a
    "h*3                    @   s  d Z ddlZdZdZG dd deZG dd deZd	d
 Zd<ddZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! ZG d"d# d#ZdaejG d$d% d%eZejG d&d' d'eZG d(d) d)ZG d*d+ d+eeZG d,d- d-eZG d.d/ d/eeZG d0d1 d1Zee_G d2d3 d3ZG d4d5 d5eeZG d6d7 d7eZ G d8d9 d9eeZ!G d:d; d;Z"e"e_dS )=z1.0    N       c                   @   s   e Zd ZdS )AddressValueErrorN__name__
__module____qualname__ r	   r	   1/opt/python-3.9.21/usr/lib/python3.9/ipaddress.pyr      s   r   c                   @   s   e Zd ZdS )NetmaskValueErrorNr   r	   r	   r	   r
   r      s   r   c              	   C   sV   z
t | W S  ttfy    Y n0 z
t| W S  ttfyB   Y n0 t| dd S )Nz. does not appear to be an IPv4 or IPv6 address)IPv4Addressr   r   IPv6Address
ValueErroraddressr	   r	   r
   
ip_address   s    

r   Tc              	   C   sZ   zt | |W S  ttfy"   Y n0 zt| |W S  ttfyF   Y n0 t| dd S )Nz. does not appear to be an IPv4 or IPv6 network)IPv4Networkr   r   IPv6Networkr   )r   strictr	   r	   r
   
ip_network8   s    r   c              	   C   sV   z
t | W S  ttfy    Y n0 z
t| W S  ttfyB   Y n0 t| dd S )Nz0 does not appear to be an IPv4 or IPv6 interface)IPv4Interfacer   r   IPv6Interfacer   r   r	   r	   r
   ip_interfaceU   s    

r   c                 C   s.   z|  ddW S  ty(   tdY n0 d S )N   bigz&Address negative or too large for IPv4to_bytesOverflowErrorr   r   r	   r	   r
   v4_int_to_packedw   s    r   c                 C   s.   z|  ddW S  ty(   tdY n0 d S )N   r   z&Address negative or too large for IPv6r   r   r	   r	   r
   v6_int_to_packed   s    
r    c                 C   s,   t | d}t|dkr(td| |S )N/   zOnly one '/' permitted in )strsplitlenr   )r   addrr	   r	   r
   _split_optional_netmask   s    r'   c                 c   sN   t | }t| }}|D ]&}|j|jd kr:||fV  |}|}q||fV  d S N   )iternext_ip)	addressesitfirstlastipr	   r	   r
   _find_address_range   s    

r2   c                 C   s$   | dkr|S t ||  | d @  S )Nr   r)   )min
bit_length)numberbitsr	   r	   r
   _count_righthand_zero_bits   s    r7   c                 c   s   t | trt |tstd| j|jkr8td| |f | |krHtd| jdkrXt}n| jdkrht}ntd| j}| j}|j}||krt	t
|||| d  d }|||| f}|V  |d|> 7 }|d |jkrqqd S )Nz1first and last must be IP addresses, not networks%%s and %s are not of the same versionz*last IP address must be greater than firstr      zunknown IP versionr)   )
isinstance_BaseAddress	TypeErrorversionr   r   r   _max_prefixlenr,   r3   r7   r4   	_ALL_ONES)r/   r0   r1   ip_bits	first_intlast_intnbitsnetr	   r	   r
   summarize_address_range   s6    



rE   c                 c   s   t | }i }|rV| }| }||}|d u r<|||< q||kr||= || qd }t| D ]$}|d ur|j|jkrqf|V  |}qfd S N)listpopsupernetgetappendsortedvaluesbroadcast_address)r-   to_mergesubnetsrD   rI   existingr0   r	   r	   r
   _collapse_addresses_internal   s$    

rR   c              	   C   s.  g }g }g }| D ]}t |trR|rF|d j|jkrFtd||d f || q|j|jkr|r|d j|jkrtd||d f z||j W q ty   ||j	 Y q0 q|r|d j|jkrtd||d f || qt
t|}|r"t|D ]\}}|t|| qt|| S )Nr8   )r:   r;   _versionr<   rK   
_prefixlenr>   r1   AttributeErrornetwork_addressrL   setr2   extendrE   rR   )r-   addrsipsnetsr1   r/   r0   r	   r	   r
   collapse_addresses/  s:    
r]   c                 C   s(   t | tr|  S t | tr$|  S tS rF   )r:   _BaseNetwork_get_networks_keyr;   _get_address_keyNotImplemented)objr	   r	   r
   get_mixed_type_keye  s
    

rc   c                   @   s   e Zd ZdZedd Zedd Zedd Zedd	 Zd
d Z	dd Z
edd Zedd Zedd Zedd Zedd Zedd Zdd ZdS )_IPAddressBaser	   c                 C   s   |   S rF   )_explode_shorthand_ip_stringselfr	   r	   r
   exploded  s    z_IPAddressBase.explodedc                 C   s   t | S rF   r#   rf   r	   r	   r
   
