Ë
    ÖÉ�j‹;  ã                   ó,  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZmZmZmZ ddlmZ ddlmZ  ej&                  e«      ZdZdZd	Zd
ZdZ ede j6                  ¬«      Zdedefd„Zde de de defd„Z! G d„ d«      Z" G d„ d«      Z# G d„ de#e"e jH                  «      Z% G d„ de#e j6                  «      Z&ee%e&f   Z' G d„ d«      Z(eeddfd eg ef   d!e)e e*f   dee    dee    d"e*d#e*d$eeeejV                  f      d%e de)e(ef   fd&„Z,y)'é    N)ÚCallable)ÚAnyÚOptionalÚTypeVarÚUnionÚcasté   )Ústun)Úrandom_transaction_idiô  iX  i   i   i   Ú
_ProtocolT)ÚboundÚdataÚreturnc                 ó   — | d   dz  dk(  S )Nr   éÀ   é@   © )r   s    úL/home/uftp/webrtc-recorder/.venv/lib/python3.12/site-packages/aioice/turn.pyÚis_channel_datar      s   € Ø�‰G�d‰N˜tÑ#Ð#ó    ÚusernameÚrealmÚpasswordc                 óŠ   — t        j                  dj                  | ||g«      j                  d«      «      j	                  «       S )Nú:Úutf8)ÚhashlibÚmd5ÚjoinÚencodeÚdigest)r   r   r   s      r   Úmake_integrity_keyr"      s5   € Ü�;‰;�s—x‘x ¨5°(Ð ;Ó<×CÑCÀFÓKÓL×SÑSÓUÐUr   c                   ód   — e Zd ZU eeegdf   ed<   ej                  ed<   deddfd„Z	dedefd„Z
y)ÚTurnStreamMixinNÚdatagram_receivedÚ	transportr   r   c                 óB  — t        | d«      sd| _        | xj                  |z  c_        t        | j                  «      dk\  rßt        j                  d| j                  dd «      \  }}|t        j                  |«      z  }t        | j                  «      rd|z   }nd|z   }t        | j                  «      |k  ry | j                  j                  d«      }| j                  | j                  d| |«       | j                  |d  | _        t        | j                  «      dk\  rŒÞy y )NÚbufferr   é   ú!HHr   é   Úpeername)Úhasattrr(   ÚlenÚstructÚunpackr
   Úpadding_lengthr   r&   Úget_extra_infor%   )Úselfr   Ú_ÚlengthÚfull_lengthÚaddrs         r   Údata_receivedzTurnStreamMixin.data_received%   sì   € Ü�t˜XÔ&ØˆDŒKØ�Š�tÑ�ä�$—+‘+Ó !Ò#ÜŸ™ e¨T¯[©[¸¸1Ð-=Ó>‰IˆAˆvØ”d×)Ñ)¨&Ó1Ñ1ˆFÜ˜tŸ{™{Ô+Ø &™j‘à  6™k�Ü�4—;‘;Ó +Ò-Øà—>‘>×0Ñ0°Ó<ˆDØ×"Ñ" 4§;¡;¨q°Ð#=¸tÔDØŸ+™+ k lÐ3ˆDŒKô �$—+‘+Ó !Õ#r   c                 ób   — t        j                  t        |«      «      }|r|t        |«      z  }|S ©N)r
   r1   r.   Úbytes)r3   r   Úpaddings      r   Ú_paddedzTurnStreamMixin._padded8   s,   € ä×%Ñ%¤c¨$£iÓ0ˆÙØ”E˜'“NÑ"ˆDØˆr   )Ú__name__Ú
