Ë
    qûàgSƒ  ã                   óZ  — 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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 ddlmZ ddlmZ ddlmZmZmZmZ dd	lmZ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'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 dZ2 ejf                  «       Z4dddœZ5djm                   ejn                  d ed¬«      d   «      «      Z8ejr                  dk(  rd„ Z:d„ Z"d„ Z;d„ Z<dHd„Z=d„ Z>d„ Z?ej€                  d „ «       ZAd!„ ZBd"„ ZCd#„ ZDd$„ ZEdHd%„ZFd&„ ZGd'„ ZHd(„ ZId)„ ZJd*„ ZKd+„ ZLd,„ ZMd-„ ZN eOd.«      ZPd/„ ZQd0„ ZRd1„ ZSd2„ ZTd3„ ZUd4„ ZVej€                  d5„ «       ZWd6„ ZXdId7„ZYd8„ ZZdJd9„Z[dKd:„Z\d;„ Z]d<„ Z^d=j¿                  d>«      Z`e`d?z  Zae`d@z  ZbdA„ ZcdB„ ZddC„ ZedD„ ZfdE„ ZgdF„ ZhdG„ Ziy)Lz”
requests.utils
~~~~~~~~~~~~~~

This module provides utility functions that are used within Requests
that are also useful for external consumption.
é    N)ÚOrderedDict)Úmake_headersÚ	parse_urlé   )Úcerts©Ú__version__)Ú_HEADER_VALIDATORS_BYTEÚ_HEADER_VALIDATORS_STRÚHEADER_VALIDATORSÚto_native_string)ÚMappingÚ
basestringÚbytesÚ
getproxiesÚgetproxies_environmentÚinteger_types)Úparse_http_list)Úproxy_bypassÚproxy_bypass_environmentÚquoteÚstrÚunquoteÚurlparseÚ
urlunparse©Úcookiejar_from_dict)ÚFileModeWarningÚInvalidHeaderÚ
InvalidURLÚUnrewindableBodyError)ÚCaseInsensitiveDict)z.netrcÚ_netrcéP   i»  )ÚhttpÚhttpsz, z,\s*T)Úaccept_encodingzaccept-encodingÚwin32c                 ó  — 	 dd l }	 |j                  |j                  d«      }t	        |j                  |d«      d   «      }|j                  |d«      d   }|r|sy|j                  d«      }t        d |«      }|D ]j  }|dk(  rd| vr y	|j                  dd
«      }|j                  dd«      }|j                  dd«      }t        j                  || t        j                  «      sŒj y	 y# t        $ r Y yw xY w# t        t        f$ r Y yw xY w)Nr   Fz;Software\Microsoft\Windows\CurrentVersion\Internet SettingsÚProxyEnableÚProxyOverrideú;z<local>ú.Tz\.Ú*z.*ú?)ÚwinregÚImportErrorÚOpenKeyÚHKEY_CURRENT_USERÚintÚQueryValueExÚOSErrorÚ
ValueErrorÚsplitÚfilterÚreplaceÚreÚmatchÚI)Úhostr0   ÚinternetSettingsÚproxyEnableÚproxyOverrideÚtests         úL/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/requests/utils.pyÚproxy_bypass_registryrD   L   s%  € ð	Ûð
	Ø%Ÿ~™~Ø×(Ñ(ØNó Ðô
 ˜f×1Ñ1Ð2BÀMÓRÐSTÑUÓVˆKà"×/Ñ/Ð0@À/ÓRÐSTÑUˆMñ ¡-Øð
 &×+Ñ+¨CÓ0ˆä˜t ]Ó3ˆà!ò 	ˆDØ�yÒ Ø˜d‘?ÙØ—<‘<  UÓ+ˆDØ—<‘<  UÓ+ˆDØ—<‘<  TÓ*ˆDÜ�x‰x˜˜d¤B§D¡DÕ)Ùð	ð øôC ò 	Ùð	ûô œÐ$ò 	Ùð	ús#   ‚C( ‡AC7 Ã(	C4Ã3C4Ã7D	ÄD	c                 óB   — t        «       rt        | «      S t        | «      S )zšReturn True, if the host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or the registry.
        )r   r   rD   )r>   s    rC   r   r   r   s    € ô "Ô#Ü+¨DÓ1Ð1ä(¨Ó.Ð.ó    c                 ó>   — t        | d«      r| j                  «       } | S )z/Returns an internal sequence dictionary update.Úitems)ÚhasattrrH   )Úds    rC   Údict_to_sequencerK   ~   s   € ô ˆq�'ÔØ�G‰G‹Iˆà€HrF   c                 óê  — d }d}t        | t        «      r| j                  d«      } t        | d«      rt	        | «      }n~t        | d«      r| j                  }net        | d«      rY	 | j                  «       }t        j                  |«      j                  }d| j                  vrt        j                  dt        «       	 t        | d«      rW	 | j!                  «       }t        | d	«      r:|€8	 | j#                  dd
«       | j!                  «       }| j#                  |xs d«       |€d}t'        d||z
  «      S # t        j                  t        f$ r Y Œ‘w xY w# t$        $ r d}Y Œ?w xY w# t$        $ r |�|}Y ŒRw xY w)Nr   úutf-8Ú__len__ÚlenÚfilenoÚba%  Requests has determined the content-length for this request using the binary size of the file: however, the file has been opened in text mode (i.e. without the 'b' flag in the mode). This may lead to an incorrect content-length. In Requests 3.0, support will be removed for files in text mode.ÚtellÚseeké   )Ú
isinstancer   ÚencoderI   rO   rP   ÚosÚfstatÚst_sizeÚmodeÚwarningsÚwarnr   ÚioÚUnsupportedOperationÚAttributeErrorrR   rS   r6   Úmax)ÚoÚtotal_lengthÚcurrent_positionrP   s       rC   Ú	super_lenrd   ‡   su  € Ø€LØÐä�!”SÔØ�H‰H�WÓˆäˆq�)ÔÜ˜1“v‰ä	��EÔ	Ø—u‘u‰ä	��HÔ	ð	Ø—X‘X“ZˆFô Ÿ8™8 FÓ+×3Ñ3ˆLð ˜!Ÿ&™&Ñ Ü—‘ð2ô $õ
ô ˆq�&Ôð	%Ø Ÿv™v›xÐô �q˜&Ô! lÐ&:ð	%à—F‘F˜1˜a”LØ#$§6¡6£8�Lð —F‘FÐ+Ò0¨qÔ1ð ÐØˆäˆq�,Ð!1Ñ1Ó2Ð2øôe ×'Ñ'¬Ð8ò 	ñ ð		ûôX ò %Ø#$’Lð%ûô% ò 	0ð
 Ð'Ø#/Ð ùð	0ús6   Á$D2 Ã	E" Ã(7E Ä2EÅEÅEÅEÅ"E2Å1E2c                 ó|  — t         j                  j                  d«      }|�|f}nd„ t        D «       }	 ddlm}m} d}|D ]E  }	 t         j                  j                  |«      }t         j                  j                  |«      sŒC|} n |€yt        | «      }	d}
t        | t        «      r|
j                  d«      }
|	j                  j                  |
«      d   }	  ||«      j!                  |«      }|r|d   rdnd}||   |d	   fS y# t        $ r Y  yw xY w# |t"        f$ r |r‚ Y yw xY w# t$        t&        f$ r Y yw xY w)
z;Returns the Requests tuple auth for a given url from netrc.ÚNETRCNc              3   ó&   K  — | ]	  }d |› �–— Œ y­w)z~/N© )Ú.0Úfs     rC   ú	<genexpr>z!get_netrc_auth.<locals>.<genexpr>Ó   s   è ø€ Ò9¨˜R ˜sœ8Ñ9ùs   ‚r   )ÚNetrcParseErrorÚnetrcó   :Úasciir   rT   )rW   ÚenvironÚgetÚNETRC_FILESrm   rl   ÚpathÚ
expanduserÚKeyErrorÚexistsr   rU   r   ÚdecodeÚnetlocr8   Úauthenticatorsr6   r1   r_   )ÚurlÚraise_errorsÚ
netrc_fileÚnetrc_locationsrl   rm   Ú
netrc_pathrj   ÚlocÚriÚsplitstrr>   r#   Úlogin_is                 rC   Úget_netrc_authrƒ   Ì   sX  € ô —‘—‘ Ó(€JØÐØ%˜-‰á9¬[Ô9ˆð-ß0àˆ
à ò 	ˆAðÜ—g‘g×(Ñ(¨Ó+�ô �w‰w�~‰~˜cÕ"Ø �
Ùð	ð ÐØä�c‹]ˆð ˆÜ�cœ3ÔØ—‘ wÓ/ˆHØ�y‰y�‰˜xÓ(¨Ñ+ˆð
	Ù˜:Ó&×5Ñ5°dÓ;ˆFÙà% ašy™!¨a�Ø˜w™¨°©Ð3Ð3ð øô3 ò ò ð	ûð:  ¤Ð)ò 	ñ Øñ ð	ûô œÐ(ò Ùðús`   ´D) ÁDÁ#D) ÂD) ÂAD) Ã+D Ä	DÄD) ÄDÄD) ÄD&Ä#D) Ä%D&Ä&D) Ä)D;Ä:D;c                 ó¦   — t        | dd«      }|rBt        |t        «      r1|d   dk7  r(|d   dk7  rt        j                  j                  |«      S yyyy)z0Tries to guess the filename of the given object.ÚnameNr   ú<éÿÿÿÿú>)ÚgetattrrU   r   rW   rs   Úbasename)Úobjr…   s     rC   Úguess_filenamerŒ     sT   € ä�3˜ Ó%€DÙ”
