Ë
    êmxièm  ã                   óœ  — U d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZ ej:                  rddlmZm Z   G d„ de«      Z!ee"e!f   Z# ed	«      Z$ej:                  r ed
«      Z% e&«       Z'ed   e(d<   dd„Z) ejT                  e)«        G d„ de«      Z+ G d„ de+«      Z, G d„ de+«      Z-dej\                  dej\                  fd„Z/dej\                  dej\                  fd„Z0da1de2dej&                  fd„Z3 G d„ d«      Z4 G d„ dejj                  «      Z6y)ak  Bridges between the `asyncio` module and Tornado IOLoop.

.. versionadded:: 3.2

This module integrates Tornado with the ``asyncio`` module introduced
in Python 3.4. This makes it possible to combine the two libraries on
the same event loop.

.. deprecated:: 5.0

   While the code in this module is still used, it is now enabled
   automatically when `asyncio` is available, so applications should
   no longer need to refer to this module directly.

.. note::

   Tornado is designed to use a selector-based event loop. On Windows,
   where a proactor-based event loop has been the default since Python 3.8,
   a selector event loop is emulated by running ``select`` on a separate thread.
   Configuring ``asyncio`` to use a selector event loop may improve performance
   of Tornado (but may reduce performance of other ``asyncio``-based libraries
   in the same process).
é    N©Úconvert_yielded)ÚIOLoopÚ_Selectable)
ÚAnyÚCallableÚDictÚListÚOptionalÚProtocolÚSetÚTupleÚTypeVarÚUnion)ÚTypeVarTupleÚUnpackc                   ó   — e Zd Zdefd„Zy)Ú
_HasFilenoÚreturnc                  ó   — y ©N© ©Úselfs    úO/home/htdocs/ttos/venv/lib/python3.12/site-packages/tornado/platform/asyncio.pyÚfilenoz_HasFileno.fileno:   s   € Øó    N)Ú__name__Ú
__module__Ú__qualname__Úintr   r   r   r   r   r   9   s   „ ð˜ô r   r   Ú_TÚ_TsÚSelectorThreadÚ_selector_loopsr   c                  ój  — t         D ]{  } | j                  5  d| _        | j                  j                  «        d d d «       	 | j                  j                  d«       | j                  €Œb| j                  j                  «        Œ} t         j                  «        y # 1 sw Y   ŒcxY w# t        $ r Y ŒUw xY w)NTó   a)
r%   Ú_select_condÚ_closing_selectorÚnotifyÚ_waker_wÚsendÚBlockingIOErrorÚ_threadÚjoinÚclear)Úloops    r   Ú_atexit_callbackr2   I   sŸ   € Üò  ˆØ×Ññ 	'Ø%)ˆDÔ"Ø×Ñ×$Ñ$Ô&÷	'ð	Ø�M‰M×Ñ˜tÔ$ð �<‰<Ñ#ð
 �L‰L×ÑÕð ô ×ÑÕ÷	'ð 	'ûô
 ò 	Ùð	ús   –"BÁB&ÂB#	Â&	B2Â1B2c            
       óº  ‡ — e Zd Zdej                  deddfˆ fd„Zd deddfd„Zde	e
ef   d	ed
   de
ddfd„Zde	e
ef   de
ddfd„Zde	e
ef   ddfd„Zde
de
ddfd„Zd!d„Zd!d„Zdededededef
d„Zdeddfd„Zdedededdfd„Zdedededdfd„Zdeej6                  j8                     dedef   deddfd„Zdej6                  j8                  ddfd„Zˆ xZ S )"ÚBaseAsyncIOLoopÚasyncio_loopÚkwargsr   Nc                 ó   •— || _         || _        t        t        d«      r*t	        |t        j
                  «      rt        |«      | _        i | _        t        «       | _	        t        «       | _
        d| _        t        j                  j                  «       D ]%  }|j                  «       sŒ	 t        j                  |= Œ' t        j                  j#                  || «      }|| urt%        d|› d|› �«      ‚t'        ‰| �P  di |¤Ž y # t         $ r Y Œxw xY w)NÚProactorEventLoopFzIOLoop z& already associated with asyncio loop r   )r5   Úselector_loopÚhasattrÚasyncioÚ
isinstancer8   ÚAddThreadSelectorEventLoopÚhandlersÚsetÚreadersÚwritersÚclosingr   Ú_ioloop_for_asyncioÚcopyÚ	is_closedÚKeyErrorÚ
setdefaultÚRuntimeErrorÚsuperÚ
initialize)r   r5   r6   r1   Úexisting_loopÚ	__class__s        €r   rJ   zBaseAsyncIOLoop.initialize_   s  ø€ ð
 )ˆÔð *ˆÔÜ”7Ð/Ô0´ZØœ'×3Ñ3ô6
