Ë
    bQbj˜c  ã            	       ó†  — d 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 ddlmZmZ ddlZddlmZ erddlmZ  ej(                  e«      Z G d„ d	e«      Z G d
„ d«      Zddedededefd„Zdedefd„Zdej>                  de e   fd„Z!dej>                  dedefd„Z" G d„ d«      Z# G d„ de#«      Z$ G d„ de#«      Z%y)zOAPIRequestContext for making HTTP requests with browser cookie synchronization.é    N)Úparsedate_to_datetime)Ú	responses)ÚTYPE_CHECKINGÚAny)ÚRetry)Ú	WebDriverc                   ó$   ‡ — e Zd ZdZdˆ fd„Zˆ xZS )ÚAPIRequestFailurez¨Raised when an API request returns a non-2xx status and fail_on_status_code is True.

    Attributes:
        response: The APIResponse that triggered the failure.
    c                 ó~   •— || _         t        ‰| �	  |j                  › d|j                  › d|j
                  › �«       y )Nú ú: )ÚresponseÚsuperÚ__init__ÚstatusÚstatus_textÚurl)Úselfr   Ú	__class__s     €ú`/var/www/html/venv/lib/python3.12/site-packages/selenium/webdriver/common/api_request_context.pyr   zAPIRequestFailure.__init__-   s8   ø€ Ø ˆŒÜ‰Ñ˜HŸO™OÐ,¨A¨h×.BÑ.BÐ-CÀ2ÀhÇlÁlÀ^ÐTÕUó    )r   ÚAPIResponseÚreturnN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__classcell__©r   s   @r   r
   r
   &   s   ø„ ñ÷Vñ Vr   r
   c                   ó|   — e Zd ZdZdededeeef   dededdfd	„Ze	de
fd
„«       Zdefd„Zdefd„Zdefd„Zdd„Zy)r   zÚRepresents an HTTP response from an API request.

    Attributes:
        status: HTTP status code.
        status_text: HTTP status text.
        headers: Response headers as a dict.
        url: The request URL.
    r   r   Úheadersr   Úbodyr   Nc                 óJ   — || _         || _        || _        || _        || _        y ©N)r   r   r!   r   Ú_body)r   r   r   r!   r   r"   s         r   r   zAPIResponse.__init__<   s&   € ØˆŒØ&ˆÔØˆŒØˆŒØˆ�
r   c                 ó6   — d| j                   cxk  xr dk  S c S )z4Whether the response status is in the 200-299 range.éÈ   i+  )r   ©r   s    r   ÚokzAPIResponse.okC   s   € ð �d—k‘kÖ( SÑ(Ð(Ñ(Ð(r   c                 ó@   — t        j                  | j                  «      S )z_Parse the response body as JSON.

        Returns:
            The parsed JSON object.
        )ÚjsonÚloadsr%   r(   s    r   r+   zAPIResponse.jsonH   s   € ô �z‰z˜$Ÿ*™*Ó%Ð%r   c                 ó8   — | j                   j                  d«      S )zmDecode the response body as UTF-8 text.

        Returns:
            The response body as a string.
        úutf-8)r%   Údecoder(   s    r   ÚtextzAPIResponse.textP   s   € ð �z‰z× Ñ  Ó)Ð)r   c                 ó   — | j                   S )zfReturn the raw response body bytes.

        Returns:
            The response body as bytes.
        ©r%   r(   s    r   r"   zAPIResponse.bodyX   s   € ð �z‰zÐr   c                 ó   — d| _         y)zFree the response body memory.r   Nr2   r(   s    r   ÚdisposezAPIResponse.dispose`   s	   € àˆ�
r   ©r   N)r   r   r   r   ÚintÚstrÚdictÚbytesr   ÚpropertyÚboolr)   r   r+   r0   r"   r4   © r   r   r   r   2   s…   „ ñð˜sð °ð ¸tÀCÈÀH¹~ð ÐTWð Ð_dð Ðimó ð ð)�Dò )ó ð)ð&�có &ð*�có *ð�eó ôr   r   Úcookier   Údefault_domainr   c                 ó8  — | j                  d«      }|�!|t        t        j                  «       «      k  ryt        j                  j                  |«      }|j                  xs d}|j                  xs d}|j                  xs d}| j                  dd«      }|s|r||k7  r2y|j                  d«      r||d	d k(  s|j                  |«      sy||k7  ry| j                  d
d«      }	|	dk(  rn||	k7  r|j                  |	dz   «      sy| j                  dd«      r|dk7  ryy)aA  Check if a browser cookie should be sent with a request to the given URL.

    Evaluates expiry, domain, path, and secure attribute matching per RFC 6265.

    Args:
        cookie: A cookie dict from driver.get_cookies().
        url: The target request URL.
        default_domain: Fallback domain for host-only cookies (no domain attribute).
            When a cookie has no domain, it only matches if the request hostname
            equals this value. If empty and cookie has no domain, the cookie is skipped.

    Returns:
        True if the cookie matches the URL.
    ÚexpiryNFÚ ú/ÚhttpÚdomainú.é   ÚpathÚsecureÚhttpsT)Úgetr6   ÚtimeÚurllibÚparseÚurlparseÚhostnamerG   ÚschemeÚ
