
    i                       S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr   " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\R4                  S9r " S S\5      r " S S\5      r " S S\5      r " S S \5      rScS! jr  " S" S#5      r! " S$ S%5      r"\#\$4r%\RL                  RO                  S&5      r(\RR                  " 5       r*\(S':X  a  SdS( jr+OQ\((       aE  SSKrSSK,r,\RZ                  R]                  \,R^                  " 5       S)\*-  5      r0\1" \0S*5      r2SdS+ jr+OS, =r3r+ " S- S.5      r4 " S/ S05      r5 " S1 S2\65      r7\Rp                  \%4     SeS3 jjr9 " S4 S5\65      r: " S6 S7\;5      r<\=" 5       r> " S8 S95      r?\=" 5       r@S:rAS;rB " S< S=5      rC " S> S?5      rD " S@ SA\D5      rE " SB SC\D5      rF " SD SE5      rG " SF SG\G5      rH " SH SI\65      rI " SJ SK\I5      rJ " SL SM\I5      rKSfSN jrL\L" SO5      rMSPrNSQrO\R                  " \O5      rQSRrR\R                  " \R5      rS " SS ST\65      rT " SU SV5      rU " SW SX5      rVSgSY jrWShSZ jrX Si       SjS[ jjrY Si       SkS\ jjrZ  Sl     SmS] jjr[SgS^ jr\ " S_ S`5      r]SnSa jr^SoSb jr_g)pzBase execnet gateway code send to the other side for bootstrapping.

:copyright: 2004-2015
:authors:
    - Holger Krekel
    - Armin Rigo
    - Benjamin Peterson
    - Ronny Pfannschmidt
    - many others
    )annotationsN)interrupt_main)BytesIO)Any)Callable)Iterator)Literal)
MutableSet)Protocol)cast)overloadc                      \ rS rSrSS jrSrg)WriteIO    c                   g N selfdatas     S/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/execnet/gateway_base.pywriteWriteIO.write!       S    r   Nr   bytesreturnNone)__name__
__module____qualname____firstlineno__r   __static_attributes__r   r   r   r   r       s    0r   r   c                      \ rS rSrSS jrSrg)ReadIO$   c                   g r   r   r   numbytess     r   readReadIO.read%       sr   r   Nr*   intr   r   )r    r!   r"   r#   r+   r$   r   r   r   r&   r&   $   s    2r   r&   c                  \    \ rS rSr% S\S'   SS jrSS jrSS jrSS jrSS jr	SS	 jr
S
rg)IO(   	ExecModel	execmodelc                   g r   r   r)   s     r   r+   IO.read+   r-   r   c                   g r   r   r   s     r   r   IO.write-   r   r   c                    g r   r   r   s    r   
close_readIO.close_read/       #r   c                    g r   r   r:   s    r   close_writeIO.close_write1   s    3r   c                    g r   r   r:   s    r   waitIO.wait3   r=   r   c                    g r   r   r:   s    r   killIO.kill5   s    Cr   r   Nr.   r   r   r   )r   
int | None)r    r!   r"   r#   __annotations__r+   r   r;   r?   rB   rE   r$   r   r   r   r1   r1   (   s    20%&%r   r1   c                  D    \ rS rSrSrS	S jrS
S jrS
S jrSSS jjrSr	g)Event8   z3Protocol for types which look like threading.Event.c                    g r   r   r:   s    r   is_setEvent.is_set;   s    cr   c                    g r   r   r:   s    r   set	Event.set=   s    3r   c                    g r   r   r:   s    r   clearEvent.clear?   s    Sr   Nc                    g r   r   r   timeouts     r   rB   
Event.waitA   s    #r   r   r   boolrG   r   rX   float | Noner   r[   )
r    r!   r"   r#   __doc__rN   rQ   rT   rB   r$   r   r   r   rK   rK   8   s    =! ==r   rK   c                     \ rS rSr\\R                  SS j5       5       rSS jr\\R                  S 5       5       r	\\R                  S 5       5       r
\\R                  S 5       5       r\R                  SSS jj5       r\R                  SS	 j5       r\R                  SS
 j5       r\R                  SS j5       r\R                  S 5       r\R                  S 5       r\R                  SS j5       rSrg)r3   D   c                    [        5       er   NotImplementedErrorr:   s    r   backendExecModel.backendE        "##r   c                     SU R                   -  $ )Nz<ExecModel %r>rd   r:   s    r   __repr__ExecModel.__repr__J   s    $,,..r   c                    [        5       er   rb   r:   s    r   queueExecModel.queueM   rf   r   c                    [        5       er   rb   r:   s    r   
subprocessExecModel.subprocessR   rf   r   c                    [        5       er   rb   r:   s    r   socketExecModel.socketW   rf   r   r   c                    [        5       er   rb   )r   funcargss      r   startExecModel.start\       !##r   c                    [        5       er   rb   r:   s    r   	get_identExecModel.get_ident`   ry   r   c                    [        5       er   rb   )r   delays     r   sleepExecModel.sleepd   ry   r   c                    [        5       er   rb   )r   fdmodebufsizeclosefds        r   fdopenExecModel.fdopenh   ry   r   c                    [        5       er   rb   r:   s    r   LockExecModel.Lockl   ry   r   c                    [        5       er   rb   r:   s    r   RLockExecModel.RLockp   ry   r   c                    [        5       er   rb   r:   s    r   rK   ExecModel.Eventt   ry   r   Nr   strr   rG   r   r/   r~   floatr   r      T)r   rK   )r    r!   r"   r#   propertyabcabstractmethodrd   ri   rl   ro   rr   rw   r{   r   r   r   r   rK   r$   r   r   r   r3   r3   D   sC   $  $/ $  $ $  $ $  $ 	$ $ 	$ $ 	$ $ 	$ $ 	$ $ 	$ $ 	$ $r   r3   )	metaclassc                      \ rS rSrSr\S 5       r\S 5       r\S 5       rSS jr	SS jr
SSS	 jjrSS
 jrS rS rS rSrg)ThreadExecModely   threadc                    SS K nU$ Nr   )rl   )r   rl   s     r   rl   ThreadExecModel.queue|   s
    r   c                    SS K nU$ r   )ro   )r   ro   s     r   ro   ThreadExecModel.subprocess   s    r   c                    SS K nU$ r   )rr   )r   rr   s     r   rr   ThreadExecModel.socket   s
    r   c                *    SS K nUR                  5       $ r   )_threadr{   )r   r   s     r   r{   ThreadExecModel.get_ident   s      ""r   c                .    SS K nUR                  U5        g r   )timer   )r   r~   r   s      r   r   ThreadExecModel.sleep   s    

5r   r   c                .    SS K nUR                  X5        g r   )r   start_new_thread)r   ru   rv   r   s       r   rw   ThreadExecModel.start   s      ,r   c                0    SS K nUR                  " XUSUS9$ )Nr   utf-8)encodingr   )osr   )r   r   r   r   r   r   s         r   r   ThreadExecModel.fdopen   s    yy7WgNNr   c                *    SS K nUR                  5       $ r   	threadingr   r   r   s     r   r   ThreadExecModel.Lock         r   c                *    SS K nUR                  5       $ r   r   r   s     r   r   ThreadExecModel.RLock   r   r   c                *    SS K nUR                  5       $ r   )r   rK   r   s     r   rK   ThreadExecModel.Event   r   r   Nr   r   r   rG   r   r    r!   r"   r#   rd   r   rl   ro   rr   r{   r   rw   r   r   r   rK   r$   r   r   r   r   r   y   se    G 
  
  
#

