o
    éT•jÅ{  ã                   @   sú  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	ddl
mZ ddl
mZmZ ddlmZ ejZzddlZddlmZmZmZmZ W n eyb   ejdkr^‚ dZY nw d	Zd
Ze ¡ ZdZdgZeedƒr|dZedg7 ZejdkrˆdZedg7 Zefdd„Z dd„ Z!dd„ Z"dd„ Z#dd„ Z$G dd„ dƒZ%er¯G dd„ de%ƒZ&G dd„ de%ƒZ'G dd„ de(ƒZ)dPd d!„Z*ejdkrÏdQd#d$„Z+ndQd%d$„Z+G d&d'„ d'e(ƒZ,d(d)„ Z-ejdkrñG d*d+„ d+e(ƒZ.d,d-„ Z/d.Z0d/Z1d0Z2d1Z3d2d3„ Z4d4d5„ Z5G d6d7„ d7e(ƒZ6d8d9„ Z7d:d;„ Z8G d<d=„ d=e)ƒZ9d>d?„ Z:ejdk�r3d@dA„ Z;ej<ej=hZ>dRdBdC„Z?nddl@Z@ee@dDƒ�rAe@jAZBne@jCZBdRdEdC„Z?ejdk�rmdFdG„ ZDdHdI„ ZEe Fe'eD¡ dJdK„ ZGdLdM„ ZHe Fe&eG¡ dS dNdG„ ZDdOdI„ ZEe Fe'eD¡ dS )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                 C   s   t  ¡ |  S ©N©ÚtimeÚ	monotonic)Útimeout© r   ú1/usr/lib/python3.10/multiprocessing/connection.pyÚ_init_timeout;   ó   r   c                 C   s   t  ¡ | kS r   r   )Útr   r   r   Ú_check_timeout>   r   r   c                 C   sT   | dkrdS | dkrt jdt ¡ d�S | dkr&t jdt ¡ ttƒf dd�S td	ƒ‚)
z?
    Return an arbitrary free address for the given family
    r   )Ú	localhostr   r   z	listener-)ÚprefixÚdirr   z\\.\pipe\pyc-%d-%d-Ú zunrecognized family)	ÚtempfileÚmktempr   Úget_temp_dirÚosÚgetpidÚnextÚ_mmap_counterÚ
ValueError©Úfamilyr   r   r   Úarbitrary_addressE   s   ÿÿr,   c                 C   sR   t jdkr| dkrtd|  ƒ‚t jdkr#| dkr%tt| ƒs'td|  ƒ‚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Úsocketr*   r   r   r   Ú_validate_familyS   s   
ýr1   c                 C   sP   t | ƒtkrdS t | ƒtu r|  d¡rdS t | ƒtu s t | ¡r"dS td|  ƒ‚)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)   )Úaddressr   r   r   Úaddress_type_   s   r8   c                   @   s¾   e Zd ZdZd+dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	e
dd„ ƒZe
dd„ ƒZe
dd„ ƒZdd„ Zdd„ Zd,dd„Zdd„ Zd-dd„Zd.d d!„Zd"d#„ Zd/d%d&„Zd'd(„ Zd)d*„ ZdS )0Ú_ConnectionBaseNTc                 C   s>   |  ¡ }|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Úwritabler   r   r   Ú__init__u   s   ÿ
z_ConnectionBase.__init__c                 C   s   | j d ur|  ¡  d S d S r   ©r;   Ú_close©r>   r   r   r   Ú__del__‚   s   
ÿz_ConnectionBase.__del__c                 C   s   | j d u r	tdƒ‚d S )Nzhandle is closed)r;   ÚOSErrorrE   r   r   r   Ú_check_closed†   s   
ÿz_ConnectionBase._check_closedc                 C   ó   | j stdƒ‚d S )Nzconnection is write-only)r<   rG   rE   r   r   r   Ú_check_readableŠ   ó   ÿz_ConnectionBase._check_readablec                 C   rI   )Nzconnection is read-only)r=   rG   rE   r   r   r   Ú_check_writableŽ   rK   z_ConnectionBase._check_writablec                 C   s$   | j r
d| _tdƒ‚|  ¡  tdƒ‚)NFzbad message length)r=   r<   ÚcloserG   rE   r   r   r   Ú_bad_message_length’   s
   ÿz#_ConnectionBase._bad_message_lengthc                 C   s
   | j du S )z True if the connection is closedN©r;   rE   r   r   r   Úclosed™   s   