__module__Ú__qualname__r   r;   r   Ú__annotations__ÚasyncioÚBaseTransportr8   r=   r   r   r   r$   r$   !   sH   … Ø ¨ ¨dÐ 2Ñ3Ó3Ø×$Ñ$Ó$ð4 %ð 4¨Dó 4ð&˜Eð  eô r   r$   c                   ó  — e Zd ZU eegdf   ed<   deeef   de	e   de	e   dededdfd	„Z
d
edeeef   ddfd„Zdeeef   fd„Zdeddfd„Zdej                   ddfd„Zdeeef   deeef   ddfd„Zdd„Zdeddfd„Zdej.                  deej.                  eeef   f   fd„Zdej.                  deej.                  eeef   f   fd„Zdedeeef   ddfd„Zdej.                  deeef   ddfd„Zdej.                  ddfd„Zy)ÚTurnClientMixinNÚ_sendÚserverr   r   ÚlifetimeÚchannel_refresh_timer   c                 óò   — i | _         i | _        i | _        i | _        d| _        || _        d | _        || _        d | _        || _	        d | _
        d | _        d | _        d | _        || _        i | _        || _        y )Ni @  )Úchannel_refresh_atÚchannel_to_peerÚpeer_connect_waitersÚpeer_to_channelÚchannel_numberrI   Úintegrity_keyrH   Únoncer   Úreceiverr   Úrefresh_taskÚrelayed_addressrG   Útransactionsr   )r3   rG   r   r   rH   rI   s         r   Ú__init__zTurnClientMixin.__init__C   sŒ   € ð 57ˆÔØ;=ˆÔð ð 	Ô!ð <>ˆÔà$ˆÔØ$8ˆÔ!Ø.2ˆÔØ ˆŒØ&*ˆŒ
Ø ˆŒØ<@ˆŒØ$(ˆŒ
Ø48ˆÔØ:>ˆÔØˆŒØ;=ˆÔØ ˆ�r   rO   r7   c              ƒ   ó:  K  — t        j                  t         j                  j                  t         j                  j
                  ¬«      }||j                  d<   ||j                  d<   | j                  |«      ƒ d {  –—†  t        j                  d||«       y 7 Œ­w)N©Úmessage_methodÚmessage_classzCHANNEL-NUMBERzXOR-PEER-ADDRESSzTURN channel bound %d %s)
r
   ÚMessageÚMethodÚCHANNEL_BINDÚClassÚREQUESTÚ
attributesÚrequest_with_retryÚloggerÚinfo)r3   rO   r7   Úrequests       r   Úchannel_bindzTurnClientMixin.channel_bind`   s{   è ø€ Ü—,‘,ÜŸ;™;×3Ñ3Ä4Ç:Á:×CUÑCUô
ˆð 0>ˆ×ÑÐ+Ñ,Ø15ˆ×ÑÐ-Ñ.Ø×%Ñ% gÓ.×.Ð.Ü�‰Ð.°ÀÕEð 	/ús   ‚A:BÁ<BÁ=Bc              ƒ   ó  K  — t        j                  t         j                  j                  t         j                  j
                  ¬«      }| j                  |j                  d<   t        |j                  d<   | j                  |«      ƒ d{  –—† \  }}|j                  d   }|j                  d   | _
        t        j                  d| j                  |«       t        j                  | j                  |«      «      | _        | j                  S 7 Œ€­w)z+
        Create a TURN allocation.
        rX   ÚLIFETIMEzREQUESTED-TRANSPORTNzXOR-RELAYED-ADDRESSz2TURN allocation created %s (expires in %d seconds))r
   r[   r\   ÚALLOCATEr^   r_   rH   r`   ÚUDP_TRANSPORTra   rT   rb   rc   rB   Úcreate_taskÚrefreshrS   )r3   rd   Úresponser4   Útime_to_expirys        r   ÚconnectzTurnClientMixin.connecti   sÛ   è ø€ ô —,‘,ÜŸ;™;×/Ñ/¼t¿z¹z×?QÑ?Qô
ˆð *.¯©ˆ×Ñ˜:Ñ&Ü4Aˆ×ÑÐ0Ñ1Ø ×3Ñ3°GÓ<×<‰ˆ�!à!×,Ñ,¨ZÑ8ˆØ'×2Ñ2Ð3HÑIˆÔÜ�‰Ø@Ø× Ñ Øô	
ô $×/Ñ/°·±¸^Ó0LÓMˆÔà×#Ñ#Ð#ð =ús   ‚BDÂ
DÂBDÚexcc                 ó‚   — t         j                  d| |«       | j                  �| j                  j                  |«       y y )Nz%s connection_lost(%s))rb   ÚdebugrR   Úconnection_lost)r3   ro   s     r   rr   zTurnClientMixin.connection_lost�   s4   € Ü�‰Ð-¨t°SÔ9Ø�=‰=Ð$Ø�M‰M×)Ñ)¨#Õ.ð %r   r&   c                 ó@   — t         j                  d| |«       || _        y )Nz%s connection_made(%s))rb   rq   r&   )r3   r&   s     r   Úconnection_madezTurnClientMixin.connection_made†   s   € Ü�‰Ð-¨t°YÔ?Ø"ˆ�r   r   c                 óì  — t        t        |«      }t        |«      dk\  r†t        |«      r{t	        j
                  d|dd «      \  }}t        |«      |dz   k\  rM| j                  �A| j                  j                  |«      }|r$|dd|z    }| j                  j                  ||«       y 	 t        j                  |«      }t        j                  d| ||«       |j                  t        j                   j"                  k(  s'|j                  t        j                   j$                  k(  rE|j&                  | j(                  v r,| j(                  |j&                     }|j+                  ||«       y y y # t        $ r Y y w xY w)Nr)   r*   r   z
