
    F2j                    V   U d Z ddlm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ZddlmZ ddlmZ ddlmZ ddlmZmZ ddlmZmZmZmZmZmZ dd	lmZm Z m!Z!m"Z" dd
lm#Z$ ej%        dk    rddl&Z&ndZ&ddl'm(Z( ddl)m)Z) ddl*m+Z+ ddl,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z= ddl>m?Z?m@Z@ ddlAmBZB ddlCmDZDmEZE ddlFmGZG 	 ddlHmIZI n# eJ$ r dZIY nw xY wejK        rddlLmMZM ddlNmOZOmPZPmQZQmRZR ddlmSZSmTZT   e            e          Z  e            e           Z dZUdd d!ZVd"eWd#<   d$X                     e	jY        d% eDd&'          d(                             ZZd)eWd*<   ej%        d+k    rdd.Z[dd0Z!dd4Z\ ed56          ddd<            Z]dd?Z^ej_        ddC            Z`ddGZa ejb        dH          Zc ejb        dI          ZdddLZeddNZfddPZgdddRZhddVZiddYZjdd\Zkdd_ZlddeZmddhZn ejb        dieoep          ZqddnZr esdo          ZtddqZuddrZvdddvZw edw6          ddy            Zxdd|Zydd}ZzddZ{ddZ|ddZ}ddZ~ej_        dd            ZddZdddZddZ	 dddZdddZddZddZddZddZddZddZddZddZddZddZd dZddZdddZddZddZddZddZddZddńZddǄZd	dʄZd
d̈́Zej        ddτ            Zej        ddЄ            ZddфZdS (  z
requests.utils
~~~~~~~~~~~~~~

This module provides utility functions that are used within Requests
that are also useful for external consumption.
    )annotationsN)OrderedDict)	lru_cache)	CookieJar)NetrcParseErrornetrc)quoteunquoteurljoinurlparse
urlunparseuses_relative)
getproxiesgetproxies_environmentproxy_bypassproxy_bypass_environment)parse_http_list
emscripten)
from_bytes   __version__)iscoroutinefunction)
InvalidURLMissingSchemaUnrewindableBodyError)RevocationConfigurationRevocationStrategy)ConnectionInfo)BaseResolverManyResolverProtocolResolverResolverDescription)AsyncBaseResolverAsyncManyResolverAsyncResolverDescription)ExtensionFromHTTPload_extension)AsyncExtensionFromHTTP)make_headers	parse_url)CaseInsensitiveDict)BACKENDssl)RequestsCookieJar)AsyncResponsePreparedRequestRequestResponse)AsyncResolverTypeResolverType)z.netrc_netrcP   i  httphttpszdict[str, int]DEFAULT_PORTSz, z,\s*T)accept_encodingzaccept-encodingstrDEFAULT_ACCEPT_ENCODINGwin32returnboolc                l   	 dd l }n# t          $ r Y dS w xY w	 |                    |j        d          }t	          |                    |d          d                   }|                    |d          d         }n# t          t          f$ r Y dS w xY w|r|sdS |                    d          }t          d |          }|D ]t}|dk    rd| vr d	S |
                    dd
          }|
                    dd          }|
                    dd          }t          j        || t          j                  r d	S udS )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)hostrI   internetSettingsproxyEnableproxyOverridetests         V/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/niquests/utils.pyproxy_bypass_registryr]   Y   s   	MMMM 	 	 	55	
	%~~(N   
 f112BMRRSTUVVK"//0@/RRSTUMM$ 	 	 	55	 	- 	5
 &++C00 t]33! 	 	Dy  d??44<<U++D<<U++D<<T**DxdBD)) ttus    
A A: :BBrW   c                Z    t                      rt          |           S t          |           S )zReturn True, if the host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or the registry.
        )r   r   r]   )rW   s    r\   r   r      s.     "## 	/+D111(...    o
