
    Ii0                     J   S r SSKJr  SSKrSSKJr  SSKJrJrJ	r	  SSK
J
r
  SSKJr  \S	 5       r\S
 5       rS\4S jrS\S\4S jrS\4S jrS\S\S\S\S\S\S\\   S\S\4S jrS\S\S\S\4S jr\SSSSSSSSSS.	S\S\S\S\S\S\S\S\\   S\S\4S  jj5       rg)!zURL.    )	lru_cacheN)Optional)parse_qsunquoteurlsplit   )hostname)	validatorc                  L    [         R                  " S[         R                  5      $ )Nz(^[\u0100-\u017F\u0180-\u024F]|[-!#$%&'*+/=?^_`{}|~0-9a-z]+(\.[-!#$%&'*+/=?^_`{}|~0-9a-z]+)*$|^([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\011.])*$)recompile
IGNORECASE     4/venv/lib/python3.13/site-packages/validators/url.py_username_regexr      s"    ::	G
 	 r   c                  L    [         R                  " S[         R                  5      $ )Nz^[\/a-z0-9\-\.\_\~\!\$\&\'\(\)\*\+\,\;\=\:\@\%\U0001F300-\U0001F5FF\U0001F600-\U0001F64F\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$r   r   r   r   _path_regexr      s!    ::	8 	
 
r   valuec                     U (       a  U S;   $ S$ )zValidate scheme.>   ftpgitircsshftpshttprtmprtspsftphttpsrtmpstelnetFr   )r   s    r   _validate_schemer$   *   s%      	
	
 r   skip_ipv6_addrc                 v    U=(       d1    U R                  S5      S:  =(       d    U R                  S5      (       + $ )zConfirm skip IPv6 check.:   [)count
startswith)r   r%   s     r   _confirm_ipv6_skipr,   ;   s.    NU[[-1N9I9I#9N5NNr   c                 X  ^ U (       d  gU R                  S5      =nS:  a"  [        5       R                  [        U 5      5      $ US:  a  [        5       R                  U 5      $ U R	                  SS5      u  nm[        5       R                  U5      =(       a    [        U4S jS 5       5      $ )z Validate authentication segment.Tr'   r   c              3   ,   >#    U  H	  oT;  v   M     g 7f)Nr   ).0char_to_avoidpasswords     r   	<genexpr>)_validate_auth_segment.<locals>.<genexpr>K   s      5;O-X%;Os   )/?#@)r*   r   matchr   rsplitall)r   colon_countusernamer1   s      @r   _validate_auth_segmentr=   @   s    {{3''1,  &&wu~66Q &&u--c1-Hh""8,  5;O5 2 r   skip_ipv4_addrmay_have_portsimple_hostconsider_tldprivaterfc_1034rfc_2782c	                    U (       a  U R                  S5      S:  a  gU R                  S5      S:  aR  [        [        X5      (       d  SU ;   a  U O!U R                  S5      R	                  SSS5      [        X5      UUUUUUUS9	$ U R                  SS5      u  p[        [        X5      (       d  SU ;   a  U
O!U
R                  S5      R	                  SSS5      [        X5      UUUUUUUS9	=(       a    [        U	5      $ )	zValidate netloc.r7   r   Fz]:r)   ] )r%   r>   r?   maybe_simplerA   rB   rC   rD   )r*   r	   r,   lstripreplacer9   r=   )r   r%   r>   r?   r@   rA   rB   rC   rD   
basic_authhosts              r   _validate_netlocrM   P   s	    EKK$q({{3! &e<< \\#&..sB:-eD)'$%
 	
 ||C+J "$7745= S!))#r15)$?%# ! - !
,-r   pathqueryfragmentstrict_queryc                 ~   SnU (       a%  U[        [        5       R                  U 5      5      -  n U(       a#  [        XSS9(       a  [        XSS9(       a  US-  nU(       a2  U[        [
        R                  " SU[
        R                  5      5      -  nU$ ! [         a    U(       a  [        XS9(       a  US-  n Naf = f)z"Validate path query and fragments.T&)strict_parsing	separator;)rT   z[0-9a-z?/:@\-._~%!$&'()*+,;=]*)boolr   r8   r   	TypeErrorr   	fullmatchr   )rN   rO   rP   rQ   optional_segmentss        r   _validate_optionalsr[      s    T+-"5"5d";<<&sKsK%
 TLL:HbmmT
 	
   &XeA%&s   *B $B<;B<FT)	r%   r>   r?   r@   rQ   rA   rB   rC   rD   c      	             U (       a  [         R                  " SU 5      (       a  g [        U 5      u  ppn[	        U
5      =(       a&    [        UUUUUUUUU	5	      =(       a    [        XX5      $ ! [         a     gf = f)a  Return whether or not given value is a valid URL.

This validator was originally inspired from [URL validator of dperini][1].
The following diagram is from [urlly][2]::


        foo://admin:hunter1@example.com:8042/over/there?name=ferret#nose
        \_/   \___/ \_____/ \_________/ \__/\_________/ \_________/ \__/
         |      |       |       |        |       |          |         |
      scheme username password hostname port    path      query    fragment

[1]: https://gist.github.com/dperini/729294
[2]: https://github.com/treeform/urlly

Examples:
    >>> url('http://duck.com')
    # Output: True
    >>> url('ftp://foobar.dk')
    # Output: True
    >>> url('http://10.0.0.1')
    # Output: True
    >>> url('http://example.com/">user@example.com')
    # Output: ValidationError(func=url, ...)

Args:
    value:
        URL string to validate.
    skip_ipv6_addr:
        When URL string cannot contain an IPv6 address.
    skip_ipv4_addr:
        When URL string cannot contain an IPv4 address.
    may_have_port:
        URL string may contain port number.
    simple_host:
        URL string maybe only hyphens and alpha-numerals.
    strict_query:
        Fail validation on query string parsing error.
    consider_tld:
        Restrict domain to TLDs allowed by IANA.
    private:
        Embedded IP address is public if `False`, private/local if `True`.
    rfc_1034:
        Allow trailing dot in domain/host name.
        Ref: [RFC 1034](https://www.rfc-editor.org/rfc/rfc1034).
    rfc_2782:
        Domain/Host name is of type service record.
        Ref: [RFC 2782](https://www.rfc-editor.org/rfc/rfc2782).

Returns:
    (Literal[True]): If `value` is a valid url.
    (ValidationError): If `value` is an invalid url.
z\sF)r   searchr   
ValueErrorr$   rM   r[   )r   r%   r>   r?   r@   rQ   rA   rB   rC   rD   schemenetlocrN   rO   rP   s                  r   urlra      s    F BIIeU++ 08-X
 	  	E

	E  XD  s   A- -
A:9A:)__doc__	functoolsr   r   typingr   urllib.parser   r   r   r	   utilsr
   r   r   strr$   rW   r,   r=   rM   r[   ra   r   r   r   <module>rh      s   
   	  4 4   	 	  C "Oc O4 O
#  ------ -- 	--
 -- -- d^-- -- --`c #  D 2 
 ! "ZZ 	Z
 Z Z Z Z Z d^Z Z Z Zr   