Ë
    aQbj–H  ã                  óü   — d Z ddlmZ ddlmZ ddl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mZmZmZmZmZ erddlmZmZmZ ddlm Z  dZ!dZ" G d„ d«      Z#	 	 	 	 	 	 dd„Z$	 	 	 	 	 	 dd„Z%y)zR
wsproto/handshake
~~~~~~~~~~~~~~~~~~

An implementation of WebSocket handshakes.
é    )Úannotations)Údeque)ÚTYPE_CHECKINGÚcastNé   )Ú
ConnectionÚConnectionStateÚConnectionType)ÚAcceptConnectionÚEventÚRejectConnectionÚ
RejectDataÚRequest)Ú	Extension)ÚLocalProtocolErrorÚRemoteProtocolErrorÚgenerate_accept_tokenÚgenerate_nonceÚnormed_header_dictÚsplit_comma_header)Ú	GeneratorÚIterableÚSequence)ÚHeaderss   13s	   websocketc                  ó°   — e Zd ZdZdd„Zedd„«       Zedd„«       Z	 	 	 	 	 	 dd„Zdd„Z	dd„Z
dd„Z	 	 	 	 dd	„Zdd
„Zdd„Zdd„Zdd„Z	 	 	 	 dd„Zdd„Zy)ÚH11Handshakez4A Handshake implementation for HTTP/1.1 connections.c                ó^  — |t         j                  u | _        t        j                  | _        | j                  r)t        j                  t        j                  «      | _        n(t        j                  t        j                  «      | _        d | _
        t        «       | _        d | _        d | _        y ©N)r
   ÚCLIENTÚclientr	   Ú
CONNECTINGÚ_stateÚh11r   Ú_h11_connectionÚSERVERÚ_connectionr   Ú_eventsÚ_initiating_requestÚ_nonce)ÚselfÚconnection_types     úD/var/www/html/venv/lib/python3.12/site-packages/wsproto/handshake.pyÚ__init__zH11Handshake.__init__,   sr   € Ø%¬×)>Ñ)>Ð>ˆŒÜ%×0Ñ0ˆŒà�;Š;Ü#&§>¡>´#·*±*Ó#=ˆDÕ ä#&§>¡>´#·*±*Ó#=ˆDÔ à.2ˆÔÜ%*£WˆŒØ37ˆÔ Ø$(ˆ�ó    c                ó   — | j                   S r   )r"   ©r*   s    r,   ÚstatezH11Handshake.state:   s   € à�{‰{Ðr.   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&   r0   s    r,   Ú
connectionzH11Handshake.connection>   s   € ð ×ÑÐr.   c                óì   — | j                   rd}t        |«      ‚t        j                  d||¬«      }t        j                  t        j
                  «      }| j                  |j                  |«      «       y)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ÚtargetÚheadersN)r    r   r#   r   r   r   Úreceive_dataÚsend)r*   r9   ÚpathÚmsgÚupgrade_requestÚ
h11_clients         r,   Úinitiate_upgrade_connectionz(H11Handshake.initiate_upgrade_connectionK   s]   € ð �;Š;ØSˆCÜ$Øóð ô Ÿ+™+¨V¸DÈ'ÔRˆÜ—^‘^¤C§J¡JÓ/ˆ
Ø×Ñ˜*Ÿ/™/¨/Ó:Õ;r.   c                óX  — d}t        |t        «      r|| j                  |«      z  }|S t        |t        «      r|| j	                  |«      z  }|S t        |t
        «      r|| j                  |«      z  }|S t        |t        «      r|| j                  |«      z  }|S d|› d�}t        |«      ‚)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
        r.   zEvent z$ cannot be sent during the handshake)
