
    cd}                     2   g 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
n# e$ r ddl
Z
Y nw xY wddlmZ ddlmZmZ ddlmZ ej        Z	 ddlZddlmZmZmZmZ n# e$ r ej        dk    r dZY nw xY wd	Zd
Z ej                    ZdZdgZ e ed          rdZedgz  Zej        dk    rdZedgz  ZefdZ!d Z"d Z#d Z$d Z% G d d          Z&er G d de&          Z' G d de&          Z( G d de)          Z*d<dZ+ej        dk    rd=dZ,nd=dZ, G d d e)          Z-d! Z.ej        dk    r G d" d#e)          Z/d$ Z0d%Z1d&Z2d'Z3d(Z4d) Z5d* Z6 G d+ d,e)          Z7d- Z8d. Z9 G d/ d0e*          Z:d1 Z;ej        dk    rd2 Z<ej=        ej>        hZ?d>d3Z@n#ddlAZA e eAd4          reAjB        ZCneAjD        ZCd>d5Z@ej        dk    r0d6 ZEd7 ZF ejG        e(eE           d8 ZHd9 ZI ejG        e'eH           dS d: ZEd; ZF ejG        e(eE           dS )?)ClientListenerPipewait    N   )util)AuthenticationErrorBufferTooShort)	reduction)WAIT_OBJECT_0WAIT_ABANDONED_0WAIT_TIMEOUTINFINITEwin32i    g      4@AF_INETAF_UNIXAF_PIPEc                 X     t          t          dt          j                              | z   S N	monotonicgetattrtime)timeouts    7lib/python3.11/site-packages/multiprocess/connection.py_init_timeoutr   >   s#    .74DI..007::    c                 Z     t          t          dt          j                              | k    S r   r   )ts    r   _check_timeoutr    A   s#    .74DI..00144r   c                    | dk    rdS | dk    r^t           j        r+dt          j                     dt	          t
                     S t          j        dt          j                              S | dk    r>t          j        d	t          j                    t	          t
                    fz  d
          S t          d          )z?
    Return an arbitrary free address for the given family
    r   )	localhostr   r   z
 listener--z	listener-)prefixdirr   z\\.\pipe\pyc-%d-%d- zunrecognized family)
r   abstract_sockets_supportedosgetpidnext_mmap_countertempfilemktempget_temp_dir
ValueErrorfamilys    r   arbitrary_addressr2   H   s      0	9	 0 * 	EDDDtM/B/BDDDkt7H7J7JKKKK	9	 0&< "	T--@-@A'BGIK K K 	K .///r   c                     t           j        dk    r| dk    rt          d| z            t           j        dk    r-| dk    r)t          t          |           st          d| z            dS dS dS )zD
    Checks if the family is valid for the current environment.
    r   r   zFamily %s is not recognized.r   N)sysplatformr/   hasattrsocketr0   s    r   _validate_familyr8   [   s     |w B6Y#6 B7&@AAA
|w F6Y#6 Fvv&& 	F;fDEEEF F F F	F 	Fr   c                    t          |           t          k    rdS t          |           t          u r|                     d          rdS t          |           t          u st	          j        |           rdS t          d| z            )z]
    Return the types of the address

    This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE'
    r   z\\r   r   zaddress type of %r unrecognized)typetuplestr
startswithr   is_abstract_socket_namespacer/   )addresss    r   address_typer@   g   s     G}} Fy	g#	 F'"4"4V"<"< Fy	g#	 F!B7!K!K Fy:WDEEEr   c                       e Zd ZdZddZd Zd Zd Zd Zd Z	e
d	             Ze
d
             Ze