ô
 "<¸LÓ!IˆDÔàMOˆŒä!$£ˆŒÜ!$£ˆŒØˆŒô ×.Ñ.×3Ñ3Ó5ò 	ˆDØ�~‰~ÕðÜ×2Ñ2°4Ñ8ð	ô ×2Ñ2×=Ñ=¸lÈDÓQˆØ Ñ$ÜØ˜-˜Ð(NÈ|ÈnÐ]óð ô 	‰ÑÑ$˜VÓ$øô  ò Ùðús   Â)DÄ	DÄDÚall_fdsc                 ó‚  — d| _         t        | j                  «      D ]9  }| j                  |   \  }}| j                  |«       |sŒ)| j	                  |«       Œ; t
        j                  | j                  = | j                  | j                  ur| j                  j                  «        | j                  j                  «        y ©NT)
rB   Úlistr>   Úremove_handlerÚclose_fdr   rC   r5   r9   Úclose)r   rM   ÚfdÚfileobjÚhandler_funcs        r   rS   zBaseAsyncIOLoop.close�   sŸ   € ØˆŒÜ�t—}‘}Ó%ò 	'ˆBØ$(§M¡M°"Ñ$5Ñ!ˆG�\Ø×Ñ Ô#ÚØ—‘˜gÕ&ð		'ô ×&Ñ& t×'8Ñ'8Ð9Ø×Ñ T×%6Ñ%6Ñ6Ø×Ñ×$Ñ$Ô&Ø×Ñ×ÑÕ!r   rT   Úhandler©.NÚeventsc                 ó  — | j                  |«      \  }}|| j                  v rt        d|z  «      ‚||f| j                  |<   |t        j                  z  rQ| j
                  j                  || j                  |t        j                  «       | j                  j                  |«       |t        j                  z  rR| j
                  j                  || j                  |t        j                  «       | j                  j                  |«       y y )Nzfd %s added twice)Úsplit_fdr>   Ú
ValueErrorr   ÚREADr9   Ú
add_readerÚ_handle_eventsr@   ÚaddÚWRITEÚ
add_writerrA   )r   rT   rW   rY   rU   s        r   Úadd_handlerzBaseAsyncIOLoop.add_handler¡   sÏ   € ð —m‘m BÓ'‰ˆˆGØ�—‘ÑÜÐ0°2Ñ5Ó6Ð6Ø$ gÐ.ˆ�‰�bÑØ”F—K‘KÒØ×Ñ×)Ñ)¨"¨d×.AÑ.AÀ2ÄvÇ{Á{ÔSØ�L‰L×Ñ˜RÔ Ø”F—L‘LÒ Ø×Ñ×)Ñ)¨"¨d×.AÑ.AÀ2ÄvÇ|Á|ÔTØ�L‰L×Ñ˜RÕ ð !r   c                 ó  — | j                  |«      \  }}|t        j                  z  r`|| j                  vr–| j                  j                  || j                  |t        j                  «       | j                  j                  |«       nD|| j                  v r6| j                  j                  |«       | j                  j                  |«       |t        j                  z  ra|| j                  vrR| j                  j                  || j                  |t        j                  «       | j                  j                  |«       y y || j                  v r7| j                  j                  |«       | j                  j                  |«       y y r   )r[   r   r]   r@   r9   r^   r_   r`   Úremove_readerÚremovera   rA   rb   Úremove_writer)r   rT   rY   rU   s       r   Úupdate_handlerzBaseAsyncIOLoop.update_handler¯   s   € Ø—m‘m BÓ'‰ˆˆGØ”F—K‘KÒØ˜Ÿ™Ñ%Ø×"Ñ"×-Ñ-¨b°$×2EÑ2EÀrÌ6Ï;É;ÔWØ—‘× Ñ  Õ$à�T—\‘\Ñ!Ø×"Ñ"×0Ñ0°Ô4Ø—‘×#Ñ# BÔ'Ø”F—L‘LÒ Ø˜Ÿ™Ñ%Ø×"Ñ"×-Ñ-¨b°$×2EÑ2EÀrÌ6Ï<É<ÔXØ—‘× Ñ  Õ$ð &ð �T—\‘\Ñ!Ø×"Ñ"×0Ñ0°Ô4Ø—‘×#Ñ# BÕ'ð "r   c                 ót  — | j                  |«      \  }}|| j                  vry || j                  v r6| j                  j	                  |«       | j                  j                  |«       || j                  v r6| j                  j                  |«       | j                  j                  |«       | j                  |= y r   )r[   r>   r@   r9   re   rf   rA   rg   )r   rT   rU   s      r   rQ   zBaseAsyncIOLoop.remove_handlerÂ   s“   € Ø—m‘m BÓ'‰ˆˆGØ�T—]‘]Ñ"ØØ�—‘ÑØ×Ñ×,Ñ,¨RÔ0Ø�L‰L×Ñ Ô#Ø�—‘ÑØ×Ñ×,Ñ,¨RÔ0Ø�L‰L×Ñ Ô#Ø�M‰M˜"Ñr   c                 ó:   — | j                   |   \  }} |||«       y r   )r>   )r   rT   rY   rU   rV   s        r   r_   zBaseAsyncIOLoop._handle_eventsÎ   s   € Ø $§¡¨bÑ 1Ñˆ�Ù�W˜fÕ%r   c                 ó8   — | j                   j                  «        y r   )r5   Úrun_foreverr   s    r   ÚstartzBaseAsyncIOLoop.startÒ   s   € Ø×Ñ×%Ñ%Õ'r   c                 ó8   — | j                   j                  «        y r   )r5   Ústopr   s    r   ro   zBaseAsyncIOLoop.stopÕ   s   € Ø×Ñ×ÑÕ r   ÚwhenÚcallbackÚargsc           	      ó´   — | j                   j                  t        d|| j                  «       z
  «      | j                  t        j                  |g|¢­i |¤Ž«      S )Nr   )r5   Ú
