
                        t   S r SSKJr  SSKrSSKrSSKJr  SSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKJrJrJrJrJrJrJrJrJrJrJrJr  SSKrSSKJr  SSKJr  SSKJr  SS	KJr  SS
KJ r   SSK!J"r"  SSK!J#r#  SSK!J$r$  SSK!J%r%  SSK!J&r&  SSK!J'r'  SSK!J(r(  SSK!J)r)  SSK!J*r*  SSK+J,r,  \	RZ                  " \.5      r/Sr0Sr1Sr2Sr3Sr4Sr5Sr6Sr7Sr8Sr9Sr:S r;Sr<S!r=S"r>SlS# jr?SmS$ jr@SnS& jrA      SoS' jrBSpS( jrC " S) S*\R                  " S*S+5      \R                  5      rF " S, S-\R                  5      rH " S. S/\H5      rI " S0 S1\H5      rJ " S2 S%\K5      rLSqS3 jrM      SrS4 jrNSsS5 jrO      StS6 jrP      SuS7 jrQ          SvS8 jrRSwS9 jrS        SxS: jrTSwS; jrUSsS< jrV " S= S>\R                  5      rX " S? S@\K5      rY        SySA jrZ Sz             S{SB jjr[        S|SC jr\          S}SD jr]    S~SE jr^SqSF jr_        SSG jr`        SSH jra              SSI jrb              SSJ jrcSSK jrd          SSL jre      SSM jrf          SSN jrg          SSO jrh          SSP jri          SSQ jrj          SSR jrk        SSS jrl          SST jrm            SSU jrn\R                   " SV SW\R                  5      5       rq " SX SY\K5      rr      SSZ jrs      SS[ jrtSS\ jru        SS] jrvSS^ jrwSS_ jrxSS` jrySSa jrz      SSb jr{SSc jr|SSd jr}SSe jr~SSf jr    SSg jr        SSh jr " Si Sj\GR                  5      r                SSk jrg)z+Service-side implementation of gRPC Python.    )annotationsN)futures)AnyCallableDictIterableIteratorListMappingOptionalSequenceSetTupleUnion)_common)_compression)_interceptor)_observability)cygrpc)ArityAgnosticMethodHandler)ChannelArgumentType)DeserializingFunction)MetadataType)NullaryCallbackType)ResponseType)SerializingFunction)ServerCallbackTag)ServerTagCallbackType)overrideshutdownrequest_callreceive_close_on_serversend_initial_metadatareceive_messagesend_messagez$send_initial_metadata * send_messagesend_status_from_serverz/send_initial_metadata * send_status_from_serveropenclosed	cancelledg      ?g    eAc                <    U R                   S   R                  5       $ Nr   )batch_operationsmessage)request_events    Gplatform/bundledpythonunix/lib/python3.13/site-packages/grpc/_server.py_serialized_requestr0   V   s    ))!,4466    c                ~    [         R                  R                  U 5      nUc  [        R                  R
                  $ U$ N)r   !STATUS_CODE_TO_CYGRPC_STATUS_CODEgetr   
StatusCodeunknown)codecygrpc_codes     r/   _application_coder:   Z   s4    ;;??EK(3(;6$$LLr1   	_RPCStatec                z    U R                   c  [        R                  R                  $ [	        U R                   5      $ r3   )r8   r   r6   okr:   states    r/   _completion_coder@   _   s-    zz  ###UZZ((r1   c                J    U R                   c  U$ [        U R                   5      $ r3   )r8   r:   )r?   r8   s     r/   _abortion_coderB   e   s"     zzUZZ((r1   c                8    U R                   c  S$ U R                   $ )Nr1   )detailsr>   s    r/   _detailsrE   m   s    --'3:U]]:r1   c                      \ rS rSrSrg)_HandlerCallDetailsq    N)__name__
__module____qualname____firstlineno____static_attributes__rI   r1   r/   rG   rG   q   s     	r1   rG   )methodinvocation_metadatac                  l    \ rS rSr\R
                  SS j5       r\R
                      SS j5       rSrg)_Method~   c                    [        5       er3   NotImplementedErrorselfs    r/   name_Method.name   s    !##r1   c                    [        5       er3   rU   rX   handler_call_detailss     r/   handler_Method.handler   s     "##r1   rI   NreturnzOptional[str]r]   rG   ra   Optional[grpc.RpcMethodHandler])	rJ   rK   rL   rM   abcabstractmethodrY   r^   rN   rI   r1   r/   rR   rR   ~   sD    $ $ 	$$7$	($ $r1   rR   c                  V    \ rS rSr    SS jr\SS j5       r\    S	S j5       rSrg)
_RegisteredMethod   c                    Xl         X l        g r3   _name_registered_handler)rX   rY   registered_handlers      r/   __init___RegisteredMethod.__init__   s    
 
#5 r1   c                    U R                   $ r3   )rk   rW   s    r/   rY   _RegisteredMethod.name   s    zzr1   c                    U R                   $ r3   )rl   r\   s     r/   r^   _RegisteredMethod.handler   s     '''r1   rj   N)rY   strrm   rc   r`   rb   	rJ   rK   rL   rM   rn   r   rY   r^   rN   rI   r1   r/   rg   rg      sQ    66 <6   ($7(	(( (r1   rg   c                  R    \ rS rSr  SS jr\SS j5       r\    S	S j5       rSrg)
_GenericMethod   c                    Xl         g r3   _generic_handlers)rX   generic_handlerss     r/   rn   _GenericMethod.__init__   s
     "2r1   c                    g r3   rI   rW   s    r/   rY   _GenericMethod.name   s    r1   c                Z    U R                    H  nUR                  U5      nUc  M  Us  $    g r3   )r{   service)rX   r]   generic_handlermethod_handlers       r/   r^   _GenericMethod.handler   s6      $55O,445IJN)%%  6 r1   rz   N)r|   List[grpc.GenericRpcHandler]r`   rb   ru   rI   r1   r/   rw   rw      sG    262   	$7		(	 	r1   rw   c                      \ rS rSr% S\S'   S\S'   \\   rS\S'   S\S	'   S