d             Zd Zd ZddZd ZddZddZd ZddZd Zd ZdS )_ConnectionBaseNTc                     |                                 }|dk     rt          d          |s|st          d          || _        || _        || _        d S )Nr   zinvalid handlez6at least one of `readable` and `writable` must be True)	__index__r/   _handle	_readable	_writable)selfhandlereadablewritables       r   __init__z_ConnectionBase.__init__}   sp    !!##A: 	/-... 	J 	JHJ J J!!r   c                 @    | j         |                                  d S d S NrE   _closerH   s    r   __del__z_ConnectionBase.__del__   s'    < 	KKMMMMM	 	r   c                 2    | j         t          d          d S )Nzhandle is closed)rE   OSErrorrQ   s    r   _check_closedz_ConnectionBase._check_closed   s%    < 	.,---	. 	.r   c                 2    | j         st          d          d S )Nzconnection is write-only)rF   rT   rQ   s    r   _check_readablez_ConnectionBase._check_readable   s%    ~ 	64555	6 	6r   c                 2    | j         st          d          d S )Nzconnection is read-only)rG   rT   rQ   s    r   _check_writablez_ConnectionBase._check_writable   s%    ~ 	53444	5 	5r   c                 f    | j         rd| _        n|                                  t          d          )NFzbad message length)rG   rF   closerT   rQ   s    r   _bad_message_lengthz#_ConnectionBase._bad_message_length   s1    > 	"DNNJJLLL*+++r   c                     | j         du S )z True if the connection is closedNrE   rQ   s    r   closedz_ConnectionBase.closed   s     |t##r   c                     | j         S )z"True if the connection is readable)rF   rQ   s    r   rJ   z_ConnectionBase.readable        ~r   c                     | j         S )z"True if the connection is writable)rG   rQ   s    r   rK   z_ConnectionBase.writable   ra   r   c                 8    |                                   | j        S )z+File descriptor or handle of the connection)rU   rE   rQ   s    r   filenoz_ConnectionBase.fileno   s    |r   c                 h    | j         *	 |                                  d| _         dS # d| _         w xY wdS )zClose the connectionNrO   rQ   s    r   r[   z_ConnectionBase.close   sF    < 	$$#t####		$ 	$s   & 	/r   c                    |                                   |                                  t          |          }|j        dk    r|                    d          }|j        }|dk     rt          d          ||k     rt          d          |||z
  }n-|dk     rt          d          ||z   |k    rt          d          |                     ||||z                       dS )	z,Send the bytes data from a bytes-like objectr   Br   zoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rU   rY   
memoryviewitemsizecastnbytesr/   _send_bytes)rH   bufoffsetsizemns         r   
send_bytesz_ConnectionBase.send_bytes   s   sOO:> 	sAHA: 	31222v: 	75666 	>v:DDAX 	>/000d]Q 	><===6&4-/011111r   c                     |                                   |                                  |                     t                              |                     dS )zSend a (picklable) objectN)rU   rY   rl   _ForkingPicklerdumpsrH   objs     r   sendz_ConnectionBase.send   sN    ..s3344444r   c                     |                                   |                                  ||dk     rt          d          |                     |          }||                                  |                                S )z7
        Receive bytes data as a bytes object.
        Nr   znegative maxlength)rU   rW   r/   _recv_bytesr\   getvalue)rH   	maxlengthrm   s      r   
recv_bytesz_ConnectionBase.recv_bytes   s     	 	3Y] 	31222y)) 	'$$&&&||~~r   c                 H   |                                   |                                  t          |          5 }|j        }|t	          |          z  }|dk     rt          d          ||k    rt          d          |                                 }|                                }|||z   k     r!t          |	                                          |
                    d           |                    |||z  ||z   |z                      |cddd           S # 1 swxY w Y   dS )zq
        Receive bytes data into a writeable bytes-like object.
        Return the number of bytes read.
        r   znegative offsetzoffset too largeN)rU   rW   rh   ri   lenr/   rz   tellr
   r{   seekreadinto)rH   rm   rn   rp   ri   bytesizeresultro   s           r   recv_bytes_intoz_ConnectionBase.recv_bytes_into   sq   
 	__ 	zH#a&&(Hz 5 !2333(" 5 !3444%%''F;;==D&4-' 8$V__%6%6777KKNNNOOAf0%}9: ; < < <!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   CDDDc                     |                                   |                                  |                                 }t                              |                                          S )zReceive a (picklable) object)rU   rW   rz   rt   loads	getbuffer)rH   rm   s     r   recvz_ConnectionBase.recv   sS      $$S]]__555r           c                 |    |                                   |                                  |                     |          S )z/Whether there is any input available to be read)rU   rW   _pollrH   r   s     r   pollz_ConnectionBase.poll  s8    zz'"""r   c                     | S rN    rQ   s    r   	__enter__z_ConnectionBase.__enter__
      r   c                 .    |                                   d S rN   r[   rH   exc_type	exc_valueexc_tbs       r   __exit__z_ConnectionBase.__exit__      

r   )TT)r   NrN   )r   )r   )__name__
__module____qualname__rE   rL   rR   rU   rW   rY   r\   propertyr_   rJ   rK   rd   r[   rr   rx   r}   r   r   r   r   r   r   r   r   rB   rB   z   ss       G	" 	" 	" 	"  . . .6 6 65 5 5, , , $ $ X$   X   X  
$ $ $2 2 2 2(5 5 5      26 6 6# # # #      r   rB   c                   D    e Zd ZdZdZej        fdZd Zd	dZ	d Z
d ZdS )
PipeConnectionz
        Connection class based on a Windows named pipe.
        Overlapped I/O is used, so the handles must have been created
        with FILE_FLAG_OVERLAPPED.
        Fc                 &     || j                    d S rN   r^   )rH   _CloseHandles     r   rP   zPipeConnection._close  s    L&&&&&r   c                    t          j        | j        |d          \  }}	 |t           j        k    r.t          j        |j        gdt                    }|t          k    sJ n#  |                                  xY w|	                    d          \  }}n# |	                    d          \  }}w xY w|dk    sJ |t          |          k    sJ d S )NT