z_ConnectionBase.closedc                 C   ó   | j S )z"True if the connection is readable)r<   rE   r   r   r   r@   ž   ó   z_ConnectionBase.readablec                 C   rQ   )z"True if the connection is writable)r=   rE   r   r   r   rA   £   rR   z_ConnectionBase.writablec                 C   s   |   ¡  | jS )z+File descriptor or handle of the connection)rH   r;   rE   r   r   r   Úfileno¨   s   z_ConnectionBase.filenoc                 C   s,   | j durz
|  ¡  W d| _ dS d| _ w dS )zClose the connectionNrC   rE   r   r   r   rM   ­   s
   

üz_ConnectionBase.closer   c                 C   s¦   |   ¡  |  ¡  t|ƒ}|jdkrtt|ƒƒ}t|ƒ}|dk r#tdƒ‚||k r+tdƒ‚|du r4|| }n|dk r<tdƒ‚|| |krFtdƒ‚|  |||| … ¡ dS )z,Send the bytes data from a bytes-like objectr   r   zoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rH   rL   Ú
memoryviewÚitemsizeÚbytesÚlenr)   Ú_send_bytes)r>   ÚbufÚoffsetÚsizeÚmÚnr   r   r   Ú
send_bytesµ   s"   

z_ConnectionBase.send_bytesc                 C   s$   |   ¡  |  ¡  |  t |¡¡ dS )zSend a (picklable) objectN)rH   rL   rX   Ú_ForkingPicklerÚdumps©r>   Úobjr   r   r   ÚsendÊ   s   z_ConnectionBase.sendc                 C   sJ   |   ¡  |  ¡  |dur|dk rtdƒ‚|  |¡}|du r!|  ¡  | ¡ S )z7
        Receive bytes data as a bytes object.
        Nr   znegative maxlength)rH   rJ   r)   Ú_recv_bytesrN   Úgetvalue)r>   Ú	maxlengthrY   r   r   r   Ú
recv_bytesÐ   s   
z_ConnectionBase.recv_bytesc                 C   sÂ   |   ¡  |  ¡  t|ƒ�K}|j}|t|ƒ }|dk rtdƒ‚||kr&tdƒ‚|  ¡ }| ¡ }||| k r:t| 	¡ ƒ‚| 
d¡ | ||| || | … ¡ |W  d  ƒ S 1 sZw   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)rH   rJ   rT   rU   rW   r)   rd   Útellr	   re   ÚseekÚreadinto)r>   rY   rZ   r\   rU   ÚbytesizeÚresultr[   r   r   r   Úrecv_bytes_intoÝ   s&   


ÿ$ðz_ConnectionBase.recv_bytes_intoc                 C   s&   |   ¡  |  ¡  |  ¡ }t | ¡ ¡S )zReceive a (picklable) object)rH   rJ   rd   r_   ÚloadsÚ	getbuffer)r>   rY   r   r   r   Úrecvö   s   z_ConnectionBase.recvç        c                 C   s   |   ¡  |  ¡  |  |¡S )z/Whether there is any input available to be read)rH   rJ   Ú_poll©r>   r   r   r   r   Úpollý   s   
z_ConnectionBase.pollc                 C   ó   | S r   r   rE   r   r   r   Ú	__enter__  ó   z_ConnectionBase.__enter__c                 C   ó   |   ¡  d S r   ©rM   ©r>   Úexc_typeÚ	exc_valueÚexc_tbr   r   r   Ú__exit__  r   z_ConnectionBase.__exit__)TT)r   Nr   )r   )rq   )Ú__name__Ú
__module__Ú__qualname__r;   rB   rF   rH   rJ   rL   rN   ÚpropertyrP   r@   rA   rS   rM   r^   rc   rg   rm   rp   rt   rv   r~   r   r   r   r   r9   r   s0    







r9   c                   @   sD   e Zd ZdZdZejfdd„Zdd„ Zddd	„Z	d
d„ Z
d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                 C   ó   || j ƒ d S r   rO   )r>   Ú_CloseHandler   r   r   rD     ó   zPipeConnection._closec              	   C   s˜   t j| j|dd�\}}z(z|t jkr!t  |jgdt¡}|tks!J ‚W n   | ¡  ‚ W | 	d¡\}}n| 	d¡\}}w |dksBJ ‚|t
|ƒksJJ ‚d S )NT©Ú
overlappedFr   )Ú_winapiÚ	WriteFiler;   ÚERROR_IO_PENDINGÚWaitForMultipleObjectsÚeventr   r   ÚcancelÚGetOverlappedResultrW   )r>   rY   ÚovÚerrÚwaitresÚnwrittenr   r   r   rX     s   