call_laterÚmaxÚtimeÚ_run_callbackÚ	functoolsÚpartial)r   rp   rq   rr   r6   s        r   Úcall_atzBaseAsyncIOLoop.call_atØ   sS   € ð × Ñ ×+Ñ+Ü��4˜$Ÿ)™)›+Ñ%Ó&Ø×ÑÜ×Ñ˜hÐ8¨Ò8°Ñ8ó
ð 	
r   Útimeoutc                 ó$   — |j                  «        y r   )Úcancel)r   r{   s     r   Úremove_timeoutzBaseAsyncIOLoop.remove_timeoutä   s   € Ø�‰Õr   c                 ór  — 	 t        j                  «       | j                  u r| j                  j                  }n| j                  j                  }	  || j                  t        j                  |g|¢­i |¤Ž«       y # t
        $ r | j                  j                  }Y ŒMw xY w# t
        $ r Y y t        $ r Y y w xY wr   )
r;   Úget_running_loopr5   Ú	call_soonÚcall_soon_threadsaferH   rw   rx   ry   ÚAttributeError)r   rq   rr   r6   r�   s        r   Úadd_callbackzBaseAsyncIOLoop.add_callbackç   s®   € ð	?Ü×'Ñ'Ó)¨T×->Ñ->Ñ>Ø ×-Ñ-×7Ñ7‘	à ×-Ñ-×BÑB�	ð	Ù�d×(Ñ(¬)×*;Ñ*;¸HÐ*VÀtÒ*VÈvÑ*VÕWøô	 ò 	?Ø×)Ñ)×>Ñ>ŠIð	?ûô
 ò 	ñ Üò 	ñ ð		ús*   ‚AA; Á*B  Á;BÂBÂ 	B6Â+B6Â5B6c                 óÒ   — t        j                  dt        «       	 | j                  j	                  | j
                  t        j                  |g|¢­i |¤Ž«       y # t        $ r Y y w xY w)Nz&add_callback_from_signal is deprecated)	ÚwarningsÚwarnÚDeprecationWarningr5   r‚   rw   rx   ry   rH   )r   rq   rr   r6   s       r   Úadd_callback_from_signalz(BaseAsyncIOLoop.add_callback_from_signalÿ   sa   € ô 	�‰Ð>Ô@RÔSð	Ø×Ñ×2Ñ2Ø×"Ñ"¤I×$5Ñ$5°hÐ$PÀÒ$PÈÑ$Põøô ò 	Ùð	ús   œ=A Á	A&Á%A&ÚexecutorÚfunc.zasyncio.Future[_T]c                 ó>   —  | j                   j                  ||g|¢­Ž S r   )r5   Úrun_in_executor)r   rŠ   r‹   rr   s       r   r�   zBaseAsyncIOLoop.run_in_executor
  s$   € ð 1ˆt× Ñ ×0Ñ0°¸4ÐGÀ$ÒGÐGr   c                 ó8   — | j                   j                  |«      S r   )r5   Úset_default_executor)r   rŠ   s     r   r�   z$BaseAsyncIOLoop.set_default_executor  s   € Ø× Ñ ×5Ñ5°hÓ?Ð?r   ©F©r   N)!r   r   r    r;   ÚAbstractEventLoopr   rJ   ÚboolrS   r   r!   r   r   rc   rh   rQ   r_   rm   ro   ÚfloatÚobjectrz   r~   r„   r‰   r   Ú
concurrentÚfuturesÚExecutorr"   r�   r�   Ú__classcell__©rL   s   @r   r4   r4   ^   sÅ  ø„ ð/%Ø#×5Ñ5ð/%ØADð/%à	õ/%ñb"˜Tð "¨dó "ð"!Ø˜˜[Ð(Ñ)ð!Ø4<¸YÑ4Gð!ØQTð!à	ó!ð(  s¨KÐ'7Ñ!8ð (À#ð (È$ó (ð&
  s¨KÐ'7Ñ!8ð 
¸Tó 
ð& ð &¨cð &°dó &ó(ó!ð

Øð

Ø%-ð

Ø69ð

ØEHð

à	ó

ð fð °ó ð Xð °cð ÀSð ÈTó ð0	Ø ð	Ø),ð	Ø8;ð	à	ó	ðHà˜:×-Ñ-×6Ñ6Ñ7ðHð �s˜B�wÑðHð ð	Hð
 
