
    F\h                        / S Q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rSSKrSSK	r	SSK
Jr  SSK
JrJr  SSKJr  \R                   r SSKrSSKrSSKJrJrJrJr  S	rS
r\	R8                  " 5       rSrS/r\ " \S5      (       a  Sr\S/-  r\R2                  S:X  a  Sr\S/-  r\4S jr!S r"S r#S r$S r% " S S5      r&\(       a   " S S\&5      r' " S S\&5      r( " S S\)5      r*SCS jr+\R2                  S:w  a  SDS jr,OSDS jr, " S S\)5      r-S  r.\R2                  S:X  a   " S! S"\)5      r/S# r0S$r1S%r2S&r3S'r4\5" 1 S(k5      r6\7" S) \6 5       5      r8S*r9S+r:\9\:4r;S, r<S- r=S. r>SES/\?4S0 jjr@S/\?4S1 jrA " S2 S3\)5      rBS4 rCS5 rD " S6 S7\*5      rES8 rF\R2                  S:X  a!  S9 rG\R                  \R                  1rJSFS: jrKO0SSKLrL\ " \LS;5      (       a  \LR                  rNO\LR                  rNSFS< jrK\R2                  S:X  a3  S= rPS> rQ\R                  " \(\P5        S? rSS@ rT\R                  " \'\S5        gSA rPSB rQ\R                  " \(\P5        g! \ a    \R2                  S:X  a  e Sr GNf = f)G)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                 2    [         R                  " 5       U -   $ Ntime	monotonic)timeouts    1/usr/lib/python3.13/multiprocessing/connection.py_init_timeoutr   <   s    >>g%%    c                 2    [         R                  " 5       U :  $ r   r   )ts    r   _check_timeoutr   ?   s    >>ar   c                    U S:X  a  gU S:X  a(  [         R                  " S[        R                  " 5       S9$ U S:X  a:  [         R                  " S[        R
                  " 5       [        [        5      4-  SS9$ [        S	5      e)
z7
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familys    r   arbitrary_addressr/   F   sy     	9	kt7H7H7JKK	9	&< "		T--@A'BGIK 	K .//r   c                     [         R                  S:w  a  U S:X  a  [        SU -  5      e[         R                  S:X  a+  U S:X  a$  [        [        U 5      (       d  [        SU -  5      eggg)z<
Checks if the family is valid for the current environment.
r   r   zFamily %s is not recognized.r   N)sysplatformr,   hasattrsocketr-   s    r   _validate_familyr5   T   sf     ||w6Y#67&@AA
||w6Y#6vv&&;fDEE ' $7r   c                     [        U 5      [        :X  a  g[        U 5      [        L a  U R                  S5      (       a  g[        U 5      [        L d  [        R
                  " U 5      (       a  g[        SU -  5      e)zQ
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=   `   sb     G}	g#	'"4"4V"<"<	g#	!B!B7!K!K:WDEEr   c                       \ rS rSrSrSS jrS rS rS rS r	S r
\S	 5       r\S
 5       r\S 5       rS rS rSS jrS rSS jrSS jrS rSS jrS rS rSrg)_ConnectionBases   Nc                     UR                  5       nUS:  a  [        S5      eU(       d  U(       d  [        S5      eXl        X l        X0l        g )Nr   zinvalid handlez6at least one of `readable` and `writable` must be True)	__index__r,   _handle	_readable	_writable)selfhandlereadablewritables       r   __init___ConnectionBase.__init__v   sI    !!#A:-..HJ J!!r   c                 @    U R                   b  U R                  5         g g r   rC   _closerF   s    r   __del___ConnectionBase.__del__   s    <<#KKM $r   c                 4    U R                   c  [        S5      eg )Nhandle is closed)rC   OSErrorrO   s    r   _check_closed_ConnectionBase._check_closed   s    <<,--  r   c                 <    U R                   (       d  [        S5      eg )Nzconnection is write-only)rD   rT   rO   s    r   _check_readable_ConnectionBase._check_readable   s    ~~455 r   c                 <    U R                   (       d  [        S5      eg )Nzconnection is read-only)rE   rT   rO   s    r   _check_writable_ConnectionBase._check_writable   s    ~~344 r   c                 j    U R                   (       a  SU l        OU R                  5         [        S5      e)NFzbad message length)rE   rD   closerT   rO   s    r   _bad_message_length#_ConnectionBase._bad_message_length   s%    >>"DNJJL*++r   c                     U R                   SL $ )z True if the connection is closedNrC   rO   s    r   closed_ConnectionBase.closed   s     ||t##r   c                     U R                   $ )z"True if the connection is readable)rD   rO   s    r   rH   _ConnectionBase.readable        ~~r   c                     U R                   $ )z"True if the connection is writable)rE   rO   s    r   rI   _ConnectionBase.writable   rg   r   c                 :    U R                  5         U R                  $ )z+File descriptor or handle of the connection)rU   rC   rO   s    r   fileno_ConnectionBase.fileno   s    ||r   c                 h    U R                   b   U R                  5         SU l         gg! SU l         f = f)zClose the connectionNrM   rO   s    r   r^   _ConnectionBase.close   s1    <<#$#	 $  $s   ( 	1c                 x   U R                  5         U R                  5         [        U5      nUR                  S:  a  UR	                  S5      nUR
                  nUS:  a  [        S5      eXR:  a  [        S5      eUc  XR-
  nO$US:  a  [        S5      eX#-   U:  a  [        S5      eU R                  XBX#-    5        g)	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   r[   
memoryviewitemsizecastnbytesr,   _send_bytes)rF   bufoffsetsizemns         r   
send_bytes_ConnectionBase.send_bytes   s    sO::>sAHHA:122:566<:DAX/00]Q<==&-01r   c                     U R                  5         U R                  5         U R                  [        R	                  U5      5        g)zSend a (picklable) objectN)rU   r[   ru   _ForkingPicklerdumpsrF   objs     r   send_ConnectionBase.send   s3    ..s34r   c                     U R                  5         U R                  5         Ub  US:  a  [        S5      eU R                  U5      nUc  U R	                  5         UR                  5       $ )z'
Receive bytes data as a bytes object.
r   znegative maxlength)rU   rX   r,   _recv_bytesr_   getvalue)rF   	maxlengthrv   s      r   
recv_bytes_ConnectionBase.recv_bytes   sa     	 Y]122y);$$&||~r   c                    U R                  5         U R                  5         [        U5       nUR                  nU[	        U5      -  nUS:  a  [        S5      eX%:  a  [        S5      eU R                  5       nUR                  5       nXRU-   :  a  [        UR                  5       5      eUR                  S5        UR                  X2U-  X'-   U-   5        UsSSS5        $ ! , (       d  f       g= f)zY
Receive bytes data into a writeable bytes-like object.
Return the number of bytes read.
r   znegative offsetzoffset too largeN)rU   rX   rq   rr   lenr,   r   tellr
   r   seekreadinto)rF   rv   rw   ry   rr   bytesizeresultrx   s           r   recv_bytes_into_ConnectionBase.recv_bytes_into   s    
 	_zzH#a&(Hz !233" !344%%'F;;=D4-'$V__%677KKNOOA0%}9; <! __s   B*C  
C.c                     U R                  5         U R                  5         U R                  5       n[        R	                  UR                  5       5      $ )zReceive a (picklable) object)rU   rX   r   r~   loads	getbuffer)rF   rv   s     r   recv_ConnectionBase.recv   s?     $$S]]_55r   c                 d    U R                  5         U R                  5         U R                  U5      $ )z/Whether there is any input available to be read)rU   rX   _pollrF   r   s     r   poll_ConnectionBase.poll   s)    zz'""r   c                     U $ r    rO   s    r   	__enter___ConnectionBase.__enter__      r   c                 $    U R                  5         g r   r^   rF   exc_type	exc_valueexc_tbs       r   __exit___ConnectionBase.__exit__      

r   )rC   rD   rE   )TT)r   Nr   )r   )g        )__name__
__module____qualname____firstlineno__rC   rJ   rP   rU   rX   r[   r_   propertyrc   rH   rI   rk   r^   r{   r   r   r   r   r   r   r   __static_attributes__r   r   r   r?   r?   s   s    G	".65, $ $    
$2(526#r   r?   c                   \    \ rS rSrSrSrSr\R                  4S jr	S r
SS jrS rS	 rS
rg)PipeConnectioni  z
Connection class based on a Windows named pipe.
Overlapped I/O is used, so the handles must have been created
with FILE_FLAG_OVERLAPPED.
FNc                 f    U R                   nUb  UR                  5         U" U R                  5        g r   )_send_ovcancelrC   )rF   _CloseHandleovs      r   rN   PipeConnection._close  s%    B~		&r   c                 @   U R                   b  [        S5      e[        R                  " U R                  USS9u  p#X l          U[        R
                  :X  a3  [        R                  " UR                  /S[        5      nU[        :X  d   eS U l         UR                  S5      u  pSU[        R                  :X  a  [        [        R                  S5      eUS:X  d   eU[!        U5      :X  d   eg !   UR                  5         e = f! S U l         UR                  S5      u  pSf = f)Nz/concurrent send_bytes() calls are not supportedT
overlappedFrS   r   )r   r,   _winapi	WriteFilerC   ERROR_IO_PENDINGWaitForMultipleObjectseventr   r   r   GetOverlappedResultERROR_OPERATION_ABORTEDrT   errnoEPIPEr   )rF   rv   r   errwaitresnwrittens         r   ru   PipeConnection._send_bytes  s   }}(  "5 6 6''cdKGBM
='222%<<
E85G"m333
 !% " 6 6t <g555 ekk+=>>!8O8s3x'''		 $ " 6 6t <#s   AC+ +C>>D Dc                    U R                   (       a  SU l         [        R                  " 5       $ Uc  SO[        US5      n [        R
                  " U R                  USS9u  p4 U[        R                  :X  a3  [        R                  " UR                  /S[        5      nU[        :X  d   eUR                  S5      u  pdUS:X  a6  [        R                  " 5       nUR                  UR                  5       5        U$ U[        R                   :X  a  U R#                  X15      $  [-        S5      e!   UR                  5         e = f! UR                  S5      u  pdUS:X  a:  [        R                  " 5       nUR                  UR                  5       5        Us  s $ U[        R                   :X  a  U R#                  X15      s  s $ f = f! [$         a*  nUR&                  [        R(                  :X  a  [*        ee S nAff = f)NF   Tr   r   z.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminr   ReadFilerC   r   r   r   r   r   r   r   writer   ERROR_MORE_DATA_get_more_datarT   winerrorERROR_BROKEN_PIPEEOFErrorRuntimeError)	rF   maxsizebsizer   r   r   nreadfes	            r   r   PipeConnection._recv_bytes6  s   &&*/'zz|#&C4E%..t||U;?AGBD'":"::&-&D&D!#
E8'=G#*m#;;#;
 &(%;%;D%A
!8 "

AGGBLLN3#$H G$;$;;#'#6#6r#CC < OPP!		%'%;%;D%A
!8 "

AGGBLLN3#$H G$;$;;#'#6#6r#CC < zzW%>%>>&	s]    "G #AD* *AG 9$G *D==E   AF>G 'F>;G =F>>G 
G5%G00G5c                     U R                   (       d'  [        R                  " U R                  5      S   S:w  a  g[	        [        U /U5      5      $ )Nr   T)r   r   PeekNamedPiperC   boolr   r   s     r   r   PipeConnection._pollV  s>    ''--dll;A>!CdVW-..r   c                    UR                  5       n[        R                  " 5       nUR                  U5        [        R
                  " U R                  5      S   nUS:  d   eUb"  [        U5      U-   U:  a  U R                  5         [        R                  " U R                  USS9u  pUR                  S5      u  pvUS:X  d   eXu:X  d   eUR                  UR                  5       5        U$ )Nr   r   Tr   )r   r   r   r   r   r   rC   r   r_   r   r   )rF   r   r   rv   r   leftr   rbytess           r   r   PipeConnection._get_more_data\  s    ,,.C

AGGCL((6q9D!8O8"s3x$'@((*&&t||TdKGB006KF!8O8>!>GGBLLN#Hr   )r   r   r   )r   r   r   r   __doc__r   r   r   CloseHandlerN   ru   r   r   r   r   r   r   r   r   r     s8    	
 #&-&9&9 	'	(4	Q@	/	r   r   c                       \ rS rSrSr\(       a)  \R                  4S jr\R                  r
\R                  rO(\R                  4S jr\R                  r
\R                   r\
4S jr\4S jrS rSS	 jrS
 rSrg)
Connectionil  zc
Connection class based on an arbitrary file descriptor (Unix only), or
a socket handle (Windows).
c                 (    U" U R                   5        g r   rb   rF   rN   s     r   rN   Connection._closes      4<< r   c                 (    U" U R                   5        g r   rb   r   s     r   rN   r   x  r   r   c                 b    [        U5      n U" U R                  U5      nX4-  nUS:X  a  g XS  nM$  Nr   )r   rC   )rF   rv   r   	remainingrz   s        r   _sendConnection._send}  s=    H	dllC(ANIA~b'C r   c                     [         R                  " 5       nU R                  nUnUS:  aL  U" XE5      n[        U5      nUS:X  a  XQ:X  a  [        e[        S5      eUR                  U5        XW-  nUS:  a  ML  U$ )Nr   zgot end of file during message)r   r   rC   r   r   rT   r   )rF   rx   readrv   rG   r   chunkrz   s           r   _recvConnection._recv  sv    jjl	!m+EE
AAv$"N!"BCCIIeNI !m 
r   c                    [        U5      nUS:  ab  [        R                  " SS5      n[        R                  " SU5      nU R                  U5        U R                  U5        U R                  U5        g [        R                  " SU5      nUS:  a#  U R                  U5        U R                  U5        g U R                  XA-   5        g )Ni!i!Qi @  )r   structpackr   )rF   rv   rz   
pre_headerheaders        r   ru   Connection._send_bytes  s    Hz>T2.J[[q)FJJz"JJvJJsO [[q)F5y 

6"

3 

6<(r   Nc                 "   U R                  S5      n[        R                  " SUR                  5       5      u  nUS:X  a8  U R                  S5      n[        R                  " SUR                  5       5      u  nUb  X1:  a  g U R                  U5      $ )N   r   r      r   )r   r   unpackr   )rF   r   rv   rx   s       r   r   Connection._recv_bytes  so    jjmdCLLN32:**Q-CMM$7ED4>zz$r   c                 2    [        U /U5      n[        U5      $ r   )r   r   )rF   r   rs      r   r   Connection._poll  s    $!Awr   r   r   )r   r   r   r   r   r   _multiprocessingclosesocketrN   r   _writer   _readr(   r^   r   r   r   r   ru   r   r   r   r   r   r   r   r   l  so    
  0 < < 	!!&& %% " 	!%   %  ). r   r   c                   Z    \ rS rSrSrSS jrS rS r\S 5       r	\S 5       r
S	 rS
 rSrg)r   i  z
Returns a listener object.

This is a wrapper for a bound socket which is 'listening' for
connections, or for a Windows named pipe.
Nc                 8   U=(       d!    U=(       a    [        U5      =(       d    [        nU=(       d    [        U5      n[        U5        US:X  a  [	        X5      U l        O[        XU5      U l        Ub   [        U[        5      (       d  [        S5      eX@l
        g )Nr   authkey should be a byte string)r=   default_familyr/   r5   PipeListener	_listenerSocketListener
isinstancebytes	TypeError_authkey)rF   r<   r.   backlogauthkeys        r   rJ   Listener.__init__  s     #G=W(= #" 	6.v6 Y)';DN+GWEDNz'5'A'A=>>r   c                     U R                   c  [        S5      eU R                   R                  5       nU R                  b*  [	        XR                  5        [        XR                  5        U$ )zb
Accept a connection on the bound socket or named pipe of `self`.

Returns a `Connection` object.
zlistener is closed)r  rT   acceptr  deliver_challengeanswer_challenge)rF   cs     r   r  Listener.accept  sS     >>!.//NN!!#==$a/Q.r   c                 R    U R                   nUb  SU l         UR                  5         gg)z1
Close the bound socket or named pipe of `self`.
N)r  r^   )rF   listeners     r   r^   Listener.close  s)     >>!DNNN  r   c                 .    U R                   R                  $ r   )r  _addressrO   s    r   r<   Listener.address  s    ~~&&&r   c                 .    U R                   R                  $ r   )r  _last_acceptedrO   s    r   last_acceptedListener.last_accepted  s    ~~,,,r   c                     U $ r   r   rO   s    r   r   Listener.__enter__  r   r   c                 $    U R                  5         g r   r   r   s       r   r   Listener.__exit__  r   r   )r  r  )NNr   N)r   r   r   r   r   rJ   r  r^   r   r<   r)  r   r   r   r   r   r   r   r     sH       ' ' - -r   r   c                     U=(       d    [        U 5      n[        U5        US:X  a  [        U 5      nO[        U 5      nUb   [	        U[
        5      (       d  [        S5      eUb  [        X25        [        X25        U$ )z5
Returns a connection to the address of a `Listener`
r   r  )	r=   r5   
PipeClientSocketClientr  r  r  r  r  )r<   r.   r  r  s       r   r   r     sp     ,|G,FVw!:gu#=#=9::$!%Hr   c                 H   U (       an  [         R                  " 5       u  pUR                  S5        UR                  S5        [        UR	                  5       5      n[        UR	                  5       5      nX44$ [
        R                  " 5       u  pV[        USS9n[        USS9nX44$ )<
Returns pair of connection objects at either end of a pipe
TFrI   rH   )r4   
socketpairsetblockingr   detachr(   pipe)duplexs1s2c1c2fd1fd2s          r   r   r     s     &&(FBNN4 NN4 BIIK(BBIIK(B v	 wwyHCC%0BC%0Bvr   c           
      ~   [        S5      nU (       a=  [        R                  n[        R                  [        R                  -  n[
        [
        pTO'[        R                  n[        R                  nS[
        pT[        R                  " X[        R                  -  [        R                  -  [        R                  [        R                  -  [        R                  -  SXE[        R                  [        R                  5      n[        R                  " XS[        R                  [        R                   [        R                  [        R                  5      n[        R"                  " U[        R                  SS5        [        R$                  " USS9nUR'                  S5      u  pU
S:X  d   e[)        X`S9n[)        XpS9nX4$ )	r3  r   r   r   NTr   r4  r5  )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:  r<   openmodeaccessobsizeibsizeh1h2r   _r   r=  r>  s                r   r   r   (  sW    $I.11H))G,A,AAF$gF22H**FF$$ < <<112%%(E(EEvw;;LL Qg.C.C((',, 	''--tT	 --bTB
//5axxB0B0vr   c                   .    \ rS rSrSrSS jrS rS rSrg)	r  iT  zG
Representation of a socket which is bound to an address and listening
c                    [         R                   " [        [         U5      5      U l         [        R                  S:X  a9  U R                  R                  [         R                  [         R                  S5        U R                  R                  S5        U R                  R                  U5        U R                  R                  U5        U R                  R                  5       U l        X l        S U l        US:X  aG  ["        R$                  " U5      (       d,  ["        R&                  " U [        R(                  U4SS9U l        g S U l        g ! [         a    U R                  R                  5         e f = f)Nposixr   Tr   r   argsexitpriority)r4   getattr_socketr(   name
setsockopt
SOL_SOCKETSO_REUSEADDRr7  bindlistengetsocknamer%  rT   r^   _familyr(  r   r;   Finalizeunlink_unlink)rF   r<   r.   r  s       r   rJ   SocketListener.__init__X  s   }}WVV%<=	ww'!''(9(9(.(;(;Q@LL$$T*LLg&LL( LL446DM "Yt'H'H'Q'Q==biiwjqDL  DL  	LL 	s   B=E
 
&E0c                     U R                   R                  5       u  ol        UR                  S5        [	        UR                  5       5      $ )NT)ra  r  r(  r7  r   r8  rF   ss     r   r  SocketListener.acceptq  s7    !%!4!4!6	d!((*%%r   c                      U R                   R                  5         U R                  nUb  S U l        U" 5         g g ! U R                  nUb  S U l        U" 5         f f = fr   )ra  r^   rl  )rF   rk  s     r   r^   SocketListener.closev  s[    	LL \\F!# " \\F!# "s	   ;  A)r%  ri  r(  ra  rl  N)r   )	r   r   r   r   r   rJ   r  r^   r   r   r   r   r  r  T  s     2&
r   r  c                    [        U 5      n[        R                  " [        [        U5      5       nUR                  S5        UR	                  U 5        [        UR                  5       5      sSSS5        $ ! , (       d  f       g= f)zG
Return a connection object connected to the socket given by `address`
TN)r=   r4   r`  r7  connectr   r8  )r<   r.   rp  s      r   r1  r1    sU     '"F	/	1Q	d			'!((*% 
2	1	1s   ;A55
Bc                   B    \ rS rSrSrS	S jrS
S jrS r\S 5       r	Sr
g)r  i  z 
Representation of a named pipe
Nc                 
   Xl         U R                  SS9/U l        S U l        [        R
                  " SU R                   5        [        R                  " U [        R                  U R                  U R                   4SS9U l	        g )NT)firstz listener created with address=%rr   r]  )
r%  _new_handle_handle_queuer(  r   	sub_debugrj  r  _finalize_pipe_listenerr^   )rF   r<   r  s      r   rJ   PipeListener.__init__  sj    #M"&"2"2"2">!?D"&DNN=t}}Ml::(($--8qDJr   c           
         [         R                  [         R                  -  nU(       a  U[         R                  -  n[         R                  " U R
                  U[         R                  [         R                  -  [         R                  -  [         R                  [        [        [         R                  [         R                  5      $ r   )r   rB  rH  rI  rG  r%  rJ  rK  rL  PIPE_UNLIMITED_INSTANCESrE  rM  rN  )rF   rx  flagss      r   ry  PipeListener._new_handle  s    ..1M1MME>>>**u))G,I,II!!"00'7,,gll r   c                 Z   U R                   R                  U R                  5       5        U R                   R                  S5      n [        R
                  " USS9n [        R                  " UR                  /S[        5      n UR                  S5      u  pEUS:X  d   e [        U5      $ !   UR                  5         [        R                  " U5        e = f! UR                  S5      u  pEUS:X  d   ef = f! [         a)  nUR                  [        R                  :w  a  e  S nANS nAff = f)Nr   Tr   F)rz  appendry  popr   rR  r   r   r   r   r   r   rT   r   ERROR_NO_DATAr   )rF   rG   r   resrY  r   r   s          r   r  PipeListener.accept  s   %%d&6&6&89''++A.F$--fF	$!88
E85C  33D9FA!8O8!&))IIK''/33D9FA!8O8  ::!6!66 7s0   C7 'B+ +)CC C47
D*D%%D*c                 p    [         R                  " SU5        U  H  n[        R                  " U5        M     g )Nz closing listener with address=%r)r   r{  r   r   )queuer<   rG   s      r   r|  $PipeListener._finalize_pipe_listener  s)    NN=wG##F+  r   )r%  rz  r(  r^   r   )F)r   r   r   r   r   rJ   ry  r  staticmethodr|  r   r   r   r   r  r    s*    			
		*. 
	, 
	,r   r  c           	      F   [        5       n  [        R                  " U S5        [        R                  " U [        R                  [        R
                  -  S[        R                  [        R                  [        R                  [        R                  5      n [        R                  " U[        R                  SS5        [!        U5      $ ! [         aI  nUR                  [        R                  [        R                  4;  d  [        U5      (       a  e  SnAOSnAff = fGM  )zE
Return a connection object connected to the pipe given by `address`
  r   N)r   r   WaitNamedPiperO  rC  rD  rN  rP  rH  rT   r   ERROR_SEM_TIMEOUTERROR_PIPE_BUSYr   rQ  rK  r   )r<   r   hr   s       r   r0  r0    s     O%%gt4&&W11G4I4IIw||W%:%:00',,  	''w,,dD	 a    ::g&?&?&-&=&=&? ?BPQRBSBS CT s   B
C
 

D?DD(   s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#>      md5   sha256   sha384   sha3_256   sha3_384c              #   8   #    U  H  n[        U5      v   M     g 7fr   )r   ).0rY  s     r   	<genexpr>r  F  s     7&6c!ff&6s         c                    [        U 5      [        ;   a  SU 4$ U R                  S5      (       aI  U R                  SS[        S-   5      =nS:  a)  U SU nU[
        ;   a  XS-   S nUR                  S5      U4$ [        S	U < 35      e)
zReturns a digest name and the payload for a response hash.

If a legacy protocol is detected based on the message length
or contents the digest name returned will be empty to indicate
legacy mode where MD5 and no digest prefix should be sent.
r$      {   }r      r   NasciizRunsupported message length, missing digest prefix, or unsupported digest: message=)r   _LEGACY_LENGTHSr:   find_MAX_DIGEST_LEN_ALLOWED_DIGESTSdecoder	   )messagecurlydigestpayloads       r   _get_digest_name_and_payloadr  Q  s     7|&
 7{4  ,,tQ(9:	:a?5!%%Agh'G==)722
/&-Z12 2r   c                    SSK n[        U5      S   nU(       d!   UR                  XS5      R                  5       $ UR                  XU5      R                  5       nSUR                  S5      U4-  $ ! [         a    Sn NDf = f)ao  Create a MAC based on authkey and message

The MAC algorithm defaults to HMAC-MD5, unless MD5 is not available or
the message has a '{digest_name}' prefix. For legacy HMAC-MD5, the response
is the raw MAC, otherwise the response is prefixed with '{digest_name}',
e.g. b'{sha256}abcdefg...'

Note: The MAC protects the entire message including the digest_name prefix.
r   Nmd5sha256   {%s}%sr  )hmacr  newr  r,   encode)r  r  r  digest_nameresponses        r   _create_responser  k  s     .w7:K	#88Ge4;;== xx+6==?H**73X>>>  	# #K		#s   A1 1B ?B c           
      z   SSK n[        U5      u  pEU=(       d    Sn UR                  XU5      R                  5       n[        U5      [        U5      :w  a'  [        SU< S[        U5       S[        U5       35      eUR                  Xe5      (       d  [        S	5      eg! [         a    [        SU< S35      ef = f)
aH  Verify MAC challenge

If our message did not include a digest_name prefix, the client is allowed
to select a stronger digest_name from _ALLOWED_DIGESTS.

In case our message is prefixed, a client cannot downgrade to a weaker
algorithm, because the MAC is calculated over the entire message
including the '{digest_name}' prefix.
r   Nr  zresponse_digest=z unsupportedz	expected z of length z got zdigest received was wrong)r  r  r  r  r,   r	   r   compare_digest)r  r  r  r  response_digestresponse_macexpecteds          r   _verify_challenger    s     $@$J!O%.OE88Go>EEG 8}L))!O.k#h- I<()+, 	, x66!"=>> 7  E!%5_$6l"CDDEs    B B:r  c                    [        U[        5      (       d#  [        SR                  [	        U5      5      5      e[
        [        :  d   S5       e[        R                  " [
        5      nSUR                  S5      U4-  nU R                  [        U-   5        U R                  S5      n [        XU5        U R                  [        5        g ! [         a    U R                  [         5        e f = f)N Authkey must be bytes, not {0!s}zprotocol constraintr  r     )r  r  r,   formatr7   MESSAGE_LENGTH_MD5ONLY_MESSAGE_LENGTHr(   urandomr  r{   
_CHALLENGEr   r  _WELCOMEr	   _FAILURE)
connectionr  r  r  r  s        r   r  r    s    gu%%.55d7mDF 	F33J5JJ3jj(G;--g6@@G *w./$$S)H('H5
 	h'	  h's   (C
 
!C+c                    [        U[        5      (       d#  [        SR                  [	        U5      5      5      eU R                  S5      nUR                  [        5      (       d  [        SU< 35      eU[        [        5      S  n[        U5      [        :  a  [        S[        U5       S35      e[        X5      nU R                  U5        U R                  S5      nU[        :w  a  [        S5      eg )Nr  r  z,Protocol error, expected challenge: message=zchallenge too short: z byteszdigest sent was rejected)r  r  r,   r  r7   r   r:   r  r	   r   r  r  r{   r  )r  r  r  r  r  s        r   r  r    s    gu%%.55d7mDF 	F##C(Gj))!?wjAC 	Cc*o&'G
7|--!$9#g,v"NOOg/F&!$$S)H8!"<== r   c                   &    \ rS rSrS rS rS rSrg)ConnectionWrapperi  c                 h    Xl         X l        X0l        S H  n[        X5      n[	        XU5        M     g )N)rk   r^   r   r   r{   )_conn_dumps_loadsr`  setattr)rF   connr   r   attrr   s         r   rJ   ConnectionWrapper.__init__  s0    
KD$%CD$ Lr   c                 \    U R                  U5      nU R                  R                  U5        g r   )r  r  r{   )rF   r   rp  s      r   r   ConnectionWrapper.send  s"    KK

a r   c                 X    U R                   R                  5       nU R                  U5      $ r   )r  r   r  ro  s     r   r   ConnectionWrapper.recv  s"    JJ!!#{{1~r   )r  r  r  N)r   r   r   r   rJ   r   r   r   r   r   r   r  r    s    %!r   r  c                 T    [         R                  U 4S S S S5      R                  S5      $ )Nr   utf-8)	xmlrpclibr   r  )r   s    r   
_xml_dumpsr    s&    ??C64tQ7>>wGGr   c                 V    [         R                  U R                  S5      5      u  u  pU$ )Nr  )r  r   r  )rp  r   methods      r   
_xml_loadsr    s"    __QXXg%67NFSJr   c                       \ rS rSrS rSrg)XmlListeneri  c                 b    SS K Jq  [        R	                  U 5      n[        U[        [        5      $ r   )xmlrpc.clientclientr  r   r  r  r  r  r   s     r   r  XmlListener.accept  s"    )ood# j*==r   r   N)r   r   r   r   r  r   r   r   r   r  r    s    >r   r  c                  J    SS K Jq  [        [	        U 0 UD6[
        [        5      $ r   )r  r  r  r  r   r  r  )r^  kwdss     r   	XmlClientr    s    %VT2T2J