˜4¤Ô,°°a±¸C²ÀDÈÁHÐPSÂOÜ�w‰w×Ñ Ó%Ð%ð ET°Ð,€trF   c                 óR  — t         j                  j                  | «      r| S t         j                  j                  | «      \  }}|ryt         j                  j                  |«      sZt         j                  j                  |«      \  }}|sn5dj	                  ||g«      }|r t         j                  j                  |«      sŒZt        j                  |«      s| S t        j                  |«      }||j                  «       vr| S t        j                  «       }t         j                  j	                  ||j                  d«      d   «      }t         j                  j                  |«      s6t        |«      5 }|j                  |j                  |«      «       ddd«       |S |S # 1 sw Y   |S xY w)zÄReplace nonexistent paths that look like they refer to a member of a zip
    archive with the location of an extracted copy of the target, or else
    just return the provided path unchanged.
    ú/r‡   N)rW   rs   rv   r8   ÚjoinÚzipfileÚ
is_zipfileÚZipFileÚnamelistÚtempfileÚ
gettempdirÚatomic_openÚwriteÚread)rs   ÚarchiveÚmemberÚprefixÚzip_fileÚtmpÚextracted_pathÚfile_handlers           rC   Úextract_zipped_pathsr      sE  € ô
 
‡w�w‡~�~�dÔàˆô —g‘g—m‘m DÓ)�O€GˆVÙ
œ"Ÿ'™'Ÿ.™.¨Ô1ÜŸ'™'Ÿ-™-¨Ó0‰ˆ�Ùð Ø—‘˜6 6Ð*Ó+ˆñ œ"Ÿ'™'Ÿ.™.¨Õ1ô ×Ñ˜gÔ&Øˆä�‰˜wÓ'€HØ�X×&Ñ&Ó(Ñ(Øˆô ×
Ñ
Ó
€CÜ—W‘W—\‘\ # v§|¡|°CÓ'8¸Ñ'<Ó=€NÜ�7‰7�>‰>˜.Ô)ä˜Ó(ð 	6¨LØ×Ñ˜xŸ}™}¨VÓ4Ô5÷	6àÐˆ>Ð÷	6àÐús   Å/!FÆF&c              #   óJ  K  — t        j                  t        j                  j	                  | «      ¬«      \  }}	 t        j
                  |d«      5 }|–— ddd«       t        j                  || «       y# 1 sw Y   Œ xY w# t        $ r t        j                  |«       ‚ w xY w­w)z-Write a file to the disk in an atomic fashion)ÚdirÚwbN)	r”   ÚmkstemprW   rs   ÚdirnameÚfdopenr:   ÚBaseExceptionÚremove)ÚfilenameÚtmp_descriptorÚtmp_nameÚtmp_handlers       rC   r–   r–   1  s†   è ø€ ô  (×/Ñ/´B·G±G·O±OÀHÓ4MÔNÑ€N�HðÜ�Y‰Y�~ tÓ,ð 	°ØÒ÷	ä