startswithÚendswith)
r=   r   r>   r@   ÚparsedrO   rG   rP   Úcookie_domainÚcookie_paths
             r   Ú_cookie_matchesrV   e   s  € ð  �Z‰Z˜Ó!€FØÐ˜f¬¬D¯I©I«KÓ(8Ò8Øä�\‰\×"Ñ" 3Ó'€FØ�‰Ò$ "€HØ�;‰;Ò˜#€DØ�]‰]Ò$˜f€Fð —J‘J˜x¨Ó,€MÙá ¨^Ò!;ØØ	×	!Ñ	! #Ô	&à˜M¨!¨"Ð-Ò-°×1BÑ1BÀ=Ô1QØà�}Ò$Øð —*‘*˜V SÓ)€KØ�cÒØØ	�Ò	 T§_¡_°[À3Ñ5FÔ%GØð ‡z�z�(˜EÔ" v°Ò'8Øàr   Úheader_valuec                 óv  — | j                  d«      }|d   j                  «       }|j                  d«      }|dk(  ri S |d| j                  «       }||dz   d j                  «       }||dœ}d}|dd D �]  }|j                  «       }|sŒd|v rD|j                  dd«      \  }	}
|	j                  «       j                  «       }	|
j                  «       }
n |j                  «       j                  «       }	d	}
|	d
k(  r|
|d
<   ŒŠ|	dk(  r|
|d<   Œ•|	dk(  rd|d<   Œ |	dk(  rd|d<   Œ«|	dk(  r|
|d<   Œ¶|	dk(  r2	 t	        |
«      }t	        t        j
                  «       «      |z   |d<   d}Œí|	dk(  sŒó|rŒö	 t        |
«      }t	        |j                  «       «      |d<   �Œ  |S # t        $ r Y �Œ/w xY w# t        t        f$ r Y �ŒEw xY w)aM  Parse a single Set-Cookie header value into a cookie dict.

    Uses manual parsing instead of http.cookies.SimpleCookie which is too
    strict for real-world Set-Cookie headers.

    Args:
        header_value: The Set-Cookie header string.

    Returns:
        A dict with cookie attributes suitable for driver.add_cookie().
    ú;r   ú=éÿÿÿÿNrF   )ÚnameÚvalueFrA   rD   rG   rH   TÚhttponlyÚhttpOnlyÚsamesiteÚsameSitezmax-ager@   Úexpires)
ÚsplitÚstripÚfindÚlowerr6   rK   Ú
ValueErrorr   Ú	timestampÚ	TypeError)rW   ÚpartsÚ
name_valueÚeq_idxr\   r]   r=   Úhas_max_ageÚpartÚ	attr_nameÚ
attr_valueÚmax_ageÚdts                r   Ú_parse_set_cookiers   š   sì  € ð ×Ñ˜sÓ#€EØ�q‘—‘Ó!€JØ�_‰_˜SÓ!€FØ�‚|Øˆ	Ø�g�vÐ×$Ñ$Ó&€DØ�v ‘z�|Ð$×*Ñ*Ó,€Eà&*°UÑ;€FØ€Kà�a�b�	ó #ˆØ�z‰z‹|ˆÙØØ�$‰;Ø$(§J¡J¨s°AÓ$6Ñ!ˆI�zØ!Ÿ™Ó)×/Ñ/Ó1ˆIØ#×)Ñ)Ó+‰JàŸ
™
›×*Ñ*Ó,ˆIØˆJà˜Ò Ø)ˆF�8ÒØ˜&Ò Ø'ˆF�6ŠNØ˜(Ò"Ø#ˆF�8ÒØ˜*Ò$Ø!%ˆF�:ÒØ˜*Ò$Ø!+ˆF�:ÒØ˜)Ò#ðÜ˜j›/�Ü#&¤t§y¡y£{Ó#3°gÑ#=��xÑ Ø"‘ð ˜)Ó#ªKðÜ*¨:Ó6�Ü#& r§|¡|£~Ó#6��xÓ ðC#ðJ €Møô ò Úðûô ¤	Ð*ò Úðús$   Ä.0FÅ)'F%Æ	F"Æ!F"Æ%F8Æ7F8Úrespc                 ó°   — t        | j                  d«      r| j                  j                  d«      }|r|S | j                  j                  d«      }|r|gS g S )z±Extract all Set-Cookie header values from a urllib3 response.

    Args:
        resp: The urllib3 HTTP response.

    Returns:
        A list of Set-Cookie header strings.
    Úgetlistz
