§
    ¨öÉgtF  ã                   ó@  — d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZmZ ddlZddlmZmZmZ ddlmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZmZmZmZm Z m!Z! dZ" G d„ d¦  «        Z#dee$         de	e         de
e%         fd„Z&dee$         dee         de	e         fd„Z'dS )zR
wsproto/handshake
~~~~~~~~~~~~~~~~~~

An implementation of WebSocket handshakes.
é    )Údeque)	ÚcastÚDequeÚDictÚ	GeneratorÚIterableÚListÚOptionalÚSequenceÚUnionNé   )Ú
ConnectionÚConnectionStateÚConnectionType)ÚAcceptConnectionÚEventÚRejectConnectionÚ
RejectDataÚRequest)Ú	Extension)ÚHeaders)Úgenerate_accept_tokenÚgenerate_nonceÚLocalProtocolErrorÚnormed_header_dictÚRemoteProtocolErrorÚsplit_comma_headers   13c                   óT  — e Zd ZdZdeddfd„Zedefd„¦   «         Zede	e
         fd„¦   «         Zded	eeef         ddfd
„Zdedefd„Zde	e         ddfd„Zdeeddf         fd„Zdej        defd„Zdedefd„Zdedefd„Zdedefd„Zdedefd„Zdej         defd„Z!defd„Z"dS )ÚH11Handshakez4A Handshake implementation for HTTP/1.1 connections.Úconnection_typeÚreturnNc                 ó:  — |t           j        u | _        t          j        | _        | j        r$t          j        t          j        ¦  «        | _        n#t          j        t          j	        ¦  «        | _        d | _
        t          ¦   «         | _        d | _        d | _        d S ©N)r   ÚCLIENTÚclientr   Ú
CONNECTINGÚ_stateÚh11r   Ú_h11_connectionÚSERVERÚ_connectionr   Ú_eventsÚ_initiating_requestÚ_nonce)Úselfr    s     ú]/var/www/html/nodeJS/PythonScripts/venv3.11/lib/python3.11/site-packages/wsproto/handshake.pyÚ__init__zH11Handshake.__init__*   sv   € Ø%­Ô)>Ð>ˆŒÝ%Ô0ˆŒàŒ;ð 	>Ý#&¤>µ#´*Ñ#=Ô#=ˆDÔ Ð å#&¤>µ#´*Ñ#=Ô#=ˆDÔ à15ˆÔÝ%*¡W¤WˆŒØ6:ˆÔ Ø'+ˆŒˆˆó    c                 ó   — | j         S r#   )r'   ©r/   s    r0   ÚstatezH11Handshake.state8   s
   € àŒ{Ðr2   c                 ó   — | j         S )zÙReturn the established connection.

        This will either return the connection or raise a
        LocalProtocolError if the connection has not yet been
        established.

        :rtype: h11.Connection
        )r+   r4   s    r0   Ú
connectionzH11Handshake.connection<   s   € ð ÔÐr2   ÚheadersÚpathc                 óì   — | j         rt          d¦  «        ‚t          j        d||¬¦  «        }t          j        t          j        ¦  «        }|                      |                     |¦  «        ¦  «         dS )zóInitiate an upgrade connection.

        This should be used if the request has already be received and
        parsed.

        :param list headers: HTTP headers represented as a list of 2-tuples.
        :param str path: A URL path.
        z?Cannot initiate an upgrade connection when acting as the clientó   GET©ÚmethodÚtargetr8   N)r%   r   r(   r   r   r$   Úreceive_dataÚsend)r/   r8   r9   Úupgrade_requestÚ
h11_clients        r0   Úinitiate_upgrade_connectionz(H11Handshake.initiate_upgrade_connectionH   sr   € ð Œ;ð 	Ý$ØQñô ð õ œ+¨V¸DÈ'ÐRÑRÔRˆÝ”^¥C¤JÑ/Ô/ˆ
Ø×Ò˜*Ÿ/š/¨/Ñ:Ô:Ñ;Ô;Ð;Ð;Ð;r2   Úeventc                 ó   — d}t          |t          ¦  «        r||                      |¦  «        z  }n�t          |t          ¦  «        r||                      |¦  «        z  }not          |t
          ¦  «        r||                      |¦  «        z  }nAt          |t          ¦  «        r||                      |¦  «        z  }nt          d|› d�¦  «        ‚|S )a
  Send an event to the remote.

        This will return the bytes to send based on the event or raise
        a LocalProtocolError if the event is not valid given the
        state.

        :returns: Data to send to the WebSocket peer.
        :rtype: bytes
        r2   zEvent z$ cannot be sent during the handshake)