�
‰
�8˜XÕ&÷	ð 	ûô ò Ü
�	‰	�(ÔØðüs4   ‚7B#ºB  ÁA4ÁB  Á3B#Á4A=Á9B  Â  B Â B#c                 ót   — | €yt        | t        t        t        t        f«      rt        d«      ‚t        | «      S )a  Take an object and test to see if it can be represented as a
    dictionary. Unless it can not be represented as such, return an
    OrderedDict, e.g.,

    ::

        >>> from_key_val_list([('key', 'val')])
        OrderedDict([('key', 'val')])
        >>> from_key_val_list('string')
        Traceback (most recent call last):
        ...
        ValueError: cannot encode objects that are not 2-tuples
        >>> from_key_val_list({'key': 'val'})
        OrderedDict([('key', 'val')])

    :rtype: OrderedDict
    Nú+cannot encode objects that are not 2-tuples)rU   r   r   Úboolr4   r7   r   ©Úvalues    rC   Úfrom_key_val_listr²   >  s6   € ð$ €}Øä�%œ#œu¤d¬CÐ0Ô1ÜÐFÓGÐGä�uÓÐrF   c                 ó´   — | €yt        | t        t        t        t        f«      rt        d«      ‚t        | t        «      r| j                  «       } t        | «      S )aÂ  Take an object and test to see if it can be represented as a
    dictionary. If it can be, return a list of tuples, e.g.,

    ::

        >>> to_key_val_list([('key', 'val')])
        [('key', 'val')]
        >>> to_key_val_list({'key': 'val'})
        [('key', 'val')]
        >>> to_key_val_list('string')
        Traceback (most recent call last):
        ...
        ValueError: cannot encode objects that are not 2-tuples

    :rtype: list
    Nr®   )	rU   r   r   r¯   r4   r7   r   rH   Úlistr°   s    rC   Úto_key_val_listrµ   Y  sJ   € ð" €}Øä�%œ#œu¤d¬CÐ0Ô1ÜÐFÓGÐGä�%œÔ!Ø—‘“ˆä�‹;ÐrF   c                 ó�   — g }t        | «      D ]5  }|dd |dd cxk(  rdk(  rn nt        |dd «      }|j                  |«       Œ7 |S )a  Parse lists as described by RFC 2068 Section 2.

    In particular, parse comma-separated lists where the elements of
    the list may include quoted-strings.  A quoted-string could
    contain a comma.  A non-quoted string could have quotes in the
    middle.  Quotes are removed automatically after parsing.

    It basically works like :func:`parse_set_header` just that items
    may appear multiple times and case sensitivity is preserved.

    The return value is a standard :class:`list`:

    >>> parse_list_header('token, "quoted value"')
    ['token', 'quoted value']

    To create a header from the :class:`list` again, use the
    :func:`dump_header` function.

    :param value: a string with a list header.
    :return: :class:`list`
    :rtype: list
    Nr   r‡   ú")Ú_parse_list_headerÚunquote_header_valueÚappend)r±   ÚresultÚitems      rC   Úparse_list_headerr½   w  sY   € ð. €FÜ" 5Ó)ò ˆØ��ˆ8�t˜B˜C�yÔ' CÕ'Ü'¨¨Q¨r¨
Ó3ˆDØ�‰�dÕðð €MrF   c                 ó¶   — i }t        | «      D ]H  }d|vrd||<   Œ|j                  dd«      \  }} | dd | dd cxk(  rdk(  rn nt        | dd «      } | ||<   ŒJ |S )a^  Parse lists of key, value pairs as described by RFC 2068 Section 2 and
    convert them into a python dict:

    >>> d = parse_dict_header('foo="is a fish", bar="as well"')
    >>> type(d) is dict
    True
    >>> sorted(d.items())
    [('bar', 'as well'), ('foo', 'is a fish')]

    If there is no value for a key it will be `None`:

    >>> parse_dict_header('key_without_value')
    {'key_without_value': None}

    To create a header from the :class:`dict` again, use the
    :func:`dump_header` function.

    :param value: a string with a dict header.
    :return: :class:`dict`
    :rtype: dict
    ú=Nr   r‡   r·   )r¸   r8   r¹   )r±   r»   r¼   r…   s       rC   Úparse_dict_headerrÀ   —  s}   € ð, €FÜ" 5Ó)ò ˆØ�d‰?ØˆF�4‰LØØ—j‘j  aÓ(‰ˆˆeØ��!ˆ9˜˜b˜c˜