Set-Cookie)Úhasattrr!   rv   rJ   )rt   r!   Úscs      r   Ú_get_set_cookie_headersry   Ù   sQ   € ô ˆt�|‰|˜YÔ'Ø—,‘,×&Ñ& |Ó4ˆÙØˆNØ	�‰×	Ñ	˜,Ó	'€BÙˆBˆ4Ð˜2Ðr   Úoriginal_urlc                 óô   — | j                   r| j                   j                  nd}|rQ|d   }|j                  r@|j                  r4t        j
                  j                  |j                  |j                  «      S |S )a)  Return the final URL after any redirects.

    urllib3's retry history records each hop.  When redirects occurred,
    the last entry's redirect_location resolved against its URL gives
    the final destination.  When no redirects occurred, the original
    request URL is returned unchanged.
    r<   r[   )ÚretriesÚhistoryr   Úredirect_locationrL   rM   Úurljoin)rt   rz   r}   Úlasts       r   Ú_resolve_redirect_urlr�   ê   s]   € ð '+§l¢lˆd�l‰l×"Ò"¸€GÙØ�r‰{ˆØ�8Š8˜×.Ò.Ü—<‘<×'Ñ'¨¯©°$×2HÑ2HÓIÐIØÐr   c                   ó$  — e Zd ZdZ	 	 	 	 	 d"dedeeef   dz  dedededdfd	„Z	d
ede
defd„Zd
ede
defd„Zd
ede
defd„Zd
ede
defd„Zd
ede
defd„Zd
ede
defd„Zd#d
edede
defd„Zd$d„Zd
edefd„Zdeee
f   deeef   fd„Zdeeef   deee
f   dedz  fd„Zd
edeee
f   defd„Zded
edeeef   dedz  deee
f   dej4                  fd„Zdej4                  d
edefd„Zd
edee   fd„Zdee   d
eddfd „Zd
edede
defd!„Z y)%Ú_BaseRequestContextzCBase class with shared HTTP request logic for API request contexts.NÚbase_urlÚextra_headersÚtimeoutÚmax_redirectsÚfail_on_status_coder   c                 ó„   — || _         |xs i | _        || _        || _        || _        t        j                  «       | _        y r$   )Ú	_base_urlÚ_extra_headersÚ_timeoutÚ_max_redirectsÚ_fail_on_status_codeÚurllib3ÚPoolManagerÚ_pool)r   r„   r…   r†   r‡   rˆ   s         r   r   z_BaseRequestContext.__init__ý   s?   € ð "ˆŒØ+Ò1¨rˆÔØˆŒØ+ˆÔØ$7ˆÔ!Ü×(Ñ(Ó*ˆ�
r   r   Úkwargsc                 ó*   —  | j                   |dfi |¤ŽS )a  Send a GET request.

        Args:
            url: The request URL (absolute or relative to base_url).
            **kwargs: Optional arguments: headers, params, timeout, max_redirects, fail_on_status_code.

        Returns:
            An APIResponse object.
        ÚGET©Ú_fetch©r   r   r’   s      r   rJ   z_BaseRequestContext.get  s   € ð ˆt�{‰{˜3 Ñ0¨Ñ0Ð0r   c                 ó*   —  | j                   |dfi |¤ŽS )a5  Send a POST request.

        Args:
            url: The request URL (absolute or relative to base_url).
            **kwargs: Optional arguments: headers, params, data, form,
                json_data, timeout, max_redirects, fail_on_status_code.

        Returns:
            An APIResponse object.
        ÚPOSTr•   r—   s      r   Úpostz_BaseRequestContext.post  ó   € ð ˆt�{‰{˜3 Ñ1¨&Ñ1Ð1r   c                 ó*   —  | j                   |dfi |¤ŽS )a4  Send a PUT request.

        Args:
            url: The request URL (absolute or relative to base_url).
            **kwargs: Optional arguments: headers, params, data, form,
                json_data, timeout, max_redirects, fail_on_status_code.

        Returns:
            An APIResponse object.
        ÚPUTr•   r—   s      r   Úputz_BaseRequestContext.put%  s   € ð ˆt�{‰{˜3 Ñ0¨Ñ0Ð0r   c                 ó*   —  | j                   |dfi |¤ŽS )a6  Send a PATCH request.

        Args:
            url: The request URL (absolute or relative to base_url).
            **kwargs: Optional arguments: headers, params, data, form,
                json_data, timeout, max_redirects, fail_on_status_code.

        Returns:
            An APIResponse object.
        ÚPATCHr•   r—   s      r   Úpatchz_BaseRequestContext.patch2  s   € ð ˆt�{‰{˜3 Ñ2¨6Ñ2Ð2r   c                 ó*   —  | j                   |dfi |¤ŽS )a7  Send a DELETE request.

        Args:
            url: The request URL (absolute or relative to base_url).
            **kwargs: Optional arguments: headers, params, data, form,
                json_data, timeout, max_redirects, fail_on_status_code.

        Returns:
            An APIResponse object.
        ÚDELETEr•   r—   s      r   Údeletez_BaseRequestContext.delete?  s   € ð ˆt�{‰{˜3 Ñ3¨FÑ3Ð3r   c                 ó*   —  | j                   |dfi |¤ŽS )a  Send a HEAD request.

        Args:
            url: The request URL (absolute or relative to base_url).
            **kwargs: Optional arguments: headers, params, timeout,
                max_redirects, fail_on_status_code.

        Returns:
            An APIResponse object.
        ÚHEADr•   r—   s      r   Úheadz_BaseRequestContext.headL  r›   r   Úmethodc                 ó*   —  | j                   ||fi |¤ŽS )aw  Send an HTTP request with a custom method.

        Args:
            url: The request URL (absolute or relative to base_url).
            method: The HTTP method to use.
            **kwargs: Optional arguments: headers, params, data, form,
                json_data, timeout, max_redirects, fail_on_status_code.

        Returns:
            An APIResponse object.
        r•   )r   r   r¨   r’   s       r   Úfetchz_BaseRequestContext.fetchY  s   € ð ˆt�{‰{˜3 Ñ1¨&Ñ1Ð1r   c                 ó8   — | j                   j                  «        y)z%Close the underlying connection pool.N)r‘   Úclearr(   s    r   r4   z_BaseRequestContext.disposeg  s   € à�
‰
×ÑÕr   c                 óˆ   — |j                  d«      s0| j                  j                  d«      dz   |j                  d«      z   S |S )z6Resolve a URL, prepending base_url for relative paths.)zhttp://zhttps://rB   )rQ   rŠ   ÚrstripÚlstrip©r   r   s     r   Ú_resolve_urlz _BaseRequestContext._resolve_urlk  s;   € à�~‰~Ð5Ô6Ø—>‘>×(Ñ(¨Ó-°Ñ3°c·j±jÀ³oÑEÐEØˆ
r   c                 óz   — t        | j                  «      }|j                  d«      r|j                  |d   «       |S )z-Merge extra_headers with per-request headers.r!   )r8   r‹   rJ   Úupdate)r   r’   r!   s      r   Ú_build_headersz"_BaseRequestContext._build_headersq  s4   € ä�t×*Ñ*Ó+ˆØ�:‰:�iÔ Ø�N‰N˜6 )Ñ,Ô-Øˆr   r!   c                 óh  — |j                  d«      }|j                  d«      }|j                  d«      }|�6|j                  dd«       t        j                  |«      j	                  d«      S |�@|j                  dd«       t
        j                  j                  |«      j	                  d«      S |�ƒt        |t        «      r@|j                  dd«       t
        j                  j                  |«      j	                  d«      S t        |t        «      r|j	                  d«      S t        |t        «      r|S y)	z�Prepare the request body from json_data, form, or data kwargs.

        Priority: json_data > form > data. Only one should be provided.
        Ú	json_dataÚformÚdataNzContent-Typezapplication/jsonr.   z!application/x-www-form-urlencoded)rJ   Ú