overlappedFr   )_winapi	WriteFilerE   ERROR_IO_PENDINGWaitForMultipleObjectseventr   r   cancelGetOverlappedResultr   )rH   rm   overrwaitresnwrittens         r   rl   zPipeConnection._send_bytes  s    'cdKKKGB	='22 4%<
E85 5G"m3333		 " 6 6t < <## 6 6t < <#<<<<!8OOOs3xx''''''s   >A  B  A77B B-Nc                    | j         rd| _         t          j                    S |dnt          |d          }	 t	          j        | j        |d          \  }}	 |t          j        k    r.t	          j        |j	        gdt                    }|t          k    sJ n#  |                                  xY w|                    d          \  }}|dk    r<t          j                    }|                    |                                           |S |t          j        k    r|                     ||          S n# |                    d          \  }}|dk    r@t          j                    }|                    |                                           |c cY S |t          j        k    r|                     ||          c cY S w xY wn/# t$          $ r"}|j        t          j        k    rt*           d }~ww xY wt-          d          )NF   Tr   r   z.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminr   ReadFilerE   r   r   r   r   r   r   r   writer   ERROR_MORE_DATA_get_more_datarT   winerrorERROR_BROKEN_PIPEEOFErrorRuntimeError)	rH   maxsizebsizer   r   r   nreadfes	            r   rz   zPipeConnection._recv_bytes-  s&   & */'z||#&EC4E4E%.t|U;?A A AGBD'":: <&-&D!#
E8'= '=G#*m#;;;;		%'%;%;D%A%A
s!8 D "
AGGBLLNN333#$H G$;; D#'#6#6r7#C#CCD &(%;%;D%A%A
s!8 D "
AGGBLLNN333#$HHHHH G$;; D#'#6#6r7#C#CCCCCCCCCCD   zW%>> &	
 OPPPsg   F? >B D1 B--D1 0AF? 
%F? 0F? 1AF;F? (F;8F? :F;;F? ?
G+	G&&G+c                     | j         s#t          j        | j                  d         dk    rdS t	          t          | g|                    S )Nr   T)r   r   PeekNamedPiperE   boolr   r   s     r   r   zPipeConnection._pollM  sK    ' -dl;;A>!CtdVW--...r   c                     |                                 }t          j                    }|                    |           t	          j        | j                  d         }|dk    sJ |*t          |          |z   |k    r|                                  t	          j	        | j        |d          \  }}|
                    d          \  }}|dk    sJ ||k    sJ |                    |                                            |S )Nr   r   Tr   )r   r   r   r   r   r   rE   r   r\   r   r   )rH   r   r   rm   r   leftr   rbytess           r   r   zPipeConnection._get_more_dataS  s    ,,..C