%s < %s %s)r   r;   r.   r   r/   r0   rR   rL   Úgetr%   r
   Úparse_messagerb   rq   Ú
ValueErrorrZ   r^   ÚRESPONSEÚERRORÚtransaction_idrU   Úresponse_received)	r3   r   r7   Úchannelr5   Úpeer_addressÚpayloadÚmessageÚtransactions	            r   r%   z!TurnClientMixin.datagram_receivedŠ   sF  € Ü”E˜4Ó ˆô ˆt‹9˜Š>œo¨dÔ3Ü$Ÿm™m¨E°4¸¸!°9Ó=‰OˆG�Vä�4‹y˜F Q™JÒ&¨4¯=©=Ð+DØ#×3Ñ3×7Ñ7¸Ó@�ÙØ" 1 q¨6¡zÐ2�GØ—M‘M×3Ñ3°G¸\ÔJàð	Ü×(Ñ(¨Ó.ˆGÜ�L‰L˜ t¨T°7Ô;ð
 ×!Ñ!¤T§Z¡Z×%8Ñ%8Ò8Ø×$Ñ$¬¯
©
×(8Ñ(8Ò8Ø×$Ñ$¨×(9Ñ(9Ñ9Ø×+Ñ+¨G×,BÑ,BÑCˆKØ×)Ñ)¨'°4Õ8ð :ð 9øô ò 	Ùð	ús   Â&-E' Å'	E3Å2E3c              ƒ   óð  K  — | j                   r!| j                   j                  «        d| _         t        j                  t        j                  j
                  t        j                  j                  ¬«      }d|j                  d<   	 | j                  |«      ƒ d{  –—†  t        j                  d| j                  «       | j                  j                  «        y7 Œ?# t        j                  $ r Y ŒRw xY w­w)z-
        Delete the TURN allocation.
        NrX   r   rg   zTURN allocation deleted %s)rS   Úcancelr
   r[   r\   ÚREFRESHr^   r_   r`   ra   ÚTransactionErrorrb   rc   rT   r&   Úclose©r3   rd   s     r   ÚdeletezTurnClientMixin.delete¦   sÀ   è ø€ ð ×ÒØ×Ñ×$Ñ$Ô&Ø $ˆDÔä—,‘,ÜŸ;™;×.Ñ.¼d¿j¹j×>PÑ>Pô
ˆð *+ˆ×Ñ˜:Ñ&ð	Ø×)Ñ)¨'Ó2×2Ð2ô
 	�‰Ð0°$×2FÑ2FÔGØ�‰×ÑÕð 3ùÜ×$Ñ$ò 	áð	üs<   ‚BC6ÂC ÂCÂC Â ;C6ÃC ÃC3Ã0C6Ã2C3Ã3C6rm   c              ƒ   ó®  K  — 	 t        j                  d|z  «      ƒ d{  –—†  t        j                  t        j                  j
                  t        j                  j                  ¬«      }| j                  |j                  d<   | j                  |«      ƒ d{  –—† \  }}|j                  d   }t        j                  d| j                  |«       ŒÍ7 Œ±7 Œ:­w)z;
        Periodically refresh the TURN allocation.
        g«ªªªªªê?NrX   rg   z4TURN allocation refreshed %s (expires in %d seconds))rB   Úsleepr
   r[   r\   r„   r^   r_   rH   r`   ra   rb   rc   rT   )r3   rm   rd   rl   r4   s        r   rk   zTurnClientMixin.refresh»   s°   è ø€ ð Ü—-‘- ¨Ñ 6Ó7×7Ð7ä—l‘lÜ#Ÿ{™{×2Ñ2Ä$Ç*Á*×BTÑBTôˆGð .2¯]©]ˆG×Ñ˜zÑ*Ø $× 7Ñ 7¸Ó @×@‰KˆH�aà%×0Ñ0°Ñ<ˆNÜ�K‰KØFØ×$Ñ$Øôð Ø7øð Aús"   ‚CŸC A8CÂCÂ9CÃCrd   c              ƒ   óˆ  K  — |j                   | j                  vsJ ‚| j                  r| j                  |«       t	        j
                  || j                  | «      }|| j                  |j                   <   	 |j                  «       ƒ d{  –—† | j                  |j                   = S 7 Œ# | j                  |j                   = w xY w­w)zE
        Execute a STUN transaction and return the response.
        N)r{   rU   rP   Ú$_TurnClientMixin__add_authenticationr
   ÚTransactionrG   Úrun)r3   rd   r�   s      r   rd   zTurnClientMixin.requestÏ   s§   è ø€ ð ×%Ñ%¨T×->Ñ->Ñ>Ð>Ð>à×ÒØ×%Ñ% gÔ.ä×&Ñ& w°·±¸TÓBˆØ4?ˆ×Ñ˜'×0Ñ0Ñ1ð	:Ø$Ÿ™Ó*×*à×!Ñ! '×"8Ñ"8Ñ9ð +ùà×!Ñ! '×"8Ñ"8Ñ9üs0   ‚A2CÁ5B& ÂB$Â	B& ÂCÂ$B& Â&B?Â?Cc              ƒ   óÊ  K  — 	 | j                  |«      ƒ d{  –—† \  }}||fS 7 Œ# t        j                  $ �r&}|j                  j                  d   d   }d|j                  j                  v rä| j
                  �Ø| j                  �Ì|dk(  rd|j                  j                  v s|dk(  rª| j                  �ž|j                  j                  d   | _        |dk(  r|j                  j                  d   | _        t        | j
                  | j                  | j                  «      | _
        t        «       |_        | j                  |«      ƒ d{  –—†7  \  }}n‚ Y d}~||fS d}~ww xY w­w)z
        Execute a STUN transaction and return the response.

        On recoverable errors it will retry the request.
        Nz