-
O
!
!
!r   r   c                      \ rS rSrSrSrg)MainThreadOnlyExecModel   main_thread_onlyr   N)r    r!   r"   r#   rd   r$   r   r   r   r   r      s     Gr   r   c                      \ rS rSrSr\S 5       r\S 5       r\S 5       rSS jr	SS jr
SSS	 jjrSS
 jrS rS rS rSrg)EventletExecModel   eventletc                "    SS K nUR                  $ r   )r   rl   r   r   s     r   rl   EventletExecModel.queue   s    ~~r   c                6    SS K nUR                  R                  $ r   )eventlet.green.subprocessgreenro   r   s     r   ro   EventletExecModel.subprocess   s    (~~(((r   c                6    SS K nUR                  R                  $ r   )eventlet.green.socketr   rr   r   s     r   rr   EventletExecModel.socket   s    $~~$$$r   c                R    SS K nUR                  R                  R                  5       $ r   )eventlet.green.threadr   r   r{   r   s     r   r{   EventletExecModel.get_ident   s    $~~$$..00r   c                .    SS K nUR                  U5        g r   )r   r   )r   r~   r   s      r   r   EventletExecModel.sleep   s    ur   r   c                2    SS K nUR                  " U/UQ76   g r   )r   spawn_n)r   ru   rv   r   s       r   rw   EventletExecModel.start   s    %%r   c                R    SS K nUR                  R                  R                  XX4S9$ Nr   r   )eventlet.green.osr   r   r   )r   r   r   r   r   r   s         r   r   EventletExecModel.fdopen   s%     ~~  ''''KKr   c                R    SS K nUR                  R                  R                  5       $ r   eventlet.green.threadingr   r   r   r   s     r   r   EventletExecModel.Lock       '~~''--//r   c                R    SS K nUR                  R                  R                  5       $ r   r   r   s     r   r   EventletExecModel.RLock   r   r   c                R    SS K nUR                  R                  R                  5       $ r   )r   r   r   rK   r   s     r   rK   EventletExecModel.Event   r   r   Nr   r   r   rG   r   r   r   r   r   r   r      se    G 
 ) )
 % %
1

&
L
0
0
0r   r   c                      \ rS rSrSr\S 5       r\S 5       r\S 5       rSS jr	SS jr
SSS	 jjrSS
 jrS rS rS rSrg)GeventExecModel   geventc                "    SS K nUR                  $ r   )gevent.queuerl   r   r   s     r   rl   GeventExecModel.queue   s    ||r   c                "    SS K nUR                  $ r   )gevent.subprocessro   r   s     r   ro   GeventExecModel.subprocess   s        r   c                "    SS K nUR                  $ r   )r   rr   r   s     r   rr   GeventExecModel.socket   s    }}r   c                >    SS K nUR                  R                  5       $ r   )gevent.threadr   r{   r   s     r   r{   GeventExecModel.get_ident  s    }}&&((r   c                .    SS K nUR                  U5        g r   )r   r   )r   r~   r   s      r   r   GeventExecModel.sleep	  s    Ur   r   c                2    SS K nUR                  " U/UQ76   g r   )r   spawn)r   ru   rv   r   s       r   rw   GeventExecModel.start  s    T!D!r   c                >    SS K nUR                  R                  XX4S9$ r   )gevent.fileobject
fileobjectFileObjectThread)r   r   r   r   r   r   s         r   r   GeventExecModel.fdopen  s!       11"G1UUr   c                >    SS K nUR                  R                  5       $ r   gevent.locklockr   r   s     r   r   GeventExecModel.Lock      {{  ""r   c                >    SS K nUR                  R                  5       $ r   r  r   s     r   r   GeventExecModel.RLock  r  r   c                >    SS K nUR                  R                  5       $ r   )gevent.eventeventrK   r   s     r   rK   GeventExecModel.Event#  s    ||!!##r   Nr   r   r   rG   r   r   r   r   r   r   r      se    G 
 ! !
  
)

"
V#
#
$r   r   c                    [        U [        5      (       a  U $ U S:X  a
  [        5       $ U S:X  a
  [        5       $ U S:X  a
  [	        5       $ U S:X  a
  [        5       $ [        SU < 35      e)Nr   r   r   r   zunknown execmodel )
isinstancer3   r   r   r   r   
ValueErrorrh   s    r   get_execmodelr  )  sl    '9%%(  	&	&&((	J	 ""	H	  -g[9::r   c                  H    \ rS rSrSrS	S jrS
SS jjrS
SS jjrSS jrSr	g)Replyi8  zdProvide access to the result of a function execution that got dispatched
through WorkerPool.spawn().c                H    Xl         UR                  5       U l        SU l        g NT)taskrK   _result_readyrunning)r   r  threadmodels      r   __init__Reply.__init__<  s    	(..0r   Nc                t    U R                  U5         U R                  $ ! [         a    U R                  Sef = f)zget the result object from an asynchronous function execution.
if the function execution raised an exception,
then calling get() will reraise that exception
including its traceback.
N)
waitfinish_resultAttributeError_excrW   s     r   get	Reply.getA  s:     	 	&<< 	&))%	&s    7c                v    U R                   R                  U5      (       d  [        SU R                  < 35      eg )Nztimeout waiting for )r  rB   OSErrorr  rW   s     r   r  Reply.waitfinishM  s5    !!&&w//0>?? 0r   c                   U R                   u  pn  U" U0 UD6U l        U R                  R                  5         SU l        g ! [         a  nX@l         S nAN7S nAff = f! U R                  R                  5         SU l        f = fNF)r  r  BaseExceptionr   r  rQ   r  )r   ru   rv   kwargsexcs        r   run	Reply.runQ  s{    !YYF	! #T4V4 ""$ DL	 !  		  ""$ DLs)   A 
AAA AA #B)r   r  r  r  r  )r  r3   r   r   r   )rX   r]   rX   r]   r   r   rG   )
r    r!   r"   r#   r^   r  r!  r  r+  r$   r   r   r   r  r  8  s    #

&@	!r   r  c                      \ rS rSr% SrS\S'   SSS jjrSS jrSS jrSS jr	SS	 jr
SS
 jrSS jrSSS jjrSSS jjrSrg)
WorkerPooli]  a  A WorkerPool allows to spawn function executions
to threads, returning a reply object on which you
can ask for the result (and get exceptions reraised).

This implementation allows the main thread to integrate
itself into performing function execution through
calling integrate_as_primary_thread() which will return
when the pool received a trigger_shutdown().

By default allows unlimited number of spawns.
zReply | None_primary_thread_taskc                .   Xl         U R                   R                  5       U l        [        5       U l        SU l        / U l        U(       aE  U R                   R                  S;  a  [        S5      eU R                   R                  5       U l
        g S U l
        g )NFr   r   z%hasprimary=True requires thread model)r4   r   _running_lockrQ   _running_shuttingdown_waitall_eventsrd   r  rK   _primary_thread_task_ready)r   r4   
hasprimarys      r   r  WorkerPool.__init__l  st    "!^^002+.5",.~~%%-KK !HII<@NN<P<P<RD+.2D+r   c                   U R                   R                  S;   d   U R                   5       eU R                  nUc   e UR                  5         U R                  nUc  gU R                  U5        U R                     U R                  (       a
   SSS5        gX R                  L a  UR                  5         SSS5        M  ! , (       d  f       N= f)zqIntegrate the thread with which we are called as a primary
thread for executing functions triggered with spawn().r2  N)	r4   rd   r7  rB   r0  _perform_spawnr3  r5  rT   )r   primary_thread_task_readyreplys      r   integrate_as_primary_thread&WorkerPool.integrate_as_primary_thready  s     ~~%%)GGWWG$($C$C!(444%**,--E}&##%% $# 555-335 $  $#s   ;B?B??
Cc                    U R                      SU l        U R                  b!  S U l        U R                  R	                  5         S S S 5        g ! , (       d  f       g = fr  )r3  r5  r7  r0  rQ   r:   s    r   trigger_shutdownWorkerPool.trigger_shutdown  sE    !%D..:,0)//335	  s   6A
Ac                ,    [        U R                  5      $ r   )lenr4  r:   s    r   active_countWorkerPool.active_count  s    4==!!r   c                d   UR                  5         U R                     U R                  R                  U5        U R                  (       dN  U R                  (       a=  U R                  R                  5       nUR                  5         U R                  (       a  M=  S S S 5        g ! , (       d  f       g = fr   )r+  r3  r4  remover6  poprQ   )r   r=  waitall_events      r   r;  WorkerPool._perform_spawn  sp    		MM  '==**$($8$8$<$<$>M!%%' ***  s   A9B!!
B/c                *   U R                   nUb  UR                  5       (       d  Xl        UR                  5         gU R                  R
                  S:X  a>  U R                  b1  U R                  R                  5         Xl        UR                  5         gg)NTr   F)r7  rN   r0  rQ   r4   rd   r  )r   r=  r<  s      r   _try_send_to_primary_thread&WorkerPool._try_send_to_primary_thread  s     %)$C$C!$0,3355,1))--/&&*<<--9))446,1) *--/r   c                l   [        XU4U R                  5      nU R                     U R                  (       a  [	        S5      eU R
                  R                  U5        U R                  U5      (       d'  U R                  R                  U R                  U45        SSS5        U$ ! , (       d  f       U$ = f)zAAsynchronously dispatch func(*args, **kwargs) and return a Reply.zpool is shutting downN)
r  r4   r3  r5  r  r4  addrM  rw   r;  )r   ru   rv   r)  r=  s        r   r   WorkerPool.spawn  s    t6*DNN;!! !899MMe$33E::$$T%8%85(C      s   A5B$$
B3Nc                @    U R                  5         U R                  US9$ )z;Trigger shutdown and wait for completion of all executions.rX   )rA  waitallrW   s     r   	terminateWorkerPool.terminate  s    ||G|,,r   c                   U R                      U R                  (       d
   SSS5        gU R                  R                  5       nU R                  R                  U5        SSS5        WR                  US9$ ! , (       d  f       N= f)z5Wait until all active spawns have finished executing.NTrS  )r3  r4  r4   rK   r6  appendrB   )r   rX   my_waitall_events      r   rT  WorkerPool.waitall  sk    ==    $~~335  ''(89    $$W$55  s   A55A55
B)r0  r7  r4  r3  r5  r6  r4   F)r4   r3   r8  r[   r   r   rG   r   )r=  r  r   r   )r=  r  r   r[   )r   r  r   r\   )r    r!   r"   r#   r^   rI   r  r>  rA  rE  r;  rM  r   rU  rT  r$   r   r   r   r/  r/  ]  sA    
 '&36.6"(2	-

6 
6r   r/  EXECNET_DEBUG2c                      SR                  [        [        U 5      5      n[        R                  R                  S[         SU S35        [        R                  R                  5         g ! [         a     g f = f)N [z] 
)	joinmapr   sysstderrr   pidflush	Exception)msglines     r   tracerk    s^    	88CSM*DJJqRvR01JJ 		s   A'A* *
A76A7zexecnet-debug-%dwc                 J    SR                  [        [        U 5      5      n[        R	                  US-   5        [        R                  5         g ! [         aJ  n [        R                  R	                  S[         SU< S35         S nAg ! [         a      S nAg f = fS nAff = f)Nr_  ra  r`  z] exception during tracing: )
rb  rc  r   	debugfiler   rg  rh  rd  re  rf  )ri  rj  r*  s      r   rk  rk    s    	88CSM*DOOD4K(OO 	

  1SE)EcWB!OPP 	s0   AA 
B"+B		
BBBBB"c                     g r   r   )ri  s    r   <lambda>rp    s    4r   c                  P    \ rS rSr\\\4rS	S jrS
S jr	SS jr
SS jrSS jrSrg)Popen2IOi  c                   XsU l         U l        [        R                  S:X  aa  SS Kn UR                  UR                  5       [        R                  5        UR                  UR                  5       [        R                  5        [        USU5      R                  U l        [        USU5      R                  U l        X0l        g ! [        [        4 a     NQf = f)Nwin32r   buffer)outfileinfilerd  platformmsvcrtsetmodefilenor   O_BINARYr  r$  getattrr+   _readr   _writer4   )r   rv  rw  r4   ry  s        r   r  Popen2IO.__init__  s    $+!dk<<7"v}}<w~~/= VXv6;;
gx9??"	 #G, s   AC CCc                    SnU[        U5      :  aR  U R                  U[        U5      -
  5      nU(       d  [        SU[        U5      4-  5      eX#-  nU[        U5      :  a  MR  U$ )z,Read exactly 'numbytes' bytes from the pipe.r   zexpected %d bytes, got %d)rD  r~  EOFError)r   r*   bufr   s       r   r+   Popen2IO.read  se     S!::hS12D:hC=QQRRKC	 S!
 
r   c                    [        U[        5      (       d   eU R                  U5        U R                  R	                  5         g)zWrite out all data bytes.N)r  r   r  rv  rg  r   s     r   r   Popen2IO.write  s1    $&&&&Dr   c                8    U R                   R                  5         g r   )rw  closer:   s    r   r;   Popen2IO.close_read"  s    r   c                8    U R                   R                  5         g r   )rv  r  r:   s    r   r?   Popen2IO.close_write%  s    r   )r~  r  r4   rw  rv  N)r4   r3   r   r   r.   r   rG   )r    r!   r"   r#   IOErrorr$  r  errorr  r+   r   r;   r?   r$   r   r   r   rr  rr    s'    gx(E#	r   rr  c                  H   \ rS rSr% Sr0 rS\S'   S$S%S jjr\S&S j5       r	S'S jr
S(S	 jrS)S
 jrS*S jrSrS\4\\'   S*S jrSrS\4\\'   S*S jrSrS\4\\'   S*S jrSrS\4\\'   S*S jrSrS\4\\'   S*S jrSrS\4\\'   S*S jrSrS\4\\'   S*S jrS rS!\4\\'   S"rg#)+Messagei)  z.Encapsulates Messages and their wire protocol.z=dict[int, tuple[str, Callable[[Message, BaseGateway], None]]]_typesr   c                (    Xl         X l        X0l        g r   )msgcode	channelidr   )r   r  r  r   s       r   r  Message.__init__/  s    "	r   c                    U R                  S5      nU(       d  [        S5      e [        R                  " SU5      u  p4n[        X4U R                  U5      5      $ ! [         a!  n[        SUR                  S   -   5      S eS nAff = f)N	   z
empty readzcouldn't load message header, r   !bii)r+   r  rv   structunpackr  )ioheaderemsgtypechannelpayloads         r   from_ioMessage.from_io4  s    	SWWQZF|,,  %+MM&&$A!'w)9::  	S;affQiGHdR	Ss   #A 
B%BBc                    [         R                  " SU R                  U R                  [	        U R
                  5      5      nUR                  X R
                  -   5        g )Nr  )r  packr  r  rD  r   r   )r   r  r  s      r   to_ioMessage.to_io?  s9    VT\\4>>3tyy>R
))#$r   c                L    U R                   U R                     S   nU" X5        g )Nr   )r  r  )r   gatewayhandlers      r   receivedMessage.receivedC  s!    ++dll+A.r   c                    U R                   U R                     S   nSU SU R                   S[        U R                  5       S3$ )Nr   z	<Message z	 channel=z	 lendata=>)r  r  r  rD  r   )r   names     r   ri   Message.__repr__G  sC    {{4<<(+4&	$..)93tyy>BRRSTTr   c                ^   [        UR                  R                  5      UR                  R	                  5       UR
                  R                  S.nUR                  [        R                  U R                  [        U5      5        UR                  [        R                  U R                  5        g )N)numchannelsnumexecutingr4   )rD  _channelfactory	_channels	_execpoolrE  r4   rd   _sendr  CHANNEL_DATAr  dumps_internalCHANNEL_CLOSE)messager  ds      r   _statusMessage._statusK  s}     w66@@A#--::< **22	
 	g**G,=,=~a?PQg++W->->?r   STATUSc                    [        U R                  U5      n[        U[        5      (       d   eUnU R                  S:X  a  X1l        g X1R                  R                  U R                  5      l        g r   )loads_internalr   r  tupler  
_strconfigr  new)r  r  r   	strconfigs       r   _reconfigureMessage._reconfigureZ  s[    gllG4$&&&&'+	!!*HQ##''(9(9:Er   r   RECONFIGUREc                    [        U5      er   )GatewayReceivedTerminater  r  s     r   _gateway_terminateMessage._gateway_terminatef  s    &w//r      GATEWAY_TERMINATEc                    UR                   R                  U R                  5      nUR                  X R                  S9  g )N)r  
sourcetask)r  r  r  _local_schedulexecr   )r  r  r  s      r   _channel_execMessage._channel_execl  s3    ))--g.?.?@""7||"Lr      CHANNEL_EXECc                d    UR                   R                  U R                  U R                  5        g r   )r  _local_receiver  r   r  s     r   _channel_dataMessage._channel_datas  s"    ..w/@/@',,Or      r  c                N    UR                   R                  U R                  5        g r   r  _local_closer  r  s     r   _channel_closeMessage._channel_closey  s    ,,W->->?r      r  c                    [        U R                  5      n[        U[        5      (       d   e[	        U5      nUR
                  R                  U R                  U5        g r   )r  r   r  r   RemoteErrorr  r  r  )r  r  error_messageremote_errors       r   _channel_close_errorMessage._channel_close_error  sI    &w||4-----"=1,,W->->Mr      CHANNEL_CLOSE_ERRORc                L    UR                   R                  U R                  SS9  g NT)sendonlyr  r  s     r   _channel_last_messageMessage._channel_last_message  s!    ,,W->->,Nr      CHANNEL_LAST_MESSAGE)r  r   r  Nr   r   r  r/   r  r/   r   r   r   r   )r  r&   r   r  )r  r   r   r   )r  BaseGatewayr   r   r   )r  r  r  r  r   r   )r    r!   r"   r#   r^   r  rI   r  staticmethodr  r  r  ri   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r$   r   r   r   r  r  )  s$   8 MOFIN
 ; ;%U
@ F(F6NR K(,7F;0 !46H IFM L*M:F<P L*M:F<@ M,n=F=N #8:N"OFO $:<Q#RF r   r  c                      \ rS rSrSrSrg)r  i  z'Receiverthread got termination message.r   Nr    r!   r"   r#   r^   r$   r   r   r   r  r    s    1r   r  c                     U" [        U 5      X R                  5      nSR                  U5      nU$ ! U a    e [         a    [        U 5      R                   SU  3n U$ f = f)N : )type__traceback__rb  r(  r    )r*  format_exceptionsysexl	errortexts        r   geterrortextr    sq    
3 T#Y->->?GGAJ	
 	   3Cy))*"SE2	3s   -1 *AAc                  N   ^  \ rS rSrSrSU 4S jjrS	S jrS	S jrS
S jrSr	U =r
$ )r  i  z=Exception containing a stringified error from the other side.c                .   > [         TU ]  5         Xl        g r   )superr  	formatted)r   r  	__class__s     r   r  RemoteError.__init__  s    "r   c                    U R                   $ r   r  r:   s    r   __str__RemoteError.__str__  s    ~~r   c                L    U R                   R                   SU R                   3$ )Nr  )r  r    r  r:   s    r   ri   RemoteError.__repr__  s#    ..))*"T^^,<==r   c                    U R                   [        :w  a;  [        R                  R	                  S[
        R                  " 5        SU < S35        g g )Nr`  z] Warning: unhandled ra  )r  INTERRUPT_TEXTrd  re  r   r   getpidr:   s    r   warnRemoteError.warn  s;    >>^+JJq-B4("MN ,r   r  )r  r   r   r   r   rG   )r    r!   r"   r#   r^   r  r  ri   r  r$   __classcell__r  s   @r   r  r    s!    G#>O Or   r  c                      \ rS rSrSrSrg)TimeoutErrori  z0Exception indicating that a timeout was reached.r   Nr  r   r   r   r  r    s    :r   r  c                  :   \ rS rSrSr\r\rSrSrSS jr	SS jr
\4     SS jjrSS jrSS	 jrS
 rSS jr\SSS jj5       r\  S      S!S jj5       r  S"     S#S jjrS$SS jjrS$S%S jjrS&S jrS$S'S jjrS(S jrS)S jr\r S*     S+S jjrSrg),Channeli  zFCommunication channel between two Python Interpreter execution points.i  Fc                p   [        U[        5      (       d   e[        U[        5      (       a   eXl        [	        USS5      U l        X l        U R                  R                  R                  R                  5       U l
        SU l        U R                  R                  R                  5       U l        / U l        g)z	:private:r  TFFN)r  r/   r  r  r}  r  idr4   rl   Queue_items_closedrK   _receiveclosed_remoteerrors)r   r  r  s      r   r  Channel.__init__  s    "c""""gt,,,,!'<Gll,,2288:"ll44::<02r   c                R    U R                   R                  " U R                  /UQ76   g r   )r  _tracer  r   ri  s     r   r   Channel._trace  s    DGG*c*r   c                   U R                   R                  R                  nU R                   R                     U R                  c  [        U < S35      eU R                  nSU l          UR                  SS9nU[        L a#  UR                  U5        U[        La  U" U5        OU" U5         MG  SSS5        g! U R                   R                  R                  R                   aN    U R                  (       d9  U R                  R                  5       (       d  XU R                   4X0R"                  '    M  f = f! , (       d  f       g= f)af  Set a callback function for receiving items.

All already-queued items will immediately trigger the callback.
Afterwards the callback will execute in the receiver thread
for each received data item and calls to ``receive()`` will
raise an error.
If an endmarker is specified the callback will eventually
be called with the endmarker when the channel closes.
Nz  has callback already registeredF)block)r  r  
_callbacks_receivelockr  r$  r!  	ENDMARKERputNO_ENDMARKER_WANTEDr4   rl   Emptyr  r  rN   r  r  )r   callback	endmarkerr%  itemsolditems         r   setcallbackChannel.setcallback  s    \\11<<
\\&&{{"(HIJJKKEDK*#iiei4G )+		'*$,??$Y/ )  '& ||--3399  LLD,?,?,F,F,H,H/7DOO.T
77+ '&s0   1D7)B887D78A8D40D73D44D77
Ec                h    U R                  5       =(       a    S=(       d    SnSU R                  U4-  $ )Nclosedopenz<Channel id=%d %s>)isclosedr  )r   flags     r   ri   Channel.__repr__  s*    ,H7#twwo55r   c                   U R                   c  g U R                  S5        U R                  (       a$  U R                   H  nUR	                  5         M     g U R
                  R                  5       (       a  g [        bU  U R                  c  [        R                  nO[        R                  n U R                   R                  X R                  5        g g ! [        [        4 a     g f = f)Nzchannel.__del__)r  r   r  r  r  r  rN   r  r  r  r  r  r  r$  r  )r   r  r  s      r   __del__Channel.__del__  s    <<%&<<++

 ,  ''))  ";;&%::G%33GLL&&w8 #  , s   +%C C%$C%c                     U R                   R                  S5      $ ! [         a,     U R                  R                  s $ ! [
         a     Of = f g f = fr   )r  rI  
IndexErrorr  _errorr  r:   s    r   _getremoteerrorChannel._getremoteerror  sW    	%%))!,, 	||***! 	s1    
AA A 
A
AAAAc                    U R                   $ )zNReturn True if the channel is closed.

A closed channel may still hold items.
)r  r:   s    r   r4  Channel.isclosed)  s    
 ||r   c                    g r   r   r   r   
proxycloses      r   makefileChannel.makefile0  s    r   c                    g r   r   rB  s      r   rD  rE  4  s     	r   c                ^    US:X  a	  [        XS9$ US:X  a	  [        XS9$ [        SU< S35      e)zReturn a file-like object.

mode can be 'w' or 'r' for writeable/readable files.
If proxyclose is true, file.close() will also close the channel.
rl  )r  rC  rzmode z not available)ChannelFileWriteChannelFileReadr  rB  s      r   rD  rE  <  s<     3;#DHHS["4GG5788r   Nc                0   U R                   (       a  [        S5      eU R                  (       a  U R                  R	                  U S5        U R                  (       Gd;  U R
                  R                  5       (       dw  U R                  R                  nUb,  U" [        R                  U R                  [        U5      5        O!U" [        R                  U R                  5        U R	                  S5        [        U[        5      (       a  U R                  R!                  U5        SU l        U R
                  R#                  5         U R$                  nUb  UR'                  [(        5        U R                  R*                  R-                  U R                  5        gg)zClose down this channel with an optional error message.

Note that closing of a channel tied to remote_exec happens
automatically at the end of execution and cannot
be done explicitly.
z2cannot explicitly close channel within remote_execz"ignoring redundant call to close()Nzsent channel close messageT)
_executingr$  r  r  r   r  rN   r  r  r  r  r  r  r  r  r  rX  rQ   r  r(  r'  r  _no_longer_opened)r   r  r(  rl   s       r   r  Channel.closeL  s    ??NOO<<LL&JK||| &&--//ll(($33TWWnU>ST--tww789%--""))%0DL##%KKE 		)$LL((::477C) r   c                    U R                   R                  US9  U R                   R                  5       (       d  U R                  SU-  5      eU R	                  5       nU(       a  Ueg)a  Wait until this channel is closed (or the remote side
otherwise signalled that no more data was being sent).

The channel may still hold receiveable items, but not receive
any more after waitclose() has returned.

Exceptions from executing code on the other side are reraised as local
channel.RemoteErrors.

EOFError is raised if the reading-connection was prematurely closed,
which often indicates a dying process.

self.TimeoutError is raised after the specified number of seconds
(default is None, i.e. wait indefinitely).
rS  zTimeout after %r secondsN)r  rB   rN   r  r=  )r   rX   r  s      r   	waitcloseChannel.waitclosem  sb    " 	   1""))++##$>$HII$$&K r   c                    U R                  5       (       a  [        SU < 35      eU R                  R                  [        R
                  U R                  [        U5      5        g)zSends the given item to the other side of the channel,
possibly blocking if the sender queue is full.

The item must be a simple Python type and will be
copied to the other side by value.

OSError is raised if the write pipe was prematurely closed.
zcannot send to N)r4  r$  r  r  r  r  r  r  )r   items     r   sendChannel.send  sF     ==??OD84557//.:NOr   c                ^   U R                   nUc  [        S5      e UR                  US9nU[        L a2  UR                  U5        U R                  5       =(       d
    [        5       eU$ ! U R                  R                  R
                  R                   a    U R                  SU-  5      Sef = f)a  Receive a data item that was sent from the other side.

timeout: None [default] blocked waiting. A positive number
indicates the number of seconds after which a channel.TimeoutError
exception will be raised if no item was received.

Note that exceptions from the remotely executing code will be
reraised as channel.RemoteError exceptions containing
a textual representation of the remote traceback.
Nz/cannot receive(), channel has receiver callbackrS  zno item after %r seconds)r  r$  r!  r  r4   rl   r*  r  r'  r(  r=  r  )r   rX   	itemqueuexs       r   receiveChannel.receive  s     KK	KLL	Tg.A 	>MM!&&(6HJ6H ||%%++11 	T##$>$HItS	Ts   A( (AB,c                    U $ r   r   r:   s    r   __iter__Channel.__iter__  s    r   c                N     U R                  5       $ ! [         a    [        S ef = fr   )rY  r  StopIterationr:   s    r   nextChannel.next  s*    	*<<>! 	*T)	*s    $c                    X4U l         [        U R                   5      nU R                  R                  [        R
                  U R                  US9  g)zSet the string coercion for this channel.

The default is to try to convert py2 str as py3 str,
but not to try and convert py3 str to py2 str
)r   N)r  r  r  r  r  r  r  )r   py2str_as_py3strpy3str_as_py2strr   s       r   reconfigureChannel.reconfigure  s?     ,>doo.7..dCr   )r  r  r  r  r  r  r  )r  r  r  r/   r   r   ri  objectr   r   )r+  zCallable[[Any], Any]r,  rh  r   r   r   rG   rZ   ).)r   zLiteral['r']rC  r[   r   rJ  )..)r   zLiteral['w']rC  r[   r   rI  )rl  F)r   zLiteral['r', 'w']rC  r[   r   z"ChannelFileWrite | ChannelFileReadr   r-  )rS  rh  r   r   )rX   r]   r   r   )r   zIterator[Any])r   r   r  )rc  r[   rd  r[   r   r   )r    r!   r"   r#   r^   r  r  _INTERNALWAKEUPrL  r  r   r)  r/  ri   r8  r=  r4  r   rD  r  rP  rT  rY  r\  r`  __next__re  r$   r   r   r   r  r    s)   PKLOJ3+ 0"*&"* "* 
	"*H6<    !  
	  #& 99 9 
,	9 DB0P0* H GL
D $
D?C
D	
D 
Dr   r  zkeyboard-interruptedzJconcurrent remote_exec would cause deadlock for main_thread_only execmodelc                  f    \ rS rSrSSS jjrSSS jjrSS jrSS jrSSS jjrSS jr	SS	 jr
S
rg)ChannelFactoryi  c                    [         R                  " 5       U l        0 U l        UR                  R                  5       U l        Xl        X l        SU l	        [        U l        g r'  )weakrefWeakValueDictionaryr  r%  r4   r   
_writelockr  countfinishedlist_list)r   r  
startcounts      r   r  ChannelFactory.__init__  sQ    '') 	  	 "++002

r   Nc                v   U R                      U R                  (       a  [        SU R                   35      eUc!  U R                  nU =R                  S-  sl         U R
                  U   nUsSSS5        $ ! [         a'    [        U R                  U5      =o R
                  U'    N;f = f! , (       d  f       g= f)z:Create a new Channel with 'id' (or create new id if None).zconnection already closed: Nr  )rp  rr  r$  r  rq  r  KeyErrorr  )r   r  r  s      r   r  ChannelFactory.new  s    __}} ;DLL>JKKzZZ

a
I..,  _  I/6t||R/HH..,I _s0   AB*A6+B*6.B'$B*&B''B**
B8c                T    U R                  U R                  R                  5       5      $ r   )rt  r  valuesr:   s    r   channelsChannelFactory.channels  s    zz$..//122r   c                     U R                   U	  U R                  R                  U5      u  p#nU[        La	  U" U5        g g ! [         a     N>f = f! [         a     g f = fr   )r  rx  r%  rI  r)  )r   r  r+  r,  r  s        r   rM   ChannelFactory._no_longer_opened  sp    	r"	$.2oo.A.A".E+H  33# 4  		  		s"   A A 
AA
AAc                   U R                   R                  U5      nUc)  U(       a  UR                  5         U R                  U5        g U(       a  UR                  R                  U5        UR                  nUb  UR                  [        5        U R                  U5        U(       d  SUl	        UR                  R                  5         g r  )r  r!  r  rM  r  rX  r  r(  r'  r  r  rQ   )r   r  remoteerrorr  r  rl   s         r   r  ChannelFactory._local_close  s    ..$$R(?  """2& %%,,[9NNE 		)$""2&"&""&&(r   c                8   U R                   R                  U5      n U R                  U   u  pEn [        X#U5      nU" U5        g ! [         a  nU R
                  R                  SU-  5        U R
                  R                  U5      nU R
                  R                  [        R                  U[        U5      5        U R                  X5         S nAg S nAff = f! [         a5    Ub  UR                  OS n	U	c   g [        X#5      n
U	R                  U
5         g f = f)Nzexception during callback: %s)r  r!  r%  r  rh  r  r   _geterrortextr  r  r  r  r  rx  r  r(  )r   r  r   r  r+  
_endmarkerr  r*  r  rl   rS  s              r   r  ChannelFactory._local_receive  s    ..$$R(	1.2oob.A+H)	1%dY? 1##$Cc$IJ LL66s;	""//^I5N !!"001  	 &-&9GNNtE}%d4		$	 s/   C A 
CA>CCD:DDc                (   U R                      SU l        S S S 5        U R                  U R                  5       H  nU R	                  USS9  M     U R                  U R
                  5       H  nU R                  U5        M     g ! , (       d  f       Nt= fr  )rp  rr  rt  r  r  r%  rM  )r   r  s     r   _finished_receiving"ChannelFactory._finished_receiving$  sl    __ DM **T^^,Bb40 -**T__-B""2& .	 _s   B
B)r%  r  rt  rp  rq  rr  r  )r   )r  r  ru  r/   r   r   r   )r  rH   r   r  )r   zlist[Channel])r  r/   r   r   r'  )r  r/   r  r[   r   r   rG   )r    r!   r"   r#   r  r  r|  rM  r  r  r  r$   r   r   r   rl  rl    s%    3$)&10'r   rl  c                  @    \ rS rSrSS	S jjrS
S jrSS jrSS jrSrg)ChannelFilei-  c                    Xl         X l        g r   )r  _proxyclose)r   r  rC  s      r   r  ChannelFile.__init__.  s    %r   c                    gr'  r   r:   s    r   isattyChannelFile.isatty2  s    r   c                \    U R                   (       a  U R                  R                  5         g g r   )r  r  r  r:   s    r   r  ChannelFile.close5  s     LL  r   c                    U R                   R                  5       =(       a    S=(       d    SnSU R                   R                  U4-  $ )Nr2  r3  z<ChannelFile %d %s>)r  r4  r  )r   states     r   ri   ChannelFile.__repr__9  s6    &&(5X@&$'???r   )r  r  NTr  r  rC  r[   r   r   rZ   rG   r   )	r    r!   r"   r#   r  r  r  ri   r$   r   r   r   r  r  -  s    &!@r   r  c                  (    \ rS rSrSS jrSS jrSrg)rI  i>  c                :    U R                   R                  U5        g r   )r  rT  )r   outs     r   r   ChannelFileWrite.write?  s    #r   c                    g r   r   r:   s    r   rg  ChannelFileWrite.flushB      r   r   N)r  r   r   r   rG   )r    r!   r"   r#   r   rg  r$   r   r   r   rI  rI  >  s    r   rI  c                  D   ^  \ rS rSrSSU 4S jjjrSS jrS	S jrSrU =r$ )
rJ  iF  c                2   > [         TU ]  X5        S U l        g r   )r  r  _buffer)r   r  rC  r  s      r   r  ChannelFileRead.__init__G  s    -#'r   c                    U R                   c-  [        [        U R                  R	                  5       5      U l         [        U R                   5      U:  aV  U =R                   [        [        U R                  R	                  5       5      -  sl         [        U R                   5      U:  a  MV  U R                   c  SnU$ U R                   S U nU R                   US  U l         U$ ! [         a    U R                  5          NRf = f)Nr  )r  r   r   r  rY  rD  r  r  )r   nrets      r   r+   ChannelFileRead.readK  s    	||##C)=)=)?@dll#a'S$,,*>*>*@ AA dll#a' <<C 
 ,,r"C<<+DL
  	JJL	s   B'C! !C>=C>c                ~   U R                   b]  U R                   R                  S5      nUS:w  a  U R                  US-   5      $ U R                  [        U R                   5      S-   5      nOU R                  S5      nU(       a:  US   S:w  a1  U R                  S5      nU(       d   U$ X#-  nU(       a  US   S:w  a  M1  U$ )Nra  r   )r  findr+   rD  )r   irj  cs       r   readlineChannelFileRead.readlineZ  s    <<#!!$'ABwyyQ''99S.23D99Q<DtBx4'		!A ID	 tBx4'
 r   )r  r  r  )r  r/   r   r   r   )	r    r!   r"   r#   r  r+   r  r$   r  r  s   @r   rJ  rJ  F  s    ( ( r   rJ  c                      \ rS rSr\rSrSSS jjrSS jrSS jr	SS jr
SS jrSSS jjrSS	 jrSS
 jrSSS jjrSrg)r  ij  z<worker>c                F   UR                   U l         Xl        X l        [        R                  [        R
                  4U l        [        X5      U l        U R                   R                  5       U l
        [        U l        [        U l        [        U R                   5      U l        g r   )r4   _ior  Unserializerrc  rd  r  rl  r  r   r&  rk  _BaseGateway__tracer  r  r/  _receivepool)r   r  r  _startcounts       r   r  BaseGateway.__init__n  sq    '88,:W:WX-d@ NN002)&t~~6r   c                >    U R                   " U R                  /UQ76   g r   )r  r  r!  s     r   r   BaseGateway._tracez  s    TWW#s#r   c                N    U R                   R                  U R                  5        g r   )r  r   _thread_receiverr:   s    r   _initreceiveBaseGateway._initreceive}  s     5 56r   c                  ^  S
U 4S jjnU" S5        T R                   n  [        R                  U5      nU" SU5        T R                     UR	                  T 5        AS S S 5        MG  ! , (       d  f       N= f! [
        [        4 a     ON[         a  nU" S5        UT l         S nAO1S nAf[         a!  nU" T R                  U5      5         S nAOS nAff = fU" S5        T R                  R                  5         U" S5        T R                  5         U" S5        T R                   R                  5         U" S5        T R                   R                  5         U" S	5        T R                   R#                  5         g )Nc                 ,   > TR                   " S/U Q76   g )Nz[receiver-thread]r   ri  r   s    r   log)BaseGateway._thread_receiver.<locals>.log  s    KK+2c2r   zRECEIVERTHREAD: starting to runr  z-EOF without prior gateway termination messagezfinishing receiving threadzterminating executionzclosing readzclosing writez#terminating our receive pseudo poolrg  )r  r  r  r&  r  KeyboardInterruptr  r  r<  rh  r  r  r  _terminate_executionr;   r?   r  rA  )r   r  r  ri  r*  s   `    r   r  BaseGateway._thread_receiver  s5   	3 	-.XX	)oob)J$&&LL& '  '& "#;< 	 	?@DKK 	)""3'((	)()002#$!!#NO12**,sA   +A8 
A'
A8 '
A51A8 8C
	CB''C4CCc                    g r   r   r:   s    r   r   BaseGateway._terminate_execution  r  r   c                    [        XU5      n UR                  U R                  5        U R                  SU5        g ! [        [
        4 a#  nU R                  SXE5        [	        S5      UeS nAff = f)Nsentzfailed to sendzcannot send (already closed?))r  r  r  r   r$  r  )r   r  r  r   r  r  s         r   r  BaseGateway._send  sf    'd3	BMM$((#KK($ 	BKK('59:A	Bs   -< A/A**A/c                &    UR                  S5        g )Nzexecution disallowed)r  )r   r  r  s      r   r  BaseGateway._local_schedulexec  s    ,-r   c                6    U R                   R                  5       $ )z!Return a new independent channel.)r  r  r:   s    r   
newchannelBaseGateway.newchannel  s    ##''))r   Nc                \    U R                  S5        U R                  R                  U5        g)z%Wait for receiverthread to terminate.z%waiting for receiver thread to finishN)r   r  rT  rW   s     r   rb  BaseGateway.join  s#    ;<!!'*r   )
__tracer  r<  r  r  r&  r  r  r4   r  )r  )r  r1   r  r/   r   r   rg  rG   r  r  r  r  r  r   r   r   )r   r  r   r-  )r    r!   r"   r#   r  _sysexr  r  r   r  r  r  r  r  r  rb  r$   r   r   r   r  r  j  s@    F	B
7$7-@B.*+ +r   r  c                  D    \ rS rSrSS jrS	S jrS	S jr    S
S jrSrg)WorkerGatewayi  c                j   U R                   R                  R                  S:X  a]  U R                  c   eU R                  R	                  SS9(       d  UR                  [        5        g U R                  R                  5         [        U5      nU R                   R                  U R                  X45        g )Nr   r   rS  )r  r4   rd   _executetask_completerB   r  MAIN_THREAD_ONLY_DEADLOCK_TEXTrT   r  r   executetask)r   r  r  sourcetask_s       r   r   WorkerGateway._local_schedulexec  s    >>##++/AA--999 --2212=<= &&,,.$Z0T--/EFr   c                2   U R                  S5        U R                  R                  5         U R                  R                  S5      (       d  U R                  S5        [        R
                  S:w  a<  U R                  S5        [        R                  " [        R                  " 5       S5        O"[        b  U R                  S5        [        5         U R                  R                  S5      (       d(  U R                  S	5        [        R                  " S
5        g g g )Nzshutting down execution poolg      @z5execution ongoing after 5 secs, trying interrupt_mainrt  zsending ourselves a SIGINTr  zcalling interrupt_main()g      $@z?execution did not finish in another 10 secs, calling os._exit()r   )r   r  rA  rT  rd  rx  r   rE   r  r   _exitr:   s    r   r  "WorkerGateway._terminate_execution  s    23'')~~%%c**KKOP ||w&89		Q'+67 >>))$//U 	 0 +r   c                  ^  S	U 4S jjnT R                   R                  S;   n[        T R                   US9T l        S T l        T R                   R                  S:X  a9  T R                   R                  5       T l        T R                  R                  5         U" S5        T R                  5          U(       a"  U" S5        T R                  R                  5         U" S5        T R                  5         g ! [         a    U" S5         g f = f)
Nc                .   > TR                  SU -   5        g )Nz[serve] r  r  s    r   rk  "WorkerGateway.serve.<locals>.trace  s    KK
S()r   r2  )r8  r   zspawning receiver threadzintegrating as primary threadzjoining receiver threadz,swallowing keyboardinterrupt, serve finished)ri  r   r   r   )r4   rd   r/  r  r  rK   rQ   r  r>  rb  r  )r   rk  r8  s   `  r   serveWorkerGateway.serve  s    	* ^^++/MM
#DNNzJ%)">>!!%77)-)=)=)?D& &&**,()		B56::<+,IIK  	B@A	Bs   /AC1 1DDc                    Uu  nu  p4pVUSS.nU R                  SUR                   S[        U5      S S  35        SUl         [	        US-   U=(       d    SS	5      n[        X5        U(       a(  U R                  S
U< SU<S S35        Xu   n	U	" U40 UD6  SUl        U R                  S5        WR                  5         U R                   b  U R                   R#                  5         g g ! SUl        U R                  S5        f = f! [         a    WR                  [        5        e [         a  n
[        U
[        5      (       da  WR                  R                  R                  (       d<  U R                  SU
< 35        U R                  U
5      nUR                  U5         S n
A
g U R                  S5         S n
A
GNS n
A
ff = f)N__channelexec__)r  r    zexecution starts[z]: 2   Tra  z<remote exec>execzcalling z(**z>60)Fzexecution finishedzgot exception: z,ignoring EOFError because receiving finished)r   r  reprrL  compiler  r  r  r  r(  r  r  r  r  rr  r  r  rQ   )r   rS  r  source	file_name	call_namer)  loccofunctionr*  r  s               r   r  WorkerGateway.executetask   s   	H>B;G;f.5CT"UCKK+GJJ<s4<;L:MNO!%G	2Vd]I,H&QRKK	6 JK"~HW//%*"01 	%%1 &&**,	 2 &+"01  	MM.) 	Hc8,,66??KK/# 9: $ 2 23 7IMM),KKFGG	Hs8   AD AC( D (DD )G .A1F;$F;;G )r  r  Nr  rG   )rS  zEtuple[Channel, tuple[str, str | None, str | None, dict[str, object]]]r   r   )	r    r!   r"   r#   r  r  r  r  r$   r   r   r   r  r    s*    G&(B2#-S#- 
#-r   r  c                      \ rS rSrSrg)DataFormatErrori+  r   Nr    r!   r"   r#   r$   r   r   r   r  r  +      r   r  c                      \ rS rSrSrSrg)	DumpErrori/  z"Error while serializing an object.r   Nr  r   r   r   r  r  /  s    ,r   r  c                      \ rS rSrSrSrg)	LoadErrori3  z$Error while unserializing an object.r   Nr  r   r   r   r  r  3  s    .r   r  c                    [        U /5      $ r   )r   )r  s    r   bchrr  7  s    !:r   r  iz!dz!ddc                      \ rS rSrSrg)_StopiE  r   Nr  r   r   r   r  r  E  r  r   r  c                  l    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSrSrSrSrSrSrSrSrSrSrg)opcodeiI  z#Container for name -> num mappings.   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   Tr   N)r    r!   r"   r#   r^   
BUILDTUPLEBYTESCHANNELFALSEFLOAT	FROZENSETINTLONGLONGINTLONGLONGNEWDICTNEWLISTNONE	PY2STRING	PY3STRINGSETSETITEMSTOPTRUEUNICODECOMPLEXr$   r   r   r   r   r   I  sn    -JEGEEI
CDGHGGDII
CGDDGGr   r   c                     \ rS rSr% 0 rS\S'   SrSr  S        S!S jjrS"S#S jjr	S$S	 jr
\
\\R                  '   S$S
 jr\\\R                  '   S$S jr\\\R                   '   S$S jr\\\R$                  '   S$S jr\\\R(                  '   \r\\\R,                  '   \r\\\R0                  '   S$S jr\\\R4                  '   S$S jr\\\R8                  '   S%S jrS&S jrS$S jr\\\R@                  '   S$S jr!\!\\RD                  '   S$S jr#\#\\RH                  '   S$S jr%\%\\RL                  '   S$S jr'\'\\RP                  '   S$S jr)\)\\RT                  '   S$S jr+\+\\RX                  '   S'S jr-S$S jr.\.\\R^                  '   S$S jr0\0\\Rb                  '   S$S jr2\2\\Rf                  '   S$S jr4\4\\Rj                  '   S$S jr6\6\\Rn                  '   Sr8g)(r  ic  z+dict[bytes, Callable[[Unserializer], None]]num2funcTFNc                    [        U[        5      (       a  UR                  nOUnUb  UR                  nU(       a  Uu  U l        U l        Xl        Uc  S U l        g UR                  U l        g r   )	r  r  r  r  rc  rd  streamchannelfactoryr  )r   r.  channel_or_gatewayr  gws        r   r  Unserializer.__init__h  sf     ('22%7%?%?B#B)*55I;D8D!4#8:"&D"$"4"4Dr   c                   U(       a3  U R                   R                  S5      nU[        :w  a  [        SU-  5      e/ U l          U R                   R                  S5      nU(       d  [
        e U R                  U   nU" U 5        MB  ! [         a    [        SU< S35      S ef = f! [         aC    [        U R                  5      S:w  a  [        S5      S eU R                  R                  S5      s $ f = f)Nr   zwrong dumpformat version %rzunknown opcode z - wire protocol corruption?zinternal unserialization errorr   )r.  r+   DUMPFORMAT_VERSIONr  stackr  r,  rx  r  rD  rI  )r   	versionedverr   loaders        r   loadUnserializer.load|  s    ++""1%C(( = CDD#%
	/))!,"N !]]62F
 t     #)&3OP  
  	%4::!# @AtK::>>!$$	%s+   )B% -B <
B% B""B% %A
C21C2c                :    U R                   R                  S 5        g r   r5  rX  r:   s    r   	load_noneUnserializer.load_none      

$r   c                :    U R                   R                  S5        g r  r<  r:   s    r   	load_trueUnserializer.load_true  r?  r   c                :    U R                   R                  S5        g r'  r<  r:   s    r   
load_falseUnserializer.load_false  s    

% r   c                Z    U R                  5       nU R                  R                  U5        g r   
_read_int4r5  rX  r   r  s     r   load_intUnserializer.load_int  s     OO

!r   c                l    U R                  5       nU R                  R                  [        U5      5        g r   )_read_byte_stringr5  rX  r/   r   ss     r   load_longintUnserializer.load_longint  s&    ""$

#a&!r   c                    U R                   R                  [        5      nU R                  R	                  [
        R                  " [        U5      S   5        g r   )r.  r+   FLOAT_FORMAT_SIZEr5  rX  r  r  FLOAT_FORMATr   binarys     r   
load_floatUnserializer.load_float  s9    !!"34

&--f=a@Ar   c                    U R                   R                  [        5      nU R                  R	                  [        [        R                  " [        U5      6 5        g r   )	r.  r+   COMPLEX_FORMAT_SIZEr5  rX  complexr  r  COMPLEX_FORMATrU  s     r   load_complexUnserializer.load_complex  s9    !!"56

'6==#HIJr   c                l    [         R                  " SU R                  R                  S5      5      S   nU$ )N!ir  r   )r  r  r.  r+   )r   values     r   rH  Unserializer._read_int4  s+    ]]4)9)9!)<=a@r   c                \    U R                  5       nU R                  R                  U5      nU$ r   )rH  r.  r+   )r   lengthas_bytess      r   rM  Unserializer._read_byte_string  s'    ";;##F+r   c                    U R                  5       nU R                  (       a  U R                  R                  U5        g U R                  R                  UR	                  S5      5        g Nr   )rM  rd  r5  rX  decode)r   re  s     r   load_py3stringUnserializer.load_py3string  sF    ))+  JJh'JJhoog67r   c                    U R                  5       nU R                  (       a  UR                  S5      nOUnU R                  R	                  U5        g )Nzlatin-1)rM  rc  ri  r5  rX  )r   re  rO  s      r   load_py2stringUnserializer.load_py2string  s>    ))+  %__Y7AA

!r   c                Z    U R                  5       nU R                  R                  U5        g r   )rM  r5  rX  rN  s     r   
load_bytesUnserializer.load_bytes  s"    ""$

!r   c                t    U R                   R                  U R                  5       R                  S5      5        g rh  )r5  rX  rM  ri  r:   s    r   load_unicodeUnserializer.load_unicode  s(    

$00299'BCr   c                b    U R                  5       nU R                  R                  S /U-  5        g r   rG  )r   rd  s     r   load_newlistUnserializer.load_newlist  s&    "

4&6/*r   c                    [        U R                  5      S:  a  [        S5      eU R                  R                  5       nU R                  R                  5       nXR                  S   U'   g )Nr  znot enough items for setitemr  )rD  r5  r  rI  )r   ra  keys      r   load_setitemUnserializer.load_setitem  sN    tzz?Q:;;

 jjnn#

2sr   c                :    U R                   R                  0 5        g r   r<  r:   s    r   load_newdictUnserializer.load_newdict  s    

"r   c                    U R                  5       nU(       aB  U" U R                  U* S  5      nU R                  U* S 2	 U R                  R                  U5        g U R                  R                  U" 5       5        g r   rG  )r   type_rd  ress       r   _load_collectionUnserializer._load_collection  s^    "

F78,-C

F78$JJc"JJeg&r   c                .    U R                  [        5        g r   )r  r  r:   s    r   load_buildtupleUnserializer.load_buildtuple  s    e$r   c                .    U R                  [        5        g r   )r  rQ   r:   s    r   load_setUnserializer.load_set  s    c"r   c                .    U R                  [        5        g r   )r  	frozensetr:   s    r   load_frozensetUnserializer.load_frozenset  s    i(r   c                    [         er   )r  r:   s    r   	load_stopUnserializer.load_stop  s    r   c                    U R                  5       nU R                  c   eU R                  R                  U5      nU R                  R	                  U5        g r   )rH  r/  r  r5  rX  )r   r  r  s      r   load_channelUnserializer.load_channel  sH    __""...((,,R0


*%r   )r/  rc  rd  r5  r.  NN)r.  r&   r0  zChannel | BaseGateway | Noner  tuple[bool, bool] | Noner   r   r[  )r6  r[   r   r   rG   r   )r   r   )r  r  r   r   )9r    r!   r"   r#   r,  rI   rc  rd  r  r9  r=  r   r"  rA  r(  rD  r  rJ  r  rP  r  	load_longr  load_longlongr  rW  r  r]  r*  rH  rM  rj  r$  rm  r#  rp  r  rs  r)  rv  r!  rz  r&  r}  r   r  r  r  r  r%  r  r  r  r'  r  r  r$   r   r   r   r  r  c  s!   <>H9>
 <@.2	55 95 ,	5
 
5(/2  &HV[[  &HV[[! (HV\\ $HVZZ"  ,HV^^I%HV[[ M -HV__B (HV\\K  ,HV^^
8 "0HV "0HV (HV\\D  ,HV^^+  ,HV^^$  ,HV^^  ,HV^^'% #2HV# $HVZZ) "0HV &HV[[&  ,HV^^r   r  c                2    [        5       R                  U SS9$ )zSerialize the given obj to a bytestring.

The obj and all contained objects must be of a builtin
Python type (so nested dicts, sets, etc. are all OK but
not user-level instances).
Tr6  _Serializersaveobjs    r   dumpsr  #  s     =cT22r   c                F    [        U R                  S9R                  USS9  g)zCwrite a serialized bytestring of the given obj to the given stream.)r   Tr  N)r  r   r  )byteior  s     r   dumpr  -  s    fll#(((=r   c                ,    [        U 5      n[        X1US9$ )a0  Deserialize the given bytestring to an object.

py2str_as_py3str: If true then string (str) objects previously
                  dumped on Python2 will be loaded as Python3
                  strings which really are text objects.
py3str_as_py2str: If true then string (str) objects previously
                  dumped on Python3 will be loaded as Python2
                  strings instead of unicode objects.

If the bytestring was dumped with an incompatible protocol
version or if the bytestring is corrupted, the
``execnet.DataFormatError`` will be raised.
)rc  rd  )r   r9  )
bytestringrc  rd  r  s       r   loadsr  2  s!      
	B
@P r   c                4    X4n[        XS9R                  SS9$ )zuDerserialize an object form the specified stream.

Behaviour and parameters are otherwise the same as with ``loads``
)r  Tr  )r  r9  )r  rc  rd  r  s       r   r9  r9  H  s%     "4I0555EEr   c                L    [        U 5      n[        X1U5      R                  5       $ r   )r   r  r9  )r  r/  r  r  s       r   r  r  S  s$    
 
	BI6;;==r   c                4    [        5       R                  U 5      $ r   r  r  s    r   r  r  \  s    =c""r   c                  *   \ rS rSr% 0 rS\S'   SSS jjrS S!S jjrS"S jrS#S jr	S$S	 jr
S%S
 jrS&S jrS&S jrS%S jrS'S jrS(S jrS)S jrS*S jrS+S jrS\4-  4     S,S jjrS-S jrS.S jrS/S jrS0S jrS1S jrS2S jrS3S jrS4S jrSrg)5r  i`  z1dict[type, Callable[[_Serializer, object], None]]	_dispatchNc                P    Uc  / U l         U R                   R                  nXl        g r   )_streamlistrX  r  )r   r   s     r   r  _Serializer.__init__c  s%    =,.D$$++Er   c                    U(       a  U R                  [        5        U R                  U5        U R                  [        R                  5         U R
                  nSR                  U5      $ ! [         a     g f = f)Nr   )r  r4  _saver   r'  r  r  rb  )r   r  r6  
streamlists       r   r  _Serializer.savei  sd     KK*+

3FKK 	))J xx
##  		s   A+ +
A87A8c                    [        U5      n U R                  U   nU" X5        g ! [         aK    SUR                  -   n[	        U R
                  US 5      nUc  [        SU 35      S eU=o0R                  U'    N]f = f)Nsave_zcan't serialize )r  r  rx  r    r}  r  r  )r   r  tpdispatch
methodnamemeths         r   r  _Serializer._savew  s    #Y		1~~b)H 	  	1 2;;.JAH
DBD |"22$ 78dB,00H~~b)	1s   % AA:9A:c                B    U R                  [        R                  5        g r   )r  r   r"  )r   nons     r   save_NoneType_Serializer.save_NoneType  s    FKK r   c                    U(       a   U R                  [        R                  5        g U R                  [        R                  5        g r   )r  r   r(  r  )r   booleans     r   	save_bool_Serializer.save_bool  s%    KK$KK%r   c                d    U R                  [        R                  5        U R                  U5        g r   )r  r   r  _write_byte_sequencer   bytes_s     r   
save_bytes_Serializer.save_bytes  s     FLL!!!&)r   c                d    U R                  [        R                  5        U R                  U5        g r   )r  r   r$  _write_unicode_stringrN  s     r   save_str_Serializer.save_str  s"    F$$%""1%r   c                     UR                  S5      nU R                  U5        g ! [         a  n[        S5      UeS nAff = f)Nr   zstrings must be utf-8 encodable)encodeUnicodeEncodeErrorr  r  )r   rO  re  r  s       r   r  !_Serializer._write_unicode_string  sH    	Fxx(H 	!!(+ " 	F=>AE	Fs   % 
A ;A c                \    U R                  [        U5      S5        U R                  U5        g )Nzstring is too long)_write_int4rD  r  r  s     r   r   _Serializer._write_byte_sequence  s#    V&:;Fr   c                    U[         ::  a#  U R                  U5        U R                  U5        g U R                  U5        U R                  [	        U5      R                  S5      R                  S5      5        g )NLascii)FOUR_BYTE_INT_MAXr  r  r  r   rstripr  )r   r  short_oplong_ops       r   _save_integral_Serializer._save_integral  sW    !!KK!QKK %%c!fmmC&8&?&?&HIr   c                b    U R                  U[        R                  [        R                  5        g r   )r  r   r  r  rI  s     r   save_int_Serializer.save_int  s    Avzz6>>:r   c                b    U R                  U[        R                  [        R                  5        g r   )r  r   r  r  )r   r  s     r   	save_long_Serializer.save_long  s    Av{{FOO<r   c                    U R                  [        R                  5        U R                  [        R                  " [
        U5      5        g r   )r  r   r  r  r  rT  )r   flts     r   
save_float_Serializer.save_float  s)    FLL!FKKc23r   c                    U R                  [        R                  5        U R                  [        R                  " [
        UR                  UR                  5      5        g r   )r  r   r*  r  r  r\  realimag)r   cpxs     r   save_complex_Serializer.save_complex  s3    FNN#FKK#((CDr   zint must be less than %ic                z    U[         :  a  [        U5      eU R                  [        R                  " SU5      5        g )Nr`  )r  r  r  r  r  )r   r  r  s      r   r  _Serializer._write_int4  s/       E""FKKa()r   c                    U R                  [        R                  5        U R                  [	        U5      S5        [        U5       H  u  p#U R                  X#5        M     g )Nzlist is too long)r  r   r!  r  rD  	enumerate_write_setitem)r   r  r  rS  s       r   	save_list_Serializer.save_list  sE    FNN#Q!34 |GA( $r   c                    U R                  U5        U R                  U5        U R                  [        R                  5        g r   )r  r  r   r&  )r   ry  ra  s      r   r  _Serializer._write_setitem  s)    

3

5FNN#r   c                    U R                  [        R                  5        UR                  5        H  u  p#U R	                  X#5        M     g r   )r  r   r   r-  r  )r   r  ry  ra  s       r   	save_dict_Serializer.save_dict  s2    FNN#'')JC+ $r   c                    U H  nU R                  U5        M     U R                  [        R                  5        U R	                  [        U5      S5        g )Nztuple is too long)r  r  r   r  r  rD  )r   tuprS  s      r   
save_tuple_Serializer.save_tuple  s?    DJJt F%%&S#67r   c                    U H  nU R                  U5        M     U R                  U5        U R                  [        U5      S5        g )Nzset is too long)r  r  r  rD  )r   rO  oprS  s       r   
_write_set_Serializer._write_set  s8    DJJt BQ!23r   c                D    U R                  U[        R                  5        g r   )r  r   r%  rN  s     r   save_set_Serializer.save_set  s    6::&r   c                D    U R                  U[        R                  5        g r   )r  r   r  rN  s     r   save_frozenset_Serializer.save_frozenset  s    6++,r   c                x    U R                  [        R                  5        U R                  UR                  5        g r   )r  r   r  r  r  )r   r  s     r   save_Channel_Serializer.save_Channel  s$    FNN#$r   )r  r  r   )r   zCallable[[bytes], None] | Noner   r   r[  )r  rh  r6  r[   r   zbytes | Noner  rh  r   r   )r  r   r   r   )r  r[   r   r   )r  r   r   r   )rO  r   r   r   )r  r/   r  r   r  r   r   r   )r  r/   r   r   )r  r/   r   r   )r  r   r   r   )r  r[  r   r   )r  r/   r  r   r   r   )r  zlist[object]r   r   )ry  rh  ra  rh  r   r   )r  zdict[object, object]r   r   )r  ztuple[object, ...]r   r   )rO  zset[object] | frozenset[object]r  r   r   r   )rO  zset[object]r   r   )rO  zfrozenset[object]r   r   )r  r  r   r   )r    r!   r"   r#   r  rI   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r$   r   r   r   r  r  `  s    CEI@E$!&*&,J;=4E
 $>AR@T#T** *	*)$
,
84'-%r   r  c                   [        [        S5      (       de  [        [        R                  [        R
                  U 5      nSS KnUR                  " S5      [        l        UR                  " S5      [        l        U$  [        R                  nU R                  [        R                  " S5      SS5      n[        R                  " U[        R                  5      n[        R                  " US5        [        R                   " U5        U R                  [        R                  " S5      SS5      n[        R                  " U[        R"                  5      n[        R                  " US5        [        R                  S:X  aG  U R                  [        R                  " S	5      SS5      [        l        [        R                  " US	5        [        R                   " U5        [        XdU 5      nU R                  SSSS
S9[        l        U R                  SSSS
S9[        l        U$ ! [         a    [        R                  S:X  a  Sn GNSn GNf = f)Ndupr   rH  rl  ntNULz	/dev/nullr   r  Fr   )hasattrr   rr  rd  stdoutstdintempfileTemporaryFiledevnullr  r  r   r
  r3  O_RDONLYdup2r  O_WRONLYre  )r4   r  r  r  r  r   r  s          r   init_popen_ior    s   2ucjj#))Y7**3/	++C0
< I9	&jjG   C3WWWbkk*
A
 !!"&&)S!4WWWbkk*
A 77d?"))"&&)S!<CJGGBN
fY/ $$QQ$>	%%aa%?
I5  	&ww$%		&s   <H  I IIc                R    [        SU < 35        [        XSS9R                  5         g )Nzcreating workergateway on r  )r  r  r  )rk  r  r  )r  r  s     r   r  r    s%    	&rf
-.RA.446r   )rd   zstr | ExecModelr   r3   rg  )r*  r(  r  ztuple[type[BaseException], ...]r   r   )r  r/   r   r   )r  rh  r   r   r  )FF)r  r   rc  r[   rd  r[   r   r   )r  r&   rc  r[   rd  r[   r   r   r  )r  r   r  r  r   r   )r4   r3   r   rr  )r  r1   r   r   )`r^   
__future__r   r   r   r  rd  	tracebackrn  r   r   r  r   typingr   r   r   r	   r
   r   r   r   r   r&   r1   rK   ABCMetar3   r   r   r   r   r  r  r/  r  
SystemExitr  environr!  DEBUGr  rf  rk  r  pathrb  
gettempdirfnr3  rn  notracerr  r  rh  r  r  r  r  r  r  rh  r)  r  r'  r  r  rl  r  rI  rJ  r  r  r  r  r  r  r4  r  rT  calcsizerS  r\  rZ  r  r   r  r  r  r  r9  r  r  r  r  r  r   r   r   <module>r$     sp  	 # 
 	  
   "         1h 13X 3    	>H 	>2$#++ 2$j6!i 6!r!o !60	 60r7$i 7$t;"! "!Jy6 y6x 
J' 	

'iikC< 	h))+-?#-E	FBRI	 ('Ge' 'TcS cSL2y 2 //-2	 + 		"O) O&;7 ; h AD ADH H	'P 
a' a'H@ @"{ !k !HR+ R+jd-K d-X	i 	- -/ / !W  OOL1 oon5 	I 	 4}, },@3> QV)-IM. JOFF"&FBFFF *.>> (> 		>#B% B%J$N7r   