Ú
isinstancer   Ú_initiate_connectionr   Ú_acceptr   Ú_rejectr   Ú_send_reject_datar   )r*   ÚeventÚdatar=   s       r,   r;   zH11Handshake.send`   sÆ   € ð ˆÜ�eœWÔ%Ø�D×-Ñ-¨eÓ4Ñ4ˆDð ˆô ˜Ô/Ô0Ø�D—L‘L Ó'Ñ'ˆDð ˆô ˜Ô/Ô0Ø�D—L‘L Ó'Ñ'ˆDð ˆô ˜œzÔ*Ø�D×*Ñ*¨5Ó1Ñ1ˆDð ˆð	 ˜5˜'Ð!EÐFˆCÜ$Øóð r.   c                ó‚  — | j                   j                  |xs d«       	 	 | j                   j                  «       }t        |t        j                  «      s$|t        j                  u s|t        j                  u ry	| j                  �rÅt        |t        j                  «      r–|j                  dk(  r,| j                  j                  | j                  |«      «       �n´| j                  j                  t        t!        |j"                  «      |j                  d¬«      «       t$        j&                  | _        �nYt        |t        j*                  «      rZt$        j,                  | _        | j                  j                  t        t!        |j"                  «      |j                  d¬«      «       nåt        |t        j.                  «      r1| j                  j                  t1        |j2                  d¬«      «       nšt        |t        j4                  «      r€| j                  j                  t1        dd¬«      «       t$        j&                  | _        nDt        |t        j6                  «      r*| j                  j                  | j9                  |«      «       �Œr# t        j                  $ r d}t	        |t        «       ¬«      ‚w xY w)
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.
        r.   TzBad HTTP message©Ú
event_hintée   F)r9   Ústatus_codeÚhas_body)rH   Úbody_finishedN)r$   r:   Ú
next_eventr#   r   r   rB   ÚConnectionClosedÚ	NEED_DATAÚPAUSEDr    ÚInformationalResponserM   r'   ÚappendÚ_establish_client_connectionÚlistr9   r	   ÚCLOSEDr"   ÚResponseÚ	REJECTINGÚDatar   rH   ÚEndOfMessager   Ú_process_connection_request)r*   rH   rG   r=   s       r,   r:   zH11Handshake.receive_data{   s   € ð 	×Ñ×)Ñ)¨$ª+°#Ô6ØðØ×,Ñ,×7Ñ7Ó9�ô ˜5¤#×"6Ñ"6Ô7ØœCŸM™MÑ)ØœCŸJ™JÑ&àà�{‹{Ü˜e¤S×%>Ñ%>Ô?Ø×(Ñ(¨CÒ/ØŸ™×+Ñ+¨D×,MÑ,MÈeÓ,TÖUàŸ™×+Ñ+Ü,Ü(,¨U¯]©]Ó(;Ø,1×,=Ñ,=Ø).ôôô '6×&<Ñ&<˜žÜ ¤s§|¡|Ô4Ü"1×";Ñ";�D”KØ—L‘L×'Ñ'Ü(Ü$(¨¯©Ó$7Ø(-×(9Ñ(9Ø%)ôõô   ¤s§x¡xÔ0Ø—L‘L×'Ñ'Ü"¨¯
©
À%ÔHõô   ¤s×'7Ñ'7Ô8Ø—L‘L×'Ñ'¬
¸È4Ô(PÔQÜ"1×"8Ñ"8�D•KÜ˜E¤3§;¡;Ô/Ø—‘×#Ñ# D×$DÑ$DÀUÓ$KÔLñ[ øô ×*Ñ*ò Ø(�Ü)ØÔ$4Ó$6ôð ðús   ¢J Ê+J>c              #  óx   K  — | j                   r*| j                   j                  «       –— | j                   rŒ)yy­w)z«
        Return a generator that provides any events that have been generated
        by protocol activity.

        :returns: a generator that yields H11 events.
        N)r'   Úpopleftr0   s    r,   ÚeventszH11Handshake.events´   s+   è ø€ ð �lŠlØ—,‘,×&Ñ&Ó(Ò(ð �l�lùs   ‚5:¸:c           	     óì  — |j                   dk7  rd}t        |t        «       ¬«      ‚d }g }d }d }g }d}d }	g }
|j                  D ]§  \  }}|j	                  «       }|dk(  rt        |«      }nn|dk(  r|j                  d«      }Œ>|dk(  r|j                  t        |«      «       Œ^|d	k(  r|}n/|d
k(  r|j                  t        |«      «       Œ†|dk(  r|}	n|dk(  r|}|
j                  ||f«       Œ© |�t        d„ |D «       «      sd}t        |t        «       ¬«      ‚|	t        k7  r%d}t        |t        dt        fg|	rdnd¬«      ¬«      ‚|€d}t        |t        «       ¬«      ‚|j	                  «       t        k7  r-dt        j                  «       › d�}t        |t        «       ¬«      ‚|€d}t        |t        «       ¬«      ‚t        ||
|||j                  j                  d«      ¬«      | _        | j                  S )Nr5   zRequest method must be GETrJ   r.   ó
   connections   hostÚidnaó   sec-websocket-extensionsó   sec-websocket-keyó   sec-websocket-protocols   sec-websocket-versionó   upgradec              3  óB   K  — | ]  }|j                  «       d k(  –— Œ y­w©ÚupgradeN©Úlower©Ú.0Útokens     r,   ú	<genexpr>z;H11Handshake._process_connection_request.<locals>.<genexpr>ä   ó    è ø€ ò 0
Ø+0ˆE�K‰K‹M˜YÕ&ñ0
ùó   ‚ú%Missing header, 'Connection: Upgrade'z'Missing header, 'Sec-WebSocket-Version'ó   Sec-WebSocket-Versioniª  i�  )r9   rM   z#Missing header, 'Sec-WebSocket-Key'úMissing header, 'Upgrade: ú'zMissing header, 'Host'Úascii)Ú
extensionsÚextra_headersÚhostÚsubprotocolsr8   )r7   r   r   r9   rl   r   ÚdecodeÚextendrU   ÚanyÚWEBSOCKET_VERSIONÚWEBSOCKET_UPGRADEr   r8   r(   )r*   rG   r=   Úconnection_tokensrx   rz   Úkeyr{   rj   Úversionr9   ÚnameÚvalues                r,   r]   z(H11Handshake._process_connection_requestÀ   sO  € ð �<‰<˜6Ò!Ø.ˆCÜ%ØÔ 0Ó 2ôð ð !ÐØ "ˆ
ØˆØˆØ"$ˆØˆØˆØˆØ Ÿ=™=ò 	*‰KˆD�%Ø—:‘:“<ˆDØ�}Ò$Ü$6°uÓ$=Ñ!Ø˜’Ø—|‘| FÓ+�ØØÐ4Ò4Ø×!Ñ!Ô"4°UÓ";Ô<ØØÐ-Ò-Ø‘ØÐ2Ò2Ø×#Ñ#Ô$6°uÓ$=Ô>ØØÐ1Ò1Ø‘Ø˜Ò#Ø�Ø�N‰N˜D %˜=Õ)ð'	*ð( Ð$¬Cñ 0
Ø4Eô0
ô -
ð :ˆCÜ%ØÔ 0Ó 2ôð ð Ô'Ò'Ø;ˆCÜ%ØÜ+Ø6Ô8IÐJÐKÙ'.¡°Côôð ð ˆ;Ø7ˆCÜ%ØÔ 0Ó 2ôð ð �=‰=‹?Ô/Ò/Ø.Ô/@×/GÑ/GÓ/IÐ.JÈ!ÐLˆCÜ%ØÜ+Ó-ôð ð ˆ<Ø*ˆCÜ%ØÔ 0Ó 2ôð ô $+Ø!Ø!ØØ%Ø—<‘<×&Ñ& wÓ/ô$
ˆÔ ð ×'Ñ'Ð'r.   c                ód  — | j                   €J ‚t        | j                   j                  «      }|d   }t        |«      }dt        fdd|fg}|j
                  �h|j
                  | j                   j                  vrd|j
                  › �}t        |«      ‚|j                  d|j
                  j                  d«      f«       |j                  rIt        t        d| j                   j                  «      |j                  «      }|r|j                  d	|f«       t        j                  d
||j                  z   d¬«      }t        | j                   rt"        j$                  nt"        j&                  |j                  «      | _        t*        j,                  | _        | j0                  j3                  |«      xs dS )Nre   ó   Upgrade©s
   Connectionr‡   s   Sec-WebSocket-Acceptzunexpected subprotocol ó   Sec-WebSocket-Protocolrw   zSequence[str]ó   Sec-WebSocket-ExtensionsrL   s   Switching Protocols)rM   r9   Úreasonr.   )r(   r   ry   r   r€   Úsubprotocolr{   r   rU   Úencoderx   Úserver_extensions_handshaker   r#   rT   r   r    r
   r   r%   r&   r	   ÚOPENr"   r$   r;   )	r*   rG   Úrequest_headersÚnonceÚaccept_tokenr9   r=   ÚacceptsÚresponses	            r,   rD   zH11Handshake._accept  s�  € à×'Ñ'Ð3Ð3Ð3Ü,¨T×-EÑ-E×-SÑ-SÓTˆàÐ 4Ñ5ˆÜ,¨UÓ3ˆð Ô*Ð+Ø'Ø$ lÐ3ð
ˆð ×ÑÐ(Ø× Ñ ¨×(@Ñ(@×(MÑ(MÑMØ/°×0AÑ0AÐ/BÐC�Ü(¨Ó-Ð-Ø�N‰NØ*¨E×,=Ñ,=×,DÑ,DÀWÓ,MÐNôð ×ÒÜ1Ü�_ d×&>Ñ&>×&IÑ&IÓJØ× Ñ óˆGñ Ø—‘Ð ;¸WÐEÔFä×,Ñ,ØØ˜e×1Ñ1Ñ1Ø)ô
ˆô
 &Ø%)§[¢[ŒN×!Ò!´n×6KÑ6KØ×Ñó
ˆÔô &×*Ñ*ˆŒØ×#Ñ#×(Ñ(¨Ó2Ò9°cÐ9r.   c                ó,  — | j                   t        j                  k7  rd| j                   › �}t        |«      ‚t	        |j
                  «      }|j                  s|j                  d«       t        j                  |j                  |¬«      }| j                  j                  |«      xs d}t        j                  | _        |j                  sI|| j                  j                  t        j                  «       «      xs dz  }t        j                   | _        |S )Nz'Connection cannot be rejected in state )s   content-lengthó   0)rM   r9   r.   )r1   r	   r!   r   rW   r9   rN   rU   r#   rY   rM   r$   r;   rZ   r"   r\   rX   )r*   rG   r=   r9   r”   rH   s         r,   rE   zH11Handshake._reject8  sØ   € Ø�:‰:œ×3Ñ3Ò3Ø;¸D¿J¹J¸<ÐHˆCÜ$Øóð ô �u—}‘}Ó%ˆØ�~Š~Ø�N‰NÐ4Ô5Ü—<‘<¨E×,=Ñ,=ÀwÔOˆØ×#Ñ#×(Ñ(¨Ó2Ò9°cˆÜ%×/Ñ/ˆŒØ�~Š~Ø�D×(Ñ(×-Ñ-¬c×.>Ñ.>Ó.@ÓAÒHÀSÑHˆDÜ)×0Ñ0ˆDŒKØˆr.   c                ó˜  — | j                   t        j                  k7  rd| j                   › �}t        |«      ‚| j                  j                  t        j                  |j                  ¬«      «      xs d}|j                  rI|| j                  j                  t        j                  «       «      xs dz  }t        j                  | _        |S )Nz$Cannot send rejection data in state )rH   r.   )r1   r	   rZ   r   r$   r;   r#   r[   rH   rO   r\   rX   r"   )r*   rG   r=   rH   s       r,   rF   zH11Handshake._send_reject_dataJ  s¢   € Ø�:‰:œ×2Ñ2Ò2Ø8¸¿¹¸ÐEˆCÜ$Øóð ð ×#Ñ#×(Ñ(¬¯©°u·z±zÔ)BÓCÒJÀsˆØ×ÒØ�D×(Ñ(×-Ñ-¬c×.>Ñ.>Ó.@ÓAÒHÀSÑHˆDÜ)×0Ñ0ˆDŒKØˆr.   c                ó¸  — || _         t        «       | _        d|j                  j	                  d«      fdt
        fdd| j                  fdt        fg}|j                  r;|j                  ddj                  |j                  «      j	                  d	«      f«       |j                  rÛi }|j                  D ]1  }t        |t        «      sJ ‚|j                  «       ||j                  <   Œ3 g }|j                  «       D ]`  \  }}|j	                  d	«      }t        |t         «      r|sŒ*|j                  |«       Œ<|j                  d