Ú
isinstancer   Ú_initiate_connectionr   Ú_acceptr   Ú_rejectr   Ú_send_reject_datar   ©r/   rD   Údatas      r0   r@   zH11Handshake.send[   sÞ   € ð ˆÝ�e�WÑ%Ô%ð 	Ø�D×-Ò-¨eÑ4Ô4Ñ4ˆDˆDÝ˜Õ/Ñ0Ô0ð 		Ø�D—L’L Ñ'Ô'Ñ'ˆDˆDÝ˜Õ/Ñ0Ô0ð 	Ø�D—L’L Ñ'Ô'Ñ'ˆDˆDÝ˜�zÑ*Ô*ð 	Ø�D×*Ò*¨5Ñ1Ô1Ñ1ˆDˆDå$ØD˜ÐDÐDÐDñô ð ð ˆr2   rL   c                 óJ  — | j                              |pd¦  «         	 	 | j                              ¦   «         }n0# t          j        $ r t	          dt          ¦   «         ¬¦  «        ‚w xY wt          |t          j        ¦  «        s|t          j        u s|t          j	        u rd	S | j
        �r³t          |t          j        ¦  «        rŽ|j        dk    r/| j                             |                      |¦  «        ¦  «         �n¦| j                             t          t!          |j        ¦  «        |j        d¬¦  «        ¦  «         t$          j        | _        �nRt          |t          j        ¦  «        rSt$          j        | _        | j                             t          t!          |j        ¦  «        |j        d¬¦  «        ¦  «         nåt          |t          j        ¦  «        r/| j                             t1          |j        d¬¦  «        ¦  «         nœt          |t          j        ¦  «        r:| j                             t1          dd¬¦  «        ¦  «         t$          j        | _        nGt          |t          j        ¦  «        r-| j                             |                      |¦  «        ¦  «         �Œ‡)
zåReceive data from the remote.

        A list of events that the remote peer triggered by sending
        this data can be retrieved with :meth:`events`.

        :param bytes data: Data received from the WebSocket peer.
        r2   TzBad HTTP message©Ú
event_hintée   F)r8   Ústatus_codeÚhas_body)rL   Úbody_finishedN)r)   r?   Ú
next_eventr(   r   r   rF   ÚConnectionClosedÚ	NEED_DATAÚPAUSEDr%   ÚInformationalResponserQ   r,   ÚappendÚ_establish_client_connectionÚlistr8   r   ÚCLOSEDr'   ÚResponseÚ	REJECTINGÚDatar   rL   ÚEndOfMessager   Ú_process_connection_request)r/   rL   rD   s      r0   r?   zH11Handshake.receive_datat   s�  € ð 	Ô×)Ò)¨$¨+°#Ñ6Ô6Ð6ð-	QðØÔ,×7Ò7Ñ9Ô9��øÝÔ*ð ð ð Ý)Ø&Õ3CÑ3EÔ3Eðñ ô ð ðøøøõ
 ˜5¥#Ô"6Ñ7Ô7ðà�CœMÐ)Ð)Ø�CœJÐ&Ð&à�àŒ{ñ QÝ˜e¥SÔ%>Ñ?Ô?ð 9ØÔ(¨CÒ/Ð/Øœ×+Ò+¨D×,MÒ,MÈeÑ,TÔ,TÑUÔUÐUÑUàœ×+Ò+Ý,Ý(,¨U¬]Ñ(;Ô(;Ø,1Ô,=Ø).ðñ ô ñô ð õ '6Ô&<˜œ™Ý ¥s¤|Ñ4Ô4ð 9Ý"1Ô";�D”KØ”L×'Ò'Ý(Ý$(¨¬Ñ$7Ô$7Ø(-Ô(9Ø%)ðñ ô ñô ð ð õ   ¥s¤xÑ0Ô0ð 9Ø”L×'Ò'Ý"¨¬
À%ÐHÑHÔHñô ð ð õ   ¥sÔ'7Ñ8Ô8ð 9Ø”L×'Ò'­
¸È4Ð(PÑ(PÔ(PÑQÔQÐQÝ"1Ô"8�D”Køå˜e¥S¤[Ñ1Ô1ð QØ”L×'Ò'¨×(HÒ(HÈÑ(OÔ(OÑPÔPÐPñ[-	Qs	   Ÿ9 ¹-A&c              #   ó`   K  — | j         r$| j                              ¦   «         V — | j         °"dS dS )z¢Return a generator that provides any events that have been generated
        by protocol activity.

        :returns: a generator that yields H11 events.
        N)r,   Úpopleftr4   s    r0   ÚeventszH11Handshake.events¬   sL   è è € ð Œlð 	)Ø”,×&Ò&Ñ(Ô(Ð(Ð(Ð(ð Œlð 	)ð 	)ð 	)ð 	)ð 	)r2   c           	      óR  — |j         dk    rt          dt          ¦   «         ¬¦  «        ‚d }g }d }d }g }d}d }g }	|j        D ]Î\  }
}|
                     ¦   «         }