ERROR-CODEr   ÚNONCEi‘  ÚREALMi¶  )rd   r
   ÚTransactionFailedrl   r`   r   r   r   rQ   r"   rP   r   r{   )r3   rd   rl   r7   ÚeÚ
error_codes         r   ra   z"TurnClientMixin.request_with_retryá   s>  è ø€ ð	Ø#'§<¡<°Ó#8×8‰NˆH�dð4 ˜ˆ~Ðð5 9ùÜ×%Ñ%ó 	ØŸ™×.Ñ.¨|Ñ<¸QÑ?ˆJà˜1Ÿ:™:×0Ñ0Ñ0Ø—M‘MÐ-Ø—M‘MÐ-à 3Ò&¨7°a·j±j×6KÑ6KÑ+KØ" cÒ)¨d¯j©jÐ.Dð ŸZ™Z×2Ñ2°7Ñ;�”
Ø Ò$Ø!"§¡×!6Ñ!6°wÑ!?�D”JÜ%7Ø—M‘M 4§:¡:¨t¯}©}ó&�Ô"ô
 *?Ó)@�Ô&Ø'+§|¡|°GÓ'<×!<Ð!<‘�™$àó ð ˜ˆ~Ðûð3	üsC   ‚E#„& ˜$™&  E#¤& ¦E ºDEÅEÅ	
EÅE#ÅE Å E#c              ƒ   ó”  K  — || j                   v rLt        j                  «       }|j                  «       }| j                   |   j	                  |«       |ƒ d{  –—†  | j
                  j                  |«      }t        j                  «       }|€¶g | j                   |<   | j                  }| xj                  dz  c_        | j                  ||«      ƒ d{  –—†  || j                  z   | j                  |<   || j                  |<   || j
                  |<   | j                   j                  |«      D ]  }|j                  d«       Œ nH|| j                  |   kD  r6| j                  ||«      ƒ d{  –—†  || j                  z   | j                  |<   t        j                   d|t#        |«      «      }| j%                  ||z   «       y7 �Œi7 Œð7 ŒZ­w)zA
        Send data to a remote host via the TURN server.
        Nr	   r*   )rM   rB   Úget_event_loopÚcreate_futureÚappendrN   rv   ÚtimerO   re   rI   rK   rL   ÚpopÚ
set_resultr/   Úpackr.   rF   )r3   r   r7   ÚloopÚwaiterr}   ÚnowÚheaders           r   Ú	send_datazTurnClientMixin.send_data  s¦  è ø€ ð
 �4×,Ñ,Ñ,Ü×)Ñ)Ó+ˆDØ×'Ñ'Ó)ˆFØ×%Ñ% dÑ+×2Ñ2°6Ô:Ø�LˆLà×&Ñ&×*Ñ*¨4Ó0ˆÜ�i‰i‹kˆØˆ?Ø.0ˆD×%Ñ% dÑ+Ø×)Ñ)ˆGØ×Ò 1Ñ$Õð ×#Ñ# G¨TÓ2×2Ð2ð 03°T×5NÑ5NÑ/NˆD×#Ñ# GÑ,Ø,0ˆD× Ñ  Ñ)Ø)0ˆD× Ñ  Ñ&ð ×3Ñ3×7Ñ7¸Ó=ò (�Ø×!Ñ! $Õ'ñ(à�4×*Ñ*¨7Ñ3Ò3à×#Ñ# G¨TÓ2×2Ð2ð 03°T×5NÑ5NÑ/NˆD×#Ñ# GÑ,ä—‘˜U G¬S°«YÓ7ˆØ�
‰
�6˜D‘=Õ!ð9 ùð 3øð 3ús9   ‚AGÁGÁA:GÃGÃBGÅ+GÅ,AGÇGÇGr€   c                 óh   — t         j                  d| ||«       | j                  t        |«      «       y)z9
        Send a STUN message to the TURN server.
        z
%s > %s %sN)rb   rq   rF   r;   )r3   r€   r7   s      r   Ú	send_stunzTurnClientMixin.send_stun-  s&   € ô 	�‰�\ 4¨¨wÔ7Ø�
‰
”5˜“>Õ"r   c                 óÐ   — | j                   |j                  d<   | j                  |j                  d<   | j                  |j                  d<   |j	                  | j
                  «       y )NÚUSERNAMEr�   r‘   )r   r`   rQ   r   Úadd_message_integrityrP   r‡   s     r   Ú__add_authenticationz$TurnClientMixin.__add_authentication4  sR   € Ø)-¯©ˆ×Ñ˜:Ñ&Ø&*§j¡jˆ×Ñ˜7Ñ#Ø&*§j¡jˆ×Ñ˜7Ñ#Ø×%Ñ% d×&8Ñ&8Õ9r   ©r   N)r>   r?   r@   r   r;   rA   ÚtupleÚstrÚintr   rV   re   rn   Ú	Exceptionrr   rB   rC   rt   r   r%   rˆ   rk   r
   r[   rd   ra   r¡   r£   rŒ   r   r   r   rE   rE   @   sÌ  … Ø�U�G˜T�MÑ"Ó"ð!à�c˜3�h‘ð!ð ˜3‘-ð!ð ˜3‘-ð	!ð
 ð!ð "ð!ð 
ó!ð:F°ð F¸EÀ#ÀsÀ(¹Oð FÐPTó Fð$˜u S¨# X™ó $ð0/ 9ð /°ó /ð
#¨×)>Ñ)>ð #À4ó #ð9 e¨E°3¨JÑ&7ð 9¸uÀSÈ#ÀX¹ð 9ÐSWó 9ó8ð*¨Cð °Dó ð(:Ø—|‘|ð:à	ˆt�|‰|˜U 3¨ 8™_Ð,Ñ	-ó:ð$#Ø—|‘|ð#à	ˆt�|‰|˜U 3¨ 8™_Ð,Ñ	-ó#ðJ%" Eð %"°°s¸C°x±ð %"ÀTó %"ðN# §¡ð #°U¸3À¸8±_ð #Èó #ð:¨D¯L©Lð :¸Tô :r   rE   c                   óL   — e Zd ZU dZej
                  ed<   deddfd„Zde	fd„Z
y)ÚTurnClientTcpProtocolz.
    Protocol for handling TURN over TCP.
    r&   r   r   Nc                 óX   — | j                   j                  | j                  |«      «       y r:   )r&   Úwriter=   ©r3   r   s     r   rF   zTurnClientTcpProtocol._sendB  s   € Ø�‰×Ñ˜TŸ\™\¨$Ó/Õ0r   c                  ó   — y)Nzturn/tcpr   ©r3   s    r   Ú__repr__zTurnClientTcpProtocol.__repr__E  ó   € Ør   )r>   r?   r@   Ú__doc__rB   Ú	TransportrA   r;   rF   rª   r´   r   r   r   r®   r®   ;  s4   … ñð × Ñ Ó ð1˜%ð 1 Dó 1ð˜#ô r   r®   c                   óL   — e Zd ZU dZej
                  ed<   deddfd„Zde	fd„Z