||j	                  d	«      fz  «       Œb |r"|j                  ddj                  |«      f«       t#        j$                  d|j&                  j	                  d	«      ||j(                  z   ¬«      }	| j*                  j-                  |	«      xs dS )Ns   Hostrc   r‡   rˆ   s   Sec-WebSocket-Keyrt   r‰   z, rw   ó   %s; %srŠ   ó   , r5   r6   r.   )r(   r   r)   rz   r�   r€   r   r{   rU   Újoinrx   rB   r   Úofferr„   ÚitemsÚboolr#   r   r8   ry   r$   r;   )
r*   Úrequestr9   ÚoffersÚerx   r„   ÚparamsÚbnamerj   s
             r,   rC   z!H11Handshake._initiate_connectionY  s´  € Ø#*ˆÔ Ü$Ó&ˆŒð �g—l‘l×)Ñ)¨&Ó1Ð2ØÔ*Ð+Ø'Ø! 4§;¡;Ð/Ø%Ô'8Ð9ð
ˆð ×ÒØ�N‰Nà-Ø—Y‘Y˜w×3Ñ3Ó4×<Ñ<¸WÓEðôð ×ÒØ,.ˆFØ×'Ñ'ò +�Ü! !¤YÔ/Ð/Ð/Ø!"§¡£��q—v‘v’ð+ð ˆJØ &§¡£ò S‘��fØŸ™ GÓ,�Ü˜f¤dÔ+ÚØ"×)Ñ)¨%Õ0à×%Ñ% i°5¸&¿-¹-ÈÓ:PÐ2QÑ&QÕRðSñ Ø—‘Ð ;¸U¿Z¹ZÈ
Ó=SÐTÔUä—+‘+ØØ—>‘>×(Ñ(¨Ó1Ø˜g×3Ñ3Ñ3ô
ˆð
 ×#Ñ#×(Ñ(¨Ó1Ò8°SÐ8r.   c                ó:  — | j                   €J ‚| j                  €J ‚d }d }g }d }d}g }|j                  D ]q  \  }}	|j                  «       }|dk(  rt	        |	«      }Œ'|dk(  rt	        |	«      }Œ8|dk(  r|	}Œ@|dk(  r|	j                  d«      }ŒW|dk(  r|	}Œ_|j                  ||	f«       Œs |�t        d„ |D «       «      sd	}
t        |
t        «       ¬
«      ‚|j                  «       t        k7  r-dt        j                  «       › d�}
t        |
t        «       ¬
«      ‚t        | j                  «      }||k7  rd}
t        |
t        «       ¬
«      ‚|�2|| j                   j                  vrd|› �}
t        |
t        «       ¬
«      ‚t        |t        d| j                   j                  «      «      }t!        | j"                  rt$        j&                  nt$        j(                  || j*                  j,                  d   «      | _        t0        j2                  | _        t7        |||¬«      S )Nr.   rb   rd   s   sec-websocket-acceptrf   rw   rg   c              3  óB   K  — | ]  }|j                  «       d k(  –— Œ y­wri   rk   rm   s     r,   rp   z<H11Handshake._establish_client_connection.<locals>.<genexpr>¤  rq   rr   rs   rJ   ru   rv   zBad accept tokenzunrecognized subprotocol úSequence[Extension]r   )rx   ry   rŒ   )r(   r)   r9   rl   r   r|   rU   r~   r   r   r€   r   r{   Úclient_extensions_handshaker   rx   r   r    r
   r   r%   r$   Útrailing_datar&   r	   r�   r"   r   )r*   rG   Úacceptr�   r“   rŒ   rj   r9   r„   r…   r=   r’   rx   s                r,   rV   z)H11Handshake._establish_client_connection„  sE  € ð ×'Ñ'Ð3Ð3Ð3Ø�{‰{Ð&Ð&Ð&àˆØ ÐØˆØˆØˆØˆØ Ÿ=™=ò 	*‰KˆD�%Ø—:‘:“<ˆDØ�}Ò$Ü$6°uÓ$=Ð!ØØÐ2Ò2Ü,¨UÓ3�ØØÐ.Ò.Ø�ØØÐ0Ò0Ø#Ÿl™l¨7Ó3�ØØ�zÒ!Ø�ØØ�N‰N˜D %˜=Õ)ð#	*ð& Ð$¬Cñ 0
