
    |gN                        d dl Z d dlZd dlZd dlZd dlmZmZmZ d dlm	Z	 d dl
mZmZ d dlmZ d dlmZmZmZmZ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Zd dl m!Z!m"Z"m#Z# d d	l$m%Z& d
dl'm(Z(m)Z) ddddddZ* e+e      Z, e+e      Z- e+d      Z. e/       Z0 ejb                  dejd                        Z3ee4e5e6f   Z7ee7df   Z8ede4ddf   Z9 ed      Z:ejv                  dk\  rd dlm<Z< neZ< G d de      Z= G d ded      Z> G d ded      Z?de:d e:fd!Z@d"d#d eAe4   fd$ZBe@ G d% d&             ZCd'ee4df   d(e4d ee4df   fd)ZDd*ZE eeE      d+e4d e4fd,       aF eeE      d-e4d e4fd.       aG eeE      d/e4d eHe4e5f   fd0       aI eeE      d-e4d dfd1       aJe@d:d2       ZKe@d e=fd3       ZLe@eEeEeEeEd4d5ee5df   d6ee5df   d7ee5df   d8ee5df   d df
d9       ZMy);    N)IterableMappingSequence)suppress)
_CacheInfo	lru_cache)
ip_address)TYPE_CHECKINGAnySupportsIntTuple	TypedDictTypeVarUnionoverload)SplitResult	parse_qslquoteurlsplituses_netlocuses_relative)	MultiDictMultiDictProxyistr)under_cached_property   )_Quoter	_UnquoterP   i     )httphttpswswssftpa<  
        # any character not in the unreserved or sub-delims sets, plus %
        # (validated with the additional check for pct-encoded sequences below)
        [^a-z0-9\-._~!$&'()*+,;=%]
    |
        # % only allowed if it is part of a pct-encoded
        # sequence of 2 hex digits.
        %(?![0-9a-f]{2})
    zSequence[SimpleQuery]zMapping[str, QueryVariable]z#Sequence[Tuple[str, QueryVariable]]_T)      )Selfc                   :    e Zd ZU dZeed<   eed<   eed<   eed<   y)	CacheInfozHost encoding cache.idna_encodeidna_decoder	   host_validateN)__name__
__module____qualname____doc__r   __annotations__     F/var/www/html/pythonbot/venv/lib/python3.12/site-packages/yarl/_url.pyr+   r+   I   s    r5   r+   c                   @    e Zd ZU eed<   eed<   eed<   eed<   eed<   y)_SplitResultDictschemenetlocpathqueryfragmentN)r/   r0   r1   strr3   r4   r5   r6   r8   r8   R   s    KK
IJMr5   r8   F)totalc                      e Zd ZU ded<   eed<   eed<   eed<   eedf   ed<   eed<   eedf   ed	<   eedf   ed
<   eedf   ed<   eedf   ed<   eedf   ed<   eedf   ed<   eedf   ed<   eedf   ed<   eedf   ed<   eed<   eed<   ee	eef      ed<   ded<   eed<   eed<   eed<   eed<   eed<   eed<   e	edf   ed<   e	edf   ed<   ded <   eed!<   eed"<   eed#<   eed$<   e	edf   ed%<   e	edf   ed&<   y)'_InternalURLCacheURL_originabsoluter9   raw_authorityN_default_port	authorityraw_useruserraw_passwordpasswordraw_hosthosthost_subcomponentportexplicit_portraw_pathr;   _parsed_queryMultiDictProxy[str]r<   raw_query_stringquery_stringpath_qsraw_path_qsraw_fragmentr=   .	raw_partspartsparentraw_namename
raw_suffixsuffixraw_suffixessuffixes)
r/   r0   r1   r3   boolr>   r   intlisttupler4   r5   r6   rA   rA   [   sH   NNKd##NCI
T	
T	""CICI
T	
S$Y''
T	
d##M
Ic3h((  LMS#Xc?MM
IOKS/!CHor5   rA   objreturnc                     d| _         | S )Nyarl)r0   )rf   s    r6   rewrite_modulerj      s    CNJr5   segmentsSequence[str]c                     g }| D ]G  }|dk(  r)t        t              5  |j                          ddd       1|dk7  s7|j                  |       I | r| d   dv r|j                  d       |S # 1 sw Y   oxY w)z1Drop '.' and '..' from a sequence of str segments..N.ro   rn    )r   
IndexErrorpopappend)rk   resolved_pathsegs      r6   _normalize_path_segmentsrx      s      "M &$; *% $!!#$ $CZ  %& HRLK/ 	R $ $s   A++A4	c                   b
   e Zd ZU dZ ed      Z e       Z eddd      Z edd      Z edd	d
d      Z	 edd	d
      Z
 edd
d      Z edd      Z ed      Z e       Z ed      Z edd      Z ed
      Zeed<   	 dddddeeed f   dedeedf   defdZeddddddddddddded ed!eedf   d"eedf   d#ed$eedf   d%ed&eedf   d'ed(ededd fd)       Zededd fd*       Zd+ Zdefd,Z e!ded-ed.ed&ed(edefd/       Z"defd0Z#de$fd1Z%d2e&defd3Z'defd4Z(d2e&defd5Z)d2e&defd6Z*d2e&defd7Z+d2e&defd8Z,d9edd fd:Z-d&edd fd;Z.defd<Z/de0e   fd=Z1d> Z2dd?Z3defd@Z4defdAZ5ddBZ6e7ddC       Z8ddDZ9e7defdE       Z:e7defdF       Z;e7defdG       Z<e7deedf   fdH       Z=e7defdI       Z>e7deedf   fdJ       Z?e7deedf   fdK       Z@e7deedf   fdL       ZAe7deedf   fdM       ZBe7deedf   fdN       ZCe7deedf   fdO       ZDe7deedf   fdP       ZEe7deedf   fdQ       ZFe7deedf   fdR       ZGe7defdS       ZHe7defdT       ZIe7defdU       ZJe7deKe0eef      fdV       ZLe7ddW       ZMe7defdX       ZNe7defdY       ZOe7defdZ       ZPe7defd[       ZQe7defd\       ZRe7defd]       ZSe7de0ed^f   fd_       ZTe7de0ed^f   fd`       ZUe7dda       ZVe7defdb       ZWe7defdc       ZXe7defdd       ZYe7defde       ZZe7de0ed^f   fdf       Z[e7de0ed^f   fdg       Z\e!ddh       Z]ddidjdedd fdkZ^ed%edefdl       Z_ee`d#ede0eeeedf   eeef   fdm              Zaed#ednedefdo       Zbee`	 dd!eedf   d"eedf   d#eedf   d$eedf   dpedefdq              Zcee`d-ede0eedf   eedf   eedf   eedf   f   fdr              Zddedd fdsZed!eedf   dd fdtZfd"eedf   dd fduZgd#edd fdvZhd$eedf   dd fdwZiddxd%ededd fdyZjdzeke0eeelf   emf      defd{Zne!d|emdefd}       Zodzeke0eeelf   ef      defd~Zpdeqdeqdeedf   fdZresd&edd fd       Ztesdemdd fd       Ztdeqdeqdd fdZtesd&edd fd       Zuesdemdd fd       Zudeqdeqdd fdZuesd&edd fd       Zvesdemdd fd       Zvdeqdeqdd fdZvdedd fdZwd(eedf   dd fdZxd9edd fdZydedd fdZzddZ{ddxd2ededd fdZ|defdZ}y)rB   )_cache_valF)requotez@:z/+)safe	protectedr|   )r}   r~   z?/:@z=+&;T)r}   r~   qsr|   )r}   r~   r   )r}   r   r|   )r}   r|   )r}   +)unsafez/%)ignorer   )r   r{   rr   N)encodedstrictvalr   r   rg   c                   |t        j                  d       t        |      t        u rt	        |      }n]t        |      | u r|S t        |      t
        u r|s;t        d      t        |t              rt	        t        |            }nt        d      i }|s|\  }}}}}	|sd}
