o
    {,hY"                     @   s*  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
 G dd deZd-ddZeeeeejejejfZdd Zd-ddZd-ddZd-ddZdd Zg deddeddgZdd eD ZdZedd ed d D  d!d" Zd#d$ Zd%d& Zd'd( Z d)d* Z!d+d, Z"e" Z#dS ).    N)Decimal)NoneTypequote)Promisec                       s   e Zd Z fddZ  ZS )DjangoUnicodeDecodeErrorc                    s   dt   | jt| jf S )Nz%s. You passed in %r (%s))super__str__objecttype)self	__class__ K/var/www/html/rh/venv/lib/python3.10/site-packages/django/utils/encoding.pyr	      s
   z DjangoUnicodeDecodeError.__str__)__name__
__module____qualname__r	   __classcell__r   r   r   r   r      s    r   utf-8Fstrictc                 C      t | tr| S t| |||S )z
    Return a string representing 's'. Treat bytestrings using the 'encoding'
    codec.

    If strings_only is True, don't convert (some) non-string-like objects.
    )
isinstancer   	force_strsencodingstrings_onlyerrorsr   r   r   	smart_str   s   
r   c                 C   s
   t | tS )zDetermine if the object instance is of a protected type.

    Objects of protected types are preserved as-is when passed to
    force_str(strings_only=True).
    )r   _PROTECTED_TYPES)objr   r   r   is_protected_type,   s   
r"   c              
   C   sr   t t| tr	| S |rt| r| S zt| tr t| ||} W | S t| } W | S  ty8 } zt|j dd}~ww )z
    Similar to smart_str(), except that lazy instances are resolved to
    strings, rather than kept as lazy objects.

    If strings_only is True, don't convert (some) non-string-like objects.
    N)	
issubclassr   strr"   r   bytesUnicodeDecodeErrorr   args)r   r   r   r   er   r   r   r   5   s   

r   c                 C   r   )z
    Return a bytestring version of 's', encoded as specified in 'encoding'.

    If strings_only is True, don't convert (some) non-string-like objects.
    )r   r   force_bytesr   r   r   r   smart_bytesK   s   
r*   c                 C   s\   t | tr|dkr| S | d|||S |rt| r| S t | tr&t| S t| ||S )z
    Similar to smart_bytes, except that lazy instances are resolved to
    strings, rather than kept as lazy objects.

    If strings_only is True, don't convert (some) non-string-like objects.
    r   )r   r%   decodeencoder"   
memoryviewr$   r   r   r   r   r)   W   s   

r)   c                 C   s*   | du r| S t | trt| } t| ddS )u  
    Convert an Internationalized Resource Identifier (IRI) portion to a URI
    portion that is suitable for inclusion in a URL.

    This is the algorithm from RFC 3987 Section 3.1, slightly simplified since
    the input is assumed to be a string rather than an arbitrary byte stream.

    Take an IRI (string or UTF-8 bytes, e.g. '/I ♥ Django/' or
    b'/I â¥ Django/') and return a string containing the encoded
    result with ASCII chars only (e.g. '/I%20%E2%99%A5%20Django/').
    Nz/#%[]=:;$&()+,!?*@'~safe)r   r   r$   r   )irir   r   r   
iri_to_urik   s
   
r1   )-   .   _   ~   A   [   a   {   c                 C   s4   i | ]}|D ]}d D ]}||   t|fq
qqS ))z%02xz%02X)r,   r%   ).0ascii_rangecharfmtr   r   r   
<dictcomp>   s    
r>   0123456789ABCDEFabcdefc                 C   s.   i | ]}t D ]}||  t|| qqS r   )_hexdigr,   r%   fromhex)r:   abr   r   r   r>      s   .    c                 C   s   | du r| S t | } | d}t|dkr| }n=|d g}|j}t}|dd D ]'}|dd }||v rG|||dd   ||dd  q(|d || q(d|}t| S )uI  
    Convert a Uniform Resource Identifier(URI) into an Internationalized
    Resource Identifier(IRI).

    This is the algorithm from RFC 3987 Section 3.2, excluding step 4.

    Take an URI in ASCII bytes (e.g. '/I%20%E2%99%A5%20Django/') and return
    a string containing the encoded result (e.g. '/I%20♥%20Django/').
    N   %   r          )r)   splitlenappend
_hextobytejoinrepercent_broken_unicoder+   )uribitsr0   partsrK   	hextobyteitemhexr   r   r   
uri_to_iri   s$   




rU   c                 C   s   t | ddS )zh
    Escape the unsafe characters from the path portion of a Uniform Resource
    Identifier (URI).
    z/:@&+$,-_.!~*'()r.   r   pathr   r   r   escape_uri_path   s   rX   c                 C   s   |  ddS )z:Return the Punycode of the given domain if it's non-ASCII.idnaascii)r,   r+   )domainr   r   r   punycode   s   r\   c              
   C   s   g }	 z|    W n3 ty< } z't| |j|j dd}|| d|j |   | |jd } W Y d}~nd}~ww d||  S q)z
    As per RFC 3987 Section 3.2, step three of converting a URI into an IRI,
    repercent-encode any octet produced that is not part of a strictly legal
    UTF-8 octet sequence.
    Ts   /#%[]=:;$&()+,!?*@'~r.   NrH   )r+   r&   r   startendrK   r,   rM   )rW   changed_partsr(   	repercentr   r   r   rN      s   rN   c                 C   s$   | du r| S t t| ddddS )aA  Convert a file system path to a URI portion that is suitable for
    inclusion in a URL.

    Encode certain chars that would normally be recognized as special chars
    for URIs. Do not encode the ' character, as it is a valid character
    within URIs. See the encodeURIComponent() JavaScript function for details.
    N\/z/~!*()'r.   )r   r$   replacerV   r   r   r   filepath_to_uri   s   rd   c                  C   s:   zt  d pd} t|  W | S  ty   d} Y | S w )z
    The encoding for the character type functions. Fallback to 'ascii' if the
    #encoding is unsupported by Python or could not be determined. See tickets
    #10335 and #5846.
    rF   rZ   )locale	getlocalecodecslookup	Exception)r   r   r   r   get_system_encoding   s   rj   )r   Fr   )$rg   datetimere   decimalr   typesr   urllib.parser   django.utils.functionalr   r&   r   r   intfloatdatetimer    r"   r   r*   r)   r1   range_ascii_rangesrL   r@   updaterU   rX   r\   rN   rd   rj   DEFAULT_LOCALE_ENCODINGr   r   r   r   <module>   sJ    
	
	

!$