Ø4Eô0
ô -
ð :ˆCÜ%ØÔ 0Ó 2ôð ð �=‰=‹?Ô/Ò/Ø.Ô/@×/GÑ/GÓ/IÐ.JÈ!ÐLˆCÜ%ØÜ+Ó-ôð ô -¨T¯[©[Ó9ˆØ�\Ò!Ø$ˆCÜ% cÔ6FÓ6HÔIÐIØÐ" {¸$×:RÑ:R×:_Ñ:_Ñ'_Ø-¨k¨]Ð;ˆCÜ%ØÜ+Ó-ôð ô 1Ø”TÐ/°×1IÑ1I×1TÑ1TÓUó
ˆ
ô &Ø%)§[¢[ŒN×!Ò!´n×6KÑ6KØØ× Ñ ×.Ñ.¨qÑ1ó
ˆÔô
 &×*Ñ*ˆŒÜØ!°Àkô
ð 	
r.   c                óh   — | j                   j                  › d| j                  › d| j                  › d�S )Nz(client=z, state=ú))Ú	__class__Ú__name__r    r1   r0   s    r,   Ú__repr__zH11Handshake.__repr__É  s/   € Ø—.‘.×)Ñ)Ð*¨(°4·;±;°-¸xÈÏ
É
À|ÐSTÐUÐUr.   N)r+   r
   ÚreturnÚNone)r¯   r	   )r¯   zConnection | None)r9   r   r<   zbytes | strr¯   r°   )rG   r   r¯   Úbytes)rH   úbytes | Noner¯   r°   )r¯   zGenerator[Event, None, None])rG   zh11.Requestr¯   r   )rG   r   r¯   r±   )rG   r   r¯   r±   )rG   r   r¯   r±   )rŸ   r   r¯   r±   )rG   zh11.InformationalResponser¯   r   )r¯   Ústr)r­   Ú