setdefaultr+   ÚdumpsÚencoderL   rM   Ú	urlencodeÚ
isinstancer8   r7   r9   )r   r!   r’   r¶   r·   r¸   s         r   Ú_prepare_bodyz!_BaseRequestContext._prepare_bodyx  s  € ð
 —J‘J˜{Ó+ˆ	Ø�z‰z˜&Ó!ˆØ�z‰z˜&Ó!ˆàÐ Ø×Ñ˜~Ð/AÔBÜ—:‘:˜iÓ(×/Ñ/°Ó8Ð8ØÐØ×Ñ˜~Ð/RÔSÜ—<‘<×)Ñ)¨$Ó/×6Ñ6°wÓ?Ð?ØÐÜ˜$¤Ô%Ø×"Ñ" >Ð3VÔWÜ—|‘|×-Ñ-¨dÓ3×:Ñ:¸7ÓCÐCÜ˜D¤#Ô&Ø—{‘{ 7Ó+Ð+Ü˜D¤%Ô(Ø�Ør   c                 ó†   — |j                  d«      }|r-d|v rdnd}||z   t        j                  j                  |«      z   S |S )z#Append query parameters to the URL.Úparamsú?ú&)rJ   rL   rM   r¼   )r   r   r’   rÀ   Ú	separators        r   Ú_append_paramsz"_BaseRequestContext._append_params‘  sC   € à—‘˜HÓ%ˆÙØ" c™z™¨sˆIØ˜‘?¤V§\¡\×%;Ñ%;¸FÓ%CÑCÐCØˆ
r   r"   c           
      óì   — |j                  d| j                  «      }|j                  d| j                  «      }|dkD  }t        dddd|r|ndd¬«      }	| j                  j                  |||||||	d¬«      S )z%Execute the HTTP request via urllib3.r†   r‡   r   F)ÚconnectÚreadr   ÚotherÚredirectÚraise_on_redirectT)r!   r"   r†   rÉ   r|   Úpreload_content)rJ   rŒ   r�   r   r‘   Úrequest)
r   r¨   r   r!   r"   r’   r†   r‡   Úfollowr|   s
             r   Ú_execute_requestz$_BaseRequestContext._execute_request™  sŽ   € ð —*‘*˜Y¨¯©Ó6ˆØŸ