compressed  s    z_IPAddressBase.compressedc                 C   s   |   S rF   )_reverse_pointerrf   r	   r	   r
   reverse_pointer  s    	z_IPAddressBase.reverse_pointerc                 C   s   dt | f }t|d S )Nz%200s has no version specifiedtypeNotImplementedErrorrg   msgr	   r	   r
   r=     s    z_IPAddressBase.versionc                 C   sF   |dk rd}t ||| jf || jkrBd}t ||| j| jf d S )Nr   z-%d (< 0) is not permitted as an IPv%d addressz2%d (>= 2**%d) is not permitted as an IPv%d address)r   rT   r?   r>   )rg   r   rq   r	   r	   r
   _check_int_address  s    

z!_IPAddressBase._check_int_addressc                 C   s.   t |}||kr*d}t||||| jf d S )Nz6%r (len %d != %d) is not permitted as an IPv%d address)r%   r   rT   )rg   r   expected_lenaddress_lenrq   r	   r	   r
   _check_packed_address  s    z$_IPAddressBase._check_packed_addressc                 C   s   | j | j |? A S rF   )r?   )cls	prefixlenr	   r	   r
   _ip_int_from_prefix  s    z"_IPAddressBase._ip_int_from_prefixc           	      C   s\   t || j}| j| }||? }d|> d }||krX| jd }||d}d}t|| |S )Nr)      r   z&Netmask pattern %r mixes zeroes & ones)r7   r>   r   r   )	rv   ip_inttrailing_zeroesrw   leading_onesall_onesbyteslendetailsrq   r	   r	   r
   _prefix_from_ip_int  s    

z"_IPAddressBase._prefix_from_ip_intc                 C   s   d| }t |d d S )Nz%r is not a valid netmask)r   )rv   netmask_strrq   r	   r	   r
   _report_invalid_netmask  s    z&_IPAddressBase._report_invalid_netmaskc                 C   sj   |  r| s| | zt|}W n tyB   | | Y n0 d|  krZ| jksfn | | |S Nr   )isasciiisdigitr   intr   r>   )rv   prefixlen_strrw   r	   r	   r
   _prefix_from_prefix_string  s    

z)_IPAddressBase._prefix_from_prefix_stringc                 C   s   z|  |}W n ty*   | | Y n0 z| |W S  tyJ   Y n0 || jN }z| |W S  ty~   | | Y n0 d S rF   )_ip_int_from_stringr   r   r   r   r?   )rv   ip_strrz   r	   r	   r
   _prefix_from_ip_string  s    
z%_IPAddressBase._prefix_from_ip_stringc                 C   sH   t |ttfr|| jfS t |ts*t|}t|dkr:|S |d | jfS )Nr)   r   )r:   bytesr   r>   tupler'   r%   )rv   r   r	   r	   r
   _split_addr_prefix  s    

z!_IPAddressBase._split_addr_prefixc                 C   s   | j t| ffS rF   )	__class__r#   rf   r	   r	   r
   
__reduce__,  s    z_IPAddressBase.__reduce__N)r   r   r   	__slots__propertyrh   rj   rl   r=   rr   ru   classmethodrx   r   r   r   r   r   r   r	   r	   r	   r
   rd   ~  s0   




	




!
rd   c                       sp   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Z fddZ  ZS )r;   r	   c                 C   s   | j S rF   )r,   rf   r	   r	   r
   __int__=  s    z_BaseAddress.__int__c                 C   s6   z| j |j ko| j|jkW S  ty0   t Y S 0 d S rF   )r,   rT   rV   ra   rg   otherr	   r	   r
   __eq__@  s    
z_BaseAddress.__eq__c                 C   sF   t |tstS | j|jkr*td| |f | j|jkrB| j|jk S dS Nr8   F)r:   r;   ra   rT   r<   r,   r   r	   r	   r
   __lt__G  s    
z_BaseAddress.__lt__c                 C   s    t |tstS | t| | S rF   r:   r   ra   r   r   r	   r	   r
   __add__S  s    
z_BaseAddress.__add__c                 C   s    t |tstS | t| | S rF   r   r   r	   r	   r
   __sub__X  s    
z_BaseAddress.__sub__c                 C   s   d| j jt| f S Nz%s(%r)r   r   r#   rf   r	   r	   r
   __repr__]  s    z_BaseAddress.__repr__c                 C   s   t | | jS rF   )r#   _string_from_ip_intr,   rf   r	   r	   r
   __str__`  s    z_BaseAddress.__str__c                 C   s   t tt| jS rF   )hashhexr   r,   rf   r	   r	   r
   __hash__c  s    z_BaseAddress.__hash__c                 C   s
   | j | fS rF   rT   rf   r	   r	   r
   r`   f  s    z_BaseAddress._get_address_keyc                 C   s   | j | jffS rF   )r   r,   rf   r	   r	   r
   r   i  s    z_BaseAddress.__reduce__c                    s   |r|d dkrt t| |S td u r8dd l}|dat|}|sRt |S | \}}}|dkr|| j	dkrxd}nd}|dkr| j
}n
| j
d }|r||d d	 7 }|r|d
7 }t t| | d| | | S )NrS   sr   z(#?)(_?)([xbnX])nr   bxr)   r"   0)formatr#   _address_fmt_rerecompile	fullmatchsuper
__format__groupsrT   r>   r   )rg   fmtr   m	alternategroupingfmt_basepadlenr   r	   r
   r   l  s*    



