o
    'èhš  ã                   @   sÂ   d Z ddlZddlZddlmZmZ ddlZddlZe 	d¡Z
dedefdd„Ze 	d	¡Ze 	d
¡Ze 	d¡Zddeeef dedefdd„ZdZdedefdd„Zdeeef defdd„ZdS )zIPv6 helper functions.é    N)ÚListÚUnionz0+([0-9a-f]+)ÚaddressÚreturnc                 C   s”  t | ƒdkr
tdƒ‚t | ¡}g }d}t |ƒ}||k r@|||d …  ¡ }t |¡}|dur3| d¡}| |¡ |d7 }||k sd}d}d}	d}
t	d	ƒD ]!}|| d
krg|
rf|}||	 }||krd|	}|}d}
qL|
sm|}	d}
qL|
r~d	}||	 }||kr~|	}|}|dkrÃ|dkr«|dks”|dkr«|d dkr«|dkr›d}nd}|t
j | dd… ¡ }|S d |d|… ¡d d ||| d… ¡ }|S d |¡}|S )zÍConvert an IPv6 address in binary form to text form.

    *address*, a ``bytes``, the IPv6 address in binary form.

    Raises ``ValueError`` if the address isn't 16 bytes long.
    Returns a ``str``.
    é   z IPv6 addresses are 16 bytes longr   é   Né   éÿÿÿÿFé   Ú0Té   é   Úffffz::z::ffff:é   ú:)ÚlenÚ
ValueErrorÚbinasciiÚhexlifyÚdecodeÚ_leading_zeroÚmatchÚgroupÚappendÚrangeÚdnsÚipv4Ú	inet_ntoaÚjoin)r   ÚhexÚchunksÚiÚlÚchunkÚmÚ
best_startÚbest_lenÚstartÚlast_was_zeroÚendÚcurrent_lenÚprefixÚthex© r-   úD/var/www/html/olx_land/venv/lib/python3.10/site-packages/dns/ipv6.pyr      sl   	



÷€€$	úÿþÿ
ÿr   s   (.*):(\d+\.\d+\.\d+\.\d+)$s   ::.*s   .*::$FÚtextÚignore_scopec              	   C   s@  t | tƒs
|  ¡ }n| }|r(| d¡}t|ƒ}|dkr |d }n|dkr(tjj‚|dkr0tjj‚| d¡r>| d¡s>tjj‚| 	d¡rL| 	d¡sLtjj‚|dkrRd}t
 |¡}|dur…tj | d¡¡}| d	¡ ¡ › d
|d d›|d	 d›d
|d d›|d d› ¡ }t |¡}|dur•|d	d… }nt |¡}|dur¤|dd… }| d¡}t|ƒ}|dkrµtjj‚d}g }	|D ]=}
|
dkrÛ|rÇtjj‚d}tdd| d	 ƒD ]}|	 d¡ qÒq»t|
ƒ}|dkrçtjj‚|dkródd|  |
 }
|	 |
¡ q»|dk r|stjj‚d |	¡}zt |¡W S  tjtfy   tjj‚w )a+  Convert an IPv6 address in text form to binary form.

    *text*, a ``str`` or ``bytes``, the IPv6 address in textual form.

    *ignore_scope*, a ``bool``.  If ``True``, a scope will be ignored.
    If ``False``, the default, it is an error for a scope to be present.

    Returns a ``bytes``.
    ó   %é   r   ó    ó   :s   ::s   0::Nr   r   Ú02xé   r	   r
   FTs   0000r   ó   0)Ú
isinstanceÚbytesÚencodeÚsplitr   r   Ú	exceptionÚSyntaxErrorÚendswithÚ
startswithÚ
_v4_endingr   r   Ú	inet_atonr   r   Ú_colon_colon_startÚ_colon_colon_endr   r   r   r   Ú	unhexlifyÚErrorÚ	TypeError)r/   r0   ÚbtextÚpartsr"   r$   Úbr    Ú
seen_emptyÚ	canonicalÚcÚ_Úlcr-   r-   r.   rA   h   st   




<þ


ÿ
ÿrA   s             ÿÿc                 C   s
   |   t¡S )zŒIs the specified address a mapped IPv4 address?

    *address*, a ``bytes`` is an IPv6 address in binary form.

    Returns a ``bool``.
    )r?   Ú_mapped_prefix)r   r-   r-   r.   Ú	is_mappedÆ   s   
rP   c                 C   s   t j t j | ¡¡S )a  Verify that *address* is a valid text form IPv6 address and return its
    canonical text form.  Addresses with scopes are rejected.

    *text*, a ``str`` or ``bytes``, the IPv6 address in textual form.

    Raises ``dns.exception.SyntaxError`` if the text is not valid.
    )r   Úipv6r   rA   )r/   r-   r-   r.   ÚcanonicalizeÑ   s   rR   )F)Ú__doc__r   ÚreÚtypingr   r   Údns.exceptionr   Údns.ipv4Úcompiler   r9   Ústrr   r@   rB   rC   ÚboolrA   rO   rP   rR   r-   r-   r-   r.   Ú<module>   s   

E

 [