nd|v sd|v sd|v r| j                  |      \  }}}
}nd x}x}}|}
|
|t        v rd| d	}t        |      d}
| j                  |
d
      }
d|
v r|
dd n|
|d<   ||d<   ||||
}d |d<   d |d<   nH|r| j                  |      n|}|r| j                  |      n|}| j                  |||
|      }||d<   ||d<   |r@| j                  |      }|r-d|v r| j                  |      }|d   dk7  r| j!                          |r| j#                  |      n|}|	r| j%                  |	      n|	}	||d<   ||d<   |	|d<   |j&                  |k7  s-|j(                  |k7  s|j*                  |k7  s|j,                  |	k7  rt        |||||	      }t.        j1                  |       }||_        ||_        |S )Nzstrict parameter is ignoredz$Cannot apply decoding to SplitResultz#Constructor parameter should be strrr   :@[z9Invalid URL: host is required for absolute urls with the  schemeFvalidate_hostr   rp   rL   rP   rH   rJ   ro   r   /r9   rT   rX   )warningswarntyper>   r   r   
ValueError
isinstance	TypeError_split_netlocSCHEME_REQUIRES_HOST_encode_host	_REQUOTER_make_netloc_PATH_REQUOTER_normalize_path%_raise_for_authority_missing_abs_path_QUERY_REQUOTER_FRAGMENT_REQUOTERr:   r;   r<   r=   object__new__r{   rz   )clsr   r   r   cacher9   r:   r;   r<   r=   rM   usernamerK   rO   msgrH   rJ   selfs                     r6   r   zURL.__new__   s    MM7893-C#Y#J#Y+% !GHHS!3s8$CABB#%471FFD%&=C6MSF]585F5Fv5N2Hhd155H5x$!D<!5566<XWF  )o-!''E'B25+D2J4j!)-o&<H$49I!F(,E*%,0E.):Bs}}X6H>F3==#:HL --hdDQF(0E*%,8E.)))$/d{"2248Aw#~AAC27C''.UE;Cs--h7H$E(O(-E$%$,E.!
 

f$88t#99%<<8+!&&$xH~~c"	r5   )r9   rG   rI   rK   rM   rO   r;   r<   rU   r=   r   r9   rG   rI   rK   rM   rO   r;   r<   rU   r=   c          	         |r|s|s|s|rt        d      |t        |t              st        d      |r|st        d      |r|	rt        d      |
||||	|
t        d      |rH|r|}n:|r=||t        j                  |      k(  rdn|}||||}n| j                  ||||      }nd}nd}|r.| j                  |      \  }}}}|r| j                  |d	      nd}n|r| j                  |d
	      }nd}|<||t        j                  |      k(  rdn|}||||}n| j                  ||||d
      }|r| j                  |      n|}|r/r-d|v r| j                  |      }|d   dk7  r| j                          |	r| j                  |	      n|	}	|
r| j                  |
      n|
}
| j                  t        |||	|
            }|r|j!                  |      S |S )zCreates and returns a new URLz@Can't mix "authority" with "user", "password", "host" or "port".NzThe port is required to be int.z/Can't build URL with "port" but without "host".z6Only one of "query" or "query_string" should be passedz}NoneType is illegal for "scheme", "authority", "host", "path", "query_string", and "fragment" args, use empty string instead.rr   Fr   Tro   r   r   )r   r   rc   r   DEFAULT_PORTSgetr   r   r   _PATH_QUOTERr   r   _QUERY_QUOTER_FRAGMENT_QUOTER	_from_valr   
with_query)r   r9   rG   rI   rK   rM   rO   r;   r<   rU   r=   r   r:   _hosturls                  r6   buildz	URL.buildP  sA   $ $(ddS  JtS$9=>>OPP\UVVN ||#Q 
 "##'=+<+<V+D#D4$D<DLX5E!F --dHdDIF&*E.1.?.?	.J+htHM((e(DSU((T(B ##'=+<+<V+D#D4$D<DLX5E"F --dHeT4PF-13##D)tD$;..t4D7c>==? 4@!!,/\  :Bs++H5xHmmKlHUV>>%((
r5   c                 L    t         j                  |       }||_        i |_        |S )z$Create a new URL from a SplitResult.)r   r   r{   rz   )r   r   r   s      r6   r   zURL._from_val  s%     ~~c"	r5   c                      t        d| d      )NzInheriting a class z from URL is forbidden)r   )r   s    r6   __init_subclass__zURL.__init_subclass__  s    -cW4JKLLr5   c                 Z   | j                   }|\  }}}}}|j                  s&|j                  r|j                  s|j                  rd}| j
                  x}C|| j                  k(  r4| j                  }| j                  | j                  | j                  |d       }| j                  |||||      S )Nr   )r{   r;   r:   r<   r=   rP   rF   rN   r   rH   rJ   _unsplit_result)	r   r   r9   r:   r;   r<   r=   rO   rM   s	            r6   __str__zURL.__str__  s    ii03-eXxxCJJCIID&&&D3@R@R8R ))D&&t}}d6G6GtTF##FFD%JJr5   r:   r   c                     |s| r| t         v s|dd dk(  r"|r|dd dk7  rd|xs d d| }nd|xs d | }| r|  d| }|r| d| }|r| d	| S |S )