\S'   S\S'   S
\S'   S\S'   S\S'   S\S'   S
\S'   S\S'   S\S'   S
\S'   S rSr	g)r;      zcontextvars.Contextcontextzthreading.Condition	conditionr   requestrt   clientboolinitial_metadata_allowedOptional[grpc.Compression]compression_algorithmdisable_next_compressionOptional[MetadataType]trailing_metadatazOptional[grpc.StatusCode]r8   Optional[bytes]rD   statusedzList[Exception]
rpc_errorsz#Optional[List[NullaryCallbackType]]	callbacksabortedc                :   [         R                  " 5       U l        [        R                  " 5       U l        [        5       U l        S U l        [        U l
        SU l        S U l        SU l        S U l        S U l        S U l        SU l        / U l        / U l        SU l        g NTF)contextvarsContextr   	threading	Conditionr   setduer   _OPENr   r   r   r   r   r8   rD   r   r   r   r   rW   s    r/   rn   _RPCState.__init__   s    "**,",,.5(,%%)"(-%!%	r1   )r   r   r   r8   r   r   r   rD   r   r   r   r   r   r   r   N)
rJ   rK   rL   rM   __annotations__r   rt   r   rn   rN   rI   r1   r/   r;   r;      s`      ""
c(CLK""55""--
##N22Mr1   c                f    [         R                  " 5       nU R                  R                  U5        Uer3   )grpcRpcErrorr   append)r?   	rpc_errors     r/   _raise_rpc_errorr      s&    I	I&
Or1   c                    U R                   R                  U5        [        U 5      (       d'  U R                   (       d  U R                  nS U l        X4$ g)NNrI   )r   remove_is_rpc_state_activer   )r?   tokenr   s      r/   _possibly_finish_callr      sC     
IIU&&uyyOO	r1   c                   ^ ^ U U4S jnU$ )Nc                j   > TR                      [        TT5      sS S S 5        $ ! , (       d  f       g = fr3   )r   r   )$unused_send_status_from_server_eventr?   r   s    r/   r&   9_send_status_from_server.<locals>.send_status_from_server   s    __(6 __s   $
2rI   )r?   r   r&   s   `` r/   _send_status_from_serverr      s    7 #"r1   c                   U R                      U R                  (       aF  [        R                  " U R                  5      4nUc  UsS S S 5        $ U[	        U5      -   sS S S 5        $ UsS S S 5        $ ! , (       d  f       g = fr3   )r   r   r   !compression_algorithm_to_metadatatuple)r?   metadatacompression_metadatas      r/   _get_initial_metadatar      si     
&&>>//$ 
 + 
 (%/9 
  
s   7A0A0%A00
A>c                N    [         R                  " [        X5      [        5      nU$ r3   )r   SendInitialMetadataOperationr   _EMPTY_FLAGS)r?   r   	operations      r/   _get_initial_metadata_operationr     s&     33e.I r1   c                   U R                   [        La  [        X5      nU R                  c  UOU R                  nU R                  (       a:  [        U S 5      [        R                  " U R                  UU[        5      4n[        nO.[        R                  " U R                  UU[        5      4n[        nUR                  U[        X5      5        SU l        U R                  R!                  U5        g g NT)r   
_CANCELLEDrB   rD   r   r   r   SendStatusFromServerOperationr   r   8_SEND_INITIAL_METADATA_AND_SEND_STATUS_FROM_SERVER_TOKEN_SEND_STATUS_FROM_SERVER_TOKENstart_server_batchr   r   r   add)r?   callr8   rD   effective_codeeffective_details
operationsr   s           r/   _abortr     s     ||:%'4',}}'<G%--))/t<44++"% 	J ME 44++"% 	J 3E0>	
 		e9 &r1   c                   ^  U 4S jnU$ )Nc                >  > TR                      U R                  S   R                  5       (       a  [        Tl        OTR                  [
        L a  [        Tl        TR                   R                  5         [        T[        5      sS S S 5        $ ! , (       d  f       g = fr+   )
r   r,   r)   r   r   r   _CLOSED
notify_allr   _RECEIVE_CLOSE_ON_SERVER_TOKEN)receive_close_on_server_eventr?   s    r/   r"   9_receive_close_on_server.<locals>.receive_close_on_server.  sc    __,==a@JJLL)&&OO&&((0NO __s   A6B
BrI   )r?   r"   s   ` r/   _receive_close_on_serverr   -  s    P #"r1   c                   ^ ^^ UUU 4S jnU$ )Nc                0  > [        U 5      nUc^  TR                     TR                  [        L a  [        Tl        TR                  R                  5         [        T[        5      sS S S 5        $ [        R                  " UT5      nTR                     Uc'  [        TT[        R                  R                  S5        OUTl        TR                  R                  5         [        T[        5      sS S S 5        $ ! , (       d  f       g = f! , (       d  f       g = f)Ns    Exception deserializing request!)r0   r   r   r   r   r   r   _RECEIVE_MESSAGE_TOKENr   deserializer   r   r6   internalr   )receive_message_eventserialized_requestr   r   request_deserializerr?   s      r/   r$   )_receive_message.<locals>.receive_message?  s    01FG%<<5(#*EL**,,U4JK	 ! ))"$8G ?))22;	 %,EM**,,U4JK ! ! !s   AC6AD6
D
DrI   )r?   r   r   r$   s   ``` r/   _receive_messager   :  s    
L2 r1   c                   ^  U 4S jnU$ )Nc                r   > TR                      [        T[        5      sS S S 5        $ ! , (       d  f       g = fr3   )r   r   _SEND_INITIAL_METADATA_TOKEN)"unused_send_initial_metadata_eventr?   s    r/   r#   5_send_initial_metadata.<locals>.send_initial_metadata\  s    __(0LM __s   (
6rI   )r?   r#   s   ` r/   _send_initial_metadatar   [  s    N ! r1   c                   ^ ^ U U4S jnU$ )Nc                   > TR                      TR                   R                  5         [        TT5      sS S S 5        $ ! , (       d  f       g = fr3   )r   r   r   )unused_send_message_eventr?   r   s    r/   r%   #_send_message.<locals>.send_messaged  s.    __OO&&((6 __s	   &>
ArI   )r?   r   r%   s   `` r/   _send_messager   c  s    7
 r1   c                     \ rS rSr% S\S'   S\S'   S\S'         S S jrS!S	 jrS"S
 jrS#S jrS$S jr	S#S jr