Ô) cÕ)Ü(¨¨q°¨Ó5ˆEØˆˆtŠðð €MrF   c                 ó–   — | rF| d   | d   cxk(  rdk(  r5n | S | dd } |r| dd dk7  r"| j                  dd«      j                  d	d«      S | S )
zçUnquotes a header value.  (Reversal of :func:`quote_header_value`).
    This does not use the real unquoting but what browsers are actually
    using for quoting.

    :param value: the header value to unquote.
    :rtype: str
    r   r‡   r·   r   NrT   z\\ú\z\")r:   )r±   Úis_filenames     rC   r¹   r¹   º  sd   € ñ ��q‘˜U 2™YÔ-¨#Ô-ð €Lð �a˜�ˆñ ˜e B Q˜i¨6Ò1Ø—=‘= ¨Ó.×6Ñ6°u¸cÓBÐBØ€LrF   c                 óX   — | D �ci c]  }|j                   |j                  “Œ }}|S c c}w )z€Returns a key/value dictionary from a CookieJar.

    :param cj: CookieJar object to extract cookies from.
    :rtype: dict
    )r…   r±   )ÚcjÚcookieÚcookie_dicts      rC   Údict_from_cookiejarrÈ   Ó  s/   € ð <>Ö>°�6—;‘; §¡Ñ,Ð>€KÐ>ØÐùò ?s   …'c                 ó   — t        || «      S )zÂReturns a CookieJar from a key/value dictionary.

    :param cj: CookieJar to insert cookies into.
    :param cookie_dict: Dict of key/values to insert into CookieJar.
    :rtype: CookieJar
    r   )rÅ   rÇ   s     rC   Úadd_dict_to_cookiejarrÊ   Þ  s   € ô ˜{¨BÓ/Ð/rF   c                 ó^  — t        j                  dt        «       t        j                  dt        j
                  ¬«      }t        j                  dt        j
                  ¬«      }t        j                  d«      }|j                  | «      |j                  | «      z   |j                  | «      z   S )zlReturns encodings from given content string.

    :param content: bytestring to extract encodings from.
    z¤In requests 3.0, get_encodings_from_content will be removed. For more information, please see the discussion on issue #2266. (This warning should only appear once.)z!<meta.*?charset=["\']*(.+?)["\'>])Úflagsz+<meta.*?content=["\']*;?charset=(.+?)["\'>]z$^<\?xml.*?encoding=["\']*(.+?)["\'>])r[   r\   ÚDeprecationWarningr;   Úcompiler=   Úfindall)ÚcontentÚ
charset_reÚ	pragma_reÚxml_res       rC   Úget_encodings_from_contentrÔ   é  s‘   € ô
 ‡M�Mð1ô 	ôô —‘Ð@ÌÏÉÔM€JÜ—
‘
ÐIÔQS×QUÑQUÔV€IÜ�Z‰ZÐ?Ó@€Fð 	×Ñ˜7Ó#Ø
×
Ñ
˜GÓ
$ñ	%à
�.‰.˜Ó
!ñ	"ðrF   c                 óH  — | j                  d«      }|d   j                  «       |dd }}i }d}|D ]m  }|j                  «       }|sŒ|d}}|j                  d«      }	|	dk7  r+|d|	 j                  |«      }||	dz   d j                  |«      }|||j                  «       <   Œo ||fS )	z¦Returns content type and parameters from given header

    :param header: string
    :return: tuple containing content type and dictionary of
         parameters
    r,   r   r   Nz"' Tr¿   r‡   )r8   ÚstripÚfindÚlower)
ÚheaderÚtokensÚcontent_typeÚparamsÚparams_dictÚitems_to_stripÚparamÚkeyr±   Úindex_of_equalss
             rC   Ú_parse_content_type_headerrâ     sÃ   € ð �\‰\˜#Ó€FØ! !™9Ÿ?™?Ó,¨f°Q°R¨j�&€LØ€KØ€Nàò -ˆØ—‘“ˆÚØ �ˆCØ#Ÿj™j¨›oˆOØ "Ò$ØÐ,˜_Ð-×3Ñ3°NÓC�Ø˜o°Ñ1Ð3Ð4×:Ñ:¸>ÓJ�Ø',ˆK˜Ÿ	™	›Ò$ð-ð ˜Ð$Ð$rF   c                 óŒ   — | j                  d«      }|syt        |«      \  }}d|v r|d   j                  d«      S d|v ryd|v ryy)	z}Returns encodings from given HTTP Header Dict.

    :param headers: dictionary to extract encoding from.
    :rtype: str
    zcontent-typeNÚcharsetz'"Útextz