z(Unsplit a URL without any normalization.N   z//r   r   rr   r   ?#)USES_AUTHORITY)r9   r:   r   r<   r=   s        r6   r   zURL._unsplit_result  s    
 f>!9c"1gos2Aw#~6<R.#/6<R..HAcU#CE5'"C&.#az"7C7r5   c                 L    | j                   j                   dt        |        dS )Nz('z'))	__class__r/   r>   r   s    r6   __repr__zURL.__repr__  s$    ..))*"SYKr::r5   c                 6    t        |       j                  d      S )Nascii)r>   encoder   s    r6   	__bytes__zURL.__bytes__  s    4y((r5   otherc                    t        |      t        urt        S | j                  }|j                  s|j
                  r|j                  d      }|j                  }|j                  s|j
                  r|j                  d      }||k(  S )Nr   r;   )r   rB   NotImplementedr{   r;   r:   _replace)r   r   val1val2s       r6   __eq__z
URL.__eq__  sj    ;c!!!yyyyT[[==c=*DzzyyT[[==c=*Dt|r5   c                     | j                   j                  d      }|P| j                  }|j                  s|j                  r|j                  d      }t        |      x}| j                   d<   |S )Nhashr   r   )rz   r   r{   r;   r:   r   r   )r   retr   s      r6   __hash__zURL.__hash__  s[    kkoof%;))C88

lll,(,S	1C$++f%
r5   c                 b    t        |      t        urt        S | j                  |j                  k  S Nr   rB   r   r{   r   r   s     r6   __le__z
URL.__le__  '    ;c!!!yyEJJ&&r5   c                 b    t        |      t        urt        S | j                  |j                  k  S r   r   r   s     r6   __lt__z
URL.__lt__  '    ;c!!!yy5::%%r5   c                 b    t        |      t        urt        S | j                  |j                  k\  S r   r   r   s     r6   __ge__z
URL.__ge__  r   r5   c                 b    t        |      t        urt        S | j                  |j                  kD  S r   r   r   s     r6   __gt__z
URL.__gt__  r   r5   r]   c                 d    t        |t              st        S | j                  t        |      f      S r   )r   r>   r   _make_childr   r]   s     r6   __truediv__zURL.__truediv__   s)    $$!!T--r5   c                 $    | j                  |      S r   )update_queryr   r<   s     r6   __mod__zURL.__mod__  s      ''r5   c                     | j                   }t        |j                  xs( |j                  xs |j                  xs |j
                        S r   )r{   rb   r:   r;   r<   r=   r   r   s     r6   __bool__zURL.__bool__  s5    iiCJJG#((GciiG3<<HHr5   c                     | j                   fS r   )r{   r   s    r6   __getstate__zURL.__getstate__  s    		|r5   c                 ~    |d   (t        |d   t              r|d   d   | _        i | _        y |^| _        }i | _        y )Nr   r   r{   )r   dictr{   rz   )r   stateunuseds      r6   __setstate__zURL.__setstate__  sG    8
58T :a(DI  "'DIr5   c                     | j                   }| j                  | j                  j                        \  |d<   |d<   |d<   |d<   y)z"Cache the netloc parts of the URL.rH   rJ   rL   rP   N)rz   r   r{   r:   )r   r   s     r6   _cache_netloczURL._cache_netloc  sJ     tyy//0	
*.!*/"r5   c                     | j                   S )zA check for absolute URLs.

        Return True for absolute ones (having scheme or starting
        with //), False otherwise.

        Is is preferred to call the .absolute property instead
        as it is cached.
        )rD   r   s    r6   is_absolutezURL.is_absolute!  s     }}r5   c                 n    | j                   x}| j                  j                  dk7  S || j                  k(  S )zA check for default port.

        Return True if port is default for specified scheme,
        e.g. 'http://python.org' or 'http://python.org:80', False
        otherwise.

        Return False for relative URLs.

        rr   )rP   r{   r:   rF   )r   explicits     r6   is_default_portzURL.is_default_port,  s=     ***H3 99##r))4----r5   c                     | j                   S )z}Return an URL with scheme, host and port parts only.

        user, password, path, query and fragment are removed.

        )rC   r   s    r6   originz
URL.origin=  s     ||r5   c                 \   | j                   }|j                  st        d      |j                  st        d      d|j                  vr|j	                  ddd      }n?| j
                  }| j                  dd|| j                        }|j	                  |ddd      }| j                  |      S )z|Return an URL with scheme, host and port parts only.

        user, password, path, query and fragment are removed.
        URL should be absolutezURL should have schemer   rr   r;   r<   r=   N)r:   r;   r<   r=   )	r{   r:   r   r9   r   rN   r   rP   r   )r   vr   encoded_hostr:   s        r6   rC   zURL._originF  s     IIxx566xx566ahh**"B*<C11L&&tT<ASASTF**F2*KC~~c""r5   c                     | j                   j                  st        d      | j                   j                  dd      }| j	                  |      S )zhReturn a relative part of the URL.

        scheme, user, password, host and port are removed.

        r   rr   )r9   r:   )r{   r:   r   r   r   r   s     r6   relativezURL.relativeY  sE     yy566ii  2 6~~c""r5   c                 4    | j                   j                  dk7  S )zA check for absolute URLs.

        Return True for absolute ones (having scheme or starting
        with //), False otherwise.

        rr   r{   r:   r   s    r6   rD   zURL.absoluted  s     yy2%%r5   c                 .    | j                   j                  S )zdScheme for absolute URLs.

        Empty string for relative URLs or URLs starting with //

        )r{   r9   r   s    r6   r9   z
URL.schemer       yyr5   c                 .    | j                   j                  S )zQEncoded authority part of URL.

        Empty string for relative URLs.

        r   r   s    r6   rE   zURL.raw_authority{  r  r5   c                 T    t         j                  | j                  j                        S )z1Default port for the scheme or None if not known.)r   r   r{   r9   r   s    r6   rF   zURL._default_port  s       !1!122r5   c                 z    | j                  | j                  | j                  | j                  | j                        S )zQDecoded authority part of URL.

        Empty string for relative URLs.

        )r   rI   rK   rM   rO   r   s    r6   rG   zURL.authority  s+       DMM499diiPPr5   c                 @    | j                          | j                  d   S )zEEncoded user part of URL.

        None if user is missing.

        rH   r   rz   r   s    r6   rH   zURL.raw_user  s     	{{:&&r5   c                 B    | j                   }|y| j                  |      S )zEDecoded user part of URL.

        None if user is missing.

        N)rH   	_UNQUOTER)r   rH   s     r6   rI   zURL.user  s%     ==~~h''r5   c                 @    | j                          | j                  d   S )zMEncoded password part of URL.

        None if password is missing.

        rJ   r  r   s    r6   rJ   zURL.raw_password  s     	{{>**r5   c                 B    | j                   }|y| j                  |      S )zMDecoded password part of URL.

        None if password is missing.

        N)rJ   r  )r   rJ   s     r6   rK   zURL.password  s'     ((~~l++r5   c                 @    | j                          | j                  d   S )zEncoded host part of URL.

        None for relative URLs.

        When working with IPv6 addresses, use the `host_subcomponent` property instead
        as it will return the host subcomponent with brackets.
        rL   r  r   s    r6   rL   zURL.raw_host  s     	{{:&&r5   c                 l    | j                   x}y|r|d   j                         sd|v r|S t        |      S )zDDecoded host part of URL.

        None for relative URLs.

        Nrp   r   )rL   isdigit_idna_decoder   raws     r6   rM   zURL.host  s<     == C)3r7??$s