KKr   c                   ^ [        U 5      m/ n[        T5      S:  au   [        R                  " TSU5      nUR                  U4S jU 5       5        U(       a8  [        T5       VVs/ s H  u  pEXCS   U-  s=:  a  U;  d  M  O  M  UPM!     snnmSnT(       a  [        T5      S:  a  TS S OTn[        R                  " USU5      nU[        :X  a   U$ [        Us=::  a  [        [        T5      -   :  a  O  O
U[        -  nO9[        Us=::  a  [        [        T5      -   :  a  O  O
U[        -  nO[        S5      eUR                  TU   5        TUS-   S  mSnT(       a  M  U$ ! [         a    / s $ f = fs  snnf )N<   Fc              3   .   >#    U  H
  nTU   v   M     g 7fr   r   )r  iLs     r   r  #_exhaustive_wait.<locals>.<genexpr>  s     +s!1s   r   zShould not get herer   )listr   r   BatchedWaitForMultipleObjectsTimeoutErrorextend	enumerater   r   r   r   r   r  )handlesr   readyr  r  r  short_Lr  s          @r   _exhaustive_waitr    sc    M q6B;;;AugN LL+s++#,Q<M<4111vz3L3LQ3LQ<MG #AafG00%ICl"  #>A(>>}$!SD+;c!f+DD''"#899LL3 #a%&	AG a )   	 Ns#   E% 'E7E7E7%E43E4c                   ^ Uc  [         nOUS:  a  SnO[        US-  S-   5      n[        U 5      n 0 m/ n[        5       n[        5       n U  H  n [	        US5      n [
        R                  " U" 5       SS5      u  pxU[
        R                  :X  a"  UR                  U5        UTUR                  '   Mf  U(       aO  [        R                  " 5       SS S:  a3   UR                  S	5      u  pU(       d  [!        US
5      (       a  SUl        UR%                  U5        SnM     [+        TR-                  5       U5      nU H  nUR/                  5         M     U Ho  n UR                  S5      u  pU[
        R0                  :w  d  M-  TUR                     nUR%                  U5        US:X  d  MU  [!        US
5      (       d  Mh  SUl        Mq     UR3                  U4S jU 5       5        U  Vs/ s H  oUU;   d  M
  UPM     sn$ ! [         a#  n	SU	R                  pU[        ;  a  e  Sn	A	GNSn	A	ff = f! [         a  n	U	R                  n Sn	A	GN_Sn	A	ff = f! [&         a    UTUR)                  5       '    GM%  f = f! [         a"  n	U	R                  nU[        ;  a  e  Sn	A	GN1Sn	A	ff = f! U H  nUR/                  5         M     U H  n UR                  S5      u  pO.! [         a!  n	U	R                  nU[        ;  a  e  Sn	A	OSn	A	ff = fU[
        R0                  :w  d  M\  TUR                     nUR%                  U5        US:X  d  M  [!        US
5      (       d  M  SUl        M     f = fs  snf )
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      ?rk   Tr  )   r  Fr   c              3   .   >#    U  H
  nTU   v   M     g 7fr   r   )r  r  waithandle_to_objs     r   r  wait.<locals>.<genexpr>_  s     I=a.q1=r  )r   intr  setr`  r   r   rT   r   _ready_errorsr   r  r   r1   getwindowsversionr   r3   r   addAttributeErrorrB   r  keysr   r   update)object_listr   ov_listready_objectsready_handlesork   r   r   r   rY  r  s              @r   r   r     s,    ?Gq[G'D.3./G;'6	8 $$Q1F
"")"2"268Q"E
 g666r*67)"((3
 #"7"7"9"1"="G1)+)?)?)F $'716J+K+K7; 4%))!,"#= !@ -->-C-C-EwOM 		  33D9FA
 '999)"((3A!%%a(ax #1&:;;37A0   	I=II&=;a}*<;==_ # ""&

Cm3! 4"  $+ 1&'jj1- & 978%akkm49N  **C-/ 0 		  33D9FAs **C-/ 0 '999)"((3A!%%a(ax #1&:;;37A0 " >s   
J$ IG<<AJ$ H,)AJ$ I5&	M&3M&<
H)H$J$ $H))J$ ,
I6IJ$ IJ$ I2-J$ 1I22J$ 5
J!?JJ!$M#KM#
L	"K>	9M#>L	M#$M#M#M#PollSelectorc                    [        5        nU  H#  nUR                  U[        R                  5        M%     Ub  [        R
                  " 5       U-   n UR                  U5      nU(       a*  U VVs/ s H  u  pgUR                  PM     snnsSSS5        $ Ub)  W[        R
                  " 5       -
  nUS:  a  UsSSS5        $ Mp  s  snnf ! , (       d  f       g= f)r  Nr   )_WaitSelectorregister	selectors
EVENT_READr   r   selectfileobj)r  r   selectorr   deadliner  keyeventss           r   r   r   n  s     _"!!#y';';< # ">>+g5 0=BCUMSCKKUC _ *"*T^^-="="Q;#( _  D _s$   A#C.CC"C?C
Cc                 *   U R                  5       n[        R                  " U[        R                  [        R                  5       nSSKJn  UR                  U5      n[        X@R                  U R                  44sS S S 5        $ ! , (       d  f       g = f)Nr   )resource_sharer)rk   r4   fromfdr   SOCK_STREAMr$   r  	DupSocketrebuild_connectionrH   rI   )r  rG   rp  r  dss        r   reduce_connectionr    s^    ]]66>>63E3EF!) **1-B%MM4=='II GFFs   5B
Bc                 V    U R                  5       n[        UR                  5       X5      $ r   r8  r   )r  rH   rI   socks       r   r  r    s     yy{$++-<<r   c                    U R                   (       a  [        R                  OSU R                  (       a  [        R                  OS-  n[
        R                  " U R                  5       U5      n[        X R                   U R                  44$ r   )	rH   r   FILE_GENERIC_READrI   FILE_GENERIC_WRITEr   	DupHandlerk   rebuild_pipe_connection)r  rT  dhs      r   reduce_pipe_connectionr&    s\    047,,1157--AG  7&]]DMM(JJJr   c                 :    U R                  5       n[        X1U5      $ r   )r8  r   )r%  rH   rI   rG   s       r   r$  r$    s    f99r   c                     [         R                  " U R                  5       5      n[        XR                  U R
                  44$ r   )r   DupFdrk   r  rH   rI   )r  dfs     r   r  r    s.    __T[[]+!Bt}}#EEEr   c                 :    U R                  5       n[        X1U5      $ r   r  )r*  rH   rI   fds       r   r  r    s    YY["11r   )NN)T)r  r   )U__all__r   r   r(   r1   r4   r   r   r%   	itertoolsr$   r   r	   r
   contextr   ForkingPicklerr~   r	  r   r   r   r   r   ImportErrorr2   rE  CONNECTION_TIMEOUTcountr+   r  familiesr3   r   r   r/   r5   r=   r?   r   r   objectr   r   r   r  r1  r  r0  r  r  r  r  	frozensetr  maxr  r  _MD5_DIGEST_LENr  r  r  r  r  r  r  r  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  	 	 
       1 **OO  !;
69NH<<7NH - & 0
FF&T Tn ] ]@M Mh;v ;|* <<7&&X)V )X& <<76,v 6,p!> 
r @B 7&677  *O<24?8?2(5 (*>% >* H>( >L <<7@ ..0M0MNML>` 
 y.))!..!00)6 <<7J= z#45K
: ~'=>F2 z#45K$  
||wGs   
I I21I2