Ë
    ž…Åj[/  ã                   ó  — U d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlm	Z	 ddl
mZmZ ddlmZmZ ddlmZmZmZ dd	lmZ d
gZej.                  dk(  r+ e	«       Ze	ed<   dZde j6                  de j6                  fd„Znde j6                  de j6                  fd„Zd ZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'd Z(dZ)dZ*	  ejV                  «       de,dede,fd„«       Z- ejV                  «       de,de,dedede,f
d„«       Z. G d„ d
«      Z/y)é    N)Úsuppress)ÚAnyÚOptional)ÚWeakKeyDictionaryé   )ÚffiÚlib)Ú	CurlECodeÚCurlMOpt)ÚDEFAULT_CACERTÚCurlÚ	CurlError)ÚCurlCffiWarningÚ	AsyncCurlÚwin32Ú
_selectorsa  
    Proactor event loop does not implement add_reader family of methods required.
    Registering an additional selector thread for add_reader support.
    To avoid this warning use:
        asyncio.set_event_loop_policy(WindowsSelectorEventLoopPolicy())
    Úasyncio_loopÚreturnc           
      ó  ‡ ‡‡— ‰ t         v r	t         ‰    S t        ‰ t        t        dt	        d«      «      «      s‰ S t        j                  t        t        d¬«       ddl	m
}  |‰ «      xŠt         ‰ <   ‰ j                  Šˆ ˆˆfd„}|‰ _        ‰S )zåGet selector-compatible loop

        Returns an object with ``add_reader`` family of methods,
        either the loop itself or a SelectorThread instance.

        Workaround Windows proactor removal of *reader methods.
        ÚProactorEventLoopNé   ©Ú
stacklevelr   )ÚAddThreadSelectorEventLoopc                  ó`   •— ‰‰ _         t        j                  ‰ d «       ‰j                  «        y ©N)Úcloser   Úpop)r   Ú
loop_closeÚselector_loops   €€€úC/opt/euro-skaner/venv/lib/python3.12/site-packages/curl_cffi/aio.pyÚ_close_selector_and_loopz.get_selector.<locals>._close_selector_and_loop7   s'   ø€ ð ",ˆLÔÜ�N‰N˜<¨Ô.Ø×ÑÕ!ó    )r   Ú
isinstanceÚgetattrÚasyncioÚtypeÚwarningsÚwarnÚPROACTOR_WARNINGr   Ú_asyncio_selectorr   r   )r   r   r"   r   r    s   `  @@r!   Úget_selectorr,      sŠ   ú€ ð œ:Ñ%Ü˜lÑ+Ð+äØœ'¤'Ð+>ÄÀTÃ
ÓKô
ð  Ðä�‰Ô&¬ÀAÕFåAá3MØó4
ð 	
ˆœ
 <Ñ0ð
 "×'Ñ'ˆ
ö	"ð 6ˆÔØÐr#   Úloopc                 ó   — | S r   © )r-   s    r!   r,   r,   C   s   € Øˆr#   r   é   é   éÿÿÿÿÚ
timeout_msÚclientpc                 óø   — t        j                  |«      }|j                  r!|j                  j                  «        d|_        |j                  j                  |dz  |j                  t        t        «      |_        y)zD
    see: https://curl.se/libcurl/c/CURLMOPT_TIMERFUNCTION.html
    Niè  r   )	r   Úfrom_handleÚ_timerÚcancelr-   Ú
call_laterÚprocess_dataÚCURL_SOCKET_TIMEOUTÚCURL_POLL_NONE)Úcurlmr3   r4   Ú
async_curls       r!   Útimer_functionr?   u   sl   € ô
 —‘ Ó)€Jð ×ÒØ×Ñ× Ñ Ô"Ø ˆ
Ôð #Ÿ™×2Ñ2Ø�TÑØ×ÑÜÜó	€JÔð r#   ÚsockfdÚwhatÚdatac                 ó  — t        j                  |«      }|j                  }||j                  v r"|j	                  |«       |j                  |«       |t        z  r=|j                  ||j                  |t        «       |j                  j                  |«       |t        z  r=|j                  ||j                  |t        «       |j                  j                  |«       |t        k(  r|j                  j                  |«       y)z[This callback is called when libcurl decides it's time to interact with certain
    socketsr   )r   r6   r-   Ú_sockfdsÚremove_readerÚremove_writerÚCURL_POLL_INÚ
add_readerr:   ÚCURL_CSELECT_INÚaddÚCURL_POLL_OUTÚ
add_writerÚCURL_CSELECT_OUTÚCURL_POLL_REMOVEÚremove)Úcurlr@   rA   r4   rB   r>   r-   s          r!   Úsocket_functionrQ   �   sÖ   € ô
 —‘ Ó)€JØ�?‰?€Dð �×$Ñ$Ñ$Ø×Ñ˜6Ô"Ø×Ñ˜6Ô"ð ŒlÒØ�‰˜ 