AGGCLLL(66q9D!8OOO +s3xx$'@ +((***&t|TdKKKGB0066KFC!8OOOT>!!!GGBLLNN###Hr   rN   )r   r   r   __doc__r   r   CloseHandlerP   rl   rz   r   r   r   r   r   r   r     s        	 	
 #&-&9 	' 	' 	' 	'	( 	( 	(	Q 	Q 	Q 	Q@	/ 	/ 	/	 	 	 	 	r   r   c                       e Zd ZdZerej        fdZej        Z	ej
        Znej        fdZej        Z	ej        Ze	fdZefdZd Zd
dZd	 ZdS )
Connectionzo
    Connection class based on an arbitrary file descriptor (Unix only), or
    a socket handle (Windows).
    c                 &     || j                    d S rN   r^   rH   rP   s     r   rP   zConnection._closej      F4<     r   c                 &     || j                    d S rN   r^   r   s     r   rP   zConnection._closeo  r   r   c                 t    t          |          }	  || j        |          }||z  }|dk    rd S ||d          }))NTr   )r   rE   )rH   rm   r   	remainingrq   s        r   _sendzConnection._sendt  sQ    HH		dlC((ANIA~ abb'C	r   c                    t          j                    }| j        }|}|dk    r] |||          }t          |          }|dk    r||k    rt          t          d          |                    |           ||z  }|dk    ]|S )Nr   zgot end of file during message)r   r   rE   r   r   rT   r   )rH   ro   readrm   rI   r   chunkrq   s           r   _recvzConnection._recv}  s    jll	!m 		D++EE

AAv D$ D"N!"BCCCIIeNI !m 		 
r   c                    t          |          }|dk    rkt          j        dd          }t          j        d|          }|                     |           |                     |           |                     |           d S t          j        d|          }|dk    r,|                     |           |                     |           d S |                     ||z              d S )Ni!i!Qi @  )r   structpackr   )rH   rm   rq   
pre_headerheaders        r   rl   zConnection._send_bytes  s    HHz> 	)T2..J[q))FJJz"""JJvJJsOOOOO [q))F5y 
) 

6"""

3 

6C<(((((r   Nc                 D   |                      d          }t          j        d|                                          \  }|dk    r>|                      d          }t          j        d|                                          \  }|||k    rd S |                      |          S )N   r   r      r   )r   r   unpackr{   )rH   r   rm   ro   s       r   rz   zConnection._recv_bytes  s    jjmmdCLLNN332: 	8**Q--CM$77ED 	4'> 	4zz$r   c                 B    t          | g|          }t          |          S rN   )r   r   )rH   r   rs      r   r   zConnection._poll  s    $!!Awwr   rN   )r   r   r   r   r   _multiprocessingclosesocketrP   rx   _writer   _readr(   r[   r   r   r   r   rl   rz   r   r   r   r   r   r   c  s         
  	 0 < 	! 	! 	! 	!!& % " 	! 	! 	! 	!%      %     ) ) ).           r   r   c                   ^    e Zd ZdZddZd Zd Zed             Zed             Z	d	 Z
d
 ZdS )r   z
    Returns a listener object.

    This is a wrapper for a bound socket which is 'listening' for
    connections, or for a Windows named pipe.
    Nr   c                 8   |p|rt          |          pt          }|pt          |          }t          |           |dk    rt	          ||          | _        nt          |||          | _        |$t          |t                    st          d          || _
        d S )Nr   authkey should be a byte string)r@   default_familyr2   r8   PipeListener	_listenerSocketListener
isinstancebytes	TypeError_authkey)rH   r?   r1   backlogauthkeys        r   rL   zListener.__init__  s     #G=W(=(= #" 	6.v66   Y 	F)'7;;DNN+GVWEEDN 	?z'5'A'A 	?=>>>r   c                     | j         t          d          | j                                         }| j        r*t	          || j                   t          || j                   |S )zz
        Accept a connection on the bound socket or named pipe of `self`.

        Returns a `Connection` object.
        Nzlistener is closed)r   rT   acceptr   deliver_challengeanswer_challenge)rH   cs     r   r   zListener.accept  sc     > 	0.///N!!##= 	/a///Q...r   c                 R    | j         }|d| _         |                                 dS dS )zA
        Close the bound socket or named pipe of `self`.
        N)r   r[   )rH   listeners     r   r[   zListener.close  s:     > 	!DNNN	 	r   c                     | j         j        S rN   )r   _addressrQ   s    r   r?   zListener.address  s    ~&&r   c                     | j         j        S rN   )r   _last_acceptedrQ   s    r   last_acceptedzListener.last_accepted  s    ~,,r   c                     | S rN   r   rQ   s    r   r   zListener.__enter__  r   r   c                 .    |                                   d S rN   r   r   s       r   r   zListener.__exit__  r   r   )NNr   N)r   r   r   r   rL   r   r[   r   r?   r  r   r   r   r   r   r   r     s                      ' ' X' - - X-      r   r   c                     |pt          |           }t          |           |dk    rt          |           }nt          |           }|$t	          |t
                    st          d          | t          ||           t          ||           |S )z=
    Returns a connection to the address of a `Listener`
    r   Nr   )	r@   r8   
