§
    H›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 j        de j        fd„Znde j        de j        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j+        ¦   «         de,dede,fd„¦   «         Z- ej+        ¦   «         de,de,dedede,f
d„¦   «         Z. G d„ d
¦  «        Z/dS )é    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   •— ‰‰ _         t                               ‰ d ¦  «         ‰                      ¦   «          d S ©N)Úcloser   Úpop)r   Ú
loop_closeÚselector_loops   €€€úL/home/lighthouse/health/venv/lib64/python3.11/site-packages/curl_cffi/aio.pyÚ_close_selector_and_loopz.get_selector.<locals>._close_selector_and_loop7   s9   ø€ ð ",ˆ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ÔKñ
ô 
ð 	 ð  ÐåŒÕ&­ÀAÐFÑFÔFÐFàAÐAÐAÐAÐAÐAà3MÐ3MØñ4
ô 4
ð 	
ˆ�
 <Ñ0ð
 "Ô'ˆ
ð	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 6ˆÔØÐr#   Úloopc                 ó   — | S r   © )r-   s    r!   r,   r,   C   s   € Øˆr#   r   é   é   éÿÿÿÿÚ
timeout_msÚclientpc                 óä   — t          j        |¦  «        }|j        r |j                             ¦   «          d|_        |j                             |dz  |j        t          t          ¦  «        |_        dS )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   st   € õ
 ” Ñ)Ô)€Jð Ôð !ØÔ× Ò Ñ"Ô"Ð"Ø ˆ
Ôð #œ×2Ò2Ø�TÑØÔÝÝñ	ô €JÔð ˆ1r#   ÚsockfdÚwhatÚdatac                 ó  — t          j        |¦  «        }|j        }||j        v r*|                     |¦  «         |                     |¦  «         |t          z  r<|                     ||j        |t          ¦  «         |j         
                    |¦  «         |t          z  r<|                     ||j        |t          ¦  «         |j         
                    |¦  «         |t          k    r|j                             |¦  «         dS )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¸ÅÑQÔQÐQØÔ×Ò Ñ'Ô'Ð'ð �mÑð (Ø�Š˜ 
Ô 7¸ÕAQÑRÔRÐRØÔ×Ò Ñ'Ô'Ð'ð ÕÒÐØÔ×"Ò" 6Ñ*Ô*Ð*àˆ1r#   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dS )r   zhWrapper around curl_multi handle to provide asyncio support. It uses the libcurl
    socket_action APIs.Ú NÚcacertc                 ó~  — t          j        ¦   «         | _        |pt          | _        i | _        i | _        t          ¦   «         | _        t          |�|nt          j        ¦   «         ¦  «        | _        | j                             |                      ¦   «         ¦  «        | _        d| _        |                      ¦   «          dS )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)ÚselfrT   r-   s      r!   Ú__init__zAsyncCurl.__init__¯   sž   € õ Ô)Ñ+Ô+ˆŒØÐ/¥ˆŒØ8:ˆÔØ13ˆŒÝ"%¡%¤%ˆŒÝ ØÐ$ˆDˆD­'Ô*BÑ*DÔ*Dñ
ô 
ˆŒ	ð !%¤	× 5Ò 5°d×6IÒ6IÑ6KÔ6KÑ LÔ LˆÔØ59ˆŒØ�Š‰Œˆˆˆr#   c                 ót  — |                       t          j        t          j        ¦  «         |                       t          j        t          j        ¦  «         t          j        | ¦  «        | _	        |                       t          j
        | j	        ¦  «         |                       t          j        | j	        ¦  «         d S r   )Úsetoptr   ÚTIMERFUNCTIONr	   r?   ÚSOCKETFUNCTIONrQ   r   Ú