× 7Ñ 7¸ÄÔQØ×Ñ×Ñ Ô'ð ŒmÒØ�‰˜ 
× 7Ñ 7¸ÔAQÔRØ×Ñ×Ñ Ô'ð ÔÒØ×Ñ×"Ñ" 6Ô*àr#   c                   ó¦   — e Zd ZdZddefd„Zd„ Zd„ Zd„ Zde	fd	„Z
d
ededefd„Zd
edefd„Zde	fd„Zde	fd„Zde	fd„Zde	fd„Zdedefd„Zd„ Zy)r   zhWrapper around curl_multi handle to provide asyncio support. It uses the libcurl
    socket_action APIs.NÚcacertc                 ód  — t        j                  «       | _        |xs t        | _        i | _        i | _        t        «       | _        t        |�|nt        j                  «       «      | _        | j                  j                  | j                  «       «      | _        d| _        | j#                  «        y)z—
        Parameters:
            cacert: CA cert path to use, by default, certs from ``certifi`` are used.
            loop: EventLoop to use.
        N)r	   Úcurl_multi_initÚ_curlmr   Ú_cacertÚ_curl2futureÚ
_curl2curlÚsetrD   r,   r&   Úget_running_loopr-   Úcreate_taskÚ_force_timeoutÚ_timeout_checkerr7   Ú_setup)ÚselfrS   r-   s      r!   Ú__init__zAsyncCurl.__init__¯   s‰   € ô ×)Ñ)Ó+ˆŒØÒ/¤ˆŒØ8:ˆÔØ13ˆŒÜ"%£%ˆŒÜ ØÐ$‰D¬'×*BÑ*BÓ*Dó
ˆŒ	ð !%§	¡	× 5Ñ 5°d×6IÑ6IÓ6KÓ LˆÔØ59ˆŒØ�‰�r#   c                 ó˜  — | j                  t        j                  t        j                  «       | j                  t        j
                  t        j                  «       t        j                  | «      | _	        | j                  t        j                  | j                  «       | j                  t        j                  | j                  «       y r   )Úsetoptr   ÚTIMERFUNCTIONr	   r?   ÚSOCKETFUNCTIONrQ   r   Ú
new_handleÚ_self_handleÚ
SOCKETDATAÚ	TIMERDATA©r`   s    r!   r_   zAsyncCurl._setupÁ   s{   € Ø�‰”H×*Ñ*¬C×,>Ñ,>Ô?Ø�‰”H×+Ñ+¬S×-@Ñ-@ÔAÜŸN™N¨4Ó0ˆÔØ�‰”H×'Ñ'¨×):Ñ):Ô;Ø�‰”H×&Ñ&¨×(9Ñ(9Õ:r#   c              ƒ   óò  K  — | j                   j                  «        t        t        j                  «      5  | j                   ƒ d{  –—†  ddd«       | j
                  j                  «       D ]b  \  }}t        j                  | j                  |j                  «       |j                  «       rŒA|j                  «       rŒR|j                  d«       Œd t        j                  | j                  «       d| _	        | j                  D ]8  }| j                   j#                  |«       | j                   j%                  |«       Œ: | j&                  r| j&                  j                  «        yy7 �Œ!# 1 sw Y   �Œ!xY w­w)z?Close and cleanup running timers, readers, writers and handles.N)r^   r8   r   r&   ÚCancelledErrorrX   Úitemsr	   Úcurl_multi_remove_handlerV   Ú_curlÚdoneÚ	cancelledÚ
set_resultÚcurl_multi_cleanuprD   r-   rE   rF   r7   )r`   rP   Úfuturer@   s       r!   r   zAsyncCurl.closeÉ   s!  è ø€ ð 	×Ñ×$Ñ$Ô&Ü”g×,Ñ,Ó-ñ 	(Ø×'Ñ'×'Ð'÷	(ð !×-Ñ-×3Ñ3Ó5ò 	(‰LˆD�&Ü×(Ñ(¨¯©°d·j±jÔAØ—;‘;•=¨×)9Ñ)9Õ);Ø×!Ñ! $Õ'ð	(ô 	×Ñ˜tŸ{™{Ô+ØˆŒð —m‘mò 	,ˆFØ�I‰I×#Ñ# FÔ+Ø�I‰I×#Ñ# FÕ+ð	,ð
 �;Š;Ø�K‰K×ÑÕ ð ð% (ù÷	(ñ 	(üs<   ‚4E7¶E*ÁE'ÁE*ÁA"E7Â.E7Â?B(E7Å'E*Å*E4Å/E7c              ƒ   óš   K  — 	 | j                   sy| j                  t        t        «       t	        j
                  d«      ƒ d{  –—†  ŒE7 Œ­w)zpThis coroutine is used to safeguard from any missing signals from curl, and
        put everything back on trackgš™™™™™¹?N)rV   Úsocket_actionr;   r<   r&   Úsleeprj   s    r!   r]   zAsyncCurl._force_timeoutä   sB   è ø€ ð Ø—;’;ØØ×ÑÔ2´NÔCÜ—-‘- Ó$×$Ð$ð	 ð %ús   ‚AAÁA	ÁArP   c                 ó   — |j                  «        t        j                  | j                  |j                  «      }| j                  |«       | j                  j                  «       }|| j                  |<   || j                  |j                  <   |S )znAdd a curl handle to be managed by curl_multi. This is the equivalent of
        `perform` in the async world.)