óHð@¨Z×-?Ñ-?×-HÑ-Hð @ÈT÷ @r   r4   c                   ó4   ‡ — e Zd ZdZdeddfˆ fd„Zdd„Zˆ xZS )ÚAsyncIOMainLoopa›  ``AsyncIOMainLoop`` creates an `.IOLoop` that corresponds to the
    current ``asyncio`` event loop (i.e. the one returned by
    ``asyncio.get_event_loop()``).

    .. deprecated:: 5.0

       Now used automatically when appropriate; it is no longer necessary
       to refer to this class directly.

    .. versionchanged:: 5.0

       Closing an `AsyncIOMainLoop` now closes the underlying asyncio loop.
    r6   r   Nc                 óJ   •— t        ‰| �  t        j                  «       fi |¤Ž y r   )rI   rJ   r;   Úget_event_loop)r   r6   rL   s     €r   rJ   zAsyncIOMainLoop.initialize%  s   ø€ Ü‰Ñœ7×1Ñ1Ó3Ñ>°vÓ>r   c                  ó   — y r   r   r   s    r   Ú_make_currentzAsyncIOMainLoop._make_current(  s   € ð 	r   r‘   )r   r   r    Ú__doc__r   rJ   r    r™   rš   s   @r   rœ   rœ     s    ø„ ñð? 3ð ?¨4õ ?÷r   rœ   c                   óR   ‡ — e Zd ZdZdeddfˆ fd„Zd
deddfˆ fd„Zdd„Zdd	„Z	ˆ xZ
S )ÚAsyncIOLoopaa  ``AsyncIOLoop`` is an `.IOLoop` that runs on an ``asyncio`` event loop.
    This class follows the usual Tornado semantics for creating new
    ``IOLoops``; these loops are not necessarily related to the
    ``asyncio`` default event loop.

    Each ``AsyncIOLoop`` creates a new ``asyncio.EventLoop``; this object
    can be accessed with the ``asyncio_loop`` attribute.

    .. versionchanged:: 6.2

       Support explicit ``asyncio_loop`` argument
       for specifying the asyncio loop to attach to,
       rather than always creating a new one with the default policy.

    .. versionchanged:: 5.0

       When an ``AsyncIOLoop`` becomes the current `.IOLoop`, it also sets
       the current `asyncio` event loop.

    .. deprecated:: 5.0

       Now used automatically when appropriate; it is no longer necessary
       to refer to this class directly.
    r6   r   Nc                 ó²   •— d| _         d }d|vrt        j                  «       x|d<   }	 t        ‰| �  di |¤Ž y # t
        $ r |�|j                  «        ‚ w xY w)NFr5   r   )Ú