JC  r5   c                 8    | j                   x}yd|v rd| dS |S )a  Return the host subcomponent part of URL.

        None for relative URLs.

        https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2

        `IP-literal = "[" ( IPv6address / IPvFuture  ) "]"`

        Examples:
        - `http://example.com:8080` -> `example.com`
        - `http://example.com:80` -> `example.com`
        - `https://127.0.0.1:8443` -> `127.0.0.1`
        - `https://[::1]:8443` -> `[::1]`
        - `http://[::1]` -> `[::1]`

        Nr   r   ])rL   r  s     r6   rN   zURL.host_subcomponent  s/    $ == C) CZ3%qz0S0r5   c                 6    | j                   xs | j                  S )zPort part of URL, with scheme-based fallback.

        None for relative URLs or URLs without explicit port and
        scheme without default port substitution.

        )rP   rF   r   s    r6   rO   zURL.port  s     !!7T%7%77r5   c                 @    | j                          | j                  d   S )zyPort part of URL, without scheme-based fallback.

        None for relative URLs or URLs without explicit port.

        rP   r  r   s    r6   rP   zURL.explicit_port  s     	{{?++r5   c                 f    | j                   j                  }|s| j                   j                  rd}|S )zNEncoded path of URL.

        / for absolute URLs without path part.

        r   )r{   r;   r:   )r   r   s     r6   rQ   zURL.raw_path  s*     iinntyy''C
r5   c                 8    | j                  | j                        S )zNDecoded path of URL.

        / for absolute URLs without path part.

        )_PATH_UNQUOTERrQ   r   s    r6   r;   zURL.path  s     ""4==11r5   c                 8    | j                  | j                        S )z{Decoded path of URL.

        / for absolute URLs without path part.

        / (%2F) and % (%25) are not decoded

        )_PATH_SAFE_UNQUOTERrQ   r   s    r6   	path_safezURL.path_safe  s     ''66r5   c                 D    t        | j                  j                  d      S )zParse query part of URL.Tkeep_blank_values)r   r{   r<   r   s    r6   rR   zURL._parsed_query%  s     DAAr5   c                 >    t        t        | j                              S )zA MultiDictProxy representing parsed query parameters in decoded
        representation.

        Empty value if URL has no query part.

        )r   r   rR   r   s    r6   r<   z	URL.query*  s     i(:(:;<<r5   c                 .    | j                   j                  S )zOEncoded query part of URL.

        Empty string if query is missing.

        )r{   r<   r   s    r6   rT   zURL.raw_query_string4  s     yyr5   c                 L    | j                  | j                  j                        S )zODecoded query part of URL.

        Empty string if query is missing.

        )_QS_UNQUOTERr{   r<   r   s    r6   rU   zURL.query_string=  s       11r5   c                 h    | j                   s| j                  S | j                   d| j                    S )zDecoded path of URL with query.r   )rU   r;   r   s    r6   rV   zURL.path_qsF  s3       99))Ad//011r5   c                     | j                   j                  s| j                  S | j                   d| j                   j                   S )zEncoded path of URL with query.r   )r{   r<   rQ   r   s    r6   rW   zURL.raw_path_qsM  s7     yy== --$))//!233r5   c                 .    | j                   j                  S )zUEncoded fragment part of URL.

        Empty string if fragment is missing.

        )r{   r=   r   s    r6   rX   zURL.raw_fragmentT  s     yy!!!r5   c                 L    | j                  | j                  j                        S )zUDecoded fragment part of URL.

        Empty string if fragment is missing.

        )r  r{   r=   r   s    r6   r=   zURL.fragment]  s     ~~dii0011r5   .c                 
   | j                   j                  }| j                   j                  r|rdg|dd j                  d      S dS |r |d   dk(  rdg|dd j                  d      S t	        |j                  d            S )zjA tuple containing encoded *path* parts.

        ('/',) for absolute URLs if *path* is missing.

        r   r   N)r   r   )r{   r;   r:   splitre   )r   r;   s     r6   rY   zURL.raw_partsf  s     yy~~9926C.$qr(..-.BFBDGsN.$qr(..-..TZZ_%%r5   c                 @     t         fd j                  D              S )zjA tuple containing decoded *path* parts.

        ('/',) for absolute URLs if *path* is missing.

        c              3   @   K   | ]  }j                  |        y wr   r  ).0partr   s     r6   	<genexpr>zURL.parts.<locals>.<genexpr>{  s     EdT^^D)E   )re   rY   r   s   `r6   rZ   z	URL.partst  s     EdnnEEEr5   c                    | j                   }|r|dk(  rZ| j                  j                  s| j                  j                  r,| j	                  | j                  j                  dd            S | S |j                  d      }| j                  j                  dj                  |dd       dd      }| j	                  |      S )z]A new URL with last part of path removed and cleaned up query and
        fragment.

        r   rr   )r<   r=   Nrp   r   )rQ   r{   r=   r<   r   r   r'  join)r   r;   rZ   r   s       r6   r[   z
URL.parent}  s     }}ts{yy!!TYY__~~dii&8&8rB&8&OPPK

3ii  chhuSbz&:"r R~~c""r5   c                 j    | j                   }| j                  j                  r|dd }|sy|d   S |d   S )zThe last part of raw_parts.r   Nrr   rp   )rY   r{   r:   )r   rZ   s     r6   r\   zURL.raw_name  s?     99!"IERy 9r5   c                 8    | j                  | j                        S )zThe last part of parts.)r  r\   r   s    r6   r]   zURL.name  s     ~~dmm,,r5   c                 |    | j                   }|j                  d      }d|cxk  rt        |      dz
  k  rn y||d  S y)Nro   r   r   rr   )r\   rfindlen)r   r]   is      r6   r^   zURL.raw_suffix  sB    }}JJsOq 3t9q=   8Or5   c                 8    | j                  | j                        S r   )r  r^   r   s    r6   r_   z
URL.suffix  s    ~~doo..r5   c                     | j                   }|j                  d      ry|j                  d      }t        d |j	                  d      dd  D              S )Nro   r4   c              3   &   K   | ]	  }d |z     yw)ro   Nr4   )r+  r_   s     r6   r-  z#URL.raw_suffixes.<locals>.<genexpr>  s     DfS6\Ds   r   )r\   endswithlstripre   r'  r   s     r6   r`   zURL.raw_suffixes  sH    }}=={{3D

30CDDDr5   c                 @     t         fd j                  D              S )Nc              3   @   K   | ]  }j                  |        y wr   r*  )r+  r_   r   s     r6   r-  zURL.suffixes.<locals>.<genexpr>  s     LT^^F+Lr.  )re   r`   r   s   `r6   ra   zURL.suffixes  s    L$:K:KLLLr5   c                      d} t        |       )zFRaise when he path in URL with authority starts lacks a leading slash.zCPath in a URL with authority should start with a slash ('/') if set)r   )r   s    r6   r   z)URL._raise_for_authority_missing_abs_path  s     Tor5   pathsrl   c                    g }d}t        t        |            D ]~  \  }}|dk(  }|r|d   dk(  rt        d|d      |r|n| j                  |      }|d|v z  }|j	                  d      }|j                          t        | xr |d   dk(        }	|||	d z  } |j                          | j                  j                  r<| j                  j                  j	                  d      x}
r|
d	   dk(  rd	nd}g |
d| |}| j                  j                  r|rt        |      n|}|r|d   dk7  rdg|}dj                  |      }| j                  | j                  j                  |dd
            S )z
        add paths to self._val.path, accounting for absolute vs relative paths,
        keep existing, but do not create new, empty segments
        Fr   r   zAppending path z! starting from slash is forbiddenro   rr   Nrp   r   )	enumeratereversedr   r   r'  reverserc   r{   r;   r:   rx   r0  r   r   )r   r?  r   parsedneeds_normalizeidxr;   lastrk   segment_slice_startold_path_segmentsold_path_cutoffnew_paths                r6   r   zURL._make_child  s   
  %"8E?3 	5IC!8DQ3 %dX-NO  #4(9(9$(?Dsd{*Ozz#H"%$h&D8A;"3D"Eh2344F	5 	99>>DIINN4H4H4MM0M$5b$9R$?bTOD()9/:DVDF999H-f5fF&)r/ v88F#~~dii00hbSU0VWWr5   c                     d}|r|d   dk(  rd}|dd  }|j                  d      }|dj                  t        |            z   S )Nrr   r   r   r   )r'  r0  rx   )r   r;   prefixrk   s       r6   r   zURL._normalize_path  sO     DGsN F8D::c?!9(!CDDDr5   c                     |j                         }|j                         }|r:|d   j                         sd|v r#d|v rd||g|j                  d      S d|||ddfS d||dddfS )aE  Parse host into parts

        Returns a tuple of:
        - True if the host looks like an IP address, False otherwise.
        - Lowercased host
        - True if the host is ASCII-only, False otherwise.
        - Raw IP address
        - Separator between IP address and zone
        - Zone part of the IP address
        rp   r   %Trr   F)lowerisasciir  	partition)r   rM   