ÿ€€ zPipeConnection._send_bytesNc           	   
   C   sh  | j r
d| _ t ¡ S |d u rdnt|dƒ}z‰tj| j|dd�\}}zFz|tjkr7t |j	gdt
¡}|tks7J ‚W n   | ¡  ‚ W | d¡\}}|dkr[t ¡ }| | ¡ ¡ |W S |tjkrg|  ||¡W S n2| d¡\}}|dkr‡t ¡ }| | ¡ ¡ |     Y W S |tjkr™|  ||¡     Y W S w W tdƒ‚ ty³ } z	|jtjkr®t‚‚ d }~ww )NFé€   Tr‡   r   z.shouldn't get here; expected KeyboardInterrupt)Ú_got_empty_messageÚioÚBytesIOÚminr‰   ÚReadFiler;   r‹   rŒ   r�   r   r   rŽ   r�   Úwritero   ÚERROR_MORE_DATAÚ_get_more_datarG   ÚwinerrorÚERROR_BROKEN_PIPEÚEOFErrorÚRuntimeError)	r>   ÚmaxsizeÚbsizer�   r‘   r’   ÚnreadÚfÚer   r   r   rd   &  sT   

ÿ

ÿ€€
ÿû
ÿû€üzPipeConnection._recv_bytesc                 C   s.   | j st | j¡d dkrdS tt| g|ƒƒS )Nr   T)r•   r‰   ÚPeekNamedPiper;   Úboolr   rs   r   r   r   rr   F  s   zPipeConnection._pollc                 C   s¤   |  ¡ }t ¡ }| |¡ t | j¡d }|dksJ ‚|d ur+t|ƒ| |kr+|  ¡  tj	| j|dd�\}}| 
d¡\}}|dksCJ ‚||ksIJ ‚| |  ¡ ¡ |S )Nr   r   Tr‡   )ro   r–   r—   rš   r‰   r¦   r;   rW   rN   r™   r�   )r>   r�   r¡   rY   r¤   Úleftr‘   Úrbytesr   r   r   rœ   L  s   
zPipeConnection._get_more_datar   )r   r€   r�   Ú__doc__r•   r‰   ÚCloseHandlerD   rX   rd   rr   rœ   r   r   r   r   rƒ     s    
 rƒ   c                   @   s|   e Zd ZdZerejfdd„ZejZ	ej
Znejfdd„ZejZ	ejZe	fdd„Zefdd„Zd	d
„ Zddd„Zdd„ ZdS )Ú
Connectionzo
    Connection class based on an arbitrary file descriptor (Unix only), or
    a socket handle (Windows).
    c                 C   r„   r   rO   ©r>   rD   r   r   r   rD   c  r†   zConnection._closec                 C   r„   r   rO   r­   r   r   r   rD   h  r†   c                 C   s8   t |ƒ}	 || j|ƒ}||8 }|dkrd S ||d … }q)NTr   )rW   r;   )r>   rY   rš   Ú	remainingr]   r   r   r   Ú_sendm  s   ûzConnection._sendc                 C   sf   t  ¡ }| j}|}|dkr1|||ƒ}t|ƒ}|dkr$||kr t‚tdƒ‚| |¡ ||8 }|dks|S )Nr   zgot end of file during message)r–   r—   r;   rW   rŸ   rG   rš   )r>   r[   ÚreadrY   r?   r®   Úchunkr]   r   r   r   Ú_recvv  s   

÷
zConnection._recvc                 C   sˆ   t |ƒ}|dkr%t dd¡}t d|¡}|  |¡ |  |¡ |  |¡ d S t d|¡}|dkr;|  |¡ |  |¡ d S |  || ¡ d S )Niÿÿÿú!iéÿÿÿÿú!Qi @  )rW   ÚstructÚpackr¯   )r>   rY   r]   Ú
pre_headerÚheaderr   r   r   rX   †  s   