y)ÚTurnClientUdpProtocolz.
    Protocol for handling TURN over UDP.
    r&   r   r   Nc                 ó:   — | j                   j                  |«       y r:   )r&   Úsendtor±   s     r   rF   zTurnClientUdpProtocol._sendP  s   € Ø�‰×Ñ˜dÕ#r   c                  ó   — y)Nzturn/udpr   r³   s    r   r´   zTurnClientUdpProtocol.__repr__S  rµ   r   )r>   r?   r@   r¶   rB   ÚDatagramTransportrA   r;   rF   rª   r´   r   r   r   r¹   r¹   I  s4   … ñð ×(Ñ(Ó(ð$˜%ð $ Dó $ð˜#ô r   r¹   c                   ó€   — e Zd ZdZdeddfd„Zdd„Zddededefd	„Z	d
e
deeef   ddfd„Zdej                  ddfd„Zy)ÚTurnTransportzH
    Behaves like a Datagram transport, but uses a TURN allocation.
    Úinner_protocolr   Nc                 ó    — || _         d | _        y r:   )Ú_TurnTransport__inner_protocolÚ_TurnTransport__relayed_address)r3   rÀ   s     r   rV   zTurnTransport.__init___  s   € Ø .ˆÔØ<@ˆÕr   c                 ó^   — t        j                  | j                  j                  «       «       y)z·
        Close the transport.

        After the TURN allocation has been deleted, the protocol's
        `connection_lost()` method will be called with None as its argument.
        N)rB   rj   rÂ   rˆ   r³   s    r   r†   zTurnTransport.closec  s!   € ô 	×Ñ˜D×1Ñ1×8Ñ8Ó:Õ;r   ÚnameÚdefaultc                 ó|   — |dk(  r%| j                   j                  j                  d«      S |dk(  r| j                  S |S )z˜
        Return optional transport information.

        - `'related_address'`: the related address
        - `'sockname'`: the relayed address
        Úrelated_addressÚsockname)rÂ   r&   r2   rÃ   )r3   rÅ   rÆ   s      r   r2   zTurnTransport.get_extra_infol  sC   € ð Ð$Ò$Ø×(Ñ(×2Ñ2×AÑAÀ*ÓMÐMØ�ZÒØ×)Ñ)Ð)Øˆr   r   r7   c                 ób   — t        j                  | j                  j                  ||«      «       y)z~
        Sends the `data` bytes to the remote peer given `addr`.

        This will bind a TURN channel as necessary.
        N)rB   rj   rÂ   r¡   )r3   r   r7   s      r   r»   zTurnTransport.sendtoy  s%   € ô 	×Ñ˜D×1Ñ1×;Ñ;¸DÀ$ÓGÕHr   Úprotocolc              ƒ   óÒ   K  — | j                   j                  «       ƒ d {  –—† | _        || j                   _        |j	                  t        t        j                  | «      «       y 7 ŒD­wr:   )rÂ   rn   rÃ   rR   rt   r   rB   r½   )r3   rË   s     r   Ú_connectzTurnTransport._connect�  sQ   è ø€ Ø'+×'<Ñ'<×'DÑ'DÓ'F×!FˆÔð *2ˆ×ÑÔ&Ø× Ñ ¤¤g×&?Ñ&?ÀÓ!FÕGð "Gús   ‚A' A%¡AA'r¨   r:   )r>   r?   r@   r¶   ÚTurnClientProtocolrV   r†   rª   r   r2   r;   r©   r«   r»   rB   ÚDatagramProtocolrÍ   r   r   r   r¿   r¿   Z  s   „ ñðAÐ'9ð A¸dó Aó<ñ 3ð °ð Àó ðI˜5ð I¨¨c°3¨h©ð I¸Dó IðH w×'?Ñ'?ð HÀDô Hr   r¿   ÚudpÚprotocol_factoryÚserver_addrrH   rI   Ússlr&   c              ƒ   ó   ‡‡‡‡‡K  — t        j                  «       }|dk(  r.|j                  ˆˆˆˆˆfd„‰d   ‰d   |¬«      ƒ d{  –—† \  }	}