is_currentr;   Únew_event_looprI   rJ   Ú	ExceptionrS   )r   r6   r1   rL   s      €r   rJ   zAsyncIOLoop.initializeH  sg   ø€ ØˆŒØˆØ Ñ'Ü,3×,BÑ,BÓ,DÐDˆF�>Ñ" Tð	Ü‰GÑÑ( Ó(øÜò 	ð ÐØ—
‘
”Øð	ús	   ©9 ¹ArM   c                 ó^   •— | j                   r| j                  «        t        ‰| �  |¬«       y )N)rM   )r¥   Ú_clear_currentrI   rS   )r   rM   rL   s     €r   rS   zAsyncIOLoop.closeV  s$   ø€ Ø�?Š?Ø×ÑÔ!Ü‰‰˜gˆÕ&r   c                 óÔ   — | j                   s!	 t        j                  «       | _        d| _         t        j                  | j                  «       y # t        t
        f$ r
 d | _        Y Œ?w xY wrO   )r¥   r;   rž   Úold_asynciorH   ÚAssertionErrorÚset_event_loopr5   r   s    r   r    zAsyncIOLoop._make_current[  sZ   € Ø�Šð(Ü#*×#9Ñ#9Ó#;�Ô ð #ˆDŒOÜ×Ñ˜t×0Ñ0Õ1øô !¤.Ð1ò (Ø#'�Ö ð(ús   ŽA ÁA'Á&A'c                 ój   — | j                   r't        j                  | j                  «       d| _         y y )NF)r¥   r;   r­   r«   r   s    r   Ú_clear_current_hookzAsyncIOLoop._clear_current_hookd  s)   € Ø�?Š?Ü×"Ñ" 4×#3Ñ#3Ô4Ø#ˆD�Oð r   r�   r‘   )r   r   r    r¡   r   rJ   r“   rS   r    r¯   r™   rš   s   @r   r£   r£   .  s8   ø„ ñð2 3ð ¨4õ ñ'˜Tð '¨dõ 'ó
2÷$r   r£   Úasyncio_futurec                 ó   — | S )zßConvert an `asyncio.Future` to a `tornado.concurrent.Future`.

    .. versionadded:: 4.1

    .. deprecated:: 5.0
       Tornado ``Futures`` have been merged with `asyncio.Future`,
       so this method is now a no-op.
    r   )r°   s    r   Úto_tornado_futurer²   j  s
   € ð Ðr   Útornado_futurec                 ó   — t        | «      S )as  Convert a Tornado yieldable object to an `asyncio.Future`.

    .. versionadded:: 4.1

    .. versionchanged:: 4.3
       Now accepts any yieldable object, not just
       `tornado.concurrent.Future`.

    .. deprecated:: 5.0
       Tornado ``Futures`` have been merged with `asyncio.Future`,
       so this method is now equivalent to `tornado.gen.convert_yielded`.
    r   )r³   s    r   Úto_asyncio_futurerµ   v  s   € ô ˜>Ó*Ð*r   Únamec                 óð   — | dk7  rt        dt        ›d| ›�«      ‚t        €Qt        j                  dk(  r!t        t        d«      rt        j                  }nt        j                  } G d„ d|«      }|at        S )NÚAnyThreadEventLoopPolicyzmodule z has no attribute Úwin32ÚWindowsSelectorEventLoopPolicyc                   óH   ‡ — e Zd ZdZdˆ fd„Zdej                  fˆ fd„Zˆ xZS )ú-__getattr__.<locals>.AnyThreadEventLoopPolicyaŽ  Event loop policy that allows loop creation on any thread.

            The default `asyncio` event loop policy only automatically creates
            event loops in the main threads. Other threads must create event
            loops explicitly or `asyncio.get_event_loop` (and therefore
            `.IOLoop.current`) will fail. Installing this policy allows event
            loops to be created automatically on any thread, matching the
            behavior of Tornado versions prior to 5.0 (or 5.0 on Python 2).

            Usage::

                asyncio.set_event_loop_policy(AnyThreadEventLoopPolicy())

            .. versionadded:: 5.0

            .. deprecated:: 6.2

                ``AnyThreadEventLoopPolicy`` affects the implicit creation
                of an event loop, which is deprecated in Python 3.10 and
                will be removed in a future version of Python. At that time
                ``AnyThreadEventLoopPolicy`` will no longer be useful.
                If you are relying on it, use `asyncio.new_event_loop`
                or `asyncio.run` explicitly in any non-main threads that
                need event loops.
            r   c                 óZ   •— t         ‰| �  «        t        j                  dt        d¬«       y )NzYAnyThreadEventLoopPolicy is deprecated, use asyncio.run or asyncio.new_event_loop insteadé   )Ú
stacklevel)rI   Ú__init__r†   r‡   rˆ   )r   rL   s    €r   rÀ   z6__getattr__.<locals>.AnyThreadEventLoopPolicy.__init__·  s%   ø€ Ü‘Ñ Ô"Ü—‘ð8ä&Ø ö	r   c                 ó†   •— 	 t         ‰| �  «       S # t        $ r& | j                  «       }| j	                  |«       |cY S w xY wr   )rI   rž   rH   r¦   r­   )r   r1   rL   s     €r   rž   z<__getattr__.<locals>.AnyThreadEventLoopPolicy.get_event_loopÀ  sF   ø€ ð Ü ™7Ñ1Ó3Ð3øÜ#ò  à×.Ñ.Ó0�DØ×'Ñ'¨Ô-Ø’Kð	 ús   ƒ ‘,A ¿A r‘   )	r   r   r    r¡   rÀ   r;   r’   rž   r™   rš   s   @r   r¸   r¼   œ  s$   ø„ ñõ4ð ¨×(AÑ(A÷  ñ  r   )	rƒ   r   Ú_AnyThreadEventLoopPolicyÚsysÚplatformr:   r;   rº   ÚDefaultEventLoopPolicy)r¶   Ú_BasePolicyr¸   s      r   Ú__getattr__rÇ   ‰  sz   € ð
 Ð)Ò)Ü˜w¤x lÐ2DÀTÀHÐMÓNÐNô !Ð(Ü�<‰<˜7Ò"¤wÜÐ5ô(
ô
 "×@Ñ@‰Kä!×8Ñ8ˆKô+	  {ô +	 ðZ %=Ð!ä$Ð$r   c                   ó   — e Zd ZdZdZdej                  ddfd„Zdd„Zde	j                  d   fd	„Zdd
„Zdd„Zdd„Zdd„Zdee   dee   ddfd„Zdedeeef   ddfd„Zdeded   deddfd„Zdeded   deddfd„Zdedefd„Zdedefd„Zy)r$   aq  Define ``add_reader`` methods to be called in a background select thread.

    Instances of this class start a second thread to run a selector.
    This thread is completely hidden from the user;
    all callbacks are run on the wrapped event loop's thread.

    Typically used via ``AddThreadSelectorEventLoop``,
    but can be attached to a running asyncio loop.
    FÚ	real_loopr   Nc                 óp  ‡ ‡— t        j                  «       ‰ _        |‰ _        t	        j
                  «       ‰ _        d ‰ _        d‰ _        d ‰ _	        ‰ j                  «       ‰ _        dˆ fd„Š‰ j                  j                  ˆ ˆfd„‰ j                  ¬«       i ‰ _        i ‰ _        t        j                   «       \  ‰ _        ‰ _        ‰ j"                  j'                  d«       ‰ j$                  j'                  d«       t(        j+                  ‰ «       ‰ j-                  ‰ j"                  ‰ j.                  «       y )NFc               “   óV   •K  — ‰ j                   j                  «       ƒ d {  –—†  y 7 Œ­wr   )Ú_thread_manager_handleÚ	__anext__r   s   €r   Úthread_manager_anextz5SelectorThread.__init__.<locals>.thread_manager_anextè  s!   øè ø€ ð ×-Ñ-×7Ñ7Ó9×9Ò9ús   ƒ)¡'¢)c                  óD   •— ‰ j                   j                   ‰«       «      S r   )Ú