PipeClientSocketClientr   r   r   r   r   )r?   r1   r   r   s       r   r   r     s     ,|G,,FV "w!! ;:gu#=#= ;9::: &G$$$!W%%%Hr   Tc                    | rt          j                    \  }}|                    d           |                    d           t          |                                          }t          |                                          }n8t          j                    \  }}t          |d          }t          |d          }||fS )L
        Returns pair of connection objects at either end of a pipe
        TFrK   rJ   )r7   
socketpairsetblockingr   detachr(   pipe)duplexs1s2c1c2fd1fd2s          r   r   r     s      		1&((FBNN4   NN4   BIIKK((BBIIKK((BBwyyHCC%000BC%000B2vr   c           
      &   t          d          }| r4t          j        }t          j        t          j        z  }t
          t
          }}n!t          j        }t          j        }dt
          }}t          j        ||t          j        z  t          j	        z  t          j
        t          j        z  t          j        z  d||t          j        t          j                  }t          j        ||dt          j        t          j        t          j        t          j                  }t          j        |t          j        dd           t          j        |d          }|                    d          \  }	}
|
dk    sJ t)          ||           }t)          ||           }||fS )	r
  r   r   r   NTr   r  r  )r2   r   PIPE_ACCESS_DUPLEXGENERIC_READGENERIC_WRITEBUFSIZEPIPE_ACCESS_INBOUNDCreateNamedPipeFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCEPIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE	PIPE_WAITNMPWAIT_WAIT_FOREVERNULL
CreateFileOPEN_EXISTINGSetNamedPipeHandleStateConnectNamedPiper   r   )r  r?   openmodeaccessobsizeibsizeh1h2r   _r   r  r  s                r   r   r     sb    $I.. 	(1H)G,AAF$gFFF2H*FFF$X <<12%(EEvvw;L  VQg.C(',  	'-tT	 	 	 -bTBBB
//553axB000B0002vr   c                   &    e Zd ZdZddZd Zd ZdS )r   zO
    Representation of a socket which is bound to an address and listening
    r   c                    t          j         t          t           |                    | _        	 t          j        dk    r0| j                            t           j        t           j        d           | j                            d           | j        	                    |           | j        
                    |           | j                                        | _        n(# t          $ r | j                                          w xY w|| _        d | _        |dk    r>t#          j        |          s*t#          j        | t          j        |fd          | _        d S d | _        d S )Nposixr   Tr   r   argsexitpriority)r7   r   _socketr(   name
setsockopt
SOL_SOCKETSO_REUSEADDRr  bindlistengetsocknamer   rT   r[   _familyr  r   r>   Finalizeunlink_unlink)rH   r?   r1   r   s       r   rL   zSocketListener.__init__N  sM   }WVV%<%<==	w'! @''(9(.(;Q@ @ @L$$T***Lg&&&L((( L4466DMM 	 	 	L   	 "Y 	 t'H'Q'Q 	 =biwjq  DLLL  DLLLs   B,C %D c                     | j                                         \  }| _        |                    d           t	          |                                          S )NT)r7  r   r  r  r   r  rH   ss     r   r   zSocketListener.acceptg  sE    !%!4!4!6!64	d!((**%%%r   c                     	 | j                                          | j        }|d | _         |             d S d S # | j        }|d | _         |             w w xY wrN   )r7  r[   rB  )rH   rA  s     r   r[   zSocketListener.closel  sx    	L   \F #  \F #s	   9 AN)r   )r   r   r   r   rL   r   r[   r   r   r   r   r   J  sP                2& & &
    r   r   c                 8   t          |           }t          j        t          t          |                    5 }|                    d           |                    |            t          |                                          cddd           S # 1 swxY w Y   dS )zO
    Return a connection object connected to the socket given by `address`
    TN)r@   r7   r   r  connectr   r  )r?   r1   rE  s      r   r  r  v  s     '""F	//	1	1 &Q	d			'!((**%%& & & & & & & & & & & & & & & & & &s   ABBBc                   >    e Zd ZdZddZd	dZd Zed             ZdS )
r   z0
        Representation of a named pipe
        Nc                     || _         |                     d          g| _        d | _        t	          j        d| j                    t	          j        | t          j        | j        | j         fd          | _	        d S )NT)firstz listener created with address=%rr   r4  )
