
                             S r SSKrSSKrSSKrSSKrSSKJrJrJ	r	  \R                  " S5      rS r\R                  " S5      r\R                  " S5      r\R                  " S	5      rS
 rSrS rg)zIPv6 helper functions.    N   )xrangebinary_typemaybe_decodez0+([0-9a-f]+)c                 &   [        U 5      S:w  a  [        S5      e[        R                  " U 5      n/ nSn[        U5      nX4:  aV  [	        XUS-    5      n[
        R                  U5      nUb  UR                  S5      nUR                  U5        US-  nX4:  a  MV  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 ``binary``, the IPv6 address in binary form.

Raises ``ValueError`` if the address isn't 16 bytes long.
Returns a ``text``.
   z IPv6 addresses are 16 bytes longr      Nr   F   0T      ffffz::z::ffff:   :)len
ValueErrorbinasciihexlifyr   _leading_zeromatchgroupappendr   dnsipv4	inet_ntoajoin)addresshexchunksilchunkm
best_startbest_lenstartlast_was_zeroendcurrent_lenprefixs                 lib/third_party/dns/ipv6.pyr   r      s    7|r;<<


7
#CF	ACA
%SQU^, &yGGAJEe	Q % JHEMAY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 S:X  a  Sn [        R	                  U 5      nUb  [        [        R                  R                  UR                  S5      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      $ ! [*        R.                  [0        4 a    [        R                   R"                  ef = f)zConvert an IPv6 address in text form to binary form.

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

Returns a ``binary``.
s   ::s   0::N   z{}:{:02x}{:02x}:{:02x}{:02x}r   r      r
      :r   Fr-   Ts   0000r	      0)
isinstancer   encode
_v4_endingr   	bytearrayr   r   	inet_atonr   formatdecode_colon_colon_start_colon_colon_endsplitr   	exceptionSyntaxErrorr   r   r   r   	unhexlifyError	TypeError)
textr$   br    r"   
seen_empty	canonicalcr!   lcs
             r,   r7   r7   d   s#    dK(({{}u} 	A9chh((45/66qwwqz7H7H7J78tQqT1Q478t=>Dfh 	 	  &A9ABx""4(y9D ZZFFA1umm'''JI8mm///JAq1uqy)  ) * QBAvmm///QwQV_)Q  	1uZmm'''88ID
(!!$''NNI& (mm'''(s   (H> >5I3s             c                 ,    U R                  [        5      $ )zIs the specified address a mapped IPv4 address?

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

Returns a ``bool``.
)
startswith_mapped_prefix)r   s    r,   	is_mappedrK      s     n--r-   )__doc__rer   dns.exceptionr   dns.ipv4_compatr   r   r   compiler   r   r5   r:   r;   r7   rJ   rK    r-   r,   <module>rS      st   $  	    6 6

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