typing.AnyrM   c                   d }d}t          | d          rt          |           }nst          | d          r| j        }n[t          | d          rK	 |                                 }t          j        |          j        }n# t          j        t          f$ r Y nw xY wt          | d          rt          | j
                  s	 | 
                                }t          | d          rW|U	 |                     dd           | 
                                }|                     |pd           n'# t          $ r d}Y nw xY wn# t          $ r ||}Y nw xY w|d}t          d||z
            S )Nr   __len__lenfilenotellseek   )hasattrrd   re   osfstatst_sizeioUnsupportedOperationAttributeErrorr   rf   rg   rO   max)r`   total_lengthcurrent_positionre   s       r\   	super_lenrs      s   Lq) 41vv	E		 4u	H		 	4	4XXZZF 8F++3LL '8 	 	 	 D		 q& %"5af"="= %	% vvxx q&!! %l&:	%FF1aLLL#$6688L FF+0q1111 % % %#$LLL%%  	0 	0 	0
 '#/ 	0* q,!11222s7   A< <BB=D9 $AD& &D54D59E
	E
@   )maxsizeFurl
str | Noneraise_errorstuple[str, str] | Nonec                P   | dS t           j                            d          }||fnt          d t          D                       }	 t          d |D             d          }|dS t          |           }|j        }|dS t          |          	                    |          }|r|\  }}	}
|r|
r||
fS dS nq# t          $ r}|rt          d          |Y d}~nPd}~wt          $ r}|rt          d          |Y d}~n,d}~wt          $ r}|rt          d          |Y d}~nd}~ww xY wdS )z;Returns the Requests tuple auth for a given url from netrc.NNETRCc              3      K   | ]	}d | V  
dS )z~/N .0fs     r\   	<genexpr>z!get_netrc_auth.<locals>.<genexpr>   s-      YxYxghZb_`ZbZbYxYxYxYxYxYxr_   c              3     K   | ]_}t           j                            t           j                            |                    >t           j                            |          V  `d S N)rj   pathexists
expanduserr~   s     r\   r   z!get_netrc_auth.<locals>.<genexpr>   sV      eeqrw~~bgN`N`abNcNc?d?deRW""eeeeeer_   zSyntax error in netrc filez+Problem accessing or reading the netrc filez6Unexpected error while retrieving netrc authenticators)rj   environgettupleNETRC_FILESnextr+   hostnamer   authenticatorsr   rP   rO   ro   RuntimeError)rv   rx   
netrc_filenetrc_locations
netrc_pathrirW   r6   login_passwordes               r\   get_netrc_authr      s    {t((J8B8N
}}TYYxYxlwYxYxYxTxTxO`eeOeee
 

 4s^^{<4z""11$77 	!'E1h ' 'h&4		
  B B B 	B9::A	B 	B 	B 	B 	B P P P 	PGHHaO	P 	P 	P 	P 	P ` ` ` 	`WXX^__	` 	` 	` 	` 	`` 4s<   B5 &B5  1B5 5
D#?CD##C::D#DD#obj	typing.IOc                    t          | dd          }|rLt          |t                    r7|d         dk    r+|d         dk    rt          j                            |          S dS )z0Tries to guess the filename of the given object.nameNr   <>)getattr
isinstancer=   rj   r   basename)r   r   s     r\   guess_filenamer      s_    3%%D &
4%% &$q'S..T"X__w%%%4r_   filenamestr | bytes | os.PathLike-typing.Generator[typing.BinaryIO, None, None]c              #  H  K   t          j        t          j                            |                     \  }}	 t          j        |d          5 }|V  ddd           n# 1 swxY w Y   t          j        ||            dS # t          $ r t          j        |            w xY w)z-Write a file to the disk in an atomic fashion)dirwbN)	tempfilemkstemprj   r   dirnamefdopenrS   BaseExceptionremove)r   tmp_descriptortmp_nametmp_handlers       r\   atomic_openr      s      
  (/BGOOH4M4MNNNNHY~t,, 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	

8X&&&&&   
	(s/   B AB A##B &A#'B  B!valuetyping.Any | NoneOrderedDict | Nonec                    | dS t          | t          t          t          f          s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')])
    N+cannot encode objects that are not 2-tuples)r   r   listdictrP   r   r   s    r\   from_key_val_listr     sE      }teeT4011 HFGGGur_   _KT_VTLdict[_KT, _VT] | typing.Mapping[_KT, _VT] | typing.Iterable[tuple[_KT, _VT]]list[tuple[_KT, _VT]]c                    | t          d          t          | t          t          t          t
          f          rt          d          t          | d          r|                                 } 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
    Nz%cannot accept None in to_key_val_listr   items)	rP   r   r=   bytesrA   rM   ri   r   r   r   s    r\   to_key_val_listr     sn    " }@AAA%#udC011 HFGGGug ;;r_   	list[str]c                    g }t          |           D ]N}|dd         |dd         cxk    rdk    rn nt          |dd                   }|                    |           O|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`
    Nr   r   ")_parse_list_headerunquote_header_valueappend)r   resultitems      r\   parse_list_headerr   <  s    , F"5))  8tBCCy''''C''''''QrT
33DdMr_   typing.Mapping[str, str | None]c                    i }t          |           D ]a}d|vrd||<   |                    dd          \  }} | dd         | dd         cxk    rdk    rn nt          | dd                   } | ||<   b|S )aM  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`
    =Nr   r   r   )r   rQ   r   )r   r   r   r   s       r\   parse_dict_headerr   [  s    * 68F"5))  d??F4Ljja((e!9bcc
))))c)))))(qt55EtMr_   is_filenamec                    | r`| d         | d         cxk    rdk    rGn nD| dd         } |r| dd         dk    r*|                      dd                               d	d          S | S )
zUnquotes 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.
    r   r   r   r   Nrh   z\\\z\")rS   )r   r   s     r\   r   r   }  s      CqU2Y----#-----
 ad  	CeBQBi611==..66ucBBBLr_   cjr   dict[str, str | None]c                    d | D             }|S )zoReturns a key/value dictionary from a CookieJar.

    :param cj: CookieJar object to extract cookies from.
    c                (    i | ]}|j         |j        S r}   )r   r   )r   cookies     r\   
<dictcomp>z'dict_from_cookiejar.<locals>.<dictcomp>  s    >>>6;>>>r_   r}   )r   cookie_dicts     r\   dict_from_cookiejarr     s     ?>2>>>Kr_   r/   RequestsCookieJar | CookieJarc                &    ddl m}  |||           S )zReturns 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.
    r   )cookiejar_from_dict)cookiesr   )r   r   r   s      r\   add_dict_to_cookiejarr     s)     -,,,,,{B///r_   header1tuple[str, dict[str, str | typing.Literal[True]]]c                   |                      d          }|d                                         |dd         }}i }d}|D ]}|                                }|rs|d}}|                    d          }	|	dk    r=|d|	                             |          }||	dz   d                             |          }|||                                <   ||fS )	zReturns content type and parameters from given header

    :param header: string
    :return: tuple containing content type and dictionary of
         parameters
    rE   r   r   Nz"' Tr   r   )rQ   stripfindlower)
r   tokenscontent_typeparamsparams_dictitems_to_stripparamkeyr   index_of_equalss
             r\   _parse_content_type_headerr     s     \\#F!!9??,,fQRRj&LKN 
- 
- 	- C#jjooO"$$,_,-33NCCo1334::>JJ',K		$$$r_   headerstyping.Mapping[str, str]c                    |                      d          }|sdS t          |          \  }}d|v r8t          |d         t                    r|d                             d          ndS d|v rdS dS )zmReturns encodings from given HTTP Header Dict.

    :param headers: dictionary to extract encoding from.
    zcontent-typeNcharsetz'"zapplication/jsonutf-8)r   r   r   r=   r   )r   r   r   s      r\   get_encoding_from_headersr     s     ;;~..L t5lCCL&F1;F9<Ms1S1S]vi &&u---Y]]\))w4r_   iterator#typing.Generator[bytes, None, None]rr3   )typing.Generator[bytes | str, None, None]c              #     K   |j         
| E d{V  dS  t          j        |j                   d          }| D ]}|                    |          }|r|V  |                    dd          }|r|V  dS dS zStream decodes an iterator.NrS   )errorsr_   T)finalencodingcodecsgetincrementaldecoderdecode)r   r   decoderchunkrvs        r\   stream_decode_response_unicoder    s      
 	z6f*1:66iHHHG  ^^E"" 	HHH	4	(	(B	  r_   "typing.AsyncGenerator[bytes, None](typing.AsyncGenerator[bytes | str, None]c                 K   |j         | 2 3 d{V }|W V  6 dS  t          j        |j                   d          }| 2 3 d{V }|                    |          }|r|W V  $6 |                    dd          }|r|W V  dS dS r   r   )r   r   r  r  r  s        r\   astream_decode_response_unicoder
    s      
 	z# 	 	 	 	 	 	 	%KKKKK $6f*1:66iHHHG       e^^E"" 	HHHH   
4	(	(B	  s
   A%_SVstringslice_length
int | None!typing.Generator[_SV, None, None]c              #     K   d}||dk    rt          |           }|t          |           k     r)| |||z            V  ||z  }|t          |           k     'dS dS )z Iterate over slices of a string.r   N)rd   )r  r  poss      r\   iter_slicesr  	  s{      
C|q006{{
F

S3--....| F





r_   zBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~uric                   |                      d          }t          dt          |                    D ]}||         dd         }t          |          dk    r|                                ro	 t	          t          |d                    }n!# t          $ r t          d| d          w xY w|t          v r|||         dd         z   ||<   d||          ||<   d||          ||<   d		                    |          S )
zUn-escape any percent-escape sequences in a URI that are unreserved
    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
    %r   r   rh      z"Invalid percent-escape sequence: ''N )
rQ   rangerd   isalnumchrrM   rP   r   UNRESERVED_SETjoin)r  partsihcs        r\   unquote_unreservedr"    s    IIcNNE1c%jj!! & &!HQqSMq66Q;;199;;;LAr

OO L L L !Ja!J!J!JKKKL N""uQx|+a)uQx>>a%58~~E!HH775>>s   -BB)c                    d}d}	 t          t          |           |          S # t          $ r t          | |          cY S w xY w)zRe-quote the given URI.

    This function passes the given URI through an unquote/quote cycle to
    ensure that it is fully and consistently quoted.
    z!#$%&'()*+,/:;=?@[]~z!#$&'()*+,/:;=?@[]~)safe)r	   r"  r   )r  safe_with_percentsafe_without_percents      r\   requote_urir'  -  sk     /0	5 ',,3DEEEE 5 5 5 S3444444	5s   $ AA    mask	totalbitsc                "    d| z  dz
  || z
  z  }|S )a
  Converts a mask from /xx format to an integer
    to be used as a mask for IP's in int format
    Example: if mask is 24 function returns 0xFFFFFF00
             if mask is 24 and totalbits=128 function
                returns 0xFFFFFF00000000000000000000000000
    r   r}   )r)  r*  bitss      r\   _get_mask_bitsr-  A  s      $Y!OT!12DKr_      addrc                4    t          j        |           j        S )zCached check for whether an IP address is private. Avoids repeated
    ``ipaddress.ip_address()`` construction which is expensive, especially for IPv6.)	ipaddress
ip_address
is_private)r/  s    r\   is_private_ipr4  M  s     %%00r_   ipnetc                   |                     d          \  }}t          |           rt          |          rwt          j        dt	          j        |                     d         }t          t          |                    }t          j        dt	          j        |                    d         }nt          |           rt          |          rt          j        dt	          j	        t          j
        |                     \  }}|dz  |z  }t          t          |          d          }t          j        dt	          j	        t          j
        |                    \  }	}
|	dz  |
z  }ndS ||z  ||z  k    S )a!  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
             returns True if ip = 1:2:3:4::1 and net = 1:2:3:4::/64
    /z>Lr   z>QQrt      F)rQ   is_ipv4_addressstructunpacksocket	inet_atonr-  rM   is_ipv6_address	inet_ptonAF_INET6)r5  r6  netaddrr,  ipaddrnetmasknetwork
ipaddr_msb
ipaddr_lsbnetwork_msbnetwork_lsbs              r\   address_in_networkrJ  T  sG    IIcNNMGTr w77 tV%5b%9%9::1= T++-f&6w&?&?@@C			 !9!9 !'uf6FvXZ6[6[!\!\
J"j0 TC00#)=8HZa8b8b#c#c ["$3uW'G"344r_   c                l    ddd| z
  z  dz
  z  }t          j        t          j        d|                    S )zpConverts mask from /xx format to xxx.xxx.xxx.xxx

    Example: if mask is 24 function returns 255.255.255.0
    l    r   r(  z>I)r=  	inet_ntoar;  pack)r)  r,  s     r\   dotted_netmaskrN  k  s8    
 b4i1,,DFKd33444r_   	string_ipc                T    	 t          j        |            n# t          $ r Y dS w xY wdS NFT)r=  r>  rO   rO  s    r\   r:  r:  t  sB    ####   uu4s    
%%c                j    	 t          j        t           j        |            n# t          $ r Y dS w xY wdS rQ  r=  r@  rA  rO   rR  s    r\   r?  r?  |  sF    )4444   uu4s   " 
00abc                    	 t          j        t           j        |           t          j        t           j        |          k    S # t          $ r Y dS w xY w)zD
    Compare 2 IPs, uses socket.inet_pton to normalize IPv6 IPs
    FrT  )rU  rV  s     r\   compare_ipv6rX    sS    33v7GYZ7[7[[[   uus   ?A 
AAstring_networkc                \   |                      d          dk    r|                     d          \  }}t          |          dk    s|                                du rdS t	          |          }t          |          r|dk     s|dk    rdS n"t          |          r|dk     s|dk    rdS ndS dS dS )zD
    Very simple check of the cidr format in no_proxy variable.
    r8  r      Fr(  r9  T)countrQ   rd   isdigitrM   r:  r?  )rY  addressr)  mask_ints       r\   is_valid_cidrr`    s     C  A%%&,,S11t99>>T\\^^u445t997## 	!||x"}}u  -W%% 	!||x#~~u  . 5u4r_   env_name"typing.Generator[None, None, None]c              #    K   |du}|r.t           j                            |           }|t           j        | <   	 dV  |r"|t           j        | = dS |t           j        | <   dS dS # |r|t           j        | = n|t           j        | <   w xY w)zSet 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)rj   r   r   )ra  r   value_changed	old_values       r\   set_environrf    s       %M %JNN8,,	$
81 	1 Jx((('0
8$$$		1 	1= 	1 Jx(('0
8$0000s   A" "#Bno_proxyc                >   dd}|}| |d          }t          |           }|j        dS |rt          d	 |                    d
d                              d          D                       }t          |j                  st          |j                  rT|D ]P}t          |          rt          |j        |          r dS *|j        |k    r dS t          |j        |          r dS QnR|j        }|j
        r|d|j
         z  }|D ]4}|j                            |          s|                    |          r dS 5t          d|          5  	 t          |j                  }	n# t          t          j        f$ r d}	Y nw xY wddd           n# 1 swxY w Y   |	rdS dS )z:
    Returns whether we should bypass proxies or not.
    r   r=   r@   rw   c                    t           j                            |           p0t           j                            |                                           S r   )rj   r   r   upper)r   s    r\   	get_proxyz(should_bypass_proxies.<locals>.get_proxy  s1    z~~c""AbjnnSYY[[&A&AAr_   Nrg  Tc              3     K   | ]}||V  	d S r   r}   )r   rW   s     r\   r   z(should_bypass_proxies.<locals>.<genexpr>  s(      [[dVZ[T[[[[[[r_    r  ,:F)r   r=   r@   rw   )r   r   r   rS   rQ   r:  r?  r`  rJ  rX  portendswithrf  r   	TypeErrorr=  gaierror)
rv   rg  rk  no_proxy_argparsedno_proxy_listproxy_iphost_with_portrW   bypasss
             r\   should_bypass_proxiesrz    s]   B B B B
 L9Z((c]]Ft   [[h.>.>sB.G.G.M.Mc.R.R[[[[[6?++ 	 v/O/O 	 ) 	  	  **  )&/8DD $#tt$_00  44!&/8<<  44 	  $_N{ 4"3fk"3"33%    ?++D11  ^5L5LT5R5R    44 
 
Z	.	.  	!&/22FF6?+ 	 	 	FFF		                t5s6   FE$#F$E?<F>E??FFFdict[str, str]c                P    t                      }|si S t          | |          ri S |S )z/
    Return a dict of environment proxies.
    rg  )r   rz  )rv   rg  proxiess      r\   get_environ_proxiesr    s9     llG 	S8444 	r_   r~  &typing.Mapping[str, str | None] | Nonec                   |pi }|sdS t          |           }|j        .|                    |j        |                    d                    S |j        dz   |j        z   |j        d|j        z   dg}|j                                        dvr|j        }d}d|v r't          |                    dd                    \  }}	 t          ||          }|                    |          }|	                    |           |	                    |dz   |j        z              n# t          $ r Y nw xY wd}|D ]}	|	|v r
||	         } n|S )	zSelect 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all://zall://r8   +r   )maxsplit)r   r   r   schemer   r   rQ   r(   scheme_to_http_schemer   rJ   )
rv   r~  urlparts
proxy_keysmaybe_extension_schemeimplementationextension_classparent_schemeproxy	proxy_keys
             r\   select_proxyr  	  s    mG t}}H {{8?GKK,>,>??? 	%("338$$	J  '   "*(((5:;Q;W;WX[fg;W;h;h5i5i2"N	I,-C^TTO ,AABXYYMm,,,me3h6GGHHHH  	 	 	D	 E  	I&EE   Ls    D 
D('D(requestPreparedRequest | Requestdict[str, str] | None	trust_envc                r   ||ni }| j         }|
J d            t          |          }|                    d          }|                                }|rct	          ||          sRt          ||          }|                    ||                    d                    }|r|                    ||           |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 a 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
    Nz,PreparedRequest is not initialized correctlyrg  r}  r  )rv   parse_schemer   copyrz  r  
setdefault)	r  r~  r  rv   r  rg  new_proxiesenviron_proxiesr  s	            r\   resolve_proxiesr  <  s     !,gg"G
+C??J???#F{{:&&H,,..K 2.sXFFF 2-cHEEE##FO,?,?,F,FGG 	2""65111r_   niquestsr   c                    |  dt            S )z>
    Return a string representing the default user agent.
    r8  r   )r   s    r\   default_user_agentr  \  s     ""["""r_   r,   c                     t           dk    r%t          t                      t          ddd          S t          ddi          S )Nutlsz*/*z
keep-alive)z
User-AgentzAccept-EncodingAccept
Connectionr  )r-   r,   r  r>   r}   r_   r\   default_headersr  c  s[     &"022#:*	 
 
 	
 ,	
  r_   list[dict[str, str]]c                   g }d}|                      |          } | s|S t          j        d|           D ]}	 |                    dd          \  }}n# t          $ r |d}}Y nw xY wd|                     d          i}|                    d          D ]X}	 |                    d          \  }} n# t          $ r Y  n0w xY w|                      |          ||                     |          <   Y|                    |           |S )	zReturn 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"
    z '"z, *<rE   r   r  rv   z<> '"r   )r   rT   rQ   rP   r   )	r   linksreplace_charsvalrv   r   linkr   r   s	            r\   parse_header_linksr  w  sA    #%EMKK&&E x&&  	"))C++KC 	" 	" 	"rCCC	" syy**+\\#&& 	H 	HE"[[--
UU    .3[[-G-GD=))**TLs#   AA! A!B,,
B:9B:
new_schemec                    t          |           }|\  }}}}}}}	|j        }
|
s||
}}
|r|
rd                    ||
g          }
||}|d}t          ||
|d||	f          S )zGiven 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.
    @Nr  )r+   netlocr  r   )rv   r  ru  r  authrW   rp  r   queryfragmentr  s              r\   prepend_scheme_if_neededr    s     s^^F6<3FD$dE8 ]F $V * * 4.))~|vvtRABBBr_   tuple[str, str]c                   t          |           }|j        r	d|j        vrdS t          |j                            dd                    \  }}	 t	          |          t	          |          f}n# t
          t          f$ r d}Y nw xY w|S )zdGiven a url with authentication components, extract them into a tuple of
    username,password.
    ro  )r  r  r   )r+   r  r   rQ   r
   ro   rr  )rv   ru  usernamer   r  s        r\   get_auth_from_urlr    s     s^^F; #V[00vv{00a8899Hh!!78#4#45I&    Ks   A- -BBc                    t          |           \  }}}}}}|s||}}|                    dd          d         }t          |||||df          S )zF
    Given a url remove the fragment and the authentication part.
    r  r   r   r  )r   rsplitr   )rv   r  r  r   r   r  r  s          r\   urldefragauthr    sb     5=SMM1FFD&%  $V]]3""2&FvvtVUB?@@@r_   prepared_requestr1   Nonec                    t          | j        dd          }|Jt          | j        t                    r0	  || j                   dS # t
          $ r t          d          w xY wt          d          )zfMove file pointer back to its recorded starting position
    so it can be read again on redirect.
    rg   N;An error occurred when rewinding request body for redirect.+Unable to rewind request body for redirect.r   bodyr   _body_positionrM   rO   r   r  	body_seeks     r\   rewind_bodyr    s     (-vt<<I,<,KS!Q!Q	gI&566666 	g 	g 	g'(efff	g $$QRRRs   A A c                   K   t          | j        dd          }|Pt          | j        t                    r6	  || j                   d{V  dS # t
          $ r t          d          w xY wt          d          )z!Async counterpart of rewind_body.rg   Nr  r  r  r  s     r\   arewind_bodyr    s      (-vt<<I,<,KS!Q!Q	g),;<<<<<<<<<<< 	g 	g 	g'(efff	g $$QRRRs   A A(
definitionResolverType | Noner    c                H   | bt           j                            dd          }|t          j        |          } n+t          t
          j                                                  S t          | t                    r| S t          | t                    rt          j        |           g}nt          | t                    r| g}n|t          | t                    rX| s+t          t
          j                                                  S t          | d         t                    rd | D             }n| }nt          d          g }d}|D ]}t          |t                    r}|                    t          j        |                     |d         j        t
          j        k    rd}d	|d         v r.|d         j        d	         du rd|d         d
<   |d         j        d	= |                    |           d	|d         v r.|d         j        d	         du rd|d         d
<   |d         j        d	= |d         j        t
          j        k    rd}|s'|                    t          j        d                     |D ]$}d|vrd|vrd|vrt!          j                    |d<   %t%          d |D              S )AInstantiate a unique resolver, reusable across the Session scope.NNIQUESTS_DNS_URLr   c                6    g | ]}t          j        |          S r}   )r#   from_urlr   r   s     r\   
<listcomp>z#create_resolver.<locals>.<listcomp>  s$    LLLA+4Q77LLLr_   !invalid resolver definition givenFr   Tverify	cert_reqs system://default?hosts=localhostca_cert_dataca_cert_dirca_certsc                6    g | ]}|                                 S r}   newr   r   s     r\   r  z#create_resolver.<locals>.<listcomp>.  s     555a!%%''555r_   )rj   r   r   r#   r  r"   SYSTEMr  r   r    r=   r   rP   r   protocolkwargswassimagenerate_ca_bundler!   r  overrule_dnsresolver	resolverscan_resolve_localhostresolver_descriptionrds          r\   create_resolverr    s   z~~&8$??#,5lCCJJ&'7'>??CCEEE*l++ *c"" >'0<<=	J 3	4	4 
><	J	%	% > 	F&'7'>??CCEEEjmS)) 	"LLLLLHH!HH<===+-I"' ( ) )*C00 
	09:NOOPPP}%)9)@@@(,%9R=((Yr]-A(-Ku-T-T-.	"k*bM(2-...y}$$2)=h)G5)P)P)*IbM+&"$X.R=!%5%<<<$(!  [,56XYYZZZ  > >##R(?(?JVXDXDX!(!;!=!=B~55955566r_   AsyncResolverType | Noner$   c                H   | bt           j                            dd          }|t          j        |          } n+t          t
          j                                                  S t          | t                    r| S t          | t                    rt          j        |           g}nt          | t                    r| g}n|t          | t                    rX| s+t          t
          j                                                  S t          | d         t                    rd | D             }n| }nt          d          g }d}|D ]}t          |t                    r}|                    t          j        |                     |d         j        t
          j        k    rd}d	|d         v r.|d         j        d	         du rd|d         d
<   |d         j        d	= |                    |           d	|d         v r.|d         j        d	         du rd|d         d
<   |d         j        d	= |d         j        t
          j        k    rd}|s'|                    t          j        d                     |D ]$}d|vrd|vrd|vrt!          j                    |d<   %t%          d |D              S )r  Nr  r   c                6    g | ]}t          j        |          S r}   )r&   r  r  s     r\   r  z)create_async_resolver.<locals>.<listcomp>E  s$    QQQ09!<<QQQr_   r  Fr   Tr  r  r  r  r  r  c                6    g | ]}|                                 S r}   r  r  s     r\   r  z)create_async_resolver.<locals>.<listcomp>n  s     :::1quuww:::r_   )rj   r   r   r&   r  r"   r  r  r   r$   r=   r   rP   r   r  r  r  r  r%   r  s          r\   create_async_resolverr  1  s   z~~&8$??#1:<HHJJ+,<,CDDHHJJJ*/00 *c"" >,5jAAB	J 8	9	9 
><	J	%	% > 	K+,<,CDDHHJJJjmS)) 	"QQjQQQHH!HH<===02I"' ( ) )*C00 
	5>?STTUUU}%)9)@@@(,%9R=((Yr]-A(-Ku-T-T-.	"k*bM(2-...y}$$2)=h)G5)P)P)*IbM+&"$X.R=!%5%<<<$(!  `1:;]^^___  > >##R(?(?JVXDXDX!(!;!=!=B~::	:::;;r_   disable_ipv4disable_ipv6socket.AddressFamilyc                R    | rt           j        S |rt           j        S t           j        S r   )r=  rA  AF_INET	AF_UNSPEC)r  r  s     r\   resolve_socket_familyr  q  s+      ~r_   responseAsyncResponse | Responsec                    | j         }t          |j                  dk    o|j        d         t          u}|r|j        d         | _         d S |                                d         | _         d S )Nr   r   )	__class__rd   	__bases__object__subclasses__)r  response_classis_asyncs      r\   _swap_contextr  y  sp    'N>+,,1_n6Nq6QY_6_H @+5a8+::<<Q?r_   ConnectionInfo | Nonec                    | d S t                      }t          |                                           D ]\  }}t          |||           |S r   )r   varsr   setattr)r`   nattrr  s       r\   _deepcopy_cir    sR    ytA!WW]]__  	c4Hr_      default
max_lengthc           	     n   	 | d|                      dd|dz                      }n~# t          $ rq}||cY d}~S 	 | d|                      dd|dz                      }|                                cY d}~S # t          $ r Y nw xY wt          d| d|  d          |d}~ww xY w|                                S )zWe tend to extract url scheme often enough, but we were crazy
    enough to use urlparse for it...! We were wasting precious CPU cycles.
    Return used scheme url, lowercased.Nr  r   ro  zInvalid URL z0: No scheme supplied. Perhaps you meant https://rH   )indexrP   r   r   )rv   r  r  r  r   outsider_schemes         r\   r  r    s   q:syy:>:::; q q qNNNNNN	!"ECIIc1j1n$E$E"EFO"((******** 	 	 	D	 h3hhbehhhiioppq <<>>s<   "% 
B BB 5A4.B 4
B>B BBB basec                   t          | d          }|r	|t          v rt          | |          S d| t          |          d         z   }t          ||          }|                    d          r||t          d          d         z   S |S )zGRFC 3986 relative join that also works for niquests' synthetic schemes.r  r  r:   Nzhttps://)r  r   r   rd   
startswith)r  rv   r  tempjoineds        r\   urljoin_safer    s    $+++F  "V},,tS!!! T#f++--((DT3F
 $$ /s7||~~...Mr_   	conn_infoc                    | | j         | j        dS d t          | j                            dg                     D             }|sdS dS )NFc                <    g | ]}|                     d           |S zhttp://r  r   eps     r\   r  z#is_ocsp_capable.<locals>.<listcomp>  <        ==##	
  r_   OCSPTcertificate_dercertificate_dictr   r   r  	endpointss     r\   is_ocsp_capabler     sl    I5=A[Acu  y155fbAABB  I  u4r_   c                    | | j         | j        dS d t          | j                            dg                     D             }|sdS dS )NFc                <    g | ]}|                     d           |S r  r  r  s     r\   r  z"is_crl_capable.<locals>.<listcomp>  r  r_   crlDistributionPointsTr  r  s     r\   is_crl_capabler$    sm    I5=A[Acu  y1556MrRRSS  I  u4r_   revocation_configurationRevocationConfiguration | Nonec                    t          |           sdS |dS |j        t          j        t          j        hv rdS t          |           sdS dS rQ  )r$  strategyr   
PREFER_CRL	CHECK_ALLr   r  r%  s     r\   should_check_crlr,    s\    )$$ u'u(-?-JL^Lh,iiit9%% t5r_   c                    t          |           sdS |dS |j        t          j        t          j        hv rdS t          |           sdS dS rQ  )r   r(  r   PREFER_OCSPr*  r$  r+  s     r\   should_check_ocspr/    s\    9%% u'u(-?-KM_Mi,jjjt)$$ t5r_   	extensiontype[ExtensionFromHTTP]c                   	
 ddl mmmmm	m
 ddl m ddlm	m
mm ddlm ddlm ddlm ddlm  G 	
fdd	|           }|S )
z
    We want to properly map exceptions from below (urllib3-future) into our own exceptions.
    This function purposely wrap the extension class to achieve that.
    Warning: synchronous context only!
    r   ChunkedEncodingErrorConnectionErrorContentDecodingErrorInvalidHeader
ProxyErrorReadTimeoutSSLErrorClosedPoolErrorDecodeErrorProtocolErrorReadTimeoutError	HTTPErrorr7  r8  c                  z     e Zd Zd		
 f	dZd
	
 fdZd	
 fdZ xZS ):wrap_extension_for_http.<locals>._WrappedExtensionFromHTTPr@   str | bytes | Nonec                   	 	  t                      j        |i |S # $ r} |          d }~w$ r} |          d }~w	$ r} |          d }~w$ r} 
|          d }~ww xY wr   supernext_payloadselfargsr  r   r4  r6  r>  r?  r9  r@  RequestsSSLError	_SSLErrorr  s       r\   rK  zGwrap_extension_for_http.<locals>._WrappedExtensionFromHTTP.next_payload*  s    	*+uww+T<V<<<  . . .**1--- . . .**1---# % % %!k!nn$ * * *&&q)))*s3    A*,A*?A*AA*A%%A*bufstr | bytesr  c                   	 t                                          |           d S # t          f$ r} |          d }~w$ r} |          d }~w$ r} |          d }~wf$ rW}t          |          r |          t          |
          r 	|          t          |          r |           d }~ww xY wr   rJ  send_payloadrO   r   rM  rQ  errr   r=  r5  r7  r?  r8  r9  r@  rO  
_HTTPError_InvalidHeader_ProxyErrorrP  r  s       r\   rU  zGwrap_extension_for_http.<locals>._WrappedExtensionFromHTTP.send_payload6  s(   $$S)))))!7+ + + +%oc***" ) ) )%oa((( $ $ $ jmm#z*   a++ **1---#344 %+a..(>22 '-***s7   !& C=CACA##
C-AB??Cc                   	 t                                                       d S # t          f$ r} |          d }~w$ r} |          d }~w$ r} |          d }~wf$ rW}t          |          r 
|          t          |	          r |          t          |          r |           d }~ww xY wr   rJ  closerO   r   rM  rW  r   r=  r5  r7  r?  r8  r9  r@  rO  rX  rY  rZ  rP  r  s      r\   r]  z@wrap_extension_for_http.<locals>._WrappedExtensionFromHTTP.closeI  s   !7+ + + +%oc***" ) ) )%oa((( $ $ $ jmm#z*   a++ **1---#344 %+a..(>22 '-***s7    % C<CACA""
C,AB>>Cr@   rG  rQ  rR  r@   r  r@   r  __name__
__module____qualname__rK  rU  r]  __classcell__r  r4  r=  r5  r6  r>  r7  r?  r8  r9  r@  rO  rX  rY  rZ  rP  s   @r\   _WrappedExtensionFromHTTPrF  )         
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	*	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	&	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r_   rh  
exceptionsr4  r5  r6  r7  r8  r9  r;  packages.urllib3.exceptionsr=  r>  r?  r@  rB  )r0  rh  r4  r=  r5  r6  r>  r7  r?  r8  r9  r@  rO  rX  rY  rZ  rP  s     @@@@@@@@@@@@@@@r\   wrap_extension_for_httprm    s                                                      1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1I 1 1 1f %$r_   type[AsyncExtensionFromHTTP]c                   	
 ddl mmmmm	m
 ddl m ddlm	m
mm ddlm ddlm ddlm ddlm  G 	
fdd	|           }|S )
z
    We want to properly map exceptions from below (urllib3-future) into our own exceptions.
    This function purposely wrap the extension class to achieve that.
    Warning: asynchronous context only!
    r   r3  r:  r<  rA  rC  rD  c                  z     e Zd Zd		
 f	dZd
	
 fdZd	
 fdZ xZS )Easync_wrap_extension_for_http.<locals>._AsyncWrappedExtensionFromHTTPr@   rG  c                   	K   	  t                      j        |i | d {V S # $ r} |          d }~w$ r} |          d }~w	$ r} |          d }~w$ r} 
|          d }~ww xY wr   rI  rL  s       r\   rK  zRasync_wrap_extension_for_http.<locals>._AsyncWrappedExtensionFromHTTP.next_payload  s      	*1UWW14B6BBBBBBBBB  . . .**1--- . . .**1---# % % %!k!nn$ * * *&&q)))*s5   $ A24A2AA2AA2"A--A2rQ  rR  r  c                  K   	 t                                          |           d {V  d S # t          f$ r} |          d }~w$ r} |          d }~w$ r} |          d }~wf$ rW}t          |          r |          t          |
          r 	|          t          |          r |           d }~ww xY wr   rT  rV  s       r\   rU  zRasync_wrap_extension_for_http.<locals>._AsyncWrappedExtensionFromHTTP.send_payload  s>     gg**3///////////!7+ + + +%oc***" ) ) )%oa((( $ $ $ jmm#z*   a++ **1---#344 %+a..(>22 '-***s9   '. CACAC A++
C5ACCc                  K   	 t                                                       d {V  d S # t          f$ r} |          d }~w$ r} |          d }~w$ r} |          d }~wf$ rW}t          |          r 
|          t          |	          r |          t          |          r |           d }~ww xY wr   r\  r^  s      r\   r]  zKasync_wrap_extension_for_http.<locals>._AsyncWrappedExtensionFromHTTP.close  s8     ggmmoo%%%%%%%%%!7+ + + +%oc***" ) ) )%oa((( $ $ $ jmm#z*   a++ **1---#344 %+a..(>22 '-***s9   &- CACACA**
C4ACCr_  r`  ra  rb  rg  s   @r\   _AsyncWrappedExtensionFromHTTPrq    ri  r_   ru  rj  )r0  ru  r4  r=  r5  r6  r>  r7  r?  r8  r9  r@  rO  rX  rY  rZ  rP  s     @@@@@@@@@@@@@@@r\   async_wrap_extension_for_httprv  _  s                                                      1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1f *)r_   excr   c                    t                      }| }|rI||vrEt          |t          j                  rdS |                    |           |j        p|j        }|r||vEdS )NTF)setr   asyncioCancelledErroradd	__cause____context__)rw  seencurs      r\   is_cancelled_error_root_causer    sp    55D #C
 /#T//c7122 	4m.s	  /#T//
 5r_   datar   c                    t          | g d                                          }|/|j        dk    r	|j        rdS |j                            dd          S d S )N)r   zutf-16zutf-32z	utf-16-lez	utf-16-bez	utf-32-lez	utf-32-be)cp_isolationutf_8z	utf-8-sigr   -)r   bestr   bomrS   )r  encoding_guesss     r\   guess_json_utfr    sw    
 
 
   dff  !"g--.2D-;&..sC8884r_   base_urlc                    d S r   r}   r  rv   s     r\   merge_base_urlr    s    =@Sr_   c                    d S r   r}   r  s     r\   r  r    s    ;>3r_   c                    | ||S t          |d          dk    r@|                     d          r
| d d         } |r|                    d          sd| }| |z   S |S )Nr  r  r8  r   )r  rq  r  r  s     r\   r  r    s    3;
C$$$**S!! 	%}H 	s~~c** 	c))C#~Jr_   )r@   rA   )rW   r=   r@   rA   )r`   ra   r@   rM   )F)rv   rw   rx   rA   r@   ry   )r   r   r@   rw   )r   r   r@   r   )r   r   r@   r   )r   r   r@   r   )r   r=   r@   r   )r   r=   r@   r   )r   r=   r   rA   r@   r=   )r   r   r@   r   )r   r/   r@   r   )r   r=   r@   r   )r   r   r@   rw   )r   r   r   r3   r@   r   )r   r  r   r3   r@   r  )r  r  r  r  r@   r  )r  r=   r@   r=   )r(  )r)  rM   r*  rM   r@   rM   )r/  r=   r@   rA   )r5  r=   r6  r=   r@   rA   )r)  rM   r@   r=   )rO  r=   r@   rA   )rU  r=   rV  r=   )rY  r=   r@   rA   )ra  r=   r   rw   r@   rb  )rv   r=   rg  rw   r@   rA   r   )rv   r=   rg  rw   r@   r{  )rv   r=   r~  r  r@   rw   )T)r  r  r~  r  r  rA   r@   r{  )r  )r   r=   r@   r=   )r@   r,   )r   r=   r@   r  )rv   r=   r  r=   r@   r=   )rv   r=   r@   r  )rv   r=   r@   r=   )r  r1   r@   r  )r  r  r@   r    )r  r  r@   r$   )r  rA   r  rA   r@   r  )r  r  r@   r  )r`   r  r@   r  )Nr  )rv   r=   r  rw   r  rM   r@   r=   )r  r=   rv   r=   r@   r=   )r  r  r@   rA   )r  r  r%  r&  r@   rA   )r0  r1  r@   r1  )r0  rn  r@   rn  )rw  r   r@   rA   )r  r   r@   rw   )r  rw   rv   r  r@   r  )r  rw   rv   r=   r@   r=   )r  rw   rv   rw   r@   rw   )__doc__
__future__r   rz  r   
contextlibrm   r1  rj   rT   r=  r;  sysr   typingcollectionsr   	functoolsr   http.cookiejarr   r   r   urllib.parser	   r
   r   r   r   r   urllib.requestr   r   r   r   r   r   platformr  charset_normalizerr   r   _compatr   rk  r   r   r   extensions.revocationr   r   packages.urllib3r   !packages.urllib3.contrib.resolverr    r!   r"   r#   (packages.urllib3.contrib.resolver._asyncr$   r%   r&   &packages.urllib3.contrib.webextensionsr'   r(   -packages.urllib3.contrib.webextensions._asyncr)   packages.urllib3.utilr*   r+   
structuresr,   packages.urllib3.contrib.anytlsr-   rJ   TYPE_CHECKINGr   r/   modelsr0   r1   r2   r3   r4   r5   r   r;   __annotations__r  rQ   r>   r]   rs   r   r   contextmanagerr   r   TypeVarr   r   r   r   r   r   r   r   r   r   r  r
  r=   r   r  r  	frozensetr  r"  r'  r-  r4  rJ  rN  r:  r?  rX  r`  rf  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r$  r,  r/  rm  rv  r  r  overloadr  r}   r_   r\   <module>r     s	     # " " " " "       				     				 				   



   # # # # # #       $ $ $ $ $ $ ( ( ( ( ( ( ( ( U U U U U U U U U U U U U U U U            A @ @ @ @ @<<NNNNG ) ) ) ) ) ) $ $ $ $ $ $ ( ( ( ( ( ( H H H H H H H H H H N N N N N N N N , , , , , ,                    
 V U U U U U U U Q Q Q Q Q Q : : : : : : : : + + + + + +8888888   GGG 
 8******IIIIIIIIIIII77777777 YY[[$$
$%;<< ")+c : : : : : :  $yy'<<X\;];];]^o;p)q)qrr  r r r r <7% % % %N	/ 	/ 	/ 	/03 03 03 03f 2' ' ' ' 'T          2 fnUfnU   <   >   D    0   0 0 0 0% % % %:   .   &   * fnUC''    dee   ,5 5 5 5(	 	 	 	 	 31 1 1 15 5 5 5.5 5 5 5            2 1 1 1 1*: : : :z    0 0 0 0l     @# # # # #   (       FC C C C6   &A A A AS S S S	S 	S 	S 	S=7 =7 =7 =7@=< =< =< =<@   @ @ @ @	 	 	 	    ,   .   &   $        Z% Z% Z% Z%zZ* Z* Z* Z*z      ,  @ @ @  @  > > >  >     s   %C, ,C65C6