_real_loopÚcreate_task)r   rÎ   s   €€r   ú<lambda>z)SelectorThread.__init__.<locals>.<lambda>ñ  s   ø€ �D—O‘O×/Ñ/Ñ0DÓ0FÓG€ r   ©Úcontextr‘   )ÚcontextvarsÚcopy_contextÚ_main_thread_ctxrÐ   Ú	threadingÚ	Conditionr(   Ú_select_argsr)   r.   Ú_thread_managerrÌ   r�   Ú_readersÚ_writersÚsocketÚ
socketpairÚ_waker_rr+   Úsetblockingr%   r`   r^   Ú_consume_waker)r   rÉ   rÎ   s   ` @r   rÀ   zSelectorThread.__init__Û  sù   ù€ Ü +× 8Ñ 8Ó :ˆÔà#ˆŒä%×/Ñ/Ó1ˆÔð ð 	Ôð "'ˆÔØ37ˆŒØ&*×&:Ñ&:Ó&<ˆÔ#õ	:ð 	�‰×!Ñ!ÜGØ×)Ñ)ð 	"ô 	
ð
 >@ˆŒØ=?ˆŒô (.×'8Ñ'8Ó':Ñ$ˆŒ�t”}Ø�‰×!Ñ! %Ô(Ø�‰×!Ñ! %Ô(Ü×Ñ˜DÔ!Ø�‰˜Ÿ™ t×':Ñ':Õ;r   c                 óä  — | j                   ry | j                  5  d| _        | j                  j                  «        d d d «       | j	                  «        | j
                  �| j
                  j                  «        t        j                  | «       | j                  | j                  «       | j                  j                  «        | j                  j                  «        d| _         y # 1 sw Y   Œ«xY wrO   )Ú_closedr(   r)   r*   Ú_wake_selectorr.   r/   r%   Údiscardre   rà   rS   r+   r   s    r   rS   zSelectorThread.close   s³   € Ø�<Š<ØØ×Ññ 	'Ø%)ˆDÔ"Ø×Ñ×$Ñ$Ô&÷	'ð 	×ÑÔØ�<‰<Ð#Ø�L‰L×ÑÔÜ×Ñ Ô%Ø×Ñ˜4Ÿ=™=Ô)Ø�‰×ÑÔØ�‰×ÑÔØˆ�÷	'ð 	'ús   š"C&Ã&C/)NNc                óö   K  — t        j                  dd| j                  ¬«      | _        | j                  j	                  «        | j                  «        	 d ­–— y # t        $ r | j                  «        ‚ w xY w­w)NzTornado selectorT)r¶   ÚdaemonÚtarget)rØ   ÚThreadÚ_run_selectr.   rm   Ú_start_selectÚGeneratorExitrS   r   s    r   rÛ   zSelectorThread._thread_manager  sk   è ø€ ô !×'Ñ'Ø#ØØ×#Ñ#ô
ˆŒð
 	�‰×ÑÔØ×ÑÔð
	õ øÜò 	Ø�J‰JŒLØð	üs   ‚AA9ÁA ÁA9ÁA6Á6A9c                 ót   — | j                   ry 	 | j                  j                  d«       y # t        $ r Y y w xY w)Nr'   )rä   r+   r,   r-   r   s    r   rå   zSelectorThread._wake_selector(  s5   € Ø�<Š<Øð	Ø�M‰M×Ñ˜tÕ$øÜò 	Ùð	ús   �+ «	7¶7c                 óZ   — 	 | j                   j                  d«       y # t        $ r Y y w xY w)Ni   )rà   Úrecvr-   r   s    r   râ   zSelectorThread._consume_waker0  s+   € ð	Ø�M‰M×Ñ˜tÕ$øÜò 	Ùð	ús   ‚ ž	*©*c                 ó,  — | j                   5  | j                  �J ‚t        | j                  j	                  «       «      t        | j
                  j	                  «       «      f| _        | j                   j                  «        d d d «       y # 1 sw Y   y xY wr   )r(   rÚ   rP   rÜ   ÚkeysrÝ   r*   r   s    r   rì   zSelectorThread._start_select6  sw   € ð ×Ññ 	'Ø×$Ñ$Ð,Ð,Ð,Ü!% d§m¡m×&8Ñ&8Ó&:Ó!;¼TÀ$Ç-Á-×BTÑBTÓBVÓ=WÐ XˆDÔØ×Ñ×$Ñ$Ô&÷	'÷ 	'ñ 	'ús   �A4B
Â
Bc                 ó*  — 	 | j                   5  | j                  €?| j                  s3| j                   j                  «        | j                  €| j                  sŒ3| j                  r
	 d d d «       y | j                  €J ‚| j                  \  }}d | _        d d d «       	 t	        j                  |«      \  }}}||z   }	 | j                  j                  | j                  ||| j                  ¬«       Œð# 1 sw Y   Œ_xY w# t
        $ rr}|j                  t        t        dt        j                  «      k(  r;t	        j                  | j                  j                  «       gg g d«      \  }}}|rg }n‚ ‚ Y d }~Œ·d }~ww xY w# t        $ r Y Œ–t         $ r Y Œ w xY w)NÚWSAENOTSOCKr   rÓ   )r(   rÚ   r)   ÚwaitÚselectÚOSErrorÚerrnoÚgetattrÚEBADFrà   r   rÐ   r‚   Ú_handle_selectr×   rH   rƒ   )r   Úto_readÚto_writeÚrsÚwsÚxsÚeÚ_s           r   rë   zSelectorThread._run_select?  s‹  € ØØ×"Ñ"ñ )Ø×'Ñ'Ð/¸×8NÒ8NØ×%Ñ%×*Ñ*Ô,ð ×'Ñ'Ð/¸×8NÓ8Nà×)Ò)Ø÷	)ð )ð
 ×(Ñ(Ð4Ð4Ð4Ø$(×$5Ñ$5Ñ!�˜Ø$(�Ô!÷)ð ô $Ÿ]™]¨7°H¸hÓG‘
��B˜Ø˜"‘W�ð,Ø—‘×4Ñ4Ø×'Ñ'¨¨R¸×9NÑ9Nð 5ô ðc ÷)ð )ûô4 ò ð —7‘7œg¤e¨]¼E¿K¹KÓHÒHÜ%Ÿ}™}¨d¯m©m×.BÑ.BÓ.DÐ-EÀrÈ2ÈqÓQ‘H�B˜˜1ÙØ™ààô	 ûðûô2  ò ñ Ü!ò ñ ð	úsI   ŽAC2ÁC2Á0$C2Â C> Â>3E< Ã2C;Ã>	E9ÄA(E4Å4E9Å<	FÆFÆFrþ   rÿ   c                 ó°   — |D ]  }| j                  || j                  «       Œ  |D ]  }| j                  || j                  «       Œ  | j                  «        y r   )Ú_handle_eventrÜ   rÝ   rì   )r   rþ   rÿ   ÚrÚws        r   rû   zSelectorThread._handle_select�  sV   € ð ò 	1ˆAØ×Ñ˜q $§-¡-Õ0ð	1àò 	1ˆAØ×Ñ˜q $§-¡-Õ0ð	1à×ÑÕr   rT   Úcb_mapc                 ó<   — 	 ||   } |«        y # t         $ r Y y w xY wr   )rF   )r   rT   r  rq   s       r   r  zSelectorThread._handle_eventŠ  s+   € ð
	Ø˜b‘zˆHñ 	�
øô ò 	Ùð	ús   ‚ �	šrq   rX   rr   c                 ój   — t        j                  |g|¢­Ž | j                  |<   | j                  «        y r   )rx   ry   rÜ   rå   ©r   rT   rq   rr   s       r   r^   zSelectorThread.add_reader•  ó.   € ô &×-Ñ-¨hÐ>¸Ò>ˆ�‰�bÑØ×ÑÕr   c                 ój   — t        j                  |g|¢­Ž | j                  |<   | j                  «        y r   )rx   ry   rÝ   rå   r
  s       r   rb   zSelectorThread.add_writer›  r  r   c                 ó^   — 	 | j                   |= | j                  «        y# t        $ r Y yw xY w©NFT)rÜ   rF   rå   ©r   rT   s     r   re   zSelectorThread.remove_reader¡  ó8   € ð	Ø—‘˜bÐ!ð 	×ÑÔØøô ò 	Ùð	úó   ‚   	,«,c                 ó^   — 	 | j                   |= | j                  «        y# t        $ r Y yw xY wr  )rÝ   rF   rå   r  s     r   rg   zSelectorThread.remove_writer©  r  r  r‘   )r   r   r    r¡   rä   r;   r’   rÀ   rS   ÚtypingÚAsyncGeneratorrÛ   rå   râ   rì   rë   r
   Ú_FileDescriptorLikerû   r	   r   r  r   r^   rb   r“   re   rg   r   r   r   r$   r$   Î  s+  „ ñð €Gð#< '×";Ñ";ð #<Àó #<óJð v×'<Ñ'<¸ZÑ'Hó ó2óó'ó@ðDØÐ*Ñ+ðØ15Ð6IÑ1Jðà	óð	àð	ð Ð(¨(Ð2Ñ3ð	ð 