r   _new_handle_handle_queuer  r   	sub_debugr@  r   _finalize_pipe_listenerr[   )rH   r?   r   s      r   rL   zPipeListener.__init__  su    #DM"&"2"2"2">">!?D"&DN=t}MMMl:($-8q  DJJJr   Fc           
      .   t           j        t           j        z  }|r|t           j        z  }t          j        | j        |t           j        t           j        z  t           j        z  t           j	        t          t          t           j        t           j                  S rN   )r   r  r  r   r  r   r!  r"  r#  PIPE_UNLIMITED_INSTANCESr  r$  r%  )rH   rK  flagss      r   rL  zPipeListener._new_handle  sp    .1MME ?>>*u)G,II!"0'7,gl  r   c                 d   | j                             |                                            | j                             d          }	 t	          j        |d          }	 t	          j        |j        gdt                    }n.#  |	                                 t	          j
        |            xY w	 |                    d          \  }}|dk    sJ nR# |                    d          \  }}|dk    sJ w xY w# t          $ r }|j        t          j        k    r Y d }~nd }~ww xY wt          |          S )Nr   Tr   F)rM  appendrL  popr   r)  r   r   r   r   r   r   rT   r   ERROR_NO_DATAr   )rH   rI   r   resr0  r   r   s          r   r   zPipeListener.accept  s^   %%d&6&6&8&8999'++A..F$-fFFF	$!8
E85 5CCIIKKK'///   33D99FAs!8OOOO  33D99FAs!8OOOOOOO    :!66       "&)))s6   C6 !B  C +B,,C "C36
D  DD c                 b    t          j        d|           | D ]}t          j        |           d S )Nz closing listener with address=%r)r   rN  r   r   )queuer?   rI   s      r   rO  z$PipeListener._finalize_pipe_listener  sB    N=wGGG , ,#F++++, ,r   rN   )F)	r   r   r   r   rL   rL  r   staticmethodrO  r   r   r   r   r     sp        	 			 		 		 		
	 
	 
	 
		* 	* 	*. 
	, 	, 
	, 	, 	,r   r   c           	         t                      }	 	 t          j        | d           t          j        | t          j        t          j        z  dt          j        t          j        t          j        t          j                  }nG# t          $ r9}|j
        t          j        t          j        fvst          |          r Y d}~nd}~ww xY wt          j        |t          j        dd           t!          |          S )zU
        Return a connection object connected to the pipe given by `address`
        r     r   N)r   r   WaitNamedPiper&  r  r  r%  r'  r  rT   r   ERROR_SEM_TIMEOUTERROR_PIPE_BUSYr    r(  r"  r   )r?   r   hr   s       r   r  r    s    OO	%gt444&W1G4IIw|W%:0',      :g&?&-&=&? ? BPQRBSBS    	" 	'w,dD	 	 	 a   s   A.B   
C
/B>>C   s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#c                    dd l }t          |t                    s/t          d                    t          |                              t          j        t                    }| 	                    t          |z              |                    ||d                                          }|                     d          }||k    r| 	                    t                     d S | 	                    t                     t!          d          )Nr    Authkey must be bytes, not {0!s}md5   zdigest received was wrong)hmacr   r   r/   formatr:   r(   urandomMESSAGE_LENGTHrr   	CHALLENGEnewdigestr}   WELCOMEFAILUREr	   
connectionr   rf  messagerl  responses         r   r   r     s    KKKgu%% F.55d7mmDDF F 	Fj((G)g-...XXgw..5577F$$S))H6 ?g&&&&&g&&&!"=>>>r   c                 6   dd l }t          |t                    s/t          d                    t          |                              |                     d          }|d t          t                             t          k    sJ d|z              |t          t                    d          }|	                    ||d          
                                }|                     |           |                     d          }|t          k    rt          d          d S )Nr   rc  re  zmessage = %rrd  zdigest sent was rejected)rf  r   r   r/   rg  r:   r}   r   rj  rk  rl  rr   rm  r	   ro  s         r   r   r     s   KKKgu%% F.55d7mmDDF F 	F##C((G?C	NN?#y0JJ.72JJJJc)nnoo&GXXgw..5577F&!!!$$S))H7 >!"<===> >r   c                        e Zd Zd Zd Zd ZdS )ConnectionWrapperc                 |    || _         || _        || _        dD ]#}t          ||          }t	          | ||           $d S )N)rd   r[   r   r}   rr   )_conn_dumps_loadsr   setattr)rH   connru   r   attrrw   s         r   rL   zConnectionWrapper.__init__  sT    