™
 ?°D×4GÑ4GÓHˆà Ñ"ˆÜØØØØÙ&,‘]°!Ø#ô
ˆð �z‰z×!Ñ!ØØØØØØØØ ð "ó 	
ð 		
r   rt   c                 óD  — i }|j                   j                  «       D ]-  \  }}|j                  «       }||v r||   dz   |z   ||<   Œ)|||<   Œ/ t        |dd«      }|xs  t	        j
                  |j                  d«      }t        |j                  ||||j                  ¬«      S )z-Build an APIResponse from a urllib3 response.z, ÚreasonNrA   )r   r   r!   r   r"   )	r!   Úitemsrf   ÚgetattrÚhttp_status_phrasesrJ   r   r   r¸   )	r   rt   r   Úresp_headersÚkÚvÚkeyrÐ   r   s	            r   Ú_build_responsez#_BaseRequestContext._build_responseµ  s¯   € ð (*ˆØ—L‘L×&Ñ&Ó(ò 	&‰DˆAˆqØ—'‘'“)ˆCØ�lÑ"Ø$0°Ñ$5¸Ñ$<¸qÑ$@�˜SÒ!à$%�˜SÒ!ð	&ô ˜˜x¨Ó.ˆØÒHÔ 3× 7Ñ 7¸¿¹ÀRÓ HˆÜØ—;‘;Ø#Ø ØØ—‘ô
ð 	
r   c                 ó   — g S )zKGet cookies that should be sent with the request. Overridden by subclasses.r<   r°   s     r   Ú_get_cookies_for_requestz,_BaseRequestContext._get_cookies_for_requestÊ  s   € àˆ	r   Úset_cookie_headersc                  ó   — y)zGProcess Set-Cookie headers from the response. Overridden by subclasses.Nr<   )r   rÛ   r   s      r   Ú_handle_response_cookiesz,_BaseRequestContext._handle_response_cookiesÎ  s   � r   c                 ó&  — | j                  |«      }| j                  |«      }| j                  |«      }|r0dj                  d„ |D «       «      }d|v r|d   dz   |z   |d<   n||d<   | j	                  ||«      }| j                  ||«      }| j                  |||||«      }t        ||«      }	t        |«      }
|
r| j                  |
|	«       | j                  ||	«      }|j                  d| j                  «      }|r|j                  st        |«      ‚|S )zëExecute an HTTP request with cookie handling.

        Args:
            url: The request URL.
            method: The HTTP method.
            **kwargs: Optional arguments.

        Returns:
            An APIResponse object.
        z; c              3   ó6   K  — | ]  }|d    › d|d   › �–— Œ y­w)r\   rZ   r]   Nr<   )Ú.0Úcs     r   ú	<genexpr>z-_BaseRequestContext._fetch.<locals>.<genexpr>â  s#   è ø€ Ò%\Àa¨¨6©¨°1°Q°w±Z°LÔ&AÑ%\ùs   ‚ÚCookierˆ   )r±   r´   rÚ   Újoinr¾   rÄ   rÎ   r�   ry   rÝ   rØ   rJ   rŽ   r)   r
   )r   r   r¨   r’   r!   Úmatching_cookiesÚcookie_headerr"   rt   Ú	final_urlrÛ   r   Úfails                r   r–   z_BaseRequestContext._fetchÑ  s'  € ð ×Ñ Ó$ˆØ×%Ñ% fÓ-ˆð  ×8Ñ8¸Ó=ÐÙØ ŸI™IÑ%\ÐK[Ô%\Ó\ˆMØ˜7Ñ"Ø$+¨HÑ$5¸Ñ$<¸}Ñ$L�˜Ò!à$1�˜Ñ!à×!Ñ! '¨6Ó2ˆØ×!Ñ! # vÓ.ˆØ×$Ñ$ V¨S°'¸4ÀÓHˆô *¨$°Ó4ˆ	ô 5°TÓ:ÐÙØ×)Ñ)Ð*<¸iÔHà×'Ñ'¨¨iÓ8ˆà�z‰zÐ/°×1JÑ1JÓKˆÙ˜ŸšÜ# HÓ-Ð-àˆr   ©rA   Nç      >@é
   F)r”   r5   )!r   r   r   r   r7   r8   Úfloatr6   r;   r   r   r   rJ   rš   rž   r¡   r¤   r§   rª   r4   r±   r´   r9   r¾   rÄ   r�   ÚBaseHTTPResponserÎ   rØ   ÚlistrÚ   rÝ   r–   r<   r   r   rƒ   rƒ   ú   s{  „ ÙMð Ø/3ØØØ$)ñ+àð+ð ˜C ˜H‘~¨Ñ,ð+ð ð	+ð
 ð+ð "ð+ð 