z_BaseAddress.__format__)r   r   r   r   r   r   r   r   r   r   r   r   r`   r   r   __classcell__r	   r	   r   r
   r;   2  s   	r;   c                   @   s\  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zejdd Zejdd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Zd%d& Zd'd( Zd)d* ZdEd-d.ZdFd/d0Zed1d2 Zed3d4 Zd5d6 Z d7d8 Z!ed9d: Z"ed;d< Z#ed=d> Z$ed?d@ Z%edAdB Z&edCdD Z'd,S )Gr^   c                 C   s   d| j jt| f S r   r   rf   r	   r	   r
   r     s    z_BaseNetwork.__repr__c                 C   s   d| j | jf S N%s/%d)rW   rw   rf   r	   r	   r
   r     s    z_BaseNetwork.__str__c                 c   s8   t | j}t | j}t|d |D ]}| |V  q"d S r(   r   rW   rN   range_address_classrg   network	broadcastr   r	   r	   r
   hosts  s    

z_BaseNetwork.hostsc                 c   s8   t | j}t | j}t||d D ]}| |V  q"d S r(   r   r   r	   r	   r
   __iter__  s    

z_BaseNetwork.__iter__c                 C   sl   t | j}t | j}|dkr>|| |kr0td| || S |d7 }|| |k rZtd| || S d S )Nr   zaddress out of ranger)   )r   rW   rN   
IndexErrorr   )rg   r   r   r   r	   r	   r
   __getitem__  s    

z_BaseNetwork.__getitem__c                 C   s^   t |tstS | j|jkr*td| |f | j|jkrB| j|jk S | j|jkrZ| j|jk S dS r   )r:   r^   ra   rT   r<   rW   netmaskr   r	   r	   r
   r     s    
z_BaseNetwork.__lt__c                 C   sJ   z.| j |j ko,| j|jko,t| jt|jkW S  tyD   t Y S 0 d S rF   )rT   rW   r   r   rV   ra   r   r	   r	   r
   r     s    
z_BaseNetwork.__eq__c                 C   s   t t| jt| jA S rF   )r   r   rW   r   rf   r	   r	   r
   r     s    z_BaseNetwork.__hash__c                 C   s8   | j |j krdS t|trdS |j| jj@ | jjkS d S NF)rT   r:   r^   r,   r   rW   r   r	   r	   r
   __contains__  s
    
z_BaseNetwork.__contains__c                 C   s(   | j |v p&| j|v p&|j | v p&|j| v S rF   )rW   rN   r   r	   r	   r
   overlaps  s
    


z_BaseNetwork.overlapsc                 C   s   |  t| jt| jB S rF   )r   r   rW   hostmaskrf   r	   r	   r
   rN     s    z_BaseNetwork.broadcast_addressc                 C   s   |  t| j| jA S rF   )r   r   r   r?   rf   r	   r	   r
   r     s    z_BaseNetwork.hostmaskc                 C   s   d| j | jf S r   )rW   rU   rf   r	   r	   r
   with_prefixlen  s    z_BaseNetwork.with_prefixlenc                 C   s   d| j | jf S N%s/%s)rW   r   rf   r	   r	   r
   with_netmask  s    z_BaseNetwork.with_netmaskc                 C   s   d| j | jf S r   )rW   r   rf   r	   r	   r
   with_hostmask  s    z_BaseNetwork.with_hostmaskc                 C   s   t | jt | j d S r(   )r   rN   rW   rf   r	   r	   r
   num_addresses
  s    z_BaseNetwork.num_addressesc                 C   s   dt | f }t|d S )Nz%%200s has no associated address classrm   rp   r	   r	   r
   r     s    z_BaseNetwork._address_classc                 C   s   | j S rF   )rU   rf   r	   r	   r
   rw     s    z_BaseNetwork.prefixlenc                 c   s  | j |j kstd| |f t|ts2td| || sLtd|| f || krXd S |d|j|jf }| 	 \}}||kr||kr||r|V  |	 \}}qz||r|V  |	 \}}qzt
d|||f qz||kr|V  n"||kr|V  nt
d|||f d S )Nr8   z%s is not a network objectz%s not contained in %sr   z3Error performing exclusion: s1: %s s2: %s other: %s)rT   r<   r:   r^   	subnet_ofr   r   rW   rw   rP   AssertionError)rg   r   s1s2r	   r	   r
   address_exclude  s>    $




z_BaseNetwork.address_excludec                 C   s`   | j |j krtd| |f | j|jk r,dS | j|jkr<dS | j|jk rLdS | j|jkr\dS dS )Nz"%s and %s are not of the same typerS   r)   r   )rT   r<   rW   r   r   r	   r	   r
   compare_networksf  s    !z_BaseNetwork.compare_networksc                 C   s   | j | j| jfS rF   )rT   rW   r   rf   r	   r	   r
   r_     s    z_BaseNetwork._get_networks_keyr)   Nc           	      c   s   | j | jkr| V  d S |d urJ|| j k r0td|dkr@td|| j  }|dk rZtd| j | }|| jkr~td|| f t| j}t| jd }t| jd |? }t|||D ]}| ||f}|V  qd S )Nznew prefix must be longerr)   (cannot set prefixlen_diff and new_prefixr   zprefix length diff must be > 0z0prefix length diff %d is invalid for netblock %s)	rU   r>   r   r   rW   rN   r   r   r   )	rg   prefixlen_diff