Ú_ensure_cacertr	   Úcurl_multi_add_handlerV   ro   Ú_check_errorr-   Úcreate_futurerX   rY   )r`   rP   Úerrcodert   s       r!   Ú
add_handlezAsyncCurl.add_handleí   sq   € ð 	×ÑÔÜ×+Ñ+¨D¯K©K¸¿¹ÓDˆØ×Ñ˜'Ô"Ø—‘×(Ñ(Ó*ˆØ"(ˆ×Ñ˜$ÑØ&*ˆ�‰˜Ÿ
™
Ñ#Øˆr#   r@   Ú
ev_bitmaskr   c                 óœ   — t        j                  d«      }t        j                  | j                  |||«      }| j                  |«       |d   S )zYwrapper for curl_multi_socket_action,
        returns the number of running curl handles.úint *r   )r   Únewr	   Úcurl_multi_socket_actionrV   r{   )r`   r@   r   Úrunning_handler}   s        r!   rv   zAsyncCurl.socket_actionù   sJ   € ô Ÿ™ Ó)ˆÜ×.Ñ.Ø�K‰K˜ ¨^ó
ˆð 	×Ñ˜'Ô"Ø˜aÑ Ð r#   c                 ó¾  — | j                   st        j                  dt        d¬«       y| j	                  ||«       t        j                  d«      }	 	 t        j                  | j                   |«      }|t
        j                  k(  ry|j                  t        k(  rŽ| j                  |j                     }|j                  j                  }|j!                  «       }|�| j#                  ||«       nE|dk(  r| j%                  |«       n.| j#                  ||j'                  |d«      «       nt)        d«       Œâ# t*        $ r t        j                  d	t        d¬«       Y Œ(w xY w)