ó+ð
1�sð 
1 cð 
1¨kó 
1ð2˜ð 2 sð 2¨{ó 2ð1�sð 1 cð 1¨kó 1ð3˜ð 3¨ð 3°ó 3ð4˜#ð 4¨ð 4°ó 4ð2˜ð 2 sð 2¨{ó 2ñ2˜ð 2 cð 2¸Sð 2À[ó 2óð ð ¨ó ð T¨#¨s¨(¡^ð ¸¸SÀ#¸X¹ó ð T¨#¨s¨(¡^ð ¸TÀ#ÀsÀ(¹^ð ÐPUÐX\ÑP\ó ð2 #ð ¨t°C¸°H©~ð À#ó ð
Øð
Ø #ð
Ø.2°3¸°8©nð
ØDIÈDÁLð
ØZ^Ð_bÐdgÐ_gÑZhð
à	×	!Ñ	!ó
ð8
 G×$<Ñ$<ð 
À3ð 
È;ó 
ð*¨Cð °D¸±Jó ðV¸4À¹9ð VÈ3ð VÐSWó Vð*˜#ð * sð *°cð *¸kô *r   rƒ   c                   ó$  ‡ — e Zd ZdZ	 	 	 	 	 ddddedeeef   dz  deded	ed
dfˆ fd„Z		 	 	 	 ddedeeef   dz  deez  e
j                  z  dz  d	ed
df
d„Zddee
j                  z  dz  d
eeef   fd„Zded
ee   fd„Zdee   ded
dfd„Zˆ xZS )ÚAPIRequestContextah  Makes HTTP requests with automatic browser cookie synchronization.

    Cookies from the browser session are sent with API requests, and cookies
    from API responses are synced back to the browser.

    Args:
        driver: The WebDriver instance to sync cookies with.
        base_url: Optional base URL prepended to relative request paths.
        extra_headers: Optional headers included in every request.
        timeout: Default request timeout in seconds.
        max_redirects: Maximum number of redirects to follow.
        fail_on_status_code: If True, raise APIRequestFailure for non-2xx responses.
    NÚdriverr   r„   r…   r†   r‡   rˆ   r   c                 ó<   •— t         ‰| �  |||||¬«       || _        y ©N)r„   r…   r†   r‡   rˆ   )r   r   Ú_driver)r   rñ   r„   r…   r†   r‡   rˆ   r   s          €r   r   zAPIRequestContext.__init__  s/   ø€ ô 	‰ÑØØ'ØØ'Ø 3ð 	ô 	
ð ˆ�r   Ústorage_stateÚ_IsolatedAPIRequestContextc                 ó8  — g }|�›t        |t        t        j                  f«      r^t        j                  |«      }|j	                  «       st        d|› �«      ‚	 t        |«      5 }t        j                  |«      }ddd«       n|}t        j                  dg «      «      }t        |||| j                  | j                   |¬«      S # 1 sw Y   ŒLxY w# t        j                  $ r}	t        d|› d|	› �«      |	‚d}	~	wt        $ r}	t        d|› d|	› �«      |	‚d}	~	ww xY w)a×  Create an isolated API request context that does not sync with the browser.

        Args:
            base_url: Optional base URL for this context.
            extra_headers: Optional headers for this context.
            storage_state: Optional cookies to pre-load, as a dict, JSON file path, or Path.
            fail_on_status_code: If True, raise APIRequestFailure for non-2xx responses.

        Returns:
            An _IsolatedAPIRequestContext instance.
        NzStorage state file not found: z#Invalid JSON in storage state file r   zCannot read storage state file Úcookies)r„   r…   rø   r†   r‡   rˆ   )r½   r7   ÚpathlibÚPathÚexistsÚFileNotFoundErrorÚopenr+   ÚloadÚJSONDecodeErrorrg   ÚOSErrorrî   rJ   rö   rŒ   r�   )
r   r„   r…   rõ   rˆ   rø   Ú	file_pathÚfÚstateÚes
             r   Únew_contextzAPIRequestContext.new_context  s$  € ð$ !ˆØÐ$Ü˜-¬#¬w¯|©|Ð)<Ô=Ü#ŸL™L¨Ó7�	Ø ×'Ñ'Ô)Ü+Ð.LÈYÈKÐ,XÓYÐYð]Ü˜i›ð -¨AÜ $§	¡	¨!£˜÷-øð &�Ü˜5Ÿ9™9 Y°Ó3Ó4ˆGä)ØØ'ØØ—M‘MØ×-Ñ-Ø 3ô