new_prefixnew_prefixlenstartendstepnew_addrcurrentr	   r	   r
   rP     s0    




z_BaseNetwork.subnetsc                 C   s   | j dkr| S |d urB|| j kr(td|dkr8td| j | }| j| }|dk rftd| j|f | t| jt| j|> @ |fS )Nr   znew prefix must be shorterr)   r   z;current prefixlen is %d, cannot have a prefixlen_diff of %d)rU   r   rw   r   r   rW   r   )rg   r   r   r   r	   r	   r
   rI     s&    



z_BaseNetwork.supernetc                 C   s   | j jo| jjS rF   )rW   is_multicastrN   rf   r	   r	   r
   r     s    	z_BaseNetwork.is_multicastc                 C   sf   z:| j |j kr"t|  d| d|j| jko8|j| jkW S  ty`   td|  d| Y n0 d S )Nz and z are not of the same versionz*Unable to test subnet containment between )rT   r<   rW   rN   rV   )ar   r	   r	   r
   _is_subnet_of
  s    
z_BaseNetwork._is_subnet_ofc                 C   s   |  | |S rF   r   r   r	   r	   r
   r     s    z_BaseNetwork.subnet_ofc                 C   s   |  || S rF   r   r   r	   r	   r
   supernet_of  s    z_BaseNetwork.supernet_ofc                 C   s   | j jo| jjS rF   )rW   is_reservedrN   rf   r	   r	   r
   r     s    	z_BaseNetwork.is_reservedc                 C   s   | j jo| jjS rF   )rW   is_link_localrN   rf   r	   r	   r
   r   *  s    z_BaseNetwork.is_link_localc                 C   s   | j jo| jjS rF   )rW   
is_privaterN   rf   r	   r	   r
   r   5  s    	z_BaseNetwork.is_privatec                 C   s   | j  S rF   )r   rf   r	   r	   r
   	is_globalA  s    	z_BaseNetwork.is_globalc                 C   s   | j jo| jjS rF   )rW   is_unspecifiedrN   rf   r	   r	   r
   r   L  s    	z_BaseNetwork.is_unspecifiedc                 C   s   | j jo| jjS rF   )rW   is_loopbackrN   rf   r	   r	   r
   r   X  s    	z_BaseNetwork.is_loopback)r)   N)r)   N)(r   r   r   r   r   r   r   r   r   r   r   r   r   	functoolscached_propertyrN   r   r   r   r   r   r   r   rw   r   r   r_   rP   rI   r   staticmethodr   r   r   r   r   r   r   r   r   r	   r	   r	   r
   r^     sb   







K0

5
)








r^   c                   @   s   e Zd ZdZdZde d ZeZi Zdd Z	e
dd Ze
d	d
 Ze
dd Ze
dd Zdd Zedd Zedd ZdS )_BaseV4r	   r   r"   r)   c                 C   s   t | S rF   ri   rf   r	   r	   r
   re   w  s    z$_BaseV4._explode_shorthand_ip_stringc                 C   s   || j vrt|tr<|}d|  kr.| jkshn | | n,z| |}W n tyf   | |}Y n0 t| 	|}||f| j |< | j | S r   )
_netmask_cacher:   r   r>   r   r   r   r   r   rx   rv   argrw   r   r	   r	   r
   _make_netmaskz  s    	

z_BaseV4._make_netmaskc              
   C   s   |st d|d}t|dkr.t d| ztt| j|dW S  tyz } zt d||f d W Y d }~n
d }~0 0 d S )NAddress cannot be empty.r   zExpected 4 octets in %rr   %s in %r)r   r$   r%   r   
from_bytesmap_parse_octetr   )rv   r   octetsexcr	   r	   r
   r     s    
z_BaseV4._ip_int_from_stringc                 C   s   |st d| r| s,d}t || t|dkrHd}t || |dkrl|d dkrld}t || t|d}|d	krt d
| |S )NzEmpty octet not permittedz#Only decimal digits permitted in %r   z$At most 3 characters permitted in %rr   r   z%Leading zeros are not permitted in %r
      zOctet %d (> 255) not permitted)r   r   r   r%   r   )rv   	octet_strrq   	octet_intr	   r	   r
   r     s    