zConnection._send_bytesNc                 C   s^   |   d¡}t d| ¡ ¡\}|dkr |   d¡}t d| ¡ ¡\}|d ur*||kr*d S |   |¡S )Né   r³   r´   é   rµ   )r²   r¶   Úunpackre   )r>   r¡   rY   r[   r   r   r   rd   �  s   


zConnection._recv_bytesc                 C   s   t | g|ƒ}t|ƒS r   )r   r§   )r>   r   Úrr   r   r   rr   §  s   zConnection._pollr   )r   r€   r�   rª   r‰   Ú_multiprocessingÚclosesocketrD   rc   Ú_writerp   Ú_readr%   rM   rš   r°   r¯   r²   rX   rd   rr   r   r   r   r   r¬   \  s    	

r¬   c                   @   sR   e Zd ZdZddd„Zdd„ Zdd	„ Zed
d„ ƒZedd„ ƒZ	dd„ Z
d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                 C   sp   |p	|rt |ƒp	t}|pt|ƒ}t|ƒ |dkrt||ƒ| _nt|||ƒ| _|d ur3t|tƒs3t	dƒ‚|| _
d S )Nr   úauthkey should be a byte string)r8   Údefault_familyr,   r1   ÚPipeListenerÚ	_listenerÚSocketListenerÚ
isinstancerV   Ú	TypeErrorÚ_authkey)r>   r7   r+   ÚbacklogÚauthkeyr   r   r   rB   ·  s   ÿ
zListener.__init__c                 C   s>   | j du r	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Å   rG   ÚacceptrÉ   Údeliver_challengeÚanswer_challenge)r>   Úcr   r   r   rÌ   Ç  s   

zListener.acceptc                 C   s$   | j }|durd| _ | ¡  dS dS )zA
        Close the bound socket or named pipe of `self`.
        N)rÅ   rM   )r>   Úlistenerr   r   r   rM   Õ  s
   þzListener.closec                 C   ó   | j jS r   )rÅ   Ú_addressrE   r   r   r   r7   Þ  ó   zListener.addressc                 C   rÑ   r   )rÅ   Ú_last_acceptedrE   r   r   r   Úlast_acceptedâ  rÓ   zListener.last_acceptedc                 C   ru   r   r   rE   r   r   r   rv   æ  rw   zListener.__enter__c                 C   rx   r   ry   rz   r   r   r   r~   é  r   zListener.__exit__)NNr   N)r   r€   r�   rª   rB   rÌ   rM   r‚   r7   rÕ   rv   r~   r   r   r   r   r   °  s    
	

r   c                 C   sh   |pt | ƒ}t|ƒ |dkrt| ƒ}nt| ƒ}|dur$t|tƒs$tdƒ‚|dur2t||ƒ t||ƒ |S )z=
    Returns a connection to the address of a `Listener`
    r   NrÂ   )	r8   r1   Ú
PipeClientÚSocketClientrÇ   rV   rÈ   rÎ   rÍ   )r7   r+   rË   rÏ   r   r   r   r   í  s   


r   Tc                 C   sp   | r"t  ¡ \}}| d¡ | d¡ t| ¡ ƒ}t| ¡ ƒ}||fS t ¡ \}}t|dd�}t|dd�}||fS )úL
        Returns pair of connection objects at either end of a pipe
        TF©rA   ©r@   )r0   Ú
socketpairÚsetblockingr¬   Údetachr%   Úpipe)ÚduplexÚs1Ús2Úc1Úc2Úfd1Úfd2r   r   r   r     s   

ür   c              
   C   sî   t dƒ}| rtj}tjtjB }tt}}ntj}tj}dt}}t ||tjB tj	B tj
tjB tjB d||tjtj¡}t ||dtjtjtjtj¡}t |tjdd¡ tj|dd�}| d¡\}	}
|
dksgJ ‚t|| d�}t|| d�}||fS )	rØ   r   r   r   NTr‡   rÙ   rÚ   )r,   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ß   r7   ÚopenmodeÚaccessÚobsizeÚibsizeÚh1Úh2rˆ   Ú_r‘   râ   rã   r   r   r   r     s>   

ÿ
ÿ
ù	þ
ÿc                   @   s*   e Zd ZdZd
dd„Zdd„ Zdd„ Zd	S )rÆ   zO
    Representation of a socket which is bound to an address and listening
    r   c                 C   sÄ   t   tt |ƒ¡| _z)tjdkr| j t jt jd¡ | j d¡ | j 	|¡ | j 