|
dk    rt          |¦  «        }nˆ|
dk    r|                     d¦  «        }ŒK|
dk    r#|                     t          |¦  «        ¦  «         Œt|
d	k    r|}n:|
d
k    r#|                     t          |¦  «        ¦  «         Œ¦|
dk    r|}n|
dk    r|}|	                     |
|f¦  «         ŒÏ|�t          d„ |D ¦   «         ¦  «        st          dt          ¦   «         ¬¦  «        ‚|t          k    r,t          dt          dt          fg|rdnd¬¦  «        ¬¦  «        ‚|€t          dt          ¦   «         ¬¦  «        ‚|                     ¦   «         dk    rt          dt          ¦   «         ¬¦  «        ‚|€t          dt          ¦   «         ¬¦  «        ‚t          ||	|||j                             d¦  «        ¬¦  «        | _        | j        S )Nr;   zRequest method must be GETrN   r2   ó
   connections   hostÚidnaó   sec-websocket-extensionsó   sec-websocket-keyó   sec-websocket-protocols   sec-websocket-versionó   upgradec              3   óF   K  — | ]}|                      ¦   «         d k    V — ŒdS ©ÚupgradeN©Úlower©Ú.0Útokens     r0   ú	<genexpr>z;H11Handshake._process_connection_request.<locals>.<genexpr>Ú   ó@   è è € ð 0
ð 0
Ø+0ˆE�KŠK‰MŒM˜YÒ&ð0
ð 0
ð 0
ð 0
ð 0
ð 0
r2   ú%Missing header, 'Connection: Upgrade'z'Missing header, 'Sec-WebSocket-Version'ó   Sec-WebSocket-Versioniª  i�  )r8   rQ   z#Missing header, 'Sec-WebSocket-Key'ó	   websocketú$Missing header, 'Upgrade: WebSocket'zMissing header, 'Host'Úascii)Ú
extensionsÚextra_headersÚhostÚsubprotocolsr>   )r=   r   r   r8   rp   r   ÚdecodeÚextendrY   ÚanyÚWEBSOCKET_VERSIONr   r>   r-   )r/   rD   Úconnection_tokensr{   r}   Úkeyr~   rn   Úversionr8   ÚnameÚvalues               r0   ra   z(H11Handshake._process_connection_request·   sØ  € ð Œ<˜6Ò!Ð!Ý%Ø,Õ9IÑ9KÔ9Kðñ ô ð ð !ÐØ "ˆ
ØˆØˆØ"$ˆØˆØˆØˆØ œ=ð 	*ð 	*‰KˆD�%Ø—:’:‘<”<ˆDØ�}Ò$Ð$Ý$6°uÑ$=Ô$=Ð!Ð!Ø˜’�Ø—|’| FÑ+Ô+�ØØÐ4Ò4Ð4Ø×!Ò!Õ"4°UÑ";Ô";Ñ<Ô<Ð<ØØÐ-Ò-Ð-Ø��ØÐ2Ò2Ð2Ø×#Ò#Õ$6°uÑ$=Ô$=Ñ>Ô>Ð>ØØÐ1Ò1Ð1Ø��Ø˜Ò#Ð#Ø�Ø�NŠN˜D %˜=Ñ)Ô)Ð)Ð)ØÐ$­Cð 0
ð 0
Ø4Eð0
ñ 0
ô 0
ñ -
ô -
Ð$õ &Ø7ÕDTÑDVÔDVðñ ô ð ð Õ'Ò'Ð'Ý%Ø9Ý+Ø6Õ8IÐJÐKØ'.Ð 7  °Cðñ ô ðñ ô ð ð ˆ;Ý%Ø5ÕBRÑBTÔBTðñ ô ð ð �=Š=‰?Œ?˜lÒ*Ð*Ý%Ø6ÕCSÑCUÔCUðñ ô ð ð ˆ<Ý%Ø(Õ5EÑ5GÔ5Gðñ ô ð õ $+Ø!Ø!ØØ%Ø”<×&Ò& wÑ/Ô/ð$
ñ $
ô $
ˆÔ ð Ô'Ð'r2   c                 ó   — | j         €J ‚t          | j         j        ¦  «        }|d         }t          |¦  «        }ddd|fg}|j        �Y|j        | j         j        vrt          d|j        › �¦  «        ‚|                     d|j                             d¦  «        f¦  «         |j	        rVt          t          t          t                   | j         j	        ¦  «        |j	        ¦  «        }|r|                     d|f¦  «         t          j        d	||j        z   ¬
¦  «        }t!          | j        rt$          j        nt$          j        |j	        ¦  «        | _        t,          j        | _        | j                             |¦  «        pdS )Nri   ©ó   Upgrades	   WebSocket©s
   ConnectionrŠ   s   Sec-WebSocket-Acceptzunexpected subprotocol ó   Sec-WebSocket-Protocolrz   ó   Sec-WebSocket-ExtensionsrP   ©rQ   r8   r2   )r-   r   r|   r   Úsubprotocolr~   r   rY   Úencoder{   Úserver_extensions_handshaker   r   Ústrr(   rX   r   r%   r   r$   r*   r+   r   ÚOPENr'   r)   r@   )r/   rD   Úrequest_headersÚnonceÚaccept_tokenr8   ÚacceptsÚresponses           r0   rH   zH11Handshake._acceptþ   s“  € àÔ'Ð3Ð3Ð3Ý,¨TÔ-EÔ-SÑTÔTˆàÐ 4Ô5ˆÝ,¨UÑ3Ô3ˆð 'Ø'Ø$ lÐ3ð
ˆð ÔÐ(ØÔ ¨Ô(@Ô(MÐMÐMÝ(Ð)VÀ5ÔCTÐ)VÐ)VÑWÔWÐWØ�NŠNØ*¨EÔ,=×,DÒ,DÀWÑ,MÔ,MÐNñô ð ð Ôð 	GÝ1Ý•X�c”] DÔ$<Ô$GÑHÔHØÔ ñô ˆGð ð GØ—’Ð ;¸WÐEÑFÔFÐFåÔ,Ø W¨uÔ/BÑ%Bð
ñ 
ô 
ˆõ &Ø%)¤[ÐK�NÔ!Ð!µnÔ6KØÔñ
ô 
ˆÔõ &Ô*ˆŒØÔ#×(Ò(¨Ñ2Ô2Ð9°cÐ9r2   c                 óÞ  — | j         t          j        k    rt          d| j         z  ¦  «        ‚t	          |j        ¦  «        }|j        s|                     d¦  «         t          j	        |j
        |¬¦  «        }| j                             |¦  «        pd}t          j        | _        |j        sA|| j                             t          j        ¦   «         ¦  «        pdz  }t          j        | _        |S )Nz)Connection cannot be rejected in state %s)s   content-lengthó   0rŽ   r2   )r5   r   r&   r   r[   r8   rR   rY   r(   r]   rQ   r)   r@   r^   r'   r`   r\   )r/   rD   r8   r˜   rL   s        r0   rI   zH11Handshake._reject%  sÚ   € ØŒ:�Ô3Ò3Ð3Ý$Ø;¸d¼jÑHñô ð õ �u”}Ñ%Ô%ˆØŒ~ð 	6Ø�NŠNÐ4Ñ5Ô5Ð5Ý”<¨EÔ,=ÀwÐOÑOÔOˆØÔ#×(Ò(¨Ñ2Ô2Ð9°cˆÝ%Ô/ˆŒØŒ~ð 	1Ø�DÔ(×-Ò-­cÔ.>Ñ.@Ô.@ÑAÔAÐHÀSÑHˆDÝ)Ô0ˆDŒKØˆr2   c                 óV  — | j         t          j        k    rt          d| j         › �¦  «        ‚| j                             t          j        |j        ¬¦  «        ¦  «        pd}|j	        rA|| j                             t          j
        ¦   «         ¦  «        pdz  }t          j        | _        |S )Nz$Cannot send rejection data in state )rL   r2   )r5   r   r^   r   r)   r@   r(   r_   rL   rS   r`   r\   r'   rK   s      r0   rJ   zH11Handshake._send_reject_data6  s    € ØŒ:�Ô2Ò2Ð2Ý$ØC°t´zÐCÐCñô ð ð Ô#×(Ò(­¬°u´zÐ)BÑ)BÔ)BÑCÔCÐJÀsˆØÔð 	1Ø�DÔ(×-Ò-­cÔ.>Ñ.@Ô.@ÑAÔAÐHÀSÑHˆDÝ)Ô0ˆDŒKØˆr2   Úrequestc                 óÆ  — || _         t          ¦   «         | _        d|j                             d¦  «        fddd| j        fdt
          fg}|j        rB|                     dd                     |j        ¦  «                             d	¦  «        f¦  «         |j	        röi }|j	        D ]5}t          |t          ¦  «        sJ ‚|                     ¦   «         ||j        <   Œ6g }|                     ¦   «         D ]t\  }}|                     d	¦  «        }t          |t          ¦  «        r|r|                     |¦  «         ŒG|                     d
||                     d	¦  «        fz  ¦  «         Œu|r*|                     dd                     |¦  «        f¦  «         t!          j        d|j                             d	¦  «        ||j        z   ¬¦  «        }	| j                             |	¦  «        pdS )Ns   Hostrg   r‰   r‹   s   Sec-WebSocket-Keyrw   rŒ   z, rz   ó   %s; %sr�   ó   , r;   r<   r2   )r-   r   r.   r}   r�   r‚   r~   rY   Újoinr{   rF   r   Úofferr†   ÚitemsÚboolr(   r   r>   r|   r)   r@   )
r/   rœ   r8   ÚoffersÚer{   r†   ÚparamsÚbnamern   s
             r0   rG   z!H11Handshake._initiate_connectionD  sþ  € Ø#*ˆÔ Ý$Ñ&Ô&ˆŒð �g”l×)Ò)¨&Ñ1Ô1Ð2Ø&Ø'Ø! 4¤;Ð/Ø%Õ'8Ð9ð
ˆð Ôð 	Ø�NŠNà-Ø—Y’Y˜wÔ3Ñ4Ô4×<Ò<¸WÑEÔEðñô ð ð Ôð 	VØ24ˆFØÔ'ð +ð +�Ý! !¥YÑ/Ô/Ð/Ð/Ð/Ø!"§¢¡¤��q”v‘�ØˆJØ &§¢¡¤ð Sð S‘��fØŸš GÑ,Ô,�Ý˜f¥dÑ+Ô+ð SØð 1Ø"×)Ò)¨%Ñ0Ô0Ð0øà×%Ò% i°5¸&¿-º-ÈÑ:PÔ:PÐ2QÑ&QÑRÔRÐRÐRØð VØ—’Ð ;¸U¿ZºZÈ
Ñ=SÔ=SÐTÑUÔUÐUå”+ØØ”>×(Ò(¨Ñ1Ô1Ø˜gÔ3Ñ3ð
ñ 
ô 
ˆð
 Ô#×(Ò(¨Ñ1Ô1Ð8°SÐ8r2   c                 óF  — | j         €J ‚| j        €J ‚d }d }g }d }d}g }|j        D ]Š\  }}	|                     ¦   «         }|dk    rt	          |	¦  «        }Œ/|dk    rt	          |	¦  «        }ŒE|dk    r|	}ŒN|dk    r|	                     d¦  «        }Œj|dk    r|	}Œs|                     ||	f¦  «         Œ‹|�t          d„ |D ¦   «         ¦  «        st          d	t          ¦   «         ¬
¦  «        ‚|                     ¦   «         dk    rt          dt          ¦   «         ¬
¦  «        ‚t          | j        ¦  «        }
||
k    rt          dt          ¦   «         ¬
¦  «        ‚|�.|| j         j        vr t          d|› �t          ¦   «         ¬
¦  «        ‚t          |t          t          t                   | j         j        ¦  «        ¦  «        }t#          | j        rt&          j        nt&          j        || j        j        d         ¦  «        | _        t2          j        | _        t9          |||¬¦  «        S )Nr2   rf   rh   s   sec-websocket-acceptrj   rz   rk   c              3   óF   K  — | ]}|                      ¦   «         d k    V — ŒdS rm   ro   rq   s     r0   rt   z<H11Handshake._establish_client_connection.<locals>.<genexpr>�  ru   r2   rv   rN   rx   ry   zBad accept tokenzunrecognized subprotocol r   )r{   r|   r�   )r-   r.   r8   rp   r   r   rY   r�   r   r   r   r~   Úclient_extensions_handshaker   r   r   r{   r   r%   r   r$   r*   r)   Útrailing_datar+   r   r“   r'   r   )r/   rD   Úacceptrƒ   r—   r�   rn   r8   r†   r‡   r–   r{   s               r0   rZ   z)H11Handshake._establish_client_connectiono  s�  € ð Ô'Ð3Ð3Ð3ØŒ{Ð&Ð&Ð&àˆØ ÐØˆØˆØˆØˆØ œ=ð 	*ð 	*‰KˆD�%Ø—:’:‘<”<ˆDØ�}Ò$Ð$Ý$6°uÑ$=Ô$=Ð!ØØÐ4Ò4Ð4Ý,¨UÑ3Ô3�ØØÐ0Ò0Ð0Ø�ØØÐ2Ò2Ð2Ø#Ÿlšl¨7Ñ3Ô3�ØØ˜Ò#Ð#Ø�ØØ�NŠN˜D %˜=Ñ)Ô)Ð)Ð)àÐ$­Cð 0
ð 0
Ø4Eð0
ñ 0
ô 0
ñ -
ô -
Ð$õ &Ø7ÕDTÑDVÔDVðñ ô ð ð �=Š=‰?Œ?˜lÒ*Ð*Ý%Ø6ÕCSÑCUÔCUðñ ô ð õ -¨T¬[Ñ9Ô9ˆØ�\Ò!Ð!Ý%Ð&8ÕEUÑEWÔEWÐXÑXÔXÐXØÐ"Ø $Ô":Ô"GÐGÐGÝ)Ø=°Ð=Ð=Ý/Ñ1Ô1ðñ ô ð õ 1Ø•T�(¥9Ô-¨tÔ/GÔ/RÑSÔSñ
ô 
ˆ
õ &Ø%)¤[ÐK�NÔ!Ð!µnÔ6KØØÔ Ô.¨qÔ1ñ
ô 
ˆÔõ
 &Ô*ˆŒÝØ!°Àkð
ñ 
ô 
ð 	
r2   c                 óX   — d                      | j        j        | j        | j        ¦  «        S )Nz{}(client={}, state={}))ÚformatÚ	__class__Ú__name__r%   r5   r4   s    r0   Ú__repr__zH11Handshake.__repr__°  s*   € Ø(×/Ò/ØŒNÔ# T¤[°$´*ñ
ô 
ð 	
r2   )#r°   Ú
__module__Ú__qualname__Ú__doc__r   r1   Úpropertyr   r5   r
   r   r7   r   r   Úbytesr’   rC   r   r@   r?   r   rd   r(   r   ra   r   rH   r   rI   r   rJ   rG   rX   rZ   r±   © r2   r0   r   r   '   s6  € € € € € Ø>Ð>ð,¨ð ,¸4ð ,ð ,ð ,ð ,ð ð�ð ð ð ñ „Xðð ð	 ˜H ZÔ0ð 	 ð 	 ð 	 ñ „Xð	 ð<Øð<Ø&+¨E°3¨JÔ&7ð<à	ð<ð <ð <ð <ð&˜%ð  Eð ð ð ð ð26Q ¨%¤ð 6Q°Tð 6Qð 6Qð 6Qð 6Qðp)˜	 %¨¨tÐ"3Ô4ð )ð )ð )ð )ðE(Ø”[ðE(à	ðE(ð E(ð E(ð E(ðN%:Ð-ð %:°%ð %:ð %:ð %:ð %:ðNÐ-ð °%ð ð ð ð ð"
 zð 
°eð 
ð 
ð 
ð 
ð)9¨Gð )9¸ð )9ð )9ð )9ð )9ðV?
ØÔ.ð?
à	ð?
ð ?
ð ?
ð ?
ðB
˜#ð 
ð 
ð 
ð 
ð 
ð 
r2   r   Ú	requestedÚ	supportedr!   c                 óœ  — i }| D ]–}|                      dd¦  «        d                              ¦   «         }|D ]c}|j        |k    rV|                     |¦  «        }t	          |t
          ¦  «        r|r
d||j        <   ŒD|�|                     d¦  «        ||j        <   ŒdŒ—|r®g }|                     ¦   «         D ]‚\  }}|                     d¦  «        }	t	          |t
          ¦  «        r|sJ ‚|                     |	¦  «         ŒI|dk    r|                     d|	z  ¦  «         Œh|                     d	|	|fz  ¦  «         Œƒd
 	                    |¦  «        S dS )zƒAgree on the extensions to use returning an appropriate header value.

    This returns None if there are no agreed extensions
    ú;r   r   TNrz   r2   s   %srž   rŸ   )
ÚsplitÚstripr†   r¬   rF   r£   r�   r¢   rY   r    )
r¸   r¹   r—   r¡   r†   Ú	extensionr¬   r{   r¦   Ú
name_bytess
             r0   r‘   r‘   ¶  s‰  € ð .0€GØð 	Eð 	EˆØ�{Š{˜3 Ñ"Ô" 1Ô%×+Ò+Ñ-Ô-ˆØ"ð 	Eð 	EˆIØŒ~ Ò%Ð%Ø"×)Ò)¨%Ñ0Ô0�Ý˜f¥dÑ+Ô+ð EØð 7Ø26˜ 	¤Ñ/øØÐ'Ø.4¯mªm¸GÑ.DÔ.D�G˜IœNÑ+øð	Eð ð &Ø"$ˆ
Ø#ŸMšM™OœOð 		Hð 		H‰LˆD�&ØŸš WÑ-Ô-ˆJÝ˜&¥$Ñ'Ô'ð HØ���Ø×!Ò! *Ñ-Ô-Ð-Ð-à˜S’=�=Ø×%Ò% e¨zÑ&:Ñ;Ô;Ð;Ð;à×%Ò% i°:¸vÐ2FÑ&FÑGÔGÐGÐGØ�zŠz˜*Ñ%Ô%Ð%àˆ4r2   Úacceptedc                 ó(  — g }| D ]Œ}|                      dd¦  «        d                              ¦   «         }|D ]9}|j        |k    r,|                     |¦  «         |                     |¦  «          n!Œ:t          d|› �t          ¦   «         ¬¦  «        ‚Œ�|S )Nr»   r   r   zunrecognized extension rN   )r¼   r½   r†   ÚfinalizerY   r   r   )rÀ   r¹   r{   r¬   r†   r¾   s         r0   rª   rª   Ú  sÄ   € ð
 €JØð 
ð 
ˆØ�|Š|˜C Ñ#Ô# AÔ&×,Ò,Ñ.Ô.ˆØ"ð 	ð 	ˆIØŒ~ Ò%Ð%Ø×"Ò" 6Ñ*Ô*Ð*Ø×!Ò! )Ñ,Ô,Ð,Ø�ð &õ
 &Ø0¨$Ð0Ð0Õ=MÑ=OÔ=Oðñ ô ð ð ð
 Ðr2   )(r´   Úcollectionsr   Útypingr   r   r   r   r   r	   r
   r   r   r(   r7   r   r   r   rd   r   r   r   r   r   r{   r   r   Ú	utilitiesr   r   r   r   r   r   r‚   r   r’   r¶   r‘   rª   r·   r2   r0   ú<module>rÆ      s  ððð ð Ð Ð Ð Ð Ð ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð €
€
€
à CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð Ð ðL
ð L
ð L
ð L
ð L
ñ L
ô L
ð L
ð^!Ø˜Œ}ð!Ø)-¨i¬ð!àˆe„_ð!ð !ð !ð !ðHØ�sŒmðØ(0°Ô(;ðà	ˆ)„_ðð ð ð ð ð r2   