z_BaseV4._parse_octetc                 C   s   d tt|ddS )Nr   r   r   )joinr   r#   r   )rv   rz   r	   r	   r
   r     s    z_BaseV4._string_from_ip_intc                 C   s&   t | dd d d }d|d S )Nr   rS   z.in-addr.arpa)r#   r$   r  )rg   reverse_octetsr	   r	   r
   rk     s    z_BaseV4._reverse_pointerc                 C   s   | j S rF   r>   rf   r	   r	   r
   max_prefixlen  s    z_BaseV4.max_prefixlenc                 C   s   | j S rF   r   rf   r	   r	   r
   r=     s    z_BaseV4.versionN)r   r   r   r   rT   
IPV4LENGTHr?   r>   r   re   r   r   r   r   r   rk   r   r  r=   r	   r	   r	   r
   r   d  s&   	


#
	
r   c                   @   s   e Zd ZdZdd Zedd Zedd Zee	 dd	 Z
ee	 d
d Zedd Zedd Zedd Zedd ZdS )r   )r,   __weakref__c                 C   st   t |tr| | || _d S t |trF| |d t|d| _d S t|}d|v rdtd|| 	|| _d S )Nr   r   r!   Unexpected '/' in )
r:   r   rr   r,   r   ru   r   r#   r   r   rg   r   addr_strr	   r	   r
   __init__  s    


zIPv4Address.__init__c                 C   s
   t | jS rF   )r   r,   rf   r	   r	   r
   packed  s    zIPv4Address.packedc                 C   s   | | j jv S rF   )
_constants_reserved_networkrf   r	   r	   r
   r     s    	zIPv4Address.is_reservedc                    s4   t  fdd jjD o2t fdd jjD S )Nc                 3   s   | ]} |v V  qd S rF   r	   .0rD   rf   r	   r
   	<genexpr><      z)IPv4Address.is_private.<locals>.<genexpr>c                 3   s   | ]} |vV  qd S rF   r	   r  rf   r	   r
   r  =  r  )anyr  _private_networksall_private_networks_exceptionsrf   r	   rf   r
   r   *  s    zIPv4Address.is_privatec                 C   s   | | j jvo| j S rF   )r  _public_networkr   rf   r	   r	   r
   r   @  s    zIPv4Address.is_globalc                 C   s   | | j jv S rF   )r  _multicast_networkrf   r	   r	   r
   r   R  s    	zIPv4Address.is_multicastc                 C   s   | | j jkS rF   )r  _unspecified_addressrf   r	   r	   r
   r   ]  s    	zIPv4Address.is_unspecifiedc                 C   s   | | j jv S rF   )r  _loopback_networkrf   r	   r	   r
   r   h  s    zIPv4Address.is_loopbackc                 C   s   | | j jv S rF   )r  _linklocal_networkrf   r	   r	   r
   r   r  s    zIPv4Address.is_link_localN)r   r   r   r   r
  r   r  r   r   	lru_cacher   r   r   r   r   r   r	   r	   r	   r
   r     s(   #







	r   c                   @   sx   e Zd Zdd Zejdd Zdd Zdd Zd	d
 Z	dd Z
ejZedd Zedd Zedd Zedd ZdS )r   c                 C   sD   |  |\}}t| | t||fdd| _| jj| _| jj| _d S NF)r   )r   r   r
  r   r   r   rU   rg   r   r&   maskr	   r	   r
   r
    s
    
zIPv4Interface.__init__c                 C   s   | j jS rF   r   r   rf   r	   r	   r
   r     s    zIPv4Interface.hostmaskc                 C   s   d|  | j| jf S r   r   r,   rU   rf   r	   r	   r
   r     s    zIPv4Interface.__str__c                 C   sD   t | |}|tu s|s|S z| j|jkW S  ty>   Y dS 0 d S r   )r   r   ra   r   rV   rg   r   address_equalr	   r	   r
   r     s    zIPv4Interface.__eq__c                 C   sP   t | |}|tu rtS z| j|jk p4| j|jko4|W S  tyJ   Y dS 0 d S r   )r   r   ra   r   rV   rg   r   address_lessr	   r	   r
   r     s    zIPv4Interface.__lt__c                 C   s   t | j| jt| jjfS rF   r   r,   rU   r   r   rW   rf   r	   r	   r
   r     s    zIPv4Interface.__hash__c                 C   s
   t | jS rF   )r   r,   rf   r	   r	   r
   r1     s    zIPv4Interface.ipc                 C   s   d|  | j| jf S r   r   rf   r	   r	   r
   r     s    zIPv4Interface.with_prefixlenc                 C   s   d|  | j| jf S r   r   r,   r   rf   r	   r	   r
   r     s    zIPv4Interface.with_netmaskc                 C   s   d|  | j| jf S r   r   r,   r   rf   r	   r	   r
   r     s    zIPv4Interface.with_hostmaskN)r   r   r   r
  r   r   r   r   r   r   r   rd   r   r   r1   r   r   r   r	   r	   r	   r
   r   }  s    