|¡ | j ¡ | _W n ty?   | j ¡  ‚ w || _d | _|dkr]t |¡s]tj| tj|fdd�| _d S d | _d S )NÚposixr   Tr   r   ©ÚargsÚexitpriority)r0   ÚgetattrÚ_socketr%   ÚnameÚ
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRrÜ   ÚbindÚlistenÚgetsocknamerÒ   rG   rM   Ú_familyrÔ   r   r6   ÚFinalizeÚunlinkÚ_unlink)r>   r7   r+   rÊ   r   r   r   rB   G  s*   

ÿ
þÿ
zSocketListener.__init__c                 C   s&   | j  ¡ \}| _| d¡ t| ¡ ƒS )NT)r  rÌ   rÔ   rÜ   r¬   rÝ   ©r>   Úsr   r   r   rÌ   `  s   
zSocketListener.acceptc                 C   sN   z| j  ¡  W | j}|d urd | _|ƒ  d S d S | j}|d ur&d | _|ƒ  w w r   )r  rM   r  )r>   r  r   r   r   rM   e  s   
þÿþzSocketListener.closeN)r   )r   r€   r�   rª   rB   rÌ   rM   r   r   r   r   rÆ   C  s
    
rÆ   c                 C   s\   t | ƒ}t tt|ƒ¡�}| d¡ | | ¡ t| ¡ ƒW  d  ƒ S 1 s'w   Y  dS )zO
    Return a connection object connected to the socket given by `address`
    TN)r8   r0   r  rÜ   Úconnectr¬   rÝ   )r7   r+   r  r   r   r   r×   o  s   


$ýr×   c                   @   s8   e Zd ZdZddd„Zddd„Zdd	„ Zed
d„ ƒZdS )rÄ   z0
        Representation of a named pipe
        Nc                 C   sL   || _ | jdd�g| _d | _t d| j ¡ tj| tj| j| j fdd�| _	d S )NT)Úfirstz listener created with address=%rr   rÿ   )
rÒ   Ú_new_handleÚ_handle_queuerÔ   r   Ú	sub_debugr  rÄ   Ú_finalize_pipe_listenerrM   )r>   r7   rÊ   r   r   r   rB   ƒ  s   þzPipeListener.__init__Fc              
   C   sH   t jt jB }|r|t jO }t  | j|t jt jB t jB t j	t
t
t jt j¡S r   )r‰   ræ   rì   rí   rë   rÒ   rî   rï   rð   ÚPIPE_UNLIMITED_INSTANCESré   rñ   rò   )r>   r  Úflagsr   r   r   r  Ž  s   

ÿûzPipeListener._new_handlec              
   C   sÜ   | j  |  ¡ ¡ | j  d¡}z	tj|dd�}W n ty3 } z|jtjkr&‚ W Y d }~t|ƒS d }~ww z+zt 	|j
gdt¡}W n   | ¡  t |¡ ‚ W | d¡\}}|dks\J ‚t|ƒS | d¡\}}|dksmJ ‚w )Nr   Tr‡   F)r  Úappendr  Úpopr‰   rö   rG   r�   ÚERROR_NO_DATArŒ   r�   r   rŽ   r«   r�   rƒ   )r>   r?   r�   r¥   Úresrý   r‘   r   r   r   rÌ   š  s2   
ÿ€ð
ÿ
ûþzPipeListener.acceptc                 C   s$   t  d|¡ | D ]}t |¡ qd S )Nz closing listener with address=%r)r   r  r‰   r«   )Úqueuer7   r?   r   r   r   r  ±  s   ÿz$PipeListener._finalize_pipe_listenerr   )F)	r   r€   r�   rª   rB   r  rÌ   Ústaticmethodr  r   r   r   r   rÄ     s    

rÄ   c              
   C   sž   t ƒ }	 zt | d¡ t | tjtjB dtjtjtjtj¡}W n  t	y? } z|j
tjtjfvs4t|ƒr5‚ W Y d}~nd}~ww nqt |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ì   rG   r�   ÚERROR_SEM_TIMEOUTÚERROR_PIPE_BUSYr   rõ   rï   rƒ   )r7   r   Úhr¥   r   r   r   rÖ   ·  s2   
ýÿÿþ€ÿó
ÿrÖ   é   s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#c                 C   s€   dd l }t|tƒstd t|ƒ¡ƒ‚t t¡}|  	t
| ¡ | ||d¡ ¡ }|  d¡}||kr7|  	t¡ d S |  	t¡ tdƒ‚)Nr   ú Authkey must be bytes, not {0!s}Úmd5é   zdigest received was wrong)ÚhmacrÇ   rV   r)   Úformatr2   r%   ÚurandomÚMESSAGE_LENGTHr^   Ú	CHALLENGEÚnewÚdigestrg   ÚWELCOMEÚFAILUREr   ©Ú
connectionrË   r(  Úmessager.  Úresponser   r   r   rÍ   Ü  s   
ÿ


rÍ   c                 C   s˜   dd l }t|tƒstd t|ƒ¡ƒ‚|  d¡}|d ttƒ… tks'J d| ƒ‚|ttƒd … }| 	||d¡ 
¡ }|  |¡ |  d¡}|tkrJtdƒ‚d S )Nr   r%  r'  zmessage = %rr&  zdigest sent was rejected)r(  rÇ   rV   r)   r)  r2   rg   rW   r,  r-  r.  r^   r/  r   r1  r   r   r   rÎ   ë  s   
ÿ
 

ÿrÎ   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚConnectionWrapperc                 C   s6   || _ || _|| _dD ]}t||ƒ}t| ||ƒ qd S )N)rS   rM   rt   rg   r^   )Ú_connÚ_dumpsÚ_loadsr  Úsetattr)r>   Úconnr`   rn   Úattrrb   r   r   r   rB   þ  s   
þzConnectionWrapper.__init__c                 C   s   |   |¡}| j |¡ d S r   )r7  r6  r^   )r>   rb   r  r   r   r   rc     s   
zConnectionWrapper.sendc                 C   s   | j  ¡ }|  |¡S r   )r6  rg   r8  r  r   r   r   rp     s   