nk|j                  ˆˆˆˆˆfd„‰¬«      ƒ d{  –—† \  }	}
|	j	                  d	«      }|�3|j                  t        j                  t        j                  t        «       	  | «       }t        |
«      }|j                  |«      ƒ d{  –—†  ||fS 7 Œ£7 Œ7 Œ# t        $ r |	j                  «        ‚ w xY w­w)
z7
    Create datagram connection relayed over TURN.
    Útcpc                  ó$   •— t        ‰‰‰‰‰ ¬«      S ©N)r   r   rH   rI   )r®   ©rI   rH   r   rÒ   r   s   €€€€€r   ú<lambda>z&create_turn_endpoint.<locals>.<lambda>œ  ó   ø€ Ô)ØØ!Ø!Ø!Ø%9ô€ r   r   r	   )ÚhostÚportrÓ   Nc                  ó$   •— t        ‰‰‰‰‰ ¬«      S r×   )r¹   rØ   s   €€€€€r   rÙ   z&create_turn_endpoint.<locals>.<lambda>©  rÚ   r   )Úremote_addrÚsocket)rB   r–   Úcreate_connectionÚcreate_datagram_endpointr2   Ú
setsockoptrß   Ú
SOL_SOCKETÚ	SO_RCVBUFÚUDP_SOCKET_BUFFER_SIZEr¿   rÍ   r¬   r†   )rÑ   rÒ   r   r   rH   rI   rÓ   r&   r�   Úinner_transportrÀ   ÚsockrË   Úturn_transports    `````        r   Úcreate_turn_endpointré   Š  s!  üè ø€ ô ×!Ñ!Ó#€Dð �EÒØ04×0FÑ0F÷ð ˜Q‘Ø˜Q‘Øð 1Gó 1
÷ +
Ñ'ˆ™ð 15×0MÑ0M÷ð $ð 1Nó 	1
÷ 	+
Ñ'ˆ˜ð ×-Ñ-¨hÓ7ˆØÐØ�O‰OœF×-Ñ-¬v×/?Ñ/?ÔAWÔXðÙ#Ó%ˆÜ& ~Ó6ˆØ×%Ñ% hÓ/×/Ð/ð
 ˜8Ð#Ð#ðG+
øð	+
øð" 	0ùÜò Ø×ÑÔØðüsN   ‡?DÁC*Á%DÁ,C,Á-ADÂ;&C0 Ã!C.Ã"C0 Ã&DÃ,DÃ.C0 Ã0DÄD)-rB   r   Úloggingrß   rÓ   r/   r™   Úcollections.abcr   Útypingr   r   r   r   r   Ú r
   Úutilsr   Ú	getLoggerr>   rb   ÚDEFAULT_CHANNEL_REFRESH_TIMEÚDEFAULT_ALLOCATION_LIFETIMEÚTCP_TRANSPORTri   rå   rÏ   r   r;   Úboolr   rª   r"   r$   rE   ÚProtocolr®   r¹   rÎ   r¿   r©   r«   Ú
SSLContextré   r   r   r   ú<module>rö      s£  ðÛ Û Û Û Û 
Û Û Ý $ß 6Õ 6å Ý (à	ˆ×	Ñ	˜8Ó	$€à"Ð Ø!Ð Ø€Ø€ØÐ á�\¨×)AÑ)AÔB€
ð$˜%ð $ Dó $ðV ð V¨Sð V¸Cð VÀEó V÷ñ ÷>x:ñ x:ôv˜O¨_¸g×>NÑ>Nô ô˜O¨W×-EÑ-Eô ð Ð0Ð2GÐGÑHÐ ÷-Hñ -Hðj 0Ø <Ø15Øñ4$Ø˜r :˜~Ñ.ð4$à�s˜C�x‘ð4$ð �s‰mð4$ð �s‰mð	4$ð
 ð4$ð ð4$ð 
�%˜˜cŸn™nÐ,Ñ-Ñ	.ð4$ð ð4$ð ˆ=˜*Ð$Ñ%ô4$r   