ó		ðØ%ðØ19¸)Ñ1DðØMPðà	óðØ%ðØ19¸)Ñ1DðØMPðà	óðÐ 3ð ¸ó ðÐ 3ð ¸ô r   c                   ó¼   ‡ — e Zd ZdZh d£Zdedefˆ fd„Zdej                  ddfd„Z
dd	„Zd
dded   ddddfd„Zd
dded   ddddfd„Zd
ddefd„Zd
ddefd„Zˆ xZS )r=   a£  Wrap an event loop to add implementations of the ``add_reader`` method family.

    Instances of this class start a second thread to run a selector.
    This thread is completely hidden from the user; all callbacks are
    run on the wrapped event loop's thread.

    This class is used automatically by Tornado; applications should not need
    to refer to it directly.

    It is safe to wrap any event loop with this class, although it only makes sense
    for event loops that do not implement the ``add_reader`` family of methods
    themselves (i.e. ``WindowsProactorEventLoop``)

    Closing the ``AddThreadSelectorEventLoop`` also closes the wrapped event loop.

    >   rS   Ú	_selectorrÐ   r^   rb   re   rg   r¶   r   c                 ór   •— |t         j                  v rt        ‰| �  |«      S t	        | j
                  |«      S r   )r=   ÚMY_ATTRIBUTESrI   Ú__getattribute__rù   rÐ   )r   r¶   rL   s     €r   r  z+AddThreadSelectorEventLoop.__getattribute__Ð  s3   ø€ ØÔ-×;Ñ;Ñ;Ü‘7Ñ+¨DÓ1Ð1Ü�t—‘¨Ó-Ð-r   rÉ   Nc                 ó2   — || _         t        |«      | _        y r   )rÐ   r$   r  )r   rÉ   s     r   rÀ   z#AddThreadSelectorEventLoop.__init__Õ  s   € Ø#ˆŒÜ'¨	Ó2ˆ�r   c                 ól   — | j                   j                  «        | j                  j                  «        y r   )r  rS   rÐ   r   s    r   rS   z AddThreadSelectorEventLoop.closeÙ  s"   € Ø�‰×ÑÔØ�‰×ÑÕr   rT   r  rq   rX   rr   zUnpack[_Ts]c                 ó>   —  | j                   j                  ||g|¢­Ž S r   )r  r^   r
  s       r   r^   z%AddThreadSelectorEventLoop.add_readerÝ  ó"   € ð )ˆt�~‰~×(Ñ(¨¨XÐ=¸Ò=Ð=r   c                 ó>   —  | j                   j                  ||g|¢­Ž S r   )r  rb   r
  s       r   rb   z%AddThreadSelectorEventLoop.add_writerå  r  r   c                 ó8   — | j                   j                  |«      S r   )r  re   r  s     r   re   z(AddThreadSelectorEventLoop.remove_readerí  ó   € Ø�~‰~×+Ñ+¨BÓ/Ð/r   c                 ó8   — | j                   j                  |«      S r   )r  rg   r  s     r   rg   z(AddThreadSelectorEventLoop.remove_writerð  r!  r   r‘   )r   r   r    r¡   r  Ústrr   r  r;   r’   rÀ   rS   r   r^   rb   r“   re   rg   r™   rš   s   @r   r=   r=   ²  sÈ   ø„ ñò&€Mð. Sð .¨Sõ .ð