zConnectionWrapper.recvN)r   r€   r�   rB   rc   rp   r   r   r   r   r5  ý  s    r5  c                 C   s   t  | fd d d d¡ d¡S )Nr   úutf-8)Ú	xmlrpclibr`   Úencode)rb   r   r   r   Ú
_xml_dumps  s   r?  c                 C   s   t  |  d¡¡\\}}|S )Nr<  )r=  rn   Údecode)r  rb   Úmethodr   r   r   Ú
_xml_loads  s   rB  c                   @   s   e Zd Zdd„ ZdS )ÚXmlListenerc                 C   s"   dd l ma t | ¡}t|ttƒS ©Nr   )Úxmlrpc.clientÚclientr=  r   rÌ   r5  r?  rB  ra   r   r   r   rÌ     s   
zXmlListener.acceptN)r   r€   r�   rÌ   r   r   r   r   rC    s    rC  c                  O   s"   dd l ma tt| i |¤ŽttƒS rD  )rE  rF  r=  r5  r   r?  rB  )r   Úkwdsr   r   r   Ú	XmlClient  s   rH  c                 C   s¸   t | ƒ}g }|rZt |d|¡}|tkr	 |S t|  kr$tt|ƒ k r+n n|t8 }nt|  kr9tt|ƒ k rCn tdƒ‚|t8 }ntdƒ‚| || ¡ ||d d … }d}|s|S )NFzShould not get herer   r   )	Úlistr‰   rŒ   r   r   rW   r   r    r  )Úhandlesr   ÚLÚreadyr  r   r   r   Ú_exhaustive_wait%  s$   
 ÷

þôrM  c           
         sô  |du rt }n|dk rd}nt|d d ƒ}t| ƒ} i ‰g }tƒ ‰ tƒ }zë| D ]�}zt|dƒ}W n ty?   |ˆ| ¡ < Y q'w zt |ƒ dd¡\}}W n t	yi } zd|j
}}|tvr_‚ W Y d}~nd}~ww |tjkrz| |¡ |ˆ|j< q'|r¯t ¡ dd… dkr¯z	| d	¡\}	}W n t	y¤ } z	|j
}W Y d}~nd}~ww |s¯t|d
ƒr¯d|_ˆ  |¡ d}q'tˆ ¡ |ƒ}W |D ]}| ¡  qÁ|D ]D}z	| d¡\}	}W n t	yï } z|j
}|tvrå‚ W Y d}~nd}~ww |tjk�rˆ|j }ˆ  |¡ |dk�rt|d
ƒ�rd|_qÊnU|D ]}| ¡  �q|D ]G}z	| d¡\}	}W n t	�yC } z|j
}|tv�r9‚ W Y d}~nd}~ww |tjk�rbˆ|j }ˆ  |¡ |dk�rbt|d
ƒ�rbd|_�qw ˆ  ‡fdd„|D ƒ¡ ‡ fd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      à?rS   Té   )é   rO  Fr•   c                 3   s   � | ]}ˆ | V  qd S r   r   )Ú.0r#  )Úwaithandle_to_objr   r   Ú	<genexpr>†  s   € zwait.<locals>.<genexpr>c                    s   g | ]}|ˆ v r|‘qS r   r   )rQ  Úo)Úready_objectsr   r   Ú
<listcomp>‡  s    úwait.<locals>.<listcomp>)r   ÚintrI  Úsetr  ÚAttributeErrorr:   r‰   r™   rG   r�   Ú_ready_errorsr‹   r  r�   r-   Úgetwindowsversionr�   r/   r•   ÚaddrM  ÚkeysrŽ   ÚERROR_OPERATION_ABORTEDÚupdate)
Úobject_listr   Úov_listÚready_handlesrT  rS   r�   r‘   r¥   rý   r   )rU  rR  r   r   ;  s¦   ÿÿ€þ

€ÿ

ÿ€þ


€òü
ÿ€þ


€òr   ÚPollSelectorc                 C   s¤   t ƒ �E}| D ]	}| |tj¡ q|durt ¡ | }	 | |¡}|r0dd„ |D ƒW  d  ƒ S |durG|t ¡  }|dk rG|W  d  ƒ S q1 sKw   Y  dS )rN  NTc                 S   s   g | ]\}}|j ‘qS r   )Úfileobj)rQ  ÚkeyÚeventsr   r   r   rV  ¥  s    rW  r   )Ú_WaitSelectorÚregisterÚ	selectorsÚ
EVENT_READr   r   Úselect)ra  r   Úselectorrb   ÚdeadlinerL  r   r   r   r   •  s"   
öñùc                 C   sf   |   ¡ }t |tjtj¡�}ddlm} | |¡}t|| j	| j
ffW  d   ƒ S 1 s,w   Y  d S )Nr   )Úresource_sharer)rS   r0   Úfromfdr   ÚSOCK_STREAMr!   ro  Ú	DupSocketÚrebuild_connectionr@   rA   )r:  r?   r  ro  Údsr   r   r   Úreduce_connection±  s   
$ýru  c                 C   s   |   ¡ }t|  ¡ ||ƒS r   ©rÝ   r¬   )rt  r@   rA   Úsockr   r   r   rs  ·  s   rs  c                 C   sB   | j rtjnd| jrtjndB }t |  ¡ |¡}t|| j | jffS rD  )	r@   r‰   ÚFILE_GENERIC_READrA   ÚFILE_GENERIC_WRITEr
   Ú	DupHandlerS   Úrebuild_pipe_connection)r:  rø   Údhr   r   r   Úreduce_pipe_connection¼  s
   ÿr}  c                 C   ó   |   ¡ }t|||ƒS r   )rÝ   rƒ   )r|  r@   rA   r?   r   r   r   r{  Á  ó   r{  c                 C   s    t  |  ¡ ¡}t|| j| jffS r   )r
   ÚDupFdrS   rs  r@   rA   )r:  Údfr   r   r   ru  Ç  s   c                 C   r~  r   rv  )r�  r@   rA   Úfdr   r   r   rs  Ê  r  )NN)Tr   )IÚ__all__r–   r%   r-   r0   r¶   r   r"   Ú	itertoolsr¾   r!   r   r   r	   Úcontextr
   ÚForkingPicklerr_   r‰   r   r   r   r   ÚImportErrorr.   ré   ÚCONNECTION_TIMEOUTÚcountr(   rÃ   Úfamiliesr/   r   r   r,   r1   r8   r9   rƒ   r¬   Úobjectr   r   r   rÆ   r×   rÄ   rÖ   r+  r,  r/  r0  rÍ   rÎ   r5  r?  rB  rC  rH  rM  rž   ÚERROR_NETNAME_DELETEDr[  r   rj  rd  rh  ÚSelectSelectorru  rs  ri  r}  r{  r   r   r   r   Ú<module>   s¦   	
ý	



 PT
=

,,
8	P