new_handleÚ_self_handleÚ
SOCKETDATAÚ	TIMERDATA©ra   s    r!   r`   zAsyncCurl._setupÁ   s‚   € Ø�Š•HÔ*­CÔ,>Ñ?Ô?Ð?Ø�Š•HÔ+­SÔ-@ÑAÔAÐAÝœN¨4Ñ0Ô0ˆÔØ�Š•HÔ'¨Ô):Ñ;Ô;Ð;Ø�Š•HÔ&¨Ô(9Ñ:Ô:Ð:Ð:Ð:r#   c              ƒ   ó®  K  — | j                              ¦   «          t          t          j        ¦  «        5  | j         ƒ d{V —† ddd¦  «         n# 1 swxY w Y   | j                             ¦   «         D ]a\  }}t          j        | j	        |j
        ¦  «         |                     ¦   «         s)|                     ¦   «         s|                     d¦  «         Œbt          j        | j	        ¦  «         d| _	        | j        D ]6}| j                             |¦  «         | j                             |¦  «         Œ7| j        r| j                             ¦   «          dS dS )z?Close and cleanup running timers, readers, writers and handles.N)r_   r8   r   r&   ÚCancelledErrorrY   Úitemsr	   Úcurl_multi_remove_handlerW   Ú_curlÚdoneÚ	cancelledÚ
set_resultÚcurl_multi_cleanuprD   r-   rE   rF   r7   )ra   rP   Úfuturer@   s       r!   r   zAsyncCurl.closeÉ   sŸ  è è € ð 	Ô×$Ò$Ñ&Ô&Ð&Ý•gÔ,Ñ-Ô-ð 	(ð 	(ØÔ'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð !Ô-×3Ò3Ñ5Ô5ð 	(ð 	(‰LˆD�&ÝÔ(¨¬°d´jÑAÔAÐAØ—;’;‘=”=ð (¨×)9Ò)9Ñ);Ô);ð (Ø×!Ò! $Ñ'Ô'Ð'øõ 	Ô˜tœ{Ñ+Ô+Ð+ØˆŒð ”mð 	,ð 	,ˆFØŒI×#Ò# FÑ+Ô+Ð+ØŒI×#Ò# FÑ+Ô+Ð+Ð+ð Œ;ð 	!ØŒK×ÒÑ Ô Ð Ð Ð ð	!ð 	!s   µAÁAÁAc              ƒ   ó�   K  — 	 | j         sdS |                      t          t          ¦  «         t	          j        d¦  «        ƒ d{V —† ŒD)zpThis coroutine is used to safeguard from any missing signals from curl, and
        put everything back on trackTgš™™™™™¹?N)rW   Úsocket_actionr;   r<   r&   Úsleeprk   s    r!   r^   zAsyncCurl._force_timeoutä   sX   è è € ð	%Ø”;ð Ø�Ø×ÒÕ2µNÑCÔCÐCÝ”- Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ð		%r#   rP   c                 óú   — |                      ¦   «          t          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_handlerW   rp   Ú_check_errorr-   Úcreate_futurerY   rZ   )ra   rP   Úerrcoderu   s       r!   Ú
add_handlezAsyncCurl.add_handleí   ss   € ð 	×ÒÑÔÐÝÔ+¨D¬K¸¼ÑDÔDˆØ×Ò˜'Ñ"Ô"Ð"Ø”×(Ò(Ñ*Ô*ˆØ"(ˆÔ˜$ÑØ&*ˆŒ˜œ
Ñ#Øˆr#   r@   Ú
ev_bitmaskr   c                 óœ   — t          j        d¦  «        }t          j        | j        |||¦  «        }|                      |¦  «         |d         S )zYwrapper for curl_multi_socket_action,
        returns the number of running curl handles.úint *r   )r   Únewr	   Úcurl_multi_socket_actionrW   r|   )ra   r@   r€   Úrunning_handler~   s        r!   rw   zAsyncCurl.socket_actionù   sQ   € õ œ Ñ)Ô)ˆÝÔ.ØŒK˜ ¨^ñ
ô 
ˆð 	×Ò˜'Ñ"Ô"Ð"Ø˜aÔ Ð r#   c                 ó`  — | j         st          j        dt          d¬¦  «         dS |                      ||¦  «         t          j        d¦  «        }	 	 t          j        | j         |¦  «        }|t
          j	        k    rdS |j
        t          k    re| j        |j                 }|j        j        }|dk    r|                      |¦  «         n:|                      ||                     |d¦  «        ¦  «         nt'          d	¦  «         n,# t(          $ r t          j        d