S%S jrS&S jrS'S jrS(S jrS)S jrS*S jrS+S jrS,S jrS%S jrS-S jrS.S jrS/S jrS0S jrS1S jrS2S jrS#S jrSrg)3_Contextil  cygrpc.BaseEvent
_rpc_eventr;   _stateOptional[DeserializingFunction]r   c                (    Xl         X l        X0l        g r3   )r   r   _request_deserializer)rX   	rpc_eventr?   r   s       r/   rn   _Context.__init__q  s     $%9"r1   c                    U R                   R                     [        U R                   5      sS S S 5        $ ! , (       d  f       g = fr3   )r   r   r   rW   s    r/   	is_active_Context.is_active{  s'    [[""'4 #""s	   6
Ac                    [        U R                  R                  R                  [        R                  " 5       -
  S5      $ r+   )maxr   call_detailsdeadlinetimerW   s    r/   time_remaining_Context.time_remaining  s*    4??//88499;FJJr1   c                L    U R                   R                  R                  5         g r3   )r   r   cancelrW   s    r/   r   _Context.cancel  s    ##%r1   c                    U R                   R                     U R                   R                  c
   S S S 5        gU R                   R                  R                  U5         S S S 5        g! , (       d  f       g = f)NFT)r   r   r   r   )rX   callbacks     r/   add_callback_Context.add_callback  sS    [[""{{$$, #" KK!!((2	 #""s   A(&A((
A6c                    U R                   R                     SU R                   l        S S S 5        g ! , (       d  f       g = fr   )r   r   r   rW   s    r/    disable_next_message_compression)_Context.disable_next_message_compression  s'    [[""37DKK0 #""s	   2
A c                .    U R                   R                  $ r3   )r   rP   rW   s    r/   rP   _Context.invocation_metadata  s    222r1   c                r    [         R                  " U R                  R                  R	                  5       5      $ r3   )r   decoder   r   peerrW   s    r/   r  _Context.peer  s$    ~~doo22779::r1   c                V    [         R                  " U R                  R                  5      $ r3   )r   peer_identitiesr   r   rW   s    r/   r  _Context.peer_identities  s    %%doo&:&:;;r1   c                    [         R                  " U R                  R                  5      nUc  U$ [        R
                  " U5      $ r3   )r   peer_identity_keyr   r   r   r
  )rX   id_keys     r/   r  _Context.peer_identity_key  s4    ))$//*>*>?vCW^^F-CCr1   c                    [         R                  " U R                  R                  5      nUc  0 OUnUR	                  5        VVs0 s H  u  p4[
        R                  " U5      U_M     snn$ s  snnf r3   )r   auth_contextr   r   itemsr   r
  )rX   r  auth_context_dictkeyvalues        r/   r  _Context.auth_context  si    **4??+?+?@"."6BL 0557
7
 NN3&7
 	
 