ISO-8859-1zapplication/jsonrM   )rq   râ   rÖ   )ÚheadersrÛ   rÜ   s      rC   Úget_encoding_from_headersrç     s`   € ð —;‘;˜~Ó.€LáØä5°lÓCÑ€L�&à�FÑØ�iÑ ×&Ñ& uÓ-Ð-à�ÑØà˜\Ñ)àð *rF   c              #   óü   K  — |j                   €| E d{  –—†  y t        j                  |j                   «      d¬«      }| D ]  }|j                  |«      }|sŒ|–— Œ |j                  dd¬«      }|r|–— yy7 Œe­w)zStream decodes an iterator.Nr:   ©ÚerrorsrF   T)Úfinal)ÚencodingÚcodecsÚgetincrementaldecoderrw   )ÚiteratorÚrÚdecoderÚchunkÚrvs        rC   Ústream_decode_response_unicoderô   4  s„   è ø€ ð 	‡z�zÐØ×ÐØà6Œf×*Ñ*¨1¯:©:Ó6¸iÔH€GØò ˆØ�^‰^˜EÓ"ˆÚØ‹Hðð 
�‰˜ 4ˆÓ	(€BÙ	Ø‹ð 
ð 	ús   ‚A<”A:•AA<Á"A<c              #   óŽ   K  — d}|�|dk  rt        | «      }|t        | «      k  r| |||z    –— ||z  }|t        | «      k  rŒyy­w)z Iterate over slices of a string.r   N)rO   )ÚstringÚslice_lengthÚposs      rC   Úiter_slicesrù   E  sW   è ø€ à
€CØÐ˜|¨qÒ0Ü˜6“{ˆØ
”�F“Ò
Ø�S˜3 Ñ-Ð.Ò.Øˆ|Ñˆð ”�F“Õ
ùs   ‚A AÁAc                 ó>  — t        j                  dt        «       g }t        | j                  «      }|r	 t        | j                  |«      S 	 t        | j                  |d¬«      S # t        $ r |j                  |«       Y Œ5w xY w# t        $ r | j                  cY S w xY w)zâReturns the requested content back in unicode.

    :param r: Response object to get unicode content from.

    Tried:

    1. charset from content-type
    2. fall back and replace all unicode characters

    :rtype: str
    z£In requests 3.0, get_unicode_from_response will be removed. For more information, please see the discussion on issue #2266. (This warning should only appear once.)r:   ré   )
r[   r\   rÍ   rç   ræ   r   rÐ   ÚUnicodeErrorrº   Ú	TypeError)rð   Útried_encodingsrì   s      rC   Úget_unicode_from_responserþ   O  s›   € ô ‡M�Mð1ô 	ôð €Oô )¨¯©Ó3€Háð	-Ü�q—y‘y (Ó+Ð+ð
Ü�1—9‘9˜h¨yÔ9Ð9øô ò 	-Ø×"Ñ" 8Ö,ð	-ûô ò Ø�y‰yÒðús#   µA$ ÁB Á$BÂ BÂBÂBzBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~c                 ó†  — | j                  d«      }t        dt        |«      «      D ]l  }||   dd }t        |«      dk(  rI|j                  «       r9	 t	        t        |d«      «      }|t        v r|||   dd z   ||<   ŒVd||   › �||<   Œbd||   › �||<   Œn d	j                  |«      S # t        $ r t        d|› d�«      ‚w xY w)
z¨Un-escape any percent-escape sequences in a URI that are unreserved
    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.

    :rtype: str
    ú%r   r   rT   é   z"Invalid percent-escape sequence: 'ú'NÚ )
r8   ÚrangerO   ÚisalnumÚchrr4   r7   r    ÚUNRESERVED_SETr�   )ÚuriÚpartsÚiÚhÚcs        rC   Úunquote_unreservedr  |  sâ   € ð �I‰I�c‹N€EÜ�1”c˜%“jÓ!ò &ˆØ�!‰H�Q�qˆMˆÜˆq‹6�QŠ;˜1Ÿ9™9œ;ðLÜœ˜A˜r›
“O�ð ”NÑ"Ø˜u Q™x¨¨˜|Ñ+��a’à˜u Q™x˜j˜>��a’à˜5 ™8˜*�~ˆE�!ŠHð&ð �7‰7�5‹>Ðøô ò LÜ Ð#EÀaÀSÈÐ!JÓKÐKðLús   ÁB'Â'C c                 óp   — d}d}	 t        t        | «      |¬«      S # t        $ r t        | |¬«      cY S w xY w)z¬Re-quote the given URI.

    This function passes the given URI through an unquote/quote cycle to
    ensure that it is fully and consistently quoted.

    :rtype: str
    z!#$%&'()*+,/:;=?@[]~z!#$&'()*+,/:;=?@[]~)Úsafe)r   r  r    )r  Úsafe_with_percentÚsafe_without_percents      rC   Úrequote_urir  ”  sJ   € ð /ÐØ0Ðð	5ô Ô'¨Ó,Ð3DÔEÐEøÜò 5ô �SÐ3Ô4Ò4ð	5ús   † œ5´5c           
      ór  — t        j                  dt        j                  | «      «      d   }|j	                  d«      \  }}t        j                  dt        j                  t        t        |«      «      «      «      d   }t        j                  dt        j                  |«      «      d   |z  }||z  ||z  k(  S )zïThis function allows you to check if an IP belongs to a network subnet

    Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24
             returns False if ip = 192.168.1.1 and net = 192.168.100.0/24

    :rtype: bool
    z=Lr   rŽ   )ÚstructÚunpackÚsocketÚ	inet_atonr8   Údotted_netmaskr4   )ÚipÚnetÚipaddrÚnetaddrÚbitsÚnetmaskÚnetworks          rC   Úaddress_in_networkr   ª  s˜   € ô �]‰]˜4¤×!1Ñ!1°"Ó!5Ó6°qÑ9€FØ—I‘I˜c“N�M€GˆTÜ�m‰m˜D¤&×"2Ñ"2´>Ä#ÀdÃ)Ó3LÓ"MÓNÈqÑQ€GÜ�m‰m˜D¤&×"2Ñ"2°7Ó";Ó<¸QÑ?À'ÑI€GØ�WÑ '¨GÑ"3Ñ4Ð4rF   c                 óp   — ddd| z
  z  dz
  z  }t        j                  t        j                  d|«      «      S )z�Converts mask from /xx format to xxx.xxx.xxx.xxx

    Example: if mask is 24 function returns 255.255.255.0

    :rtype: str
    l   ÿÿ r   é    z>I)r  Ú	inet_ntoar  Úpack)Úmaskr  s     rC   r  r  ¹  s7   € ð ˜˜b 4™i™¨1Ñ,Ñ,€DÜ×ÑœFŸK™K¨¨dÓ3Ó4Ð4rF   c                 óN   — 	 t        j                  | «       y# t        $ r Y yw xY w)z
    :rtype: bool
    FT)r  r  r6   )Ú	string_ips    rC   Úis_ipv4_addressr(  Ä  s.   € ðÜ×Ñ˜Ô#ð øô ò Ùðús   ‚ ˜	$£$c                 ó  — | j                  d«      dk(  rR	 t        | j                  d«      d   «      }|dk  s|dkD  ry	 t	        j
                  | j                  d«      d   «       yy# t        $ r Y yw xY w# t        $ r Y yw xY w)zV
    Very simple check of the cidr format in no_proxy variable.

    :rtype: bool
    rŽ   r   Fr"  r   T)Úcountr4   r8   r7   r  r  r6   )Ústring_networkr%  s     rC   Úis_valid_cidrr,  Ï  sœ   € ð ×Ñ˜CÓ  AÒ%ð	Ü�~×+Ñ+¨CÓ0°Ñ3Ó4ˆDð �!Š8�t˜b’yØð	Ü×Ñ˜^×1Ñ1°#Ó6°qÑ9Ô:ð
 ð øô ò 	Ùð	ûô ò 	Ùð	ús"   –A( ¿'A7 Á(	A4Á3A4Á7	BÂBc              #   ó8  K  — |du}|r2t         j                  j                  | «      }|t         j                  | <   	 d–— |r(€t         j                  | = y|t         j                  | <   yy# |r(€t         j                  | = w |t         j                  | <   w w xY w­w)zÎSet the environment variable 'env_name' to 'value'

    Save previous value, yield, and then restore the previous value stored in
    the environment variable 'env_name'.

    If 'value' is None, do nothingN)rW   rp   rq   )Úenv_namer±   Úvalue_changedÚ	old_values       rC   Úset_environr1  ç  s�   è ø€ ð  Ð%€MÙÜ—J‘J—N‘N 8Ó,ˆ	Ø$Œ�
‰
�8Ñð1ÛáØÐ Ü—J‘J˜xÑ(à'0”—
‘
˜8Ò$ð	 ø‰=ØÐ Ü—J‘J˜xÑ(à'0”—
‘
˜8Ò$ð	 üs   ‚9B¼A+ Á +BÁ+,BÂBc                 ó¾  — d„ }|}|€ |d«      }t        | «      }|j                  €y|rÙd„ |j                  dd«      j                  d«      D «       }t	        |j                  «      r=|D ]7  }t        |«      rt        |j                  |«      sŒ% y|j                  |k(  sŒ7 y n_|j                  }|j                  r|d	|j                  › �z  }|D ]0  }|j                  j                  |«      s|j                  |«      sŒ0 y t        d|«      5  	 t        |j                  «      }ddd«       ryy
# t        t        j                  f$ r d
}Y Œ)w xY w# 1 sw Y   Œ.xY w)zL
    Returns whether we should bypass proxies or not.

    :rtype: bool
    c                 óž   — t         j                  j                  | «      xs- t         j                  j                  | j                  «       «      S ©N)rW   rp   rq   Úupper)rà   s    rC   Ú	get_proxyz(should_bypass_proxies.<locals>.get_proxy  s-   € Ü�z‰z�~‰~˜cÓ"ÒA¤b§j¡j§n¡n°S·Y±Y³[Ó&AÐArF   NÚno_proxyTc              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­wr4  rh   )ri   r>   s     rC   rk   z(should_bypass_proxies.<locals>.<genexpr>  s   è ø€ ÒR˜TÊT”DÑRùs   ‚Šú r  ú,ú:F)r   Úhostnamer:   r8   r(  r,  r   ÚportÚendswithr1  r   rü   r  Úgaierror)	rz   r7  r6  Úno_proxy_argÚparsedÚproxy_ipÚhost_with_portr>   Úbypasss	            rC   Úshould_bypass_proxiesrE  ý  sZ  € òBð
 €LØÐÙ˜ZÓ(ˆÜ�c‹]€Fà‡�Ðàáñ S X×%5Ñ%5°c¸2Ó%>×%DÑ%DÀSÓ%IÔRˆä˜6Ÿ?™?Ô+Ø$ò  �Ü  Ô*Ü)¨&¯/©/¸8ÕDÙ#Ø—_‘_¨Ó0ñ  ñ ð $Ÿ_™_ˆNØ�{Š{Ø A f§k¡k ]Ð"3Ñ3�à ò  �Ø—?‘?×+Ñ+¨DÔ1°^×5LÑ5LÈTÕ5Rñ  ð	 ô 
�Z Ó	.ñ ð	Ü! &§/¡/Ó2ˆF÷ñ Øàøô œ6Ÿ?™?Ð+ò 	ØŠFð	ú÷	ð ús*   ÄEÄD2Ä2EÅEÅEÅEÅEc                 ó4   — t        | |¬«      ri S t        «       S )zA
    Return a dict of environment proxies.

    :rtype: dict
    ©r7  )rE  r   )rz   r7  s     rC   Úget_environ_proxiesrH  :  s   € ô ˜S¨8Õ4Øˆ	ä‹|ÐrF   c                 ó.  — |xs i }t        | «      }|j                  €+|j                  |j                  |j                  d«      «      S |j                  dz   |j                  z   |j                  d|j                  z   dg}d}|D ]  }||v sŒ||   } |S  |S )z­Select a proxy for the url, if applicable.

    :param url: The url being for the request
    :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs
    NÚallz://zall://)r   r<  rq   Úscheme)rz   ÚproxiesÚurlpartsÚ
proxy_keysÚproxyÚ	proxy_keys         rC   Úselect_proxyrQ  F  s¯   € ð Šm˜€GÜ˜‹}€HØ×ÑÐ Ø�{‰{˜8Ÿ?™?¨G¯K©K¸Ó,>Ó?Ð?ð 	�‰˜%Ñ (×"3Ñ"3Ñ3Ø�‰Ø�8×$Ñ$Ñ$Øð	€Jð €EØò ˆ	Ø˜ÒØ˜IÑ&ˆEØà€Lðð
 €LrF   c                 ó8  — |�|ni }| j                   }t        |«      j                  }|j                  d«      }|j	                  «       }|rOt        ||¬«      sBt        ||¬«      }|j                  ||j                  d«      «      }|r|j                  ||«       |S )a©  This method takes proxy information from a request and configuration
    input to resolve a mapping of target proxies. This will consider settings
    such as NO_PROXY to strip proxy configurations.

    :param request: Request or PreparedRequest
    :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs
    :param trust_env: Boolean declaring whether to trust environment configs

    :rtype: dict
    r7  rG  rJ  )rz   r   rK  rq   ÚcopyrE  rH  Ú
setdefault)	ÚrequestrL  Ú	trust_envrz   rK  r7  Únew_proxiesÚenviron_proxiesrO  s	            rC   Úresolve_proxiesrY  `  s�   € ð !Ð,‰g°"€GØ
�+‰+€CÜ�c‹]×!Ñ!€FØ�{‰{˜:Ó&€HØ—,‘,“.€KáÔ.¨s¸XÕFÜ-¨c¸HÔEˆà×#Ñ# F¨O×,?Ñ,?ÀÓ,FÓGˆáØ×"Ñ" 6¨5Ô1ØÐrF   c                 ó   — | › dt         › �S )zO
    Return a string representing the default user agent.

    :rtype: str
    rŽ   r   )r…   s    rC   Údefault_user_agentr[  {  s   € ð ˆV�1”[�MÐ"Ð"rF   c                  ó:   — t        t        «       t        dddœ«      S )z9
    :rtype: requests.structures.CaseInsensitiveDict
    z*/*z
keep-alive)z
User-AgentzAccept-EncodingÚAcceptÚ
Connection)r"   r[  ÚDEFAULT_ACCEPT_ENCODINGrh   rF   rC   Údefault_headersr`  „  s%   € ô ä,Ó.Ü6ØØ&ñ		
óð rF   c                 óÄ  — g }d}| j                  |«      } | s|S t        j                  d| «      D ]Š  }	 |j                  dd«      \  }}d|j                  d«      i}|j                  d«      D ]:  }	 |j                  d«      \  }} | j                  |«      ||j                  |«      <   Œ< |j	                  |«       ŒŒ |S # t        $ r |d}}Y Œ…w xY w# t        $ r Y  Œ4w xY w)	z¼Return a list of parsed link headers proxies.

    i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg"

    :rtype: list
    z '"z, *<r,   r   r  rz   z<> '"r¿   )rÖ   r;   r8   r7   rº   )	r±   ÚlinksÚreplace_charsÚvalrz   rÜ   Úlinkrß   rà   s	            rC   Úparse_header_linksrf  ’  sý   € ð €Eà€Mà�K‰K˜Ó&€EÙØˆä�x‰x˜ Ó&ò ˆð	"ØŸ)™) C¨Ó+‰KˆC�ð �s—y‘y Ó*Ð+ˆà—\‘\ #Ó&ò 	HˆEðØ"Ÿ[™[¨Ó-‘
��Uð .3¯[©[¸Ó-GˆD�—‘˜=Ó)Ò*ð	Hð 	�‰�TÕð!ð$ €Løô ò 	"Ø˜r�ŠCð	"ûô ò Úðús#   ´B?Á1CÂ?CÃCÃ	CÃCú ro   rT   é   c                 óŒ  — | dd }|t         j                  t         j                  fv ry|dd t         j                  k(  ry|dd t         j                  t         j
                  fv ry|j                  t        «      }|dk(  ry	|dk(  r |ddd…   t        k(  ry
|ddd…   t        k(  ry|dk(  r|dd t        k(  ry|dd t        k(  ryy)z
    :rtype: str
    Né   zutf-32rh  z	utf-8-sigrT   zutf-16r   rM   z	utf-16-ber   z	utf-16-lez	utf-32-bez	utf-32-le)
rí   ÚBOM_UTF32_LEÚBOM_UTF32_BEÚBOM_UTF8ÚBOM_UTF16_LEÚBOM_UTF16_BEr*  Ú_nullÚ_null2Ú_null3)ÚdataÚsampleÚ	nullcounts      rC   Úguess_json_utfrv  ½  sÕ   € ð �"�1ˆX€FØ”&×%Ñ%¤v×':Ñ':Ð;Ñ;ØØˆbˆq€z”V—_‘_Ò$ØØˆbˆq€z”f×)Ñ)¬6×+>Ñ+>Ð?Ñ?ØØ—‘œUÓ#€IØ�A‚~ØØ�A‚~Ø‘#�A�#‰;œ&Ò ØØ�!�$�Q�$‰<œ6Ò!Øà�A‚~Ø�"�1ˆ:œÒØØ�!�"ˆ:œÒØàrF   c                 ó¬   — t        | «      }|\  }}}}}}}	|j                  }
|
s||
}}
|rdj                  ||
g«      }
|€|}|€d}t        ||
|d||	f«      S )zªGiven a URL that may or may not have a scheme, prepend the given scheme.
    Does not replace a present scheme with the one provided as an argument.

    :rtype: str
    ú@r  )r   rx   r�   r   )rz   Ú
new_schemerA  rK  Úauthr>   r=  rs   ÚqueryÚfragmentrx   s              rC   Úprepend_scheme_if_neededr}  Ý  s{   € ô �s‹^€FØ6<Ñ3€FˆD�$˜˜d E¨8ð �]‰]€FÙØ˜V�ˆáð —‘˜4 ˜.Ó)ˆØ€~ØˆØ€|Øˆä�v˜v t¨R°¸ÐAÓBÐBrF   c                 ó¢   — t        | «      }	 t        |j                  «      t        |j                  «      f}|S # t        t
        f$ r d}Y |S w xY w)z{Given a url with authentication components, extract them into a tuple of
    username,password.

    :rtype: (str,str)
    )r  r  )r   r   ÚusernameÚpasswordr_   rü   )rz   rA  rz  s      rC   Úget_auth_from_urlr�  ú  sU   € ô �c‹]€FðÜ˜Ÿ™Ó(¬'°&·/±/Ó*BÐCˆð €Køô œIÐ&ò Ø‰à€Kðús   �*9 ¹AÁAc                 óB   — | \  }}t        | |d«       t        | |d«       y)z§Verifies that header parts don't contain leading whitespace
    reserved characters, or return characters.

    :param header: tuple, in the format (name, value).
    r   r   N)Ú_validate_header_part)rÙ   r…   r±   s      rC   Úcheck_header_validityr„  
  s%   € ð �K€Dˆ%Ü˜& $¨Ô*Ü˜& %¨Õ+rF   c           
      óü   — t        |t        «      r
t        |   }n7t        |t        «      r
t        |   }nt        d|›d| › dt        |«      › �«      ‚|j                  |«      s|dk(  rdnd}t        d|› d|›�«      ‚y )	NzHeader part (z) from z# must be of type str or bytes, not r   r…   r±   zTInvalid leading whitespace, reserved character(s), or return character(s) in header z: )rU   r   r   r   r
   r   Útyper<   )rÙ   Úheader_partÚheader_validator_indexÚ	validatorÚheader_kinds        rC   rƒ  rƒ    s    € Ü�+œsÔ#Ü*Ð+AÑB‰	Ü	�K¤Ô	'Ü+Ð,BÑC‰	äØ˜K˜?¨'°&°ð :1Ü15°kÓ1BÐ0CðEó
ð 	
ð
 �?‰?˜;Ô'Ø 6¸!Ò ;‘fÀˆÜð&Ø&1 ]°"°[°OðEó
ð 	
ð (rF   c                 ó~   — t        | «      \  }}}}}}|s||}}|j                  dd«      d   }t        |||||df«      S )zW
    Given a url remove the fragment and the authentication part.

    :rtype: str
    rx  r   r‡   r  )r   Úrsplitr   )rz   rK  rx   rs   rÜ   r{  r|  s          rC   Úurldefragauthr�  (  sU   € ô 5=¸S³MÑ1€FˆF�D˜& %¨ñ Ø˜V�ˆà�]‰]˜3 Ó" 2Ñ&€Fä�v˜v t¨V°U¸BÐ?Ó@Ð@rF   c                 óÖ   — t        | j                  dd«      }|�.t        | j                  t        «      r	  || j                  «       yt        d«      ‚# t
        $ r t        d«      ‚w xY w)zfMove file pointer back to its recorded starting position
    so it can be read again on redirect.
    rS   Nz;An error occurred when rewinding request body for redirect.z+Unable to rewind request body for redirect.)r‰   ÚbodyrU   Ú_body_positionr   r6   r!   )Úprepared_requestÚ	body_seeks     rC   Úrewind_bodyr“  9  st   € ô Ð(×-Ñ-¨v°tÓ<€IØÐ¤Ø×'Ñ'¬ô"ð	ÙÐ&×5Ñ5Õ6ô $Ð$QÓRÐRøô ò 	Ü'ØMóð ð	ús   µA ÁA()Fr4  )T)zpython-requests)jÚ__doc__rí   Ú
contextlibr]   rW   r;   r  r  Úsysr”   r[   r�   Úcollectionsr   Úurllib3.utilr   r   r  r   r	   Ú_internal_utilsr
   r   r   r   Úcompatr   r   r   r   r   r   r   r¸   r   r   r   r   r   r   r   Úcookiesr   Ú
exceptionsr   r   r    r!   Ú
structuresr"   rr   ÚwhereÚDEFAULT_CA_BUNDLE_PATHÚDEFAULT_PORTSr�   r8   r_  ÚplatformrD   rK   rd   rƒ   rŒ   r    Úcontextmanagerr–   r²   rµ   r½   rÀ   r¹   rÈ   rÊ   rÔ   râ   rç   rô   rù   rþ   Ú	frozensetr  r  r  r   r  r(  r,  r1  rE  rH  rQ  rY  r[  r`  rf  rV   rp  rq  rr  rv  r}  r�  r„  rƒ  r�  r“  rh   rF   rC   ú<module>r¤     s  ðñó Û Û 	Û 	Û 	Û Û Û 
Û Û Û Ý #ç 0å Ý $÷ó ÷÷ õ :÷÷ ñ õ )÷ó õ ,à"€à$˜Ÿ™›Ð à cÑ*€ð Ÿ)™)Ø€B‡H�HˆW‘l°4Ô8Ð9JÑKÓLóÐ ð
 ‡<�<�7Òò$òL	/òòB3óJ6òr&ò"ðJ ×Ññ	ó ð	òò6ò<ò@óFò2ò0òò2%ò2ò2ò"ò$ñP ØMó€ò
ò05ò,5ò5òòð0 ×Ññ1ó ð1ò*:óz	òó4ó6#òò"ðL 	�‰�gÓ€Ø	�‰€Ø	�‰€òò@Cò:ò ,ò
ò&Aó"SrF   