lower_hostis_asciis       r6   _parse_hostzURL._parse_host  s|     ZZ\
<<> T"X%%'3$;d{ZGDNN34GGGXtR;;j(BB66r5   r   c                     | j                  |      \  }}}}}}|r0	 t        |      \  }}	|	dk(  r|r	d| d| dS d| dS |r| d| S |S |r|rt        |       |S t	        |      S # t        $ r Y 'w xY w)zEncode host part of URL.   r   rO  r  )rU  _ip_compressed_versionr   _host_validate_idna_encode)
r   rM   r   looks_like_iprS  rT  raw_ipsepzoneversions
             r6   r   zURL._encode_host	  s     BEQUAV>z8VS$&	9 6v >g a<14QtfAdV1-EAdV1+E+.$q'8D8  z*J'')  s   A' '	A32A3r   c                     |y|}|| d| }|||S |3|sd}n|r| j                  |      }|r| j                  |      }| d| }n|r|r| j                  |      }|r| d| S |S )zMake netloc from parts.

        The user and password are encoded if encode is True.

        The host must already be encoded with _encode_host.
        rr   r   r   )_QUOTER)r   rI   rK   rM   rO   r   r   s          r6   r   zURL._make_netloc8  s      <E4&/C<H,J{{4(;;x0V1XJ'Df;;t$D"&$q/C/r5   c                    d|vrd}d}|}n.|j                  d      \  }}}|j                  d      \  }}}|sd}d|v r@|j                  d      \  }}}|j                  d      \  }	}}
|
j                  d      \  }}}
n|j                  d      \  }	}}
|
s|xs d||	xs ddfS 	 t        |
      }d|cxk  rdk  st        d	       t        d	      |xs d||	xs d|fS # t        $ r t        d      w xY w)
z4Split netloc into username, password, host and port.r   Nr   r   r  z/Invalid URL: port can't be converted to integerr     zPort out of range 0-65535)
rpartitionrR  rc   r   )r   r:   r   rK   hostinfouserinfo_have_password	bracketedhostnameport_strrO   s               r6   r   zURL._split_netloc[  sA    f)-H)-HH$*$5$5c$:!Ha080B0B30G-HmX (?&005OAq)$-$7$7$<!Ha%//4NAq($,$6$6s$;!Ha#tXx/?4EE	Px=D T"U"899 #89948+;tTAA	  	PNOO	Ps   $C C4c                    t        |t              st        d      |j                         }| j                  j
                  s|t        v rd| d}t        |      | j                  | j                  j                  |            S )z&Return a new URL with scheme replaced.zInvalid scheme typez<scheme replacement is not allowed for relative URLs for the r   r9   )