K 	% 	%D$%%CD$$$$$	% 	%r   c                 d    |                      |          }| j                            |           d S rN   )rx  rw  rr   )rH   rw   rE  s      r   rx   zConnectionWrapper.send  s/    KK
a     r   c                 ^    | j                                         }|                     |          S rN   )rw  r}   ry  rD  s     r   r   zConnectionWrapper.recv  s%    J!!##{{1~~r   N)r   r   r   rL   rx   r   r   r   r   ru  ru    sA        % % %! ! !    r   ru  c                 f    t                               | fd d d d                              d          S )Nr   utf-8)	xmlrpclibru   encode)rw   s    r   
_xml_dumpsr    s,    ??C64tQ77>>wGGGr   c                 j    t                               |                     d                    \  \  }}|S )Nr  )r  r   decode)rE  rw   methods      r   
_xml_loadsr    s*    __QXXg%6%677NFSFJr   c                       e Zd Zd ZdS )XmlListenerc                 x    dd l ma t                              |           }t          |t          t                    S Nr   )xmlrpc.clientclientr  r   r   ru  r  r  rv   s     r   r   zXmlListener.accept  s7    ))))))ood## j*===r   N)r   r   r   r   r   r   r   r  r    s#        > > > > >r   r  c                  X    dd l ma t          t	          | i |t
          t                    S r  )r  r  r  ru  r   r  r  )r5  kwdss     r   	XmlClientr  !  s3    %%%%%%VT2T22J
KKKr   c                    t          |           }g }|rt          j        |d|          }|t          k    rnt          |cxk    rt          t          |          z   k     rn n|t          z  }nDt          |cxk    rt          t          |          z   k     rn n|t          z  }nt          d          |                    ||                    ||dz   d          }d}||S )NFzShould not get herer   r   )	listr   r   r   r   r   r   r   rT  )handlesr   LreadyrW  s        r   _exhaustive_waitr  ,  s$    MM 	0E7CCCl" :# : : : :A(> : : : : :}$!S : : : :+;c!ff+D : : : : :''"#8999LL3   #a%&&	AG  	 r   c                   
 |t           }n|dk     rd}nt          |dz  dz             }t          |           } i g }t                      
t                      }	 | D ]B}	 t	          |d          }	 t          j         |            dd          \  }}n*# t          $ r}d|j        }}|t          vr Y d}~nd}~ww xY w|t
          j
        k    r |                    |           ||j        <   |rpt          j                    dd         dk    rQ	 |                    d	          \  }	}n# t          $ r}|j        }Y d}~nd}~ww xY w|st!          |d
          rd|_        
                    |           d}# t&          $ r ||                                <   Y @w xY wt+                                          |          }|D ]}|                                 |D ]}	 |                    d          \  }	}n(# t          $ r}|j        }|t          vr Y d}~nd}~ww xY w|t
          j        k    r?|j                 }
                    |           |dk    rt!          |d
          rd|_        n# |D ]}|                                 |D ]}	 |                    d          \  }	}n(# t          $ r}|j        }|t          vr Y d}~nd}~ww xY w|t
          j        k    r?|j                 }
                    |           |dk    rt!          |d
          rd|_        w xY w
                    fd|D                        