3 '×";Ñ";ð 3Àó 3ó ð>à!ð>ð ˜9Ñ%ð>ð ð	>ð
 
ó>ð>à!ð>ð ˜9Ñ%ð>ð ð	>ð
 
ó>ð0Ð 5ð 0¸$ó 0ð0Ð 5ð 0¸$÷ 0r   r=   r‘   )7r¡   r;   ÚatexitÚconcurrent.futuresr–   rÕ   rø   rx   rö   rÞ   rÃ   rØ   r  r†   Útornado.genr   Útornado.ioloopr   r   r   r   r	   r
   r   r   r   r   r   r   ÚTYPE_CHECKINGÚtyping_extensionsr   r   r   r!   r  r"   r#   r?   r%   Ú__annotations__r2   Úregisterr4   rœ   r£   ÚFuturer²   rµ   rÂ   r#  rÇ   r$   r’   r=   r   r   r   ú<module>r-     sX  ðòó0 Û Û Û Û Û Û Û Û 
Û Û Û Ý 'ß .÷÷ ÷ ð 
×Òß6ô�ô ð
 ˜C ˜OÑ,Ð áˆTƒ]€à	×ÒÙ
�uÓ
€Cñ *-«€�Ð%Ñ&Ó .óð$ €‡�Ð Ô !ôu@�fô u@ôp�oô ô09$�/ô 9$ðx	 g§n¡nð 	¸¿¹ó 	ð+ g§n¡nð +¸¿¹ó +ð  !Ð ðB%�cð B%˜fŸj™jó B%÷Jañ aôH?0 ×!:Ñ!:õ ?0r   