r   r>   r   rP  r{   r:   r   r   r   r   )r   r9   lower_schemer   s       r6   with_schemezURL.with_scheme~  s}     &#&122||~yyL4H$H))5g?  S/!~~dii000EFFr5   c                 b   | j                   }|d}n9t        |t              r| j                  |      }| j                  }nt        d      |j                  st        d      | j                  xs d}| j                  |||| j                        }| j                  |j                  |            S )zReturn a new URL with user replaced.

        Autoencode user if needed.

        Clear user/password if user is None.

        NzInvalid user typez1user replacement is not allowed for relative URLsrr   r:   )r{   r   r>   ra  rJ   r   r:   r   rN   r   rP   r   r   )r   rI   r   rK   r   r:   s         r6   	with_userzURL.with_user  s     ii<Hc"<<%D((H/00zzPQQ--3""4<ASAST~~cll&l9::r5   c                 n   |n-t        |t              r| j                  |      }nt        d      | j                  j
                  st        d      | j                  xs d}| j                  }| j                  | j                  |||      }| j                  | j                  j                  |            S )zReturn a new URL with password replaced.

        Autoencode password if needed.

        Clear password if argument is None.

        zInvalid password typez5password replacement is not allowed for relative URLsrr   rq  )r   r>   ra  r   r{   r:   r   rN   rP   r   rH   r   r   )r   rK   r   rO   r:   s        r6   with_passwordzURL.with_password  s     #&||H-H344yyTUU--3!!""4==(L$O~~dii000?@@r5   c                 p   t        |t              st        d      | j                  }|j                  st        d      |st        d      |r| j                  |d      nd}| j                  }| j                  | j                  | j                  ||      }| j                  |j                  |            S )zReturn a new URL with host replaced.

        Autoencode host if needed.

        Changing host for relative URLs is not allowed, use .join()
        instead.

        zInvalid host typez1host replacement is not allowed for relative URLszhost removing is not allowedTr   rr   rq  )r   r>   r   r{   r:   r   r   rP   r   rH   rJ   r   r   )r   rM   r   r   rO   r:   s         r6   	with_hostzURL.with_host  s     $$/00iizzPQQ;<<FJt((T(BPR!!""4==$2C2C\SWX~~cll&l9::r5   c                    |Rt        |t              st        |t              st        dt	        |             d|cxk  rdk  sn t        d|       | j                  }|j                  st        d      | j                  xs d}| j                  | j                  | j                  ||      }| j                  |j                  |            S )z`Return a new URL with port replaced.

        Clear port to default if None is passed.

        z port should be int or None, got r   rc  z&port must be between 0 and 65535, got z1port replacement is not allowed for relative URLsrr   rq  )r   rb   rc   r   r   r   r{   r:   rN   r   rH   rJ   r   r   )r   rO   r   r   r:   s        r6   	with_portzURL.with_port  s     $%Zc-B"B4:, OPP&& #I$!PQQiizzPQQ--3""4==$2C2C\SWX~~cll&l9::r5   r   c                   |s>| j                  |      }| j                  j                  rd|v r| j                  |      n|}t	        |      dkD  r|d   dk7  rd|z   }| j                  | j                  j                  |dd            S )z$Return a new URL with path replaced.ro   r   r   rr   r   )r   r{   r:   r   r5  r   r   )r   r;   r   s      r6   	with_pathzURL.with_path  s}    $$T*Dyy58D[t++D1dt9q=T!W^:D~~dii00d"r0RSSr5   itemsc                 >   | j                   }|D cg c]k  \  }}t        |      t        urt        |t        t
        f      r|n|fD ]7  } ||       d |t        |      t        u r|n| j                  |             9 m }}}}dj                  |      S c c}}}w )zReturn a query string from a sequence of (key, value) pairs.

        value is a single value or a sequence of values for the key

        The sequence of values must be a list or tuple.
        =&)_QUERY_PART_QUOTERr   r>   r   rd   re   
_query_varr0  )r   r|  quoterkr   r   pairss          r6   %_get_str_query_from_sequence_iterablez)URL._get_str_query_from_sequence_iterable  s     ((  
 
3 9C'JsT5M,J V
  ayk6tAw#~!4??1;MNOP
P
 
 xx
s   A0Br   c                    t        |       }t        |t              rt        rt	        | t              sJ | S |t
        u rt        |       S t        |t              rlt        rt	        | t              sJ t        j                  |       rt        d      t        j                  |       rt        d      t        t        |             S |t        ur$t	        |t              rt        t        |             S t        dj                  | |            )Nzfloat('inf') is not supportedzfloat('nan') is not supportedzMInvalid variable type: value should be str, int or float, got {!r} of type {})r   
issubclassr>   r
   r   rc   floatmathisinfr   isnanrb   r   r   format)r   r   s     r6   r  zURL._query_var  s    1gc3!!S)))H#:q6Mc5!!!U+++zz!} !@AAzz!} !@AAuQx= d?z#{;s1v;3
 	
r5   c                     | j                   }|D cg c]:  \  }} ||       d |t        |      t        u r|n| j                  |             < }}}dj	                  |      S c c}}w )a   Return a query string from an iterable.

        The iterable must contain (key, value) pairs.

        The values are not allowed to be sequences, only single values are
        allowed. For sequences, use `_get_str_query_from_sequence_iterable`.
        r~  r  )r  r   r>   r  r0  )r   r|  r  r  r   r  s         r6   _get_str_query_from_iterablez URL._get_str_query_from_iterable  sq     ((
 
1 ayk6tAw#~!4??1;MNOP
 
 xx	
s   ?A%argskwargsc                    |rt        |      dkD  rt        d      |}nt        |      dk(  r|d   }nt        d      |y t        |t              r| j	                  |j                               S t        |t              r| j                  |      S t        |t        t        t        f      rt        d      t        |t              r| j                  |      S t        d      )Nr   z7Either kwargs or single query parameter must be presentr   zAInvalid query type: bytes, bytearray and memoryview are forbiddenzRInvalid query type: only str, mapping or sequence of (key, value) pairs is allowed)r5  r   r   r   r  r|  r>   r   bytes	bytearray
memoryviewr   r   r  )r   r  r  r<   s       r6   _get_str_queryzURL._get_str_query.  s    4y1} M  EY!^GEVWW=eW%==ekkmLLeS!%%e,,eeY
;<S  eX&
 44U;;8
 	
r5   c                      y r   r4   r   s     r6   r   zURL.with_queryQ  s    14r5   c                      y r   r4   r   r  s     r6   r   zURL.with_queryT  s    <?r5   c                      | j                   |i |xs d}| j                  | j                  j                  |            S )a[  Return a new URL with query part replaced.

        Accepts any Mapping (e.g. dict, multidict.MultiDict instances)
        or str, autoencode the argument if needed.

        A sequence of (key, value) pairs is supported as well.

        It also can take an arbitrary number of keyword arguments.

        Clear query if None is passed.

        rr   r<   )r  r   r{   r   )r   r  r  	new_querys       r6   r   zURL.with_queryW  sA     (D''88>B	~~dii00y0ABBr5   c                      y r   r4   r   s     r6   extend_queryzURL.extend_queryi      36r5   c                      y r   r4   r  s     r6   r  zURL.extend_queryl      >Ar5   c                      | j                   |i |}|s| S | j                  j                  x}r|d   dk(  r||z  }n|d| z  }n|}| j                  | j                  j	                  |            S )a&  Return a new URL with query part combined with the existing.

        This method will not remove existing query parameters.

        Example:
        >>> url = URL('http://example.com/?a=1&b=2')
        >>> url.extend_query(a=3, c=4)
        URL('http://example.com/?a=1&b=2&a=3&c=4')
        rp   r  r  )r  r{   r<   r   r   )r   r  r  new_query_stringr  s        r6   r  zURL.extend_queryo  s     /4..??K		'9' }#--	q!1 233	(I~~dii00y0ABBr5   c                      y r   r4   r   s     r6   r   zURL.update_query  r  r5   c                      y r   r4   r  s     r6   r   zURL.update_query  r  r5   c                 v    | j                   |i |}|+| j                  | j                  j                  d            S t	        | j
                        }|j                  t        |d             | j                  |j                               }| j                  | j                  j                  |            S )a  Return a new URL with query part updated.

        This method will overwrite existing query parameters.

        Example:
        >>> url = URL('http://example.com/?a=1&b=2')
        >>> url.update_query(a=3, c=4)
        URL('http://example.com/?a=3&b=2&c=4')
        rr   r  Tr  )
r  r   r{   r   r   rR   updater   r  r|  )r   r  r  sr<   new_strs         r6   r   zURL.update_query  s      D009>>$))"4"42"4">??$,,-YqD9:33EKKMB~~dii00w0?@@r5   query_paramsc                     t        |      | j                  j                         z  s| S | j                  t	        fd| j                  j                         D                    S )z4Remove some keys from query part and return new URL.c              3   4   K   | ]  \  }}|vr||f  y wr   r4   )r+  r]   valueparams_to_removes      r6   r-  z+URL.without_query_params.<locals>.<genexpr>  s*      D%// us   )setr<   keysr   re   r|  )r   r  r  s     @r6   without_query_paramszURL.without_query_params  sY    |,tzz/@@K #'::#3#3#5 
 	
r5   c                     |d}n,t        |t              st        d      | j                  |      }| j                  j
                  |k(  r| S | j                  | j                  j                  |            S )zReturn a new URL with fragment replaced.

        Autoencode fragment if needed.

        Clear fragment to default if None is passed.

        rr   zInvalid fragment type)r=   )r   r>   r   r   r{   r=   r   r   )r   r=   rX   s      r6   with_fragmentzURL.with_fragment  sm     LHc*34400:L99-K~~dii00,0GHHr5   c                    t        |t              st        d      d|v rt        d      | j	                  |      }|dv rt        d      t        | j                        }| j                  j                  r+t        |      dk(  r|j                  |       n||d<   d|d	<   n||d<   |d	   dk(  rd|d	<   | j                  | j                  j                  dj                  |      dd
            S )zReturn a new URL with name (last part of path) replaced.

        Query and fragment parts are cleaned up.

        Name is encoded if needed.

        zInvalid name typer   zSlash in name is not allowedrq   z. and .. values are forbiddenr   rp   rr   r   r   )r   r>   r   r   r   rd   rY   r{   r:   r5  ru   r   r   r0  )r   r]   rZ   s      r6   	with_namezURL.with_name  s     $$/00$;;<<  &;<==T^^$995zQT" b	E!HE"IQx3a~~IICHHUO2K
 	
r5   r_   c                    t        |t              st        d      |r|d   dk(  r|dk(  rt        d|      | j                  }|st        | d      | j
                  }|s||z   n|dt        |        |z   }| j                  |      S )zReturn a new URL with suffix (file extension of name) replaced.

        Query and fragment parts are cleaned up.

        suffix is encoded if needed.
        zInvalid suffix typer   ro   zInvalid suffix z has an empty nameN)r   r>   r   r   r\   r^   r5  r  )r   r_   r]   
old_suffixs       r6   with_suffixzURL.with_suffix  s     &#&122&)s*fmvj9::}}x'9:;;__
$.tf}D9KC
O;K4Lv4U~~d##r5   c                    t        |      t        urt        d      | j                  }|j                  }|j                  xs |j                  }||j                  k7  s|t
        vr|S |j                  r)|t        v r!| j                  |j                  |            S d|i}|j                  s|j                  r|j                  |d<   |j                  s|j                  r|j                  |d<   |j                  s!| j                   |j                  di |      S |j                  d   dk(  r|j                  }n|j                  sd|j                   }nu|j                  d   dk(  r|j                   |j                   }nHdj                  g | j                  d	d d
      }||j                  z  }|j                  d   dk(  r|dd	 }d|v r| j                  |      n||d<   | j                   |j                  di |      S )u_  Join URLs

        Construct a full (“absolute”) URL by combining a “base URL”
        (self) with another URL (url).

        Informally, this uses components of the base URL, in
        particular the addressing scheme, the network location and
        (part of) the path, to provide missing components in the
        relative URL.

        zurl should be URLrm  r9   r=   r<   r   r   rp   Nrr   r   ro   r;   r4   )r   rB   r   r{   r9   USES_RELATIVEr:   r   r   r   r;   r=   r<   r0  rZ   r   )r   r   r   	other_valr9   rZ   r;   s          r6   r0  zURL.join  s    9C/00iiHH	!!/SZZSZZ6#>J . 8>>)"4"4F"4"CDD#+V"4>>Y// ) 2 2E*>>Y__&__E'N~~>>,#,,"7"788>>!#>>Dy~~&'DXXb\S hhZ	/0D
 882djj"o2r23DINN"Dxx{c!ABx69Tk,,T2tf~~lcll3U344r5   c                (    | j                  ||      S )zAReturn a new URL with the elements in other appended to the path.ry  )r   )r   r   r   s      r6   joinpathzURL.joinpath&  s    w77r5   c                    t        | j                  d      }t        | j                  d      }| j                  x}r
d|v rd| d}t        | j                  d      }t
        r|J dj                  d | j                  j                         D              }t        | j                  d      }t
        r|J | j                  |||| j                        }| j                  j                  }| j                  |||||      S )	z<Return decoded human readable string for URL representation.z#/:?@[]r   r   r  z#?r  c              3   n   K   | ]-  \  }}d j                  t        |d      t        |d             / yw)z{}={}z#&+;=N)r  _human_quote)r+  r  r   s      r6   r-  z!URL.human_repr.<locals>.<genexpr>3  s5       
1 NN<73\!W5MN 
s   35rr   )r  rI   rK   rM   r;   r
   r0  r<   r|  r=   r   rP   r{   r9   r   )	r   rI   rK   rM   r;   rU   r=   r:   r9   s	            r6   
human_reprzURL.human_repr*  s    DIIy1y9IID3$;tfA;DDIIt,###xx  


((* 
 
  r2'''""449K9KL!!##FFD,QQr5   )rr   rg   N)rg   rB   )rg   rS   )F)r   rB   rg   rB   )~r/   r0   r1   	__slots__r   ra  r   r   r   r   r   r  r   r   r   r  r  r  r!  r   r3   r   r>   rb   r)   r   classmethodrc   Queryr   r   r   r   staticmethodr   r   r  r   r   r   r   r   r   r   r   r   r   r   re   r   r   r   r   r   r   cached_propertyrC   r   rD   r9   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   r;   r  rd   rR   r<   rT   rU   rV   rW   rX   r=   rY   rZ   r[   r\   r]   r^   r_   r`   ra   r   r   r   r   rU  r   r   r   ro  rr  rt  rv  rx  r{  r   r   QueryVariabler  r  r  r   r  r   r   r  r   r  r  r  r  r0  r  r  r4   r5   r6   rB   rB      s   N #Ie$G	IeDL$$7N6dERM6VEO fuEFE: f-Ic*N#4<%L
 /1V $(V3U*+V 	V
 dDj!V 
Vp  !%%)!%$(U U 	U
 CIU T	"U U CIU U UD[!U U U U 
U Un K E  M
K 
K 88 8'*8368BE8	8 8;# ;)5 )F t # 'F 't '
&F &t &
'F 't '
&F &t &
. . .
(U (u (I$ IeK0 1	T 	. ." # #$	# &$ & &        s     3uS$Y/ 3 3 Q3 Q Q '%T	* ' ' 	(eCI& 	( 	( +eCI. + + 	,%T	* 	, 	, '%T	* ' ' !eCI& ! ! 15d#3 1 1* 8eCI& 8 8 ,uS$Y/ , , 	# 	 	 2c 2 2 73 7 7 BtE#s(O4 B B = = #   2c 2 2 2 2 2 4S 4 4 "c " " 2# 2 2 &5c? & & FuS#X F F # # 
# 
 
 -c - - C   / / / EeCHo E E M%S/ M M  
"X "X4 "XE "XH 
E3 
E3 
E 
E 77	tS%d
+S#s:	;7  72 ,( ,(D ,(S ,( ,(\  0CI0 T	"0 CI	0
 CI0 0 
0  0B BB 
uS$YsDy!15d3CU3PT9EUU	VB  BBG# G% G;eCI. ;5 ;.AeCI&6 A5 A,;c ;e ;,;eCI. ;5 ;& 7< Tc Tt T TeCI.=>? 
, 
m 
 
 
0eE#t)$4c$9:;	&!
C !
3 !
5d;K !
F 44%4 4?=?U? ?C Cs Cu C$ 6%6E6 6A]AuA AC# C C C0 6%6E6 6A]AuA AA# A A A&
# 
% 
IeCI&6 I5 I&
c 
e 
>$# $% $$35j 5: 8s 8T 8e 8RC Rr5   rB   r  r   c                     | s| S d|z   D ]&  }|| v s| j                  |dt        |      d      } ( | j                         r| S dj                  d | D              S )NrO  02Xrr   c              3   V   K   | ]!  }|j                         r|n
t        |       # y wr   )isprintabler   )r+  cs     r6   r-  z_human_quote.<locals>.<genexpr>G  s!     A!1U1X5As   '))replaceordr  r0  )r  r   r  s      r6   r  r  ?  sf    6\ /6		!qQ-.A/ 	}}77AqAAAr5      r  c                     	 t        j                  | j                  d            S # t        $ r# | j                  d      j                  d      cY S w xY w)Nr   idna)r  decoder   UnicodeError)r  s    r6   r  r  M  sH    2{{3::g.// 2zz'"))&112s   #& )AArM   c                     	 t        j                  | d      j                  d      S # t        $ r# | j                  d      j                  d      cY S w xY w)NT)uts46r   r  )r  r   r  r  )rM   s    r6   rZ  rZ  U  sL    3{{4t,33G<< 3{{6"))'223s   %( )AAr\  c                 H    t        |       }|j                  |j                  fS )z8Return compressed version of IP address and its version.)r	   
compressedr_  )r\  ips     r6   rX  rX  ]  s!     
F	B=="**$$r5   c           
          t         j                  |       }|y|j                         |j                         d}}}|dk(  s|dk(  r	d| |d v rd}t	        d| d|d| d	|       d)
