
    uip                         S r SSKrSSKrSSKrSSKr\R                  " S5      rS r\R                  " S5      r	\R                  " S5      r
\R                  " S5      rSS jrS	rS
 rg)zIPv6 helper functions.    Nz0+([0-9a-f]+)c                 0   [        U 5      S:w  a  [        S5      e[        R                  " U 5      n/ nSn[        U5      nX4:  a[  XUS-    R	                  5       n[
        R                  U5      nUb  UR                  S5      nUR                  U5        US-  nX4:  a  M[  SnSnSn	Sn
[        S	5       H4  nX#   S
:w  a  U
(       a  UnX-
  nX:  a  U	nUnSn
M%  M'  U
(       a  M0  Un	Sn
M6     U
(       a  S	nX-
  nX:  a  U	nUnUS:  a~  US:X  aG  US:X  d  US:X  a;  US   S:X  a2  US:X  a  SnOSnU[        R                  R                  U SS 5      -   nU$ SR                  USU 5      S-   SR                  X'U-   S 5      -   n U$ SR                  U5      nU$ )zConvert 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)addresshexchunksilchunkm
best_startbest_lenstartlast_was_zeroendcurrent_lenprefixs                 ?/home/kodi/.kodi/addons/script.module.dnspython/lib/dns/ipv6.pyr   r      s    7|r;<<


7
#CF	ACA
%a!e##% &=GGAJEe	Q % JHEM1X9!k)!&J*H %  E M  k!J"H!|?MMfQi611}"388--gbcl;;C J	 ((6+:./$6((6x"7"89:;C J hhvJ    s   (.*):(\d+\.\d+\.\d+\.\d+)$s   ::.*s   .*::$c                    [        U [        5      (       d  U R                  5       n U(       aH  U R                  S5      n[	        U5      nUS:X  a  US   n O US:  a  [
        R                  R                  eU S:X  a  [
        R                  R                  eU R                  S5      (       a0  U R                  S5      (       d  [
        R                  R                  eU R                  S5      (       a0  U R                  S5      (       d  [
        R                  R                  eU S:X  a  Sn [        R                  U 5      nUbz  [
        R                  R                  UR                  S5      5      nS	R                  UR                  S
5      R!                  5       US   US
   US   US   5      R                  5       n ["        R                  U 5      nUb  U S
S n O[$        R                  U 5      nUb  U SS n U R                  S5      n[	        U5      nUS:  a  [
        R                  R                  eSn/ nU H  n	U	S:X  aO  U(       a  [
        R                  R                  eSn['        SSU-
  S
-   5       H  n
UR)                  S5        M     MX  [	        U	5      nUS:  a  [
        R                  R                  eUS:w  a  SSU-
  -  U	-   n	UR)                  U	5        M     US:  a!  U(       d  [
        R                  R                  eSR+                  U5      n  [,        R.                  " U 5      $ ! [,        R0                  [2        4 a    [
        R                  R                  ef = f)a
  Convert an IPv6 address in text form to binary form.

*text*, a ``str``, 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   r,      :s   ::s   0::Nz{}:{:02x}{:02x}:{:02x}{:02x}r      r   r   FTs   0000r      0)
isinstancebytesencodesplitr   r   	exceptionSyntaxErrorendswith
startswith
_v4_endingr   r   	inet_atonr   formatr   _colon_colon_start_colon_colon_endr   r   r   r   	unhexlifyError	TypeError)textignore_scopepartsr!   r#   br   
seen_empty	canonicalc_lcs               r+   r<   r<   c   s    dE""{{}

4 J68DU--+++s{mm'''	t		T]]5%9%9mm'''			tu'='=mm'''	 	A}HHqwwqz*/66qwwqz7H7H7J78tQqT1Q478t=>Dfh 	 	  &A}ABx""4(=9D ZZFFA1umm'''JI8mm///J1a!eai(  ) ) QBAvmm///QwQV_)Q  	1uZmm'''88ID
(!!$''NNI& (mm'''(s   L0 05M%s             c                 ,    U R                  [        5      $ )zIs the specified address a mapped IPv4 address?

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

Returns a ``bool``.
)r:   _mapped_prefix)r   s    r+   	is_mappedrN      s     n--r,   )F)__doc__rer   dns.exceptionr   dns.ipv4compiler   r   r;   r>   r?   r<   rM   rN    r,   r+   <module>rU      sn   $  	   

+,AF ZZ67
ZZ) ::i( V(p ,.r,   