r   c                   @   s.   e Zd ZeZdddZee dd Z	dS )r   Tc                    s   |  |\ }t | _| |\| _| _t| j}|t| j@ |krl|rXtd|  nt|t| j@ | _| j| jd kr| j	| _
n| j| jkr fdd| _
d S )N%s has host bits setr)   c                      s
   t  gS rF   )r   r	   r&   r	   r
   <lambda>  r  z&IPv4Network.__init__.<locals>.<lambda>)r   r   rW   r   r   rU   r   r   r>   r   r   rg   r   r   r  r  r	   r)  r
   r
    s    #


zIPv4Network.__init__c                 C   s&   | j tdv o| jtdv  o$| j S )N100.64.0.0/10)rW   r   rN   r   rf   r	   r	   r
   r     s
    
zIPv4Network.is_globalN)T)
r   r   r   r   r   r
  r   r   r  r   r	   r	   r	   r
   r     s
   
4r   c                   @   s   e Zd ZedZedZedZedZededededededed	ed
ededededededgZededgZ	edZ
edZdS )_IPv4Constantsz169.254.0.0/16z127.0.0.0/8z224.0.0.0/4r,  z	0.0.0.0/8z
10.0.0.0/8z172.16.0.0/12z192.0.0.0/24z192.0.0.170/31z192.0.2.0/24z192.168.0.0/16z198.18.0.0/15z198.51.100.0/24z203.0.113.0/24z240.0.0.0/4z255.255.255.255/32z192.0.0.9/32z192.0.0.10/32z0.0.0.0N)r   r   r   r   r  r  r  r  r  r  r  r   r  r	   r	   r	   r
   r-    s0   r-  c                   @   s   e Zd ZdZdZde d ZdZedZ	eZ
i Zedd Zed	d
 Zedd Zedd ZedddZdd Zdd Zedd Zedd Zedd ZdS )_BaseV6r	   r9   r"   r)   ry   0123456789ABCDEFabcdefc                 C   sl   || j vrbt|tr<|}d|  kr.| jksFn | | n
| |}t| |}||f| j |< | j | S r   )r   r:   r   r>   r   r   r   rx   r   r	   r	   r
   r   O  s    	


z_BaseV6._make_netmaskc              
   C   s  |st d|d}d}t||k r:d||f }t |d|d v rzt| j}W n6 t y } zt d||f d W Y d }~n
d }~0 0 |d|d	? d
@   |d|d
@   | jd }t||krd|d |f }t |d }tdt|d D ]*}	||	 s|d ur"d| }t ||	}q|d ur|}
t|| d }|d sn|
d8 }
|
rnd}t || |d s|d8 }|rd}t || | j|
|  }|dk r4d}t || jd |f njt|| jkrd}t || j|f |d s
d}t || |d s$d}t || t|}
d}d}znd}t|
D ] }	|d	K }|| 	||	 O }qB|d	| K }t| dD ] }	|d	K }|| 	||	 O }q||W S  t
y } zt d||f d W Y d }~n
d }~0 0 d S )Nr   :r   z At least %d parts expected in %rr   rS   r   %xr     r)   z!At most %d colons permitted in %rz At most one '::' permitted in %rr   z0Leading ':' only permitted as part of '::' in %rz1Trailing ':' only permitted as part of '::' in %rz/Expected at most %d other parts with '::' in %rz,Exactly %d parts expected without '::' in %r)r   r$   r%   r   rH   r,   rK   _HEXTET_COUNTr   _parse_hextetr   )rv   r   parts
_min_partsrq   ipv4_intr   
_max_parts
skip_indexiparts_hiparts_loparts_skippedrz   r	   r	   r
   r   c  s    
(







z_BaseV6._ip_int_from_stringc                 C   s>   | j |std| t|dkr4d}t|| t|dS )NzOnly hex digits permitted in %rr   z$At most 4 characters permitted in %rr   )_HEX_DIGITS
issupersetr   r%   r   )rv   
hextet_strrq   r	   r	   r
   r4    s    z_BaseV6._parse_hextetc           	      C   s   d}d}d}d}t |D ]>\}}|dkrN|d7 }|dkr<|}||krV|}|}qd}d}q|dkr|| }|t|kr~|dg7 }dg|||< |dkrdg| }|S )NrS   r   r   r)    )	enumerater%   )	rv   hextetsbest_doublecolon_startbest_doublecolon_lendoublecolon_startdoublecolon_lenindexhextetbest_doublecolon_endr	   r	   r
   _compress_hextets  s0    

z_BaseV6._compress_hextetsNc                    sZ   |d u rt | j}|| jkr$tdd|   fddtdddD }| |}d|S )	NzIPv6 address is too large%032xc                    s&   g | ]}d t  ||d  d qS )r1  r   r   )r   r  r   hex_strr	   r
   
<listcomp>*  r  z/_BaseV6._string_from_ip_int.<locals>.<listcomp>r   r   r   r0  )r   r,   r?   r   r   rK  r  )rv   rz   rC  r	   rN  r
   r     s    