ð 	
÷-ð -ûä×+Ñ+ò dÜ$Ð'JÈ9È+ÐUWÐXYÐWZÐ%[Ó\ÐbcÐcûÜò ]Ü!Ð$CÀIÀ;ÈbÐQRÐPSÐ"TÓUÐ[\Ð\ûð]ús<   ÁC Á$CÁ:C ÃCÃ
C ÃDÃ$C6Ã6DÄDÄDrG   c                 ó0  — | j                   j                  «       }d|i}|�Et        j                  |«      }	 t	        |d«      5 }t        j                  ||d¬«       ddd«       |S |S # 1 sw Y   |S xY w# t        $ r}t        d|› d|› �«      |‚d}~ww xY w)zõExport the current browser cookies as a storage state dict.

        Args:
            path: Optional file path to save the storage state as JSON.

        Returns:
            A dict with a "cookies" key containing the browser cookies.
        rø   NÚwé   )ÚindentzCannot write storage state to r   )rô   Úget_cookiesrù   rú   rý   r+   Údumpr   )r   rG   rø   r  r  r  r  s          r   Úget_storage_statez#APIRequestContext.get_storage_stateK  s§   € ð —,‘,×*Ñ*Ó,ˆØ!*¨GÐ 4ˆØÐÜŸ™ TÓ*ˆIðXÜ˜) SÓ)ð 2¨QÜ—I‘I˜e Q¨qÕ1÷2ð ˆˆuˆ÷	2ð ˆûô ò XÜÐ >¸y¸kÈÈAÈ3ÐOÓPÐVWÐWûðXús5   ·A5 ÁA(ÁA5 Á(A2Á-A5 Á2A5 Á5	BÁ>BÂBr   c                 óª  — 	 | j                   j                  «       }d}	 | j                   j
                  }|r-t        j                  j                  |«      j                  xs d}|D �cg c]  }t        |||«      sŒ|‘Œ c}S # t        $ r t        j	                  dd¬«       g cY S w xY w# t        $ r t        j	                  dd¬«       Y Œhw xY wc c}w )z1Get matching browser cookies for the request URL.z"Could not retrieve browser cookiesT©Úexc_inforA   z7Could not get current URL for host-only cookie matching)rô   r
  Ú	ExceptionÚloggerÚdebugÚcurrent_urlrL   rM   rN   rO   rV   )r   r   Úbrowser_cookiesr>   Úcurrentrá   s         r   rÚ   z*APIRequestContext._get_cookies_for_request_  sÂ   € ð	Ø"Ÿl™l×6Ñ6Ó8ˆOð
 ˆð	cØ—l‘l×.Ñ.ˆGÙÜ!'§¡×!6Ñ!6°wÓ!?×!HÑ!HÒ!NÈB�ð +ÖV�a¬o¸aÀÀnÕ.U’ÒVÐVøô ò 	Ü�L‰LÐ=ÈˆLÔMØŠIð	ûô ò 	cÜ�L‰LÐRÐ]aˆLÖbð	cüâVs/   ‚B ŸAB* Á(CÁ;CÂ"B'Â&B'Â* CÃCrÛ   c                 óX  — t         j                  j                  |«      }|D ]À  }t        |«      }|j	                  d«      sŒ |j                  d|j                  xs d«       |j                  dd«       |j	                  d«      }|�@|t        t        j                  «       «      k  r 	 | j                  j                  |d   «       Œ¥	 | j                  j                  |«       ŒÂ y# t        $ r Y Œ+w xY w# t        $ r+ t        j                  d|j	                  d«      d	¬
«       Y �Œw xY w)z,Sync Set-Cookie headers back to the browser.r\   rD   rA   rG   rB   r@   NzICould not sync cookie '%s' to browser (domain mismatch with current page)Tr  )rL   rM   rN   rs   rJ   r¹   rO   r6   rK   rô   Údelete_cookier  Ú
add_cookier  Úwarning)r   rÛ   r   Ú
parsed_urlÚ	sc_headerr=   r@   s          r   rÝ   z*APIRequestContext._handle_response_cookiesp  s  € ä—\‘\×*Ñ*¨3Ó/ˆ
Ø+ò 	ˆIÜ& yÓ1ˆFØ—:‘:˜fÔ%ØØ×Ñ˜h¨
×(;Ñ(;Ò(A¸rÔBØ×Ñ˜f cÔ*Ø—Z‘Z Ó)ˆFØÐ! f´´D·I±I³KÓ0@Ò&@ðØ—L‘L×.Ñ.¨v°f©~Ô>ð ðØ—‘×'Ñ'¨Õ/ñ	øô !ò Ùðûô
 ò Ü—‘Ø_Ø—J‘J˜vÓ&Ø!ð ÷ ðús$   Â(C&ÃC5Ã&	C2Ã1C2Ã50D)Ä(D)ré   )rA   NNFr$   )r   r   r   r   r7   r8   rì   r6   r;   r   rù   rú   r  r   r  rî   rÚ   rÝ   r   r   s   @r   rð   rð   þ  s7  ø„ ñð" Ø/3ØØØ$)ñàðð ðð ˜C ˜H‘~¨Ñ,ð	ð
 ðð ðð "ðð 
õð( Ø/3Ø:>Ø$)ñ*
àð*
ð ˜C ˜H‘~¨Ñ,ð*
ð ˜c‘z G§L¡LÑ0°4Ñ7ð	*
ð
 "ð*