s   #A,c                    U R                   R                     XR                   l        S S S 5        g ! , (       d  f       g = fr3   )r   r   r   )rX   compressions     r/   set_compression_Context.set_compression  s%    [[""0;KK- #""   1
?c                0   U R                   R                     U R                   R                  [        L a  [	        U R                   5        U R                   R
                  (       a  [        U R                   U5      nU R                  R                  R                  U4[        U R                   5      5        SU R                   l        U R                   R                  R                  [        5        OSn[        U5      e S S S 5        g ! , (       d  f       g = f)NFz#Initial metadata no longer allowed!)r   r   r   r   r   r   r   r   r   r   r   r   r   r   
ValueError)rX   initial_metadatar   	error_msgs       r/   r#   _Context.send_initial_metadata  s    [[""{{!!Z/ -{{33;KK!1	 $$77L"8"E 8=4##$@AA	 ++ B #""s   C&D
Dc                    U R                   R                     XR                   l        S S S 5        g ! , (       d  f       g = fr3   )r   r   r   )rX   r   s     r/   set_trailing_metadata_Context.set_trailing_metadata  s%    [["",=KK) #""r  c                .    U R                   R                  $ r3   )r   r   rW   s    r/   r   _Context.trailing_metadata  s    {{,,,r1   c                   U[         R                  R                  :X  a1  [        R	                  S5        [         R                  R
                  nSnU R                  R                     XR                  l        [        R                  " U5      U R                  l        SU R                  l        [        5       e! , (       d  f       g = f)Nz4abort() called with StatusCode.OK; returning UNKNOWN T)r   r6   OK_LOGGERerrorUNKNOWNr   r   r8   r   encoderD   r   	Exception)rX   r8   rD   s      r/   abort_Context.abort  s    4??%%%MMF ??**DG[[""#KK").."9DKK"&DKK+	 #"s   &AB77
Cc                    UR                   U R                  l         U R                  UR                  UR                  5        g r3   )r   r   r2  r8   rD   )rX   statuss     r/   abort_with_status_Context.abort_with_status  s*    (.(@(@%

6;;/r1   c                    U R                   R                     XR                   l        S S S 5        g ! , (       d  f       g = fr3   )r   r   r8   )rX   r8   s     r/   set_code_Context.set_code  s%    [[""#KK #""r  c                .    U R                   R                  $ r3   )r   r8   rW   s    r/   r8   _Context.code  s    {{r1   c                    U R                   R                     [        R                  " U5      U R                   l        S S S 5        g ! , (       d  f       g = fr3   )r   r   r   r0  rD   )rX   rD   s     r/   set_details_Context.set_details  s0    [[""").."9DKK #""s   &A
Ac                .    U R                   R                  $ r3   )r   rD   rW   s    r/   rD   _Context.details  s    {{"""r1   c                    g r3   rI   rW   s    r/   _finalize_state_Context._finalize_state  s    r1   )r   r   r   N)r   r   r?   r;   r   r   )ra   r   )ra   floatra   None)r  r   ra   r   )ra   r   )ra   rt   )ra   zOptional[Sequence[bytes]]r`   )ra   zMapping[str, Sequence[bytes]])r  zgrpc.Compressionra   rG  )r"  r   ra   rG  )r   r   ra   rG  )r8   grpc.StatusCoderD   rt   ra   rG  )r5  zgrpc.Statusra   rG  )r8   rH  ra   rG  )ra   rH  )rD   rt   ra   rG  )ra   bytes)rJ   rK   rL   rM   r   rn   r   r   r   r  r  rP   r  r  r  r  r  r#   r&  r   r2  r6  r9  r8   r>  rD   rC  rN   rI   r1   r/   r   r   l  s      99:#: : >	:5K&83;<D
<,">-0$ :#r1   r   c                      \ rS rSr% S\S'   S\S'   S\S'         SS jrSS	 jrSS
 jrSS jrSS jr	SS jr
SS jrSrg)_RequestIteratori  r;   r   cygrpc.Call_callr   r   c                (    Xl         X l        X0l        g r3   )r   rM  r   )rX   r?   r   r   s       r/   rn   _RequestIterator.__init__  s     
%9"r1   c                   U R                   R                  [        L a  [        U R                   5        g [	        U R                   5      (       d
  [        5       eU R                  R                  [        R                  " [        5      4[        U R                   U R                  U R                  5      5        U R                   R                  R                  [        5        g r3   )r   r   r   r   r   StopIterationrM  r   r   ReceiveMessageOperationr   r   r   r   r   r   rW   s    r/   _raise_or_start_receive_message0_RequestIterator._raise_or_start_receive_message  s    ;;+T[[)%dkk22/!JJ))//=? KKT-G-G KKOO 67r1   c                J   U R                   R                  [        L a  [        U R                   5        [        5       eU R                   R                  c(  [
        U R                   R                  ;  a
  [        5       eU R                   R                  nS U R                   l        U$ r3   )	r   r   r   r   r   r   r   rQ  AssertionErrorrX   r   s     r/   _look_for_request"_RequestIterator._look_for_request  su    ;;+T[[)  KK'&dkkoo=/!kk))G"&DKKNr1   c                    U R                   R                     U R                  5          U R                   R                  R                  5         U R	                  5       nUb  UsS S S 5        $ MD  ! , (       d  f       g = fr3   )r   r   rS  waitrX  rW  s     r/   _next_RequestIterator._next  s_    [[""002%%**,002&" #" #"s   A
A-+A--
A;c                    U $ r3   rI   rW   s    r/   __iter___RequestIterator.__iter__  s    r1   c                "    U R                  5       $ r3   r\  rW   s    r/   __next___RequestIterator.__next__      zz|r1   c                "    U R                  5       $ r3   rb  rW   s    r/   next_RequestIterator.next   re  r1   )rM  r   r   N)r?   r;   r   rL  r   r   rF  )ra   r   )ra   rK  )rJ   rK   rL   rM   r   rn   rS  rX  r\  r_  rc  rg  rN   rI   r1   r/   rK  rK    sS    :::: : >	:8#r1   rK  c                   ^ ^^ UU U4S jnU$ )Nc            	       > TR                      [        T5      (       d
   S S S 5        g TR                  R                  [        R
                  " [        5      4[        TTR                  T5      5        TR                  R                  [        5         TR                   R                  5         TR                  c  TR                  [        L as  SR                  TR                   R"                  5      n [%        TTR                  [        R&                  R(                  [*        R,                  " U 5      5         S S S 5        g TR                  [.        L a
   S S S 5        g OTR                  nS Tl        UsS S S 5        $ M  ! , (       d  f       g = f)Nz*"{}" requires exactly one request message.)r   r   r   r   r   rR  r   r   r   r   r   r[  r   r   r   formatr   rO   r   r6   unimplementedr   r0  r   )rD   r   r   r   r?   s     r/   unary_request%_unary_request.<locals>.unary_request)  s4   __'.. _ NN--//=? 	8LM IIMM01$$&==(||w.HOO ) 6 6 = =  
 !%NN"--;;#NN73	  $/ _0 ||z1#3 _0 2 $mmG$(EM"; _  _s#   E>DE> E>E><E>>
FrI   )r   r?   r   rm  s   ``` r/   _unary_requestro  $  s    
#@ r1   c                `   SSK Jn  U" XU5       n S nUb
  U" X7U5      nOU" X75      nUS4sS S S 5        $ ! [         Ga[  n	UR                     UR                  (       a1  [        UU R                  [        R                  R                  S5        OXR                  ;  a   SR                  U	5      n
Oe! [         aX    Sn
[        R                  [        R                  " [!        U	5      U	U	R"                  5      5        [        R$                  " 5          Of = f[        R                  U
5        [        UU R                  [        R                  R                  [&        R(                  " U
5      5        S S S 5        O! , (       d  f       O= f S n	A	S S S 5        gS n	A	ff = f! , (       d  f       g = f)Nr   )_create_servicer_contextT   RPC Abortedz!Exception calling application: {}z1Calling application raised unprintable Exception!NF)r   rq  r1  r   r   r   r   r   r6   r7   r   rk  r-  	exception	tracebackformat_exceptiontype__traceback__	print_excr   r0  )r   r?   behaviorargumentr   send_response_callbackrq  r   response_or_iteratorrt  rD   s              r/   _call_behaviorr~  L  s~    .	!.
	*	#' %1'/'=($ (0'B$'-
 
  !	==!))11&	 &6&66."E"L"L%# % .O    ))%66 $Y ) ) 7 7 "++-. %%g.!))11w/	5 !@ [
 
!	
 
sk   F6FFAE9 B21E92AD	E9D	AE90	F9
FF
FFF
F-c           
     &    [        U5      S4$ ! [         a     g[         a  nUR                     UR                  (       a1  [        UU R                  [        R                  R                  S5        OyX1R                  ;  aj  SR                  U5      n[        R                  U5        [        UU R                  [        R                  R                  [        R                  " U5      5        S S S 5        O! , (       d  f       O= f S nAgS nAff = f)NTr   rr  z!Exception iterating responses: {}rs  )rg  rQ  r1  r   r   r   r   r   r6   r7   r   rk  r-  rt  r   r0  )r   r?   response_iteratorrt  rD   s        r/   %_take_response_from_response_iteratorr    s    
%&,,  __}}NN%%--"	 "2"22=DDYO!!'*NN%%--NN7+	 __" %s1    
D	DDB<C5,	D5
D	?DDc                    [         R                  " X#5      nUcF  UR                     [        UU R                  [
        R                  R                  S5        S S S 5        g U$ ! , (       d  f       g = f)Ns   Failed to serialize response!)r   	serializer   r   r   r   r6   r   )r   r?   responseresponse_serializerserialized_responses        r/   _serialize_responser    sc     "++HJ"__!!**0	   _ s   1A""
A0c                d    U R                   (       a  [        R                  R                  $ [        $ r3   )r   r   	WriteFlagno_compressr   r>   s    r/   %_get_send_message_op_flags_from_stater    s%     %%+++r1   c                ^    U R                      SU l        S S S 5        g ! , (       d  f       g = frs  )r   r   r>   s    r/   _reset_per_message_stater    s    	).& 
s   
,c                l   UR                      [        U5      (       d
   S S S 5        gUR                  (       a:  [        US 5      [        R
                  " U[        U5      5      4nSUl        [        nO'[        R
                  " U[        U5      5      4n[        nU R                  R                  U[        X5      5        UR                  R                  U5        [        U5         UR                   R                  5         XAR                  ;  a  [        U5      sS S S 5        $ M?  ! , (       d  f       g = frs  )r   r   r   r   r   SendMessageOperationr  -_SEND_INITIAL_METADATA_AND_SEND_MESSAGE_TOKEN_SEND_MESSAGE_TOKENr   r   r   r   r   r  r[  )r   r?   r  r   r   s        r/   _send_responser    s     
#E** 
 ))/t<++'9%@J .3E*AE ++'9%@J (E))e3	
 			e 'OO  "II%+E2; 
4 5 
s   D%C1D%#D%%
D3c           	     b   UR                      UR                  [        La  [        U5      n[	        U5      n[
        R                  " UR                  X4[        5      /nUR                  (       a  UR                  [        US 5      5        Ub/  UR                  [
        R                  " U[        U5      5      5        U R                  R                  U[!        U["        5      5        SUl        ['        U5        UR(                  R+                  ["        5        S S S 5        g ! , (       d  f       g = fr   )r   r   r   r@   rE   r   r   r   r   r   r   r   r  r  r   r   r   r   r   r  r   r   )r   r?   r  r8   rD   r   s         r/   _statusr    s    
 
<<z)#E*DuoG44++TLJ
 --!!"A%"NO".!!//+=eD NN--(0NO "EN$U+IIMM891 
s   D
D  
D.c                P   [         R                  " U 5         U" 5       nUb1  [        XX&U5      u  pxU(       a  [        XXu5      n	U	b  [	        XU	5        [         R                  " 5         g ! [
         a    [        R                  " 5          N7f = f! [         R                  " 5         f = fr3   )	r   'install_context_from_request_call_eventr~  r  r  r1  ru  ry  uninstall_context)
r   r?   rz  argument_thunkr   r  r{  r  proceedr  s
             r/   _unary_response_in_poolr    s     229=#!# .(6J!H &9h'# '2I.AB 	  "   	  "s#   ;A) )BB 
BB B%c           	       ^ ^^ [         R                  " T 5        SUU U4S jjn U" 5       nUbU  [        US5      (       a   UR                  (       a  [	        T TUUUUS9  O$[	        T TX'U5      u  pU	(       a  [        T TXh5        [         R                  " 5         g ! [         a    [        R                  " 5          N7f = f! [         R                  " 5         f = f)Nc                f   > U c  [        TTS 5        g [        TTU T5      nUb  [        TTU5        g g r3   )r  r  r  )r  r  r  r   r?   s     r/   send_response/_stream_response_in_pool.<locals>.send_response-  sD    Iud+"55(,?# #.y%1DE /r1   experimental_non_blocking)r|  )r  r   ra   rG  )
r   r  hasattrr  r~  3_send_message_callback_to_blocking_iterator_adapterr1  ru  ry  r  )
r   r?   rz  r  r   r  r  r{  r  r  s
   ``   `    r/   _stream_response_in_poolr  #  s     229=F F#!#"=>>66(+8 .<uh:N.*! G!5- 	  "   	  "s/   :B B?  $B B<9B? ;B<<B? ?Cc                V    U R                   [        L=(       a    U R                  (       + $ r3   )r   r   r   r>   s    r/   r   r   T  s    <<z)@%...@@r1   c                h     [        XU5      u  pEU(       a  U" U5        [        U5      (       d  g Og M2  r3   )r  r   )r   r?   r|  r  r  r  s         r/   r  r  X  sD     A/
 "8,'.. /  r1   c                    [        U S5      (       a5  [        U R                  [        R                  5      (       a  U R                  $ U$ )Nexperimental_thread_pool)r  
isinstancer  r   ThreadPoolExecutor)rz  default_thread_pools     r/    _select_thread_pool_for_behaviorr  j  sC     x344))7+E+E: : 000r1   c           
         [        XUR                  5      n[        UR                  U5      nUR	                  UR
                  R                  [        U UUR                  UUR                  UR                  5      $ r3   )	ro  r   r  unary_unarysubmitr   runr  r  r   r?   r   r  rm  thread_pools         r/   _handle_unary_unaryr  u  sz     #.==M 3""$7K ""++**	 	r1   c           
         [        XUR                  5      n[        UR                  U5      nUR	                  UR
                  R                  [        U UUR                  UUR                  UR                  5      $ r3   )	ro  r   r  unary_streamr  r   r  r  r  r  s         r/   _handle_unary_streamr    sz     #.==M 3##%8K  ##++**	 	r1   c           
       ^ [        XR                  UR                  5      m[        UR                  U5      nUR                  UR                  R                  [        U UUR                  U4S jUR                  UR                  5      $ )Nc                    > T $ r3   rI   request_iterators   r/   <lambda>&_handle_stream_unary.<locals>.<lambda>       r1   )
rK  r   r   r  stream_unaryr  r   r  r  r  r   r?   r   r  r  r  s        @r/   _handle_stream_unaryr    s     (~~~BB 3##%8K ## ++**	 	r1   c           
       ^ [        XR                  UR                  5      m[        UR                  U5      nUR                  UR                  R                  [        U UUR                  U4S jUR                  UR                  5      $ )Nc                    > T $ r3   rI   r  s   r/   r  '_handle_stream_stream.<locals>.<lambda>  r  r1   )
rK  r   r   r  stream_streamr  r   r  r  r  r  s        @r/   _handle_stream_streamr    s     (~~~BB 3$$&9K  $$ ++**	 	r1   c                R  ^     SU4S jjnTR                  5       nU(       d*  [        R                  " U R                  R                  5      n[        UU R                  5      nUb&  UR                  R                  UR                  XF5      $ UR                  R                  XF5      $ )Nc                &   > TR                  U 5      $ r3   )r^   )r]   method_with_handlers    r/   query_handlers,_find_method_handler.<locals>.query_handlers  s     #**+?@@r1   rb   )
rY   r   r
  r   rO   rG   rP   r   r  execute)r   r?   r  interceptor_pipeliner  method_namer]   s     `    r/   _find_method_handlerr    s    A1A	(A
 &**,KnnY%;%;%B%BC.%%
 '}}   ((.
 	
 ==^BBr1   c                   ^ [        TS 5      [        R                  " [        5      [        R                  " S X#[        5      4nU R
                  R                  UU4S j5        g )Nc                   > TS4$ r   rI   )_ignored_event	rpc_states    r/   r  _reject_rpc.<locals>.<lambda>  s     
r1   )r   r   ReceiveCloseOnServerOperationr   r   r   r   )r   r  r5  rD   r   s    `   r/   _reject_rpcr    sU     	(	48,,\:,,&<	
J NN%%	
r1   c                   UR                      U R                  R                  [        R                  " [
        5      4[        U5      5        UR                  R                  [        5        UR                  (       a;  UR                  (       a  [        XX#5      sS S S 5        $ [        XX#5      sS S S 5        $ UR                  (       a  [        XX#5      sS S S 5        $ [        XX#5      sS S S 5        $ ! , (       d  f       g = fr3   )r   r   r   r   r  r   r   r   r   r   request_streamingresponse_streamingr  r  r  r  )r   r?   r   r  s       r/   _handle_with_method_handlerr    s     
))11,?A$U+	
 			45++00,n 
 (. 
 ,,'. 
$ #n
% 
s   BC2"C27C2C22
D c                `   U R                   (       d  gU R                  R                  (       d  UR                  5       (       a  [	        5       n [        U UUU5      nUc*  [        U U[        R                  R                  S5        US4$ U(       a*  [        U U[        R                  R                  S5        US4$ U[!        XXc5      4$ g! [         aZ  nSR                  U5      n[        R                  U5        [        U U[        R                  R                  S5        US4s SnA$ SnAff = f)a  Handles RPC based on provided handlers.

  When receiving a call event from Core, registered method will have its
name as tag, we pass the tag as registered_method_name to this method,
then we can find the handler in registered_method_handlers based on
the method name.

  For call event with unregistered method, the method name will be included
in rpc_event.call_details.method and we need to query the generics handlers
to find the actual handler.
)NNzException servicing handler: {}s   Error in service handler!Ns   Method not found!s   Concurrent RPC limit exceeded!)successr   rO   rY   r;   r  r1  rk  r-  rt  r  r   r6   r7   rl  resource_exhaustedr  )	r   r  r  r  concurrency_exceededr  r   rt  rD   s	            r/   _handle_callr  #  s/   $ $$(;(@(@(B(BK		#1#$	N  !!!//$	 d?"!!441	 d?"'n
 	
 A  		#7>>yIGg&!!)),	 d?"		#s   C	 	
D-AD("D-(D-c                       \ rS rSrSrSrSrSrg)_ServerStageic  stoppedstartedgracerI   N)rJ   rK   rL   rM   STOPPEDSTARTEDGRACErN   rI   r1   r/   r  r  c  s    GGEr1   r  c                      \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'               S#S  jrS!rg")$_ServerStateij  zthreading.RLocklockcygrpc.CompletionQueuecompletion_queuecygrpc.Serverserverr   r|    Dict[str, grpc.RpcMethodHandler]registered_method_handlers'Optional[_interceptor._ServicePipeline]r  futures.ThreadPoolExecutorr  r  stagethreading.Eventtermination_eventzList[threading.Event]shutdown_eventsOptional[int]maximum_concurrent_rpcsintactive_rpc_countzSet[_RPCState]
rpc_stateszSet[str]r   r   server_deallocatedc                |   [         R                  " 5       U l        Xl        X l        [        U5      U l        X@l        XPl        [        R                  U l        [         R                  " 5       U l        U R                  /U l        X`l        SU l        0 U l        [%        5       U l        [%        5       U l        SU l        g )Nr   F)r   RLockr  r  r  listr|   r  r  r  r  r  Eventr  r  r  r  r  r   r  r   r  )rX   r  r  r|   r  r  r  s          r/   rn   _ServerState.__init__|  s     OO%	 0 $%5 6$8!&!))
!*!2 $ 6 67'>$ !*,' %5 #(r1   )r  r  r   r|   r  r  r  r  r  r  r  r  r  r  r  N)r  r  r  r  r|    Sequence[grpc.GenericRpcHandler]r  r  r  r  r  r  )rJ   rK   rL   rM   r   rn   rN   rI   r1   r/   r  r  j  s    
,,22 @@AA++&&****	M(0( ( ;	(
 F( 0( "/(r1   r  c                    U R                      U R                  R                  U5        S S S 5        g ! , (       d  f       g = fr3   )r  r|   extend)r?   r|   s     r/   _add_generic_handlersr    s*     
%%&67 
	   2
A c                    U R                      U R                  R                  U5        S S S 5        g ! , (       d  f       g = fr3   )r  r  update)r?   method_handlerss     r/   _add_registered_method_handlersr    s)     
((//@ 
r  c                    U R                      U R                  R                  U5      sS S S 5        $ ! , (       d  f       g = fr3   )r  r  add_http2_port)r?   addresss     r/   _add_insecure_portr    s%    	||**73 
s	   2
A c                    U R                      U R                  R                  XR                  5      sS S S 5        $ ! , (       d  f       g = fr3   )r  r  r	  _credentials)r?   r
  server_credentialss      r/   _add_secure_portr    s0    
 
||**44
 
s	   %<
A
c                    U R                   R                  U R                  U R                  [        5        U R                  R                  [        5        g r3   )r  r!   r  _REQUEST_CALL_TAGr   r   r>   s    r/   _request_callr    s;    	LL 6 68I 
IIMM#$r1   c                    UnU R                   R                  U R                  U R                  UU5        U R                  R	                  U5        g r3   )r  request_registered_callr  r   r   )r?   rO   registered_call_tags      r/   _request_registered_callr    sE     	LL((	 
IIMM%&r1   c                    U R                   (       dd  U R                  (       dS  U R                  R                  5         U R                   H  nUR                  5         M     [        R                  U l        ggr   )	r  r   r  destroyr  r   r  r  r  )r?   shutdown_events     r/   _stop_servingr    sP    EII#33N  4"**r1   c                z    U R                      U =R                  S-  sl        S S S 5        g ! , (       d  f       g = f)N   )r  r  r>   s    r/   _on_call_completedr    s$    	!# 
s   ,
:c                ,  ^  SnUR                   [        L aH  T R                     T R                  R	                  [        5        [        T 5      (       a  SnS S S 5        U$ UR                   [        L d)  UR                   T R                  R                  5       ;   Ga  S nUR                   T R                  R                  5       ;   a3  UR                   n[        UT R                  R                  US 5      5      nO[        T R                  5      nT R                     T R                  R	                  UR                   5        T R                  S L=(       a    T R                  T R                  :  n[        UUT R                   T R"                  U5      u  pgUb  T R$                  R'                  U5        Ub*  T =R                  S-  sl        UR)                  U 4S j5        T R*                  [,        R.                  L a7  UT R                  R                  5       ;   a  [1        T U5        O[3        T 5        O[        T 5      (       a  SnS S S 5        U$ UR                  U5      u  phU H  n	 U	" 5         M     UbD  T R                     T R$                  R	                  U5        [        T 5      (       a  SnS S S 5        U$ U$ ! , (       d  f       U$ = f! , (       d  f       U$ = f! [4         a    [6        R9                  S5         M  f = f! , (       d  f       U$ = f)NTFr  c                   > [        T5      $ r3   )r  )_unused_futurer?   s    r/   r  -_process_event_and_continue.<locals>.<lambda>  s    +=e+Dr1   zException calling callback!)tag_SHUTDOWN_TAGr  r   r   r  r  r  keysrg   r5   rw   r|   r  r  r  r  r  r  r   add_done_callbackr  r  r  r  r  r1  r-  rt  )
r?   eventshould_continueregistered_method_namer  r  r  
rpc_futurer   r  s
   `         r/   _process_event_and_continuer*    s    OyyM!ZZII]+U##"' ~ u 			&&9988==??!%9988==??%*YY""3&0044*D# #1&&# ZZIIUYY'--T9 L**e.K.KK ! %1#**!!$%!I $  $$Y/%&&!+&,,D {{l222*77<<>? -U4JK!%(u%%"'; T   %yy/	!HA
 "
    ''	2 ''&+O  ? Z~ U ZT   A!!"?@A  s6   2J:D*K&K .L:
K	
KL L
Lc                $    [         R                   " 5       [        -   nU R                  R                  U5      nU R                  (       a  [        U 5        UR                  [        R                  R                  :w  a  [        X5      (       d  g S nM  r3   )r   "_DEALLOCATED_SERVER_CHECK_PERIOD_Sr  pollr  _begin_shutdown_oncecompletion_typer   CompletionTypequeue_timeoutr*  )r?   timeoutr&  s      r/   _server3  "  sq    
))+ BB&&++G4## '  F$9$9$G$GG.u<<  r1   c                F   U R                      U R                  [        R                  L a^  U R                  R                  U R                  [        5        [        R                  U l        U R                  R                  [        5        S S S 5        g ! , (       d  f       g = fr3   )r  r  r  r  r  r    r  r#  r  r   r   r>   s    r/   r.  r.  1  s\    	;;,...LL!!%"8"8-H&,,EKIIMM-(	 
s   A<B
B c                4  ^ ^^ T R                      T R                  [        R                  L a0  [        R
                  " 5       mTR                  5         TsS S S 5        $ [        T 5        [        R
                  " 5       mT R                  R                  T5        Tc  T R                  R                  5         O7UUU 4S jn[        R                  " US9nUR                  5         TsS S S 5        $  S S S 5        TR                  5         T$ ! , (       d  f       N = f)Nc                    > TR                  T S9  TR                     TR                  R                  5         S S S 5        g ! , (       d  f       g = fN)r2  )r[  r  r  cancel_all_calls)r  r  r?   s   r/   cancel_all_calls_after_grace+_stop.<locals>.cancel_all_calls_after_graceF  s5    ##E#2ZZLL113  ZZs   A
A)target)r  r  r  r  r   r  r   r.  r  r   r  r8  Threadstartr[  )r?   r  r9  threadr  s   ``  @r/   _stopr?  9  s    	;;,...&__.N !	 

 	U#"*$$^4=LL))+4
 %%-IJFLLN!' 
 , 
( + 
s   AD	BD		
Dc                   U R                      U R                  [        R                  La  Sn[	        U5      eU R
                  R                  5         [        R                  U l        U R                  R                  5        H  n[        X5        M     [        U 5        [        R                  " [        U 4S9nSUl        UR                  5         S S S 5        g ! , (       d  f       g = f)Nz$Cannot start already-started server!)r;  argsT)r  r  r  r  r!  r  r=  r  r  r$  r  r  r   r<  r3  daemon)r?   r#  rO   r>  s       r/   _startrC  R  s    	;;l222>IY''"**66;;=F$U3 > 	e!!uh? 
s   CC
C&c                X    U  H$  n[        USS 5      nUb  M  SU S3n[        U5      e   g )Nr   "zP" must conform togrpc.GenericRpcHandler type but does not have "service" method!)getattrAttributeError)generic_rpc_handlersgeneric_rpc_handlerservice_attributer#  s       r/   _validate_generic_rpc_handlersrK  c  sL      4#$7DI$'( )R R  !++  4r1   c                |    [         R                  " U5      n[        R                  " U5      n[	        U 5      U-   U-   $ r3   )r   create_channel_optionr   (create_server_call_tracer_factory_optionr   )base_optionsr  xdscompression_option'maybe_server_call_tracer_factory_options        r/   _augment_optionsrS  p  sG    
 &;;KH??D , 	l
	
1	2r1   c                      \ rS rSr% S\S'                 SS jr    SS jr      SS jrSS jr      SS jr	SS	 jr
SSS jjrSS jrS rSrg
)_Serveri  r  r   c                    [         R                  " 5       n[         R                  " [        XFU5      U5      n	U	R	                  U5        [        UU	U[        R                  " U5      UU5      U l        Xl	        g r3   )
r   CompletionQueueServerrS  register_completion_queuer  r   service_pipeliner   
_cy_server)
rX   r  r|   interceptorsoptionsr  r  rP  r  r  s
             r/   rn   _Server.__init__  sj     "113/cJCP(()9:")),7#
 !r1   c                F    [        U5        [        U R                  U5        g r3   )rK  r  r   )rX   rH  s     r/   add_generic_rpc_handlers _Server.add_generic_rpc_handlers  s     	'';<dkk+?@r1   c                   U R                   R                     U R                   R                  [        R                  L a
   S S S 5        g  S S S 5        UR                  5        VVs0 s H  u  p4[        R                  " X5      U_M     nnnUR                  5        H  nU R                  R                  U5        M      [        U R                   U5        g ! , (       d  f       N= fs  snnf r3   )r   r  r  r  r  r  r   fully_qualified_methodr$  r[  register_methodr  )rX   service_namer  rO   r   method_to_handlersrc  s          r/   add_registered_method_handlers&_Server.add_registered_method_handlers  s     [[{{  L$8$88 8  +:*?*?*A
*A& **<@.P*A 	 
 '9&=&=&?"OO++,BC '@'5GH 

s   )C%#C%
C"c           	         [         R                  " U[        U R                  [         R                  " U5      5      5      $ r3   )r   validate_port_binding_resultr  r   r0  )rX   r
  s     r/   add_insecure_port_Server.add_insecure_port  s/    33'W^^G5LM
 	
r1   c           	         [         R                  " U[        U R                  [         R                  " U5      U5      5      $ r3   )r   rj  r  r   r0  )rX   r
  r  s      r/   add_secure_port_Server.add_secure_port  s7     33W^^G46H
 	
r1   c                .    [        U R                  5        g r3   )rC  r   rW   s    r/   r=  _Server.start  s    t{{r1   Nc                    [         R                  " U R                  R                  R                  U R                  R                  R                  US9$ r7  )r   r[  r   r  is_set)rX   r2  s     r/   wait_for_termination_Server.wait_for_termination  s>     ||KK))..KK))00
 	
r1   c                .    [        U R                  U5      $ r3   )r?  r   )rX   r  s     r/   stop_Server.stop  s    T[[%((r1   c                J    [        U S5      (       a  SU R                  l        g g )Nr   T)r  r   r  rW   s    r/   __del___Server.__del__  s"    4"" .2DKK* #r1   )r[  r   )r  r  r|   r  r\   Sequence[grpc.ServerInterceptor]r]  Sequence[ChannelArgumentType]r  r  r  r   rP  r   rH   Iterable[grpc.GenericRpcHandler]ra   rG  )re  rt   r  r  ra   rG  )r
  rt   ra   r  )r
  rt   r  grpc.ServerCredentialsra   r  rF  r3   )r2  Optional[float]ra   r   )r  r  ra   r  )rJ   rK   rL   rM   r   rn   r`  rg  rk  rn  r=  rt  rw  rz  rN   rI   r1   r/   rU  rU    s    !/! ;! 7	!
 /! "/! 0! !.A$DA	AII :I 
	I&



0F
	

)2r1   rU  c           	     :    [        U5        [        U UUUUUU5      $ r3   )rK  rU  )r  rH  r\  r]  r  r  rP  s          r/   create_serverr    s/     ##78 r1   )r.   r   ra   rI  )r8   rH  ra   cygrpc.StatusCode)r?   r;   ra   r  )r?   r;   r8   r  ra   r  )r?   r;   ra   rI  )r?   r;   ra   rG  )r?   r;   r   rt   ra   r   )r?   r;   r   rt   ra   r   )r?   r;   r   r   ra   r   )r?   r;   r   r   ra   zcygrpc.Operation)
r?   r;   r   rL  r8   r  rD   rI  ra   rG  )r?   r;   ra   r   )r?   r;   r   rL  r   r   ra   r   )r   r   r?   r;   r   r   ra   Callable[[], Any]r3   )r   r   r?   r;   rz  r   r{  r   r   r   r|  z(Optional[Callable[[ResponseType], None]]ra   z8Tuple[Union[ResponseType, Iterator[ResponseType]], bool])r   r   r?   r;   r  Iterator[ResponseType]ra   zTuple[ResponseType, bool])
r   r   r?   r;   r  r   r  Optional[SerializingFunction]ra   r   )r?   r;   ra   zUnion[int, cygrpc.WriteFlag])r   r   r?   r;   r  rI  ra   r   )r   r   r?   r;   r  r   ra   rG  )r   r   r?   r;   rz  r   r  r  r   r  r  r  ra   rG  )r   r   r?   r;   rz  r   r  r  r   r   r  r  ra   rG  )r?   r;   ra   r   )
r   r   r?   r;   r|  zCallable[[ResponseType], None]r  r  ra   rG  )rz  r   r  r  ra   r  )
r   r   r?   r;   r   grpc.RpcMethodHandlerr  r  ra   futures.Future)
r   r   r?   r;   r  rR   r  r  ra   rc   )r   r   r  r;   r5  r  rD   rI  )
r   r   r?   r;   r   r  r  r  ra   r  )r   r   r  rR   r  r  r  r  r  r   ra   z4Tuple[Optional[_RPCState], Optional[futures.Future]])r?   r  r|   r  ra   rG  )r?   r  r  r  ra   rG  )r?   r  r
  rI  ra   r  )r?   r  r
  rI  r  r  ra   r  )r?   r  ra   rG  )r?   r  rO   rt   ra   rG  )r?   r  ra   r   )r?   r  r&  r   ra   r   )r?   r  r  r  ra   r  r~  )rO  r}  r  r   rP  r   ra   r}  )r  r  rH  r  r\  r|  r]  r}  r  r  r  r   rP  r   ra   rU  )__doc__
__future__r   rd   collections
concurrentr   r   enumloggingr   r   ru  typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   grpc._cythonr   grpc._typingr   r   r   r   r   r   r   r   r   typing_extensionsr   	getLoggerrJ   r-  r#  r  r   r   r   r  r  r   r   r   r   r   r   r,  _INF_TIMEOUTr0   r:   r@   rB   rE   
namedtupleHandlerCallDetailsrG   ABCrR   rg   rw   objectr;   r   r   r   r   r   r   r   r   r   r   ServicerContextr   rK  ro  r~  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  uniqueEnumr  r  r  r  r  r  r  r  r  r  r*  r3  r.  r?  rC  rK  rS  rX  rU  r  rI   r1   r/   <module>r     s   2 " 
                  3 , . % , % , * . &


H
%" !: 6 * $ * . "; 5 9 	

%( "7M
)))-));
		
 	
		$cgg 	$( ((W 0   F # 6  6'/@KP	D
#
 : 	B!vt## vr<v <~%%% :% 	%\ HL777 )7 	7
 :7 E7 >7t . 	<  7	
 &!/
 3 3(1 3HM 3	 3F::: ): 
	:@### )# &	#
 8# 7# 
#8.#.#.# ).# &	.#
 :.# 7.# 
.#bA ; .	
 
$(3   * 4	
 0 * 4	
 0 * 4	
 0 * 4	
 0CCC !C B	C
 %C6  	,


 *
 ,	

 
:== = B= ,	=
 = :=@ 499  -(6 -(`88+K8	8AA*JA	A4



 /
 		
%'$DD 0D	DN)2"
,:
,	
,/+ 
 #	 W2dkk W2t+: 3 +	
 + , 
 r1   