z_BaseV6._string_from_ip_intc                    s   t | trt| j}nt | tr,t| j}nt| }| |}d|   fddtdddD }t | ttfrdd	|| j
f S d	|S )	NrL  c                    s   g | ]} ||d   qS )r   r	   rM  rN  r	   r
   rP  ?  r  z8_BaseV6._explode_shorthand_ip_string.<locals>.<listcomp>r   r   r   r   r0  )r:   r   r#   rW   r   r1   r   r   r^   r  rU   )rg   r   rz   r5  r	   rN  r
   re   /  s    


z$_BaseV6._explode_shorthand_ip_stringc                 C   s&   | j d d d dd}d|d S )NrS   r0  rA  r   z	.ip6.arpa)rh   replacer  )rg   reverse_charsr	   r	   r
   rk   D  s    z_BaseV6._reverse_pointerc                 C   s:   |  d\}}}|sd }n|r&d|v r2td|  ||fS )N%zInvalid IPv6 address: "%r")	partitionr   )r   r&   sepscope_idr	   r	   r
   _split_scope_idM  s    z_BaseV6._split_scope_idc                 C   s   | j S rF   r  rf   r	   r	   r
   r  a  s    z_BaseV6.max_prefixlenc                 C   s   | j S rF   r   rf   r	   r	   r
   r=   e  s    z_BaseV6.version)N)r   r   r   r   rT   
IPV6LENGTHr?   r3  	frozensetr>  r>   r   r   r   r   r4  rK  r   re   rk   r   rW  r   r  r=   r	   r	   r	   r
   r.  ;  s2   	

g

/	

r.  c                       s   e Zd ZdZdd Z fddZdd Z fdd	Zed
d Z	edd Z
edd Zedd Zedd Zedd Zee dd Zedd Zedd Zedd Zedd Zed d! Zed"d# Z  ZS )$r   )r,   	_scope_idr  c                 C   s   t |tr$| | || _d | _d S t |trR| |d t|d| _d | _d S t|}d|v rpt	d|| 
|\}| _| || _d S )Nr   r   r!   r  )r:   r   rr   r,   rZ  r   ru   r   r#   r   rW  r   r  r	   r	   r
   r
  p  s    


zIPv6Address.__init__c                    s"   t   }| jr|d | j S |S )NrS  )r   r   rZ  )rg   r   r   r	   r
   r     s    
zIPv6Address.__str__c                 C   s   t | j| jfS rF   )r   r,   rZ  rf   r	   r	   r
   r     s    zIPv6Address.__hash__c                    s2   t  |}|tu rtS |s dS | jt|dd kS )NFrZ  )r   r   ra   rZ  getattrr!  r   r	   r
   r     s    zIPv6Address.__eq__c                 C   s   | j S rF   )rZ  rf   r	   r	   r
   rV    s    
zIPv6Address.scope_idc                 C   s
   t | jS rF   )r    r,   rf   r	   r	   r
   r    s    zIPv6Address.packedc                 C   s    | j }|d ur|jS | | jjv S rF   )ipv4_mappedr   r  r  rg   r\  r	   r	   r
   r     s    	zIPv6Address.is_multicastc                    s.    j }|d ur|jS t fdd jjD S )Nc                 3   s   | ]} |v V  qd S rF   r	   rM  rf   r	   r
   r    r  z*IPv6Address.is_reserved.<locals>.<genexpr>)r\  r   r  r  _reserved_networksr]  r	   rf   r
   r     s    	zIPv6Address.is_reservedc                 C   s    | j }|d ur|jS | | jjv S rF   )r\  r   r  r  r]  r	   r	   r
   r     s    zIPv6Address.is_link_localc                 C   s   | | j jv S rF   )r  _sitelocal_networkrf   r	   r	   r
   is_site_local  s    zIPv6Address.is_site_localc                    sH    j }|d ur|jS t fdd jjD oFt fdd jjD S )Nc                 3   s   | ]} |v V  qd S rF   r	   r  rf   r	   r
   r    r  z)IPv6Address.is_private.<locals>.<genexpr>c                 3   s   | ]} |vV  qd S rF   r	   r  rf   r	   r
   r    r  )r\  r   r  r  r  r  r  r]  r	   rf   r
   r     s    zIPv6Address.is_privatec                 C   s   | j }|d ur|jS | j S rF   )r\  r   r   r]  r	   r	   r
   r     s    zIPv6Address.is_globalc                 C   s   | j }|d ur|jS | jdkS r   )r\  r   r,   r]  r	   r	   r
   r     s    	zIPv6Address.is_unspecifiedc                 C   s   | j }|d ur|jS | jdkS r(   )r\  r   r,   r]  r	   r	   r
   r   *  s    	zIPv6Address.is_loopbackc                 C   s    | j d? dkrd S t| j d@ S )Nr   r2      r,   r   rf   r	   r	   r
   r\  8  s    	zIPv6Address.ipv4_mappedc                 C   s4   | j d? dkrd S t| j d? d@ t| j  d@ fS )N`   i   @   ra  rb  rf   r	   r	   r
   teredoE  s
    
zIPv6Address.teredoc                 C   s$   | j d? dkrd S t| j d? d@ S )Np   i   P   ra  rb  rf   r	   r	   r
   	sixtofourT  s    	zIPv6Address.sixtofour)r   r   r   r   r
  r   r   r   r   rV  r  r   r   r   r`  r   r  r   r   r   r   r\  re  rh  r   r	   r	   r   r
   r   j  s@   (










r   c                       s   e Zd Zdd Zejdd Z fddZdd Zd	d
 Z	dd Z
ejZedd Zedd Zedd Zedd Zedd Ze fddZ  ZS )r   c                 C   sD   |  |\}}t| | t||fdd| _| jj| _| jj| _d S r  )r   r   r
  r   r   r   rU   r  r	   r	   r
   r
  d  s
    