ð 
&ó*
ñX c¨G¯L©LÑ&8¸4Ñ&?ð È4ÐPSÐUXÐPXÉ>ó ð(W¨Cð W°D¸±Jó Wð"¸4À¹9ð È3ð ÐSW÷ r   rð   c                   ó°   ‡ — e Zd ZdZ	 	 	 	 	 	 ddedeeef   dz  dee   dz  dedede	d	dfˆ fd
„Z
d	eeef   fd„Zded	ee   fd„Zdee   ded	dfd„Zˆ xZS )rö   zƒAn isolated API request context that maintains its own cookie jar.

    Does not synchronize cookies with any browser session.
    Nr„   r…   rø   r†   r‡   rˆ   r   c                 óD   •— t         ‰| �  |||||¬«       |xs g | _        y ró   )r   r   Ú_cookies)r   r„   r…   rø   r†   r‡   rˆ   r   s          €r   r   z#_IsolatedAPIRequestContext.__init__�  s3   ø€ ô 	‰ÑØØ'ØØ'Ø 3ð 	ô 	
ð %,¢M¨rˆ�r   c                 ó0   — dt        | j                  «      iS )z3Return the current cookies as a storage state dict.rø   )rî   r  r(   s    r   r  z,_IsolatedAPIRequestContext.get_storage_state¢  s   € àœ4 §¡Ó.Ð/Ð/r   r   c                 ó¶   — t         j                  j                  |«      j                  xs d}| j                  D �cg c]  }t        |||«      sŒ|‘Œ c}S c c}w )z+Get matching cookies from the internal jar.rA   )rL   rM   rN   rO   r  rV   )r   r   r>   rá   s       r   rÚ   z3_IsolatedAPIRequestContext._get_cookies_for_request¦  sF   € ô  Ÿ™×.Ñ.¨sÓ3×<Ñ<ÒBÀˆØŸ=™=ÖT�a¬O¸A¸sÀNÕ,S’ÒTÐTùÒTs   ¼AÁArÛ   c           
      óœ  — t         j                  j                  |«      }t        t	        j                  «       «      }|D �]  }t        |«      }|j                  d«      sŒ!|j                  d|j                  xs d«       |j                  dd«       |d   |j                  dd«      |j                  dd«      f}| j                  D �cg c]<  }|j                  d«      |j                  dd«      |j                  dd«      f|k7  sŒ;|‘Œ> c}| _	        |j                  d«      }	|	�|	|k  rŒë| j                  j                  |«       �Œ yc c}w )z-Store Set-Cookie headers in the internal jar.r\   rD   rA   rG   rB   r@   N)rL   rM   rN   r6   rK   rs   rJ   r¹   rO   r  Úappend)
r   rÛ   r   r  Únowr  r=   r×   rá   r@   s
             r   rÝ   z3_IsolatedAPIRequestContext._handle_response_cookies¬  s%  € ä—\‘\×*Ñ*¨3Ó/ˆ
Ü”$—)‘)“+ÓˆØ+ó 	)ˆIÜ& yÓ1ˆFØ—:‘:˜fÔ%ØØ×Ñ˜h¨
×(;Ñ(;Ò(A¸rÔBØ×Ñ˜f cÔ*à˜&‘> 6§:¡:¨h¸Ó#;¸V¿Z¹ZÈÐPSÓ=TÐUˆCð  Ÿ=™=öØ¨Q¯U©U°6«]¸A¿E¹EÀ(ÈBÓ<OÐQR×QVÑQVÐW]Ð_bÓQcÐ,dÐhkÓ,k’òˆDŒMð —Z‘Z Ó)ˆFØÐ! f°¢mØØ�M‰M× Ñ  Ö(ñ!	)ùòs   Ã<E	ÄE	)rA   NNrê   rë   F)r   r   r   r   r7   r8   rî   rì   r6   r;   r   r   r  rÚ   rÝ   r   r   s   @r   rö   rö   Š  sÈ   ø„ ñð Ø/3Ø%)ØØØ$)ñ2àð2ð ˜C ˜H‘~¨Ñ,ð2ð �d‘˜dÑ"ð	2ð
 ð2ð ð2ð "ð2ð 
õ2ð$0 4¨¨S¨¡>ó 0ðU¨Cð U°D¸±Jó Uð)¸4À¹9ð )È3ð )ÐSW÷ )r   rö   )rA   )&r   r+   Úloggingrù   rK   Úurllib.parserL   Úemail.utilsr   Úhttp.clientr   rÓ   Útypingr   r   r�   Úurllib3.util.retryr   Ú#selenium.webdriver.remote.webdriverr   Ú	getLoggerr   r  r  r
   r   r8   r7   r;   rV   rs   rí   rî   ry   r�   rƒ   rð   rö   r<   r   r   ú<module>r,     sø   ðñ$ Vã Û Û Û Û Ý -Ý 8ß %ã Ý $áÝ=à	ˆ×	Ñ	˜8Ó	$€ô	V˜	ô 	V÷0ñ 0ñf2˜Dð 2 sð 2¸Cð 2Èó 2ðj< Cð <¨Dó <ð~ '×":Ñ":ð ¸tÀC¹yó ð" × 8Ñ 8ð Èð ÐPSó ÷ Añ AôHIÐ+ô IôX6)Ð!4õ 6)r   