fd| D             S )
        Wait till an object in object_list is ready/readable.

        Returns list of those objects in object_list which are ready/readable.
        Nr   r\  g      ?rd   T   )   r  Fr   c              3   (   K   | ]}|         V  d S rN   r   ).0r`  waithandle_to_objs     r   	<genexpr>zwait.<locals>.<genexpr>  s)      IIa.q1IIIIIIr   c                     g | ]}|v |	S r   r   )r  oready_objectss     r   
<listcomp>zwait.<locals>.<listcomp>  s#    ===a!}*<====r   )r   intr  setr   r   r   rT   r   _ready_errorsr   rT  r   r4   getwindowsversionr   r6   r   addAttributeErrorrD   r  keysr   ERROR_OPERATION_ABORTEDupdate)object_listr   ov_listready_handlesr  rd   r   r   r   r0  r  r  s             @@r   r   r   B  s     	0GGq[ 	0GG'D.3.//G;''6	8  $ $$$Q11F
"")"26688Q"E"ECC" " " ""&
Cm3 "!" " " " "" g66 $r***67)"(33
  <#"7"9"9"1""="G <1)+)?)?)F)F33#* 1 1 1&'j1#& <716J+K+K <7; 4%))!,,,"#7 & 9 9 978%akkmm4449: -->-C-C-E-EwOOM   		  8 833D99FAss   *C-/      '99 8)"(3A!%%a(((ax 8 #1&:;; 837A08	   		  8 833D99FAss   *C-/      '99 8)"(3A!%%a(((ax 8 #1&:;; 837A08  	IIII=IIIIII====;====s   I3 !E92!BI3 
B;B61I3 6B;;AI3 D)(I3 )
E3D?:I3 ?E5I3 9!FI3 F%I3 !G::
HHH3L$J+*L$+
K	5K	L$K	AL$PollSelectorc                    t                      5 }| D ]"}|                    |t          j                   #|+ t	          t
          dt
          j                              |z   }	 |                    |          }|rd |D             cddd           S |?| t	          t
          dt
          j                              z
  }|dk     r|cddd           S q# 1 swxY w Y   dS )r  Nr   Tc                 "    g | ]\  }}|j         S r   )fileobj)r  keyeventss      r   r  zwait.<locals>.<listcomp>  s    CCCMS&CKCCCr   r   )_WaitSelectorregister	selectors
EVENT_READr   r   select)r  r   selectorrw   deadliner  s         r   r   r     sY    __ 	)" = =!!#y';<<<< K>74DI>>@@7J) 00 )CCUCCC	) 	) 	) 	) 	) 	) 	) 	)  )"*-PWT+di-P-P-R-R"R"Q; )#(	) 	) 	) 	) 	) 	) 	) 	))	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   A6C4CCCCc                    |                                  }t          j        |t          j        t          j                  5 }ddlm} |                    |          }t          || j	        | j
        ffcd d d            S # 1 swxY w Y   d S )Nr   )resource_sharer)rd   r7   fromfdr   SOCK_STREAMr&   r  	DupSocketrebuild_connectionrJ   rK   )r{  rI   rE  r  dss        r   reduce_connectionr    s    ]66>63EFF 	J!)))))) **1--B%DM4='II	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	Js   1A==BBc                 p    |                                  }t          |                                 ||          S rN   r  r   )r  rJ   rK   socks       r   r  r    s)    yy{{$++--8<<<r   c                     | j         rt          j        nd| j        rt          j        ndz  }t          j        |                                 |          }t          || j         | j        ffS r  )	rJ   r   FILE_GENERIC_READrK   FILE_GENERIC_WRITEr   	DupHandlerd   rebuild_pipe_connection)r{  r+  dhs      r   reduce_pipe_connectionr    s^    04D7,,115E7--AG 77&T]DM(JJJr   c                 L    |                                  }t          |||          S rN   )r  r   )r  rJ   rK   rI   s       r   r  r    s!    fh999r   c                 z    t          j        |                                           }t          || j        | j        ffS rN   )r   DupFdrd   r  rJ   rK   )r{  dfs     r   r  r    s/    _T[[]]++!Bt}#EEEr   c                 L    |                                  }t          |||          S rN   r  )r  rJ   rK   fds       r   r  r    s!    YY[["h111r   )NN)TrN   )J__all__r   r(   r4   r7   r   r   r,   	itertools_multiprocessr   ImportErrorr&   r   r	   r
   contextr   ForkingPicklerrt   r   r   r   r   r   r5   r  CONNECTION_TIMEOUTcountr+   r   familiesr6   r   r    r2   r8   r@   rB   r   r   objectr   r   r   r   r  r   r  ri  rj  rm  rn  r   r   ru  r  r  r  r  r  r   ERROR_NETNAME_DELETEDr  r   r  r  r  SelectSelectorr  r  r  r  r  r   r   r   <module>r     s   3
2
2 				 				 



        ,,,,,          1 1 1 1 1 1 1 1      *NNNOOOOOOOOOOOOO   
|w GGG  	!!;
769 NH<7 NH - ; ; ; ;5 5 50 0 0&
F 
F 
FF F F&T T T T T T T Tn  OM M M M M M M M`M M M M M M M Mh: : : : :v : : :z   * <7 ;    && & & &X) ) ) ) )V ) ) )X& & & <7 S!6, 6, 6, 6, 6,v 6, 6, 6,p! ! !> 	

? ? ?> > >$       H H H  > > > > >( > > >L L L <7 G)  ( .0MNML> L> L> L> L>` 
 wy.)) 1!.!0) ) ) )6 <7 6J J J= = = Iz#4555K K K
: : : I~'=>>>>>F F F2 2 2 Iz#455555s   + 	77A' 'A=<A=