zValidate an ascii host name.Nrr   r   r   zQ, if the value includes a username or password, use 'authority' instead of 'host'zHost z cannot contain z (at position ))_not_reg_namesearchgroupstartr   )rM   invalidr  posextras        r6   rY  rY  d  s     ""4(G"3E|ST
):0 	 
x'y3%qPr5   c                      t         j                          t        j                          t        j                          t        j                          y)zClear all LRU caches.N)r  cache_clearrZ  rX  rY  r4   r5   r6   r  r  v  s4     &&( r5   c                      t         j                         t        j                         t        j                         t        j                         dS )zReport cache statistics.)r,   r-   r	   r.   )rZ  
cache_infor  rX  rY  r4   r5   r6   r  r    s>     $..0#..0,779'224	 r5   idna_encode_sizeidna_decode_sizeip_address_sizehost_validate_sizer  r  r  r  c                      t        |       t        j                        a t        |      t        j                        a t        |      t        j                        a t        |      t
        j                        ay)zConfigure LRU cache sizes.N)r   rZ  __wrapped__r  rX  rY  r  s       r6   cache_configurer    si     /9-.|/G/GHL.9-.|/G/GHL7Y7** 3Y12>3M3MNNr5   r  )Nr  resysr   collections.abcr   r   r   
contextlibr   	functoolsr   r   	ipaddressr	   typingr
   r   r   r   r   r   r   r   urllib.parser   r   r   r   r   r   r  	multidictr   r   r   propcache.apir   r  _quotingr   r   r   	frozensetr   r  r   r   sentinelcompileVERBOSEr  r>   rc   r  SimpleQueryr  r  r&   version_infor)   r+   r8   rA   rj   rd   rx   rB   r  	_MAXCACHEr  rZ  re   rX  rY  r  r  r  r4   r5   r6   <module>r      s    	 
  7 7  +  	 	 	   5 5 B (cCK;'-( !!FG 8
 

 JJ CeO$k#::;#,.SS	 T]wD	 y #	 #L r 
 49 0 ]R ]R ]R@-BE#t)$ Bc BeCI6F B 	 92c 2c 2 2 93s 3s 3 3 9%3 %5c? % % 9   " ! ! I    *3)2(1+4OCI&O CI&O 39%	O
 c4i(O 
O Or5   