t          d¬¦  «         Y nw xY wŒß)z8Call curl_multi_info_read to read data for given socket.z0Curlm already closed! quitting from process_datar   r   Nr‚   Tr   ÚperformzNOT DONEzLUnexpected curl multi state in process_data, please open an issue on GitHub
)rW   r(   r)   r   rw   r   rƒ   r	   Úcurl_multi_info_readÚNULLÚmsgÚCURLMSG_DONErZ   Úeasy_handlerB   Úresultrs   Úset_exceptionÚ
_get_errorÚprintÚ	Exception)ra   r@   r€   Úmsg_in_queueÚcurl_msgrP   Úretcodes          r!   r:   zAsyncCurl.process_data  sR  € àŒ{ð 	ÝŒMØBÝØðñ ô ð ð
 ˆFà×Ò˜6 :Ñ.Ô.Ð.å”w˜wÑ'Ô'ˆð	ðÝÔ3°D´KÀÑNÔN�à�sœxÒ'Ð'Ø�EØ”<¥<Ò/Ð/Øœ?¨8Ô+?Ô@�DØ&œmÔ2�GØ !’|�|ØŸš¨Ñ-Ô-Ð-Ð-à×*Ò*¨4°·²ÀÈ)Ñ1TÔ1TÑUÔUÐUÐUå˜*Ñ%Ô%Ð%øøÝð ð ð Ý”ð7å#Ø ð	ñ ô ð ð ð ðøøøð	s   Á*D Á>BD Ä&D,Ä+D,c                 óà   — t          j        | j        |j        ¦  «        }|                      |¦  «         | j                             |j        d ¦  «         | j                             |d ¦  «        S r   )r	   ro   rW   rp   r|   rZ   r   rY   )ra   rP   r~   s      r!   Ú_pop_futurezAsyncCurl._pop_future'  s_   € ÝÔ.¨t¬{¸D¼JÑGÔGˆØ×Ò˜'Ñ"Ô"Ð"ØŒ×Ò˜DœJ¨Ñ-Ô-Ð-ØÔ ×$Ò$ T¨4Ñ0Ô0Ð0r#   c                 ó¸   — |                       |¦  «        }|r>|                     ¦   «         s,|                     ¦   «         s|                     ¦   «          dS dS dS dS )z&Cancel a future for given curl handle.N)r–   rq   rr   r8   ©ra   rP   ru   s      r!   Úremove_handlezAsyncCurl.remove_handle-  sn   € à×!Ò! $Ñ'Ô'ˆØð 	˜&Ÿ+š+™-œ-ð 	°×0@Ò0@Ñ0BÔ0Bð 	Ø�MŠM‰OŒOˆOˆOˆOð	ð 	ð 	ð 	ð 	ð 	r#   c                 óº   — |                       |¦  «        }|r?|                     ¦   «         s-|                     ¦   «         s|                     d¦  «         dS dS dS dS )z,Mark a future as done for given curl handle.N)r–   rq   rr   rs   r˜   s      r!   rs   zAsyncCurl.set_result3  sw   € à×!Ò! $Ñ'Ô'ˆØð 	$˜&Ÿ+š+™-œ-ð 	$°×0@Ò0@Ñ0BÔ0Bð 	$Ø×Ò˜dÑ#Ô#Ð#Ð#Ð#ð	$ð 	$ð 	$ð 	$ð 	$ð 	$r#   c                 óº   — |                       |¦  «        }|r?|                     ¦   «         s-|                     ¦   «         s|                     |¦  «         dS dS dS dS )z2Raise exception of a future for given curl handle.N)r–   rq   rr   rŽ   )ra   rP   Ú	exceptionru   s       r!   rŽ   zAsyncCurl.set_exception9  sw   € à×!Ò! $Ñ'Ô'ˆØð 	,˜&Ÿ+š+™-œ-ð 	,°×0@Ò0@Ñ0BÔ0Bð 	,Ø× Ò  Ñ+Ô+Ð+Ð+Ð+ð	,ð 	,ð 	,ð 	,ð 	,ð 	,r#   r~   Úargsc           	      ó¾   — |t           j        k    rd S t          j        |¦  «        }d                     d„ |D ¦   «         ¦  «        }t          d|› d|› d|› d�¦  «        ‚)Nú c                 ó,   — g | ]}t          |¦  «        ‘ŒS r/   )Ústr)Ú.0Úas     r!   ú
<listcomp>z*AsyncCurl._check_error.<locals>.<listcomp>C  s   € Ð0Ð0Ð0 a�3˜q™6œ6Ð0Ð0Ð0r#   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Újoinr   )ra   r~   r�   ÚerrmsgÚactions        r!   r|   zAsyncCurl._check_error?  sŒ   € Ø•i”lÒ"Ð"ØˆFÝÔ(¨Ñ1Ô1ˆØ—’Ð0Ð0¨4Ð0Ñ0Ô0Ñ1Ô1ˆÝðP˜ð Pð P¨7ð Pð P°fð Pð Pð Pñ
ô 
ð 	
r#   c                 óô   — |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_setoptrW   )ra   ÚoptionÚvalueÚc_values       r!   rd   zAsyncCurl.setoptJ  si   € àÝÔÝÔ ÝÔ)ÝÔ(ÝÔ*ÝÔ+ð
ð 
ð 
õ ”g˜g uÑ-Ô-ˆGˆGàˆGÝÔ$ T¤[°&¸'ÑBÔBÐBr#   )rS   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r¡   rb   r`   r   r^   r   r   Úintrw   r:   r–   r™   rs   rŽ   r   r|   rd   r/   r#   r!   r   r   «   st  € € € € € ðð ðð ˜sð ð ð ð ð$;ð ;ð ;ð!ð !ð !ð6%ð %ð %ð
˜tð 
ð 
ð 
ð 
ð! Cð !°Sð !¸Sð !ð !ð !ð !ð" 3ð "°Cð "ð "ð "ð "ðH1 ð 1ð 1ð 1ð 1ð $ð ð ð ð ð$˜tð $ð $ð $ð $ð, $ð ,ð ,ð ,ð ,ð	
 Cð 	
°ð 	
ð 	
ð 	
ð 	
ðCð Cð Cð 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Ì      ss  ðØ €€€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  Ø %Ð %Ð %Ð %Ð %Ð %à Ð Ð Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø "Ð "Ð "Ð "Ð "Ð "àˆ-€à„<�7ÒÐà$5Ð$5Ñ$7Ô$7€JÐ!Ð7Ð7Ñ7ðÐð&ØÔ/ð&à	Ô	"ð&ð &ð &ð &ð &ðT˜7Ô4ð ¸Ô9Rð ð ð ð ð €Ø€Ø€Ø€ØÐ àÐ Ø€à€ØÐ ØÐ à€àÐ Ø€ØÐ ðð4 €„ÑÔð cð °Cð ¸Cð ð ð ñ Ôðð. €„ÑÔð #ð ¨Sð ¸3ð Àcð Ècð ð ð ñ Ôðð:lCð lCð lCð lCð lCñ lCô lCð lCð lCð lCr#   