zIPv6Interface.__init__c                 C   s   | j jS rF   r  rf   r	   r	   r
   r   l  s    zIPv6Interface.hostmaskc                    s   dt   | jf S r   )r   r   rU   rf   r   r	   r
   r   p  s    
zIPv6Interface.__str__c                 C   sD   t | |}|tu s|s|S z| j|jkW S  ty>   Y dS 0 d S r   )r   r   ra   r   rV   r!  r	   r	   r
   r   t  s    zIPv6Interface.__eq__c                 C   sP   t | |}|tu r|S z| j|jk p4| j|jko4|W S  tyJ   Y dS 0 d S r   )r   r   ra   r   rV   r#  r	   r	   r
   r     s    zIPv6Interface.__lt__c                 C   s   t | j| jt| jjfS rF   r%  rf   r	   r	   r
   r     s    zIPv6Interface.__hash__c                 C   s
   t | jS rF   )r   r,   rf   r	   r	   r
   r1     s    zIPv6Interface.ipc                 C   s   d|  | j| jf S r   r   rf   r	   r	   r
   r     s    zIPv6Interface.with_prefixlenc                 C   s   d|  | j| jf S r   r&  rf   r	   r	   r
   r     s    zIPv6Interface.with_netmaskc                 C   s   d|  | j| jf S r   r'  rf   r	   r	   r
   r     s    zIPv6Interface.with_hostmaskc                 C   s   | j dko| jjS r   )r,   r   r   rf   r	   r	   r
   r     s    zIPv6Interface.is_unspecifiedc                    s   t  jo| jjS rF   )r   r   r   rf   r   r	   r
   r     s    zIPv6Interface.is_loopback)r   r   r   r
  r   r   r   r   r   r   r   rd   r   r   r1   r   r   r   r   r   r   r	   r	   r   r
   r   b  s(   





r   c                   @   s.   e Zd ZeZd	ddZdd Zedd ZdS )
r   Tc                    s   |  |\ }t | _| |\| _| _t| j}|t| j@ |krl|rXtd|  nt|t| j@ | _| j| jd kr| j	| _
n| j| jkr fdd| _
d S )Nr(  r)   c                      s
   t  gS rF   )r   r	   r)  r	   r
   r*    r  z&IPv6Network.__init__.<locals>.<lambda>)r   r   rW   r   r   rU   r   r   r>   r   r   r+  r	   r)  r
   r
    s    


zIPv6Network.__init__c                 c   s<   t | j}t | j}t|d |d D ]}| |V  q&d S r(   r   r   r	   r	   r
   r     s    

zIPv6Network.hostsc                 C   s   | j jo| jjS rF   )rW   r`  rN   rf   r	   r	   r
   r`    s    zIPv6Network.is_site_localN)T)	r   r   r   r   r   r
  r   r   r`  r	   r	   r	   r
   r     s
   
0r   c                   @   s   e Zd ZedZedZededededededed	ed
edededgZededededededgZedededededededededededededed ed!gZed"Z	d#S )$_IPv6Constantsz	fe80::/10zff00::/8z::1/128z::/128z::ffff:0:0/96z64:ff9b:1::/48z100::/64z	2001::/23z2001:db8::/32z	2002::/16z	3fff::/20zfc00::/7z2001:1::1/128z2001:1::2/128z2001:3::/32z2001:4:112::/48z2001:20::/28z2001:30::/28z::/8z100::/8z200::/7z400::/6z800::/5z1000::/4z4000::/3z6000::/3z8000::/3zA000::/3zC000::/3zE000::/4zF000::/5zF800::/6zFE00::/9z	fec0::/10N)
r   r   r   r   r  r  r  r  r^  r_  r	   r	   r	   r
   ri  		  s>   
ri  )T)#__version__r   r  rX  r   r   r   r   r   r   r   r    r'   r2   r7   rE   rR   r]   rc   rd   r   total_orderingr;   r^   r   r   r   r   r-  r  r.  r   r   r   ri  r	   r	   r	   r
   <module>   sX   
"716 3k   H  CR&  1 yK\/