z8Call curl_multi_info_read to read data for given socket.z0Curlm already closed! quitting from process_datar   r   Nr�   r   ÚperformzNOT DONEzLUnexpected curl multi state in process_data, please open an issue on GitHub
)rV   r(   r)   r   rv   r   r‚   r	   Úcurl_multi_info_readÚNULLÚmsgÚCURLMSG_DONErY   Úeasy_handlerB   ÚresultÚ_get_callback_exceptionÚset_exceptionrr   Ú
_get_errorÚprintÚ	Exception)r`   r@   r   Úmsg_in_queueÚcurl_msgrP   ÚretcodeÚcallback_exceptions           r!   r:   zAsyncCurl.process_data  s&  € à�{Š{Ü�M‰MØBÜØõð
 à×Ñ˜6 :Ô.ä—w‘w˜wÓ'ˆØðÜ×3Ñ3°D·K±KÀÓN�àœsŸx™xÒ'ØØ—<‘<¤<Ò/ØŸ?™?¨8×+?Ñ+?Ñ@�DØ&Ÿm™m×2Ñ2�GØ)-×)EÑ)EÓ)GÐ&Ø)Ð5Ø×*Ñ*¨4Ð1CÕDØ  AšØŸ™¨Õ-à×*Ñ*¨4°·±ÀÈ)Ó1TÕUä˜*Ô%ð# øô$ ò Ü—‘ð7ä#Ø ÷	ðús   Á3D4 ÂB,D4 Ä4%EÅEc                 óü   — t        j                  | j                  |j                  «      }| j	                  |«       | j
                  j                  |j                  d «       | j                  j                  |d «      S r   )r	   rn   rV   ro   r{   rY   r   rX   )r`   rP   r}   s      r!   Ú_pop_futurezAsyncCurl._pop_future*  s[   € Ü×.Ñ.¨t¯{©{¸D¿J¹JÓGˆØ×Ñ˜'Ô"Ø�‰×Ñ˜DŸJ™J¨Ô-Ø× Ñ ×$Ñ$ T¨4Ó0Ð0r#   c                 ó�   — | j                  |«      }|r3|j                  «       s"|j                  «       s|j                  «        yyyy)z&Cancel a future for given curl handle.N)r—   rp   rq   r8   ©r`   rP   rt   s      r!   Úremove_handlezAsyncCurl.remove_handle0  s;   € à×!Ñ! $Ó'ˆÙ˜&Ÿ+™+œ-°×0@Ñ0@Ô0BØ�M‰M�Oð 1C˜-ˆ6r#   c                 ó’   — | j                  |«      }|r4|j                  «       s#|j                  «       s|j                  d«       yyyy)z,Mark a future as done for given curl handle.N)r—   rp   rq   rr   r™   s      r!   rr   zAsyncCurl.set_result6  s@   € à×!Ñ! $Ó'ˆÙ˜&Ÿ+™+œ-°×0@Ñ0@Ô0BØ×Ñ˜dÕ#ð 1C˜-ˆ6r#   c                 ó’   — | j                  |«      }|r4|j                  «       s#|j                  «       s|j                  |«       yyyy)z2Raise exception of a future for given curl handle.N)r—   rp   rq   rŽ   )r`   rP   Ú	exceptionrt   s       r!   rŽ   zAsyncCurl.set_exception<  s@   € à×!Ñ! $Ó'ˆÙ˜&Ÿ+™+œ-°×0@Ñ0@Ô0BØ× Ñ  Õ+ð 1C˜-ˆ6r#   r}   Úargsc           	      óØ   — |t         j                  k(  ry t        j                  |«      }dj	                  |D �cg c]  }t        |«      ‘Œ c}«      }t        d|› d|› d|› d�«      ‚c c}w )Nú z
Failed in z
, multi: (z) z„. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. Please open an issue on GitHub to help debug this error.)r
   ÚOKr	   Úcurl_multi_strerrorÚjoinÚstrr   )r`   r}   rž   ÚerrmsgÚaÚactions         r!   r{   zAsyncCurl._check_errorB  so   € Ø”i—l‘lÒ"ØÜ×(Ñ(¨Ó1ˆØ—‘¨4Ö0 aœ3˜q�6Ò0Ó1ˆÜØ˜˜ 
¨7¨)°2°f°Xð >Pð Pó
ð 	
ùò 1s   ¹A'c                 ó2  — |t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  fv rt        j                  d|«      }n|}t        j                  | j                  ||«      S )z!Wrapper around curl_multi_setopt.zlong*)r   Ú
PIPELININGÚMAXCONNECTSÚMAX_HOST_CONNECTIONSÚMAX_PIPELINE_LENGTHÚMAX_TOTAL_CONNECTIONSÚMAX_CONCURRENT_STREAMSr   r‚   r	   Úcurl_multi_setoptrV   )r`   ÚoptionÚvalueÚc_values       r!   rc   zAsyncCurl.setoptM  su   € àÜ×ÑÜ× Ñ Ü×)Ñ)Ü×(Ñ(Ü×*Ñ*Ü×+Ñ+ð
ñ 
ô —g‘g˜g uÓ-‰GàˆGÜ×$Ñ$ T§[¡[°&¸'ÓBÐBr#   )Ú N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r¤   ra   r_   r   r]   r   r~   Úintrv   r:   r—   rš   rr   rŽ   r   r{   rc   r/   r#   r!   r   r   «   s¥   „ ññ˜só ò$;ò!ò6%ð
˜tó 
ð! Cð !°Sð !¸Só !ð% 3ð %°Có %ðN1 ó 1ð $ó ð$˜tó $ð, $ó ,ð	
 Cð 	
°ó 	
óCr#   )0r&   Úsysr(   Ú
contextlibr   Útypingr   r   Úweakrefr   Ú_wrapperr   r	   Úconstr
   r   rP   r   r   r   Úutilsr   Ú__all__Úplatformr   Ú__annotations__r*   ÚAbstractEventLoopr,   r<   rG   rK   ÚCURL_POLL_INOUTrN   r;   ÚCURL_SOCKET_BADrI   rM   ÚCURL_CSELECT_ERRrŠ   ÚCURLPIPE_NOTHINGÚCURLPIPE_HTTP1ÚCURLPIPE_MULTIPLEXÚ
def_externr¸   r?   rQ   r   r/   r#   r!   ú<module>rË      sc  ðÜ Û 
Û Ý ß  Ý %ç ß &ß 1Ñ 1Ý "àˆ-€à‡<�<�7Òá$5Ó$7€JÐ!Ó7ðÐð&Ø×/Ñ/ð&à	×	"Ñ	"ô&ðT˜7×4Ñ4ð ¸×9RÑ9Ró ð €Ø€Ø€Ø€ØÐ àÐ Ø€à€ØÐ ØÐ à€àÐ Ø€ØÐ ðð4 €‡�Óð cð °Cð ¸Cò ó ðð. €‡�Óð #ð ¨Sð ¸3ð Àcð Ècò ó ð÷:oCò oCr#   