__module__Ú__qualname__Ú__doc__r-   Úpropertyr1   r3   r@   r;   r:   r`   r]   rD   rE   rF   rC   rV   r®   © r.   r,   r   r   )   s®   „ Ù>ó)ð òó ðð ò
 ó ð
 ð<Øð<Ø&1ð<à	ó<ó*ó67Mór)ðL(Ø ðL(à	óL(ó\(:óTó$ó)9ðVC
Ø.ðC
à	óC
ôJVr.   r   c                ó\  — i }| D ]‘  }|j                  dd«      d   j                  «       }|D ]g  }|j                  |k(  sŒ|j                  |«      }t	        |t
        «      r|sŒ7d||j                  <   ŒG|€ŒJ|j                  d«      ||j                  <   Œi Œ“ |r’g }|j                  «       D ]l  \  }}|j                  d«      }	t	        |t
        «      r|sJ ‚|j                  |	«       Œ=|dk(  r|j                  d|	z  «       ŒW|j                  d	|	|fz  «       Œn d
j                  |«      S y)zˆ
    Agree on the extensions to use returning an appropriate header value.

    This returns None if there are no agreed extensions
    ú;r   r   TNrw   r.   s   %sr™   rš   )
ÚsplitÚstripr„   r©   rB   rž   r�   r�   rU   r›   )
Ú	requestedÚ	supportedr“   rœ   r„   Ú	extensionr©   rx   r¢   Ú
name_bytess
             r,   rŽ   rŽ   Í  s5  € ð (*€GØò 	EˆØ�{‰{˜3 Ó" 1Ñ%×+Ñ+Ó-ˆØ"ò 	EˆIØ�~‰~ Ó%Ø"×)Ñ)¨%Ó0�Ü˜f¤dÔ+ÚØ26˜ 	§¡Ò/ØÑ'Ø.4¯m©m¸GÓ.D�G˜IŸN™NÒ+ñ	Eð	Eñ Ø"$ˆ
Ø#ŸM™M›Oò 	D‰LˆD�&ØŸ™ WÓ-ˆJÜ˜&¤$Ô'Ù��vØ×!Ñ! *Õ-Ø˜3’Ø×!Ñ! %¨:Ñ"6Õ7à×!Ñ! )¨z¸6Ð.BÑ"BÕCð	Dð �z‰z˜*Ó%Ð%àr.   c                ó  — g }| D ]x  }|j                  dd«      d   j                  «       }|D ]5  }|j                  |k(  sŒ|j                  |«       |j	                  |«        Œ_ d|› �}t        |t        «       ¬«      ‚ |S )Nrº   r   r   zunrecognized extension rJ   )r»   r¼   r„   ÚfinalizerU   r   r   )Úacceptedr¾   rx   r©   r„   r¿   r=   s          r,   r§   r§   ñ  sœ   € ð
 €JØò ˆØ�|‰|˜C Ó# AÑ&×,Ñ,Ó.ˆØ"ò 		ˆIØ�~‰~ Ó%Ø×"Ñ" 6Ô*Ø×!Ñ! )Ô,Ùð			ð ,¨D¨6Ð2ˆCÜ%ØÔ 0Ó 2ôð ðð Ðr.   )r½   úIterable[str]r¾   úlist[Extension]r¯   r²   )rÃ   rÄ   r¾   r¦   r¯   rÅ   )&r¶   Ú
__future__r   Úcollectionsr   Útypingr   r   r#   r3   r   r	   r
   r`   r   r   r   r   r   rx   r   Ú	utilitiesr   r   r   r   r   r   Úcollections.abcr   r   r   r   r   r€   r   rŽ   r§   r¸   r.   r,   ú<module>rË      s�   ðñõ #å ÷ó
 ç CÑ Cß RÕ RÝ !÷÷ ñ ß=Ñ=åð Ð ð !Ð ÷aVñ aVðH!Øð!Ø)8ð!àó!ðHØðØ(;ðàôr.   