grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026 й¼]Õ'ã@s dZddlZdZdZGdd„deƒZGdd„deƒZd d „Zd d d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd d!„ZGd"d#„d#ƒZejGd$d%„d%eƒƒZejGd&d'„d'eƒƒZGd(d)„d)ƒZGd*d+„d+eeƒZGd,d-„d-eƒZGd.d/„d/eeƒZGd0d1„d1ƒZee_Gd2d3„d3ƒZGd4d5„d5eeƒZGd6d7„d7eƒZGd8d9„d9eeƒZ Gd:d;„d;ƒZ!e!e_dS)7}|d|j krÄPqÄWdS)Nz1first and last must be IP addresses, not networksz%%s and %s are not of the same versionz*last IP address must be greater than firstrézunknown IP versionr%) Ú isinstanceÚ _BaseAddressÚ TypeErrorÚversionr rrÚ_max_prefixlenr(r/r2r0Ú _ALL_ONES)r+r,r-Zip_bitsZ first_intZlast_intZnbitsÚnetrrr Úsummarize_address_rangeÊs0         r;ccsÒt|ƒ}i}xj|r~|jƒ}|jƒ}|j|ƒ}|dkr[|||Zexistingr,rrr Ú_collapse_addresses_internals$        rEc Cs˜g}g}g}x*|D]"}t|tƒrt|rd|dj|jkrdtd||dfƒ‚|j|ƒq|j|jkrø|r¼|dj|jkr¼td||dfƒ‚y|j|jƒWq;tk rô|j|j ƒYq;Xq|r.|dj|jkr.td||dfƒ‚|j|ƒqWt t |ƒƒ}|rŠx0t |ƒD]"\}}|j t||ƒƒqdWt||ƒS) Nr%z%%s and %s are not of the same versionéÿÿÿÿrFrFrFrFrF)r4r5Ú_versionr6r@Ú _prefixlenr8r-ÚAttributeErrorÚnetwork_addressrAÚsetr.Úextendr;rE)r)ZaddrsZipsZnetsr-r+r,rrr Úcollapse_addresses2s4  rMcCs6t|tƒr|jƒSt|tƒr2|jƒStS)N)r4Ú _BaseNetworkÚ_get_networks_keyr5Ú_get_address_keyÚNotImplemented)Úobjrrr Úget_mixed_type_keyhs   rSc@sÜeZdZfZedd„ƒZedd„ƒZedd„ƒZedd„ƒZd d „Z d d „Z e d d„ƒZ e dd„ƒZ e dd„ƒZe dd„ƒZe dd„ƒZdd„ZdS)Ú_IPAddressBasecCs |jƒS)N)Ú_explode_shorthand_ip_string)Úselfrrr Úexploded‡sz_IPAddressBase.explodedcCs t|ƒS)N)r )rVrrr Ú compressedŒsz_IPAddressBase.compressedcCs |jƒS)N)Ú_reverse_pointer)rVrrr Úreverse_pointer‘s z_IPAddressBase.reverse_pointercCs#dt|ƒf}t|ƒ‚dS)Nz%200s has no version specified)ÚtypeÚNotImplementedError)rVÚmsgrrr r7œsz_IPAddressBase.versioncCsc|dkr+d}t|||jfƒ‚||jkr_d}t|||j|jfƒ‚dS)Nrz-%d (< 0) is not permitted as an IPv%d addressz2%d (>= 2**%d) is not permitted as an IPv%d address)rrGr9r8)rVrr]rrr Ú_check_int_address¡s z!_IPAddressBase._check_int_addresscCsAt|ƒ}||kr=d}t|||||jfƒ‚dS)Nz6%r (len %d != %d) is not permitted as an IPv%d address)r"rrG)rVrZ expected_lenZ address_lenr]rrr Ú_check_packed_addressªs    z$_IPAddressBase._check_packed_addresscCs|j|j|?AS)N)r9)ÚclsÚ prefixlenrrr Ú_ip_int_from_prefix±s z"_IPAddressBase._ip_int_from_prefixc Cs|t||jƒ}|j|}||?}d|>d}||krx|jd}|j|dƒ}d}t||ƒ‚|S)Nr%érz&Netmask pattern %r mixes zeroes & ones)r2r8rr ) r`Úip_intZtrailing_zeroesraZ leading_onesZall_onesZbyteslenZdetailsr]rrr Ú_prefix_from_ip_int¾s      z"_IPAddressBase._prefix_from_ip_intcCsd|}t|ƒd‚dS)Nz%r is not a valid netmask)r )r`Z netmask_strr]rrr Ú_report_invalid_netmask×s z&_IPAddressBase._report_invalid_netmaskc Cs�tjj|ƒs|j|ƒyt|ƒ}Wntk rP|j|ƒYnXd|kok|jkns}|j|ƒ|S)Nr)Ú_BaseV4Ú_DECIMAL_DIGITSÚ issupersetrfÚintr r8)r`Z prefixlen_strrarrr Ú_prefix_from_prefix_stringÜs   z)_IPAddressBase._prefix_from_prefix_stringcCsŸy|j|ƒ}Wntk r4|j|ƒYnXy|j|ƒSWntk rZYnX||jN}y|j|ƒSWntk rš|j|ƒYnXdS)N)Ú_ip_int_from_stringrrfrer r9)r`Úip_strrdrrr Ú_prefix_from_ip_stringõs    z%_IPAddressBase._prefix_from_ip_stringcCs|jt|ƒffS)N)Ú __class__r )rVrrr Ú __reduce__sz_IPAddressBase.__reduce__N)rrrÚ __slots__ÚpropertyrWrXrZr7r^r_Ú classmethodrbrerfrkrnrprrrr rT�s    "rTc@sŽeZdZfZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Z d d„Z dd„Z dd„Z dd„Z dS)r5cCs|jS)N)r()rVrrr Ú__int__&sz_BaseAddress.__int__c CsCy&|j|jko$|j|jkSWntk r>tSYnXdS)N)r(rGrIrQ)rVÚotherrrr Ú__eq__)s  z_BaseAddress.__eq__cCsat|tƒstS|j|jkr;td||fƒ‚|j|jkr]|j|jkSdS)Nz%%s and %s are not of the same versionF)r4r5rQrGr6r()rVrurrr Ú__lt__0sz_BaseAddress.__lt__cCs*t|tƒstS|jt|ƒ|ƒS)N)r4rjrQro)rVrurrr Ú__add__<sz_BaseAddress.__add__cCs*t|tƒstS|jt|ƒ|ƒS)N)r4rjrQro)rVrurrr Ú__sub__Asz_BaseAddress.__sub__cCsd|jjt|ƒfS)Nz%s(%r))rorr )rVrrr Ú__repr__Fsz_BaseAddress.__repr__cCst|j|jƒƒS)N)r Ú_string_from_ip_intr()rVrrr Ú__str__Isz_BaseAddress.__str__cCsttt|jƒƒƒS)N)ÚhashÚhexrjr()rVrrr Ú__hash__Lsz_BaseAddress.__hash__cCs |j|fS)N)rG)rVrrr rPOsz_BaseAddress._get_address_keycCs|j|jffS)N)ror()rVrrr rpRsz_BaseAddress.__reduce__N)rrrrqrtrvrwrxryrzr|rrPrprrrr r5s         r5c@sêeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z edd„ƒZedd„ƒZedd„ƒZedd„ƒZedd „ƒZed!d"„ƒZed#d$„ƒZed%d&„ƒZd'd(„Zd)d*„Zd+d,„Zd-d.d/d0„Zd-d.d1d2„Zed3d4„ƒZed5d6„ƒZed7d8„ƒZed9d:„ƒZed;d<„ƒZ ed=d>„ƒZ!ed?d@„ƒZ"d.S)ArNcCs i|_dS)N)Ú_cache)rVrrrr Ú__init___sz_BaseNetwork.__init__cCsd|jjt|ƒfS)Nz%s(%r))rorr )rVrrr rzbsz_BaseNetwork.__repr__cCsd|j|jfS)Nz%s/%d)rJra)rVrrr r|esz_BaseNetwork.__str__ccsNt|jƒ}t|jƒ}x)t|d|ƒD]}|j|ƒVq2WdS)Nr%)rjrJrCÚrangeÚ_address_class)rVÚnetworkÚ broadcastÚxrrr Úhostshsz_BaseNetwork.hostsccsNt|jƒ}t|jƒ}x)t||dƒD]}|j|ƒVq2WdS)Nr%)rjrJrCr‚rƒ)rVr„r…r†rrr Ú__iter__tsz_BaseNetwork.__iter__cCs†t|jƒ}t|jƒ}|dkrQ|||kr@t‚|j||ƒS|d7}|||krqt‚|j||ƒSdS)Nrr%)rjrJrCÚ IndexErrorrƒ)rVÚnr„r…rrr Ú __getitem__zs  z_BaseNetwork.__getitem__cCsƒt|tƒstS|j|jkr;td||fƒ‚|j|jkr]|j|jkS|j|jkr|j|jkSdS)Nz%%s and %s are not of the same versionF)r4rNrQrGr6rJÚnetmask)rVrurrr rw‡sz_BaseNetwork.__lt__c CsayD|j|jkoB|j|jkoBt|jƒt|jƒkSWntk r\tSYnXdS)N)rGrJrjrŒrIrQ)rVrurrr rv“s   z_BaseNetwork.__eq__cCs tt|jƒt|jƒAƒS)N)r}rjrJrŒ)rVrrr r›sz_BaseNetwork.__hash__cCs`|j|jkrdSt|tƒr)dSt|jƒt|jƒkoYt|jƒkSSdS)NF)rGr4rNrjrJr(rC)rVrurrr Ú __contains__žs  z_BaseNetwork.__contains__cCs:|j|kp9|j|kp9|j|kp9|j|kS)N)rJrC)rVrurrr Úoverlaps«sz_BaseNetwork.overlapscCsT|jjdƒ}|dkrP|jt|jƒt|jƒBƒ}||jd<|S)NrC)r€r?rƒrjrJÚhostmask)rVr†rrr rC²s   z_BaseNetwork.broadcast_addresscCsN|jjdƒ}|dkrJ|jt|jƒ|jAƒ}||jd<|S)Nr�)r€r?rƒrjrŒr9)rVr†rrr r�»s   z_BaseNetwork.hostmaskcCsd|j|jfS)Nz%s/%d)rJrH)rVrrr Úwith_prefixlenÃsz_BaseNetwork.with_prefixlencCsd|j|jfS)Nz%s/%s)rJrŒ)rVrrr Ú with_netmaskÇsz_BaseNetwork.with_netmaskcCsd|j|jfS)Nz%s/%s)rJr�)rVrrr Ú with_hostmaskËsz_BaseNetwork.with_hostmaskcCst|jƒt|jƒdS)Nr%)rjrCrJ)rVrrr Ú num_addressesÏsz_BaseNetwork.num_addressescCs#dt|ƒf}t|ƒ‚dS)Nz%%200s has no associated address class)r[r\)rVr]rrr rƒÔsz_BaseNetwork._address_classcCs|jS)N)rH)rVrrr raÜsz_BaseNetwork.prefixlenccs»|j|jks(td||fƒ‚t|tƒsGtd|ƒ‚|j|jkoh|j|jks�td||fƒ‚||kr‘dS|jd|j|jfƒ}|j ƒ\}}x±||kru||kru|j|jkr|j|jkr|V|j ƒ\}}qÅ|j|jkrY|j|jkrY|V|j ƒ\}}qÅt d|||fƒ‚qÅW||krŠ|Vn-||krž|Vnt d|||fƒ‚dS)Nz%%s and %s are not of the same versionz%s is not a network objectz%s not contained in %sz%s/%sz3Error performing exclusion: s1: %s s2: %s other: %s) rGr6r4rNrJrCr rorarDÚAssertionError)rVruÚs1Ús2rrr Úaddress_excludeàs<$   z_BaseNetwork.address_excludecCs„|j|jkr(td||fƒ‚|j|jkr>dS|j|jkrTdS|j|jkrjdS|j|jkr€dSdS)Nz"%s and %s are not of the same typer%rrFrF)rGr6rJrŒ)rVrurrr Úcompare_networks.s!z_BaseNetwork.compare_networkscCs|j|j|jfS)N)rGrJrŒ)rVrrr rO^sz_BaseNetwork._get_networks_keyr%Nc cs%|j|jkr|VdS|dk rg||jkrBtdƒ‚|dkrZtdƒ‚||j}|dkrtdƒ‚|j|}||jkr±td||fƒ‚t|jƒ}t|jƒd}t|jƒd|?}x4t|||ƒD] }|j||fƒ}|VqýWdS)Nznew prefix must be longerr%z(cannot set prefixlen_diff and new_prefixrzprefix length diff must be > 0z0prefix length diff %d is invalid for netblock %s) rHr8r rjrJrCr�r‚ro) rVÚprefixlen_diffÚ new_prefixÚ new_prefixlenÚstartÚendÚstepZnew_addrÚcurrentrrr rDhs,        z_BaseNetwork.subnetscCs¾|jdkr|S|dk r_||jkr:tdƒ‚|dkrRtdƒ‚|j|}|j|}|dkr‘td|j|fƒ‚|jt|jƒt|jƒ|>@|fƒS)Nrznew prefix must be shorterr%z(cannot set prefixlen_diff and new_prefixz;current prefixlen is %d, cannot have a prefixlen_diff of %d)rHr rarorjrJrŒ)rVr™ršr›rrr r>�s        z_BaseNetwork.supernetcCs|jjo|jjS)N)rJÚ is_multicastrC)rVrrr r Æs z_BaseNetwork.is_multicastcCs|jjo|jjS)N)rJÚ is_reservedrC)rVrrr r¡Òs z_BaseNetwork.is_reservedcCs|jjo|jjS)N)rJÚ is_link_localrC)rVrrr r¢Þs z_BaseNetwork.is_link_localcCs|jjo|jjS)N)rJÚ is_privaterC)rVrrr r£és z_BaseNetwork.is_privatecCs|j S)N)r£)rVrrr Ú is_globalõs z_BaseNetwork.is_globalcCs|jjo|jjS)N)rJÚis_unspecifiedrC)rVrrr r¥s z_BaseNetwork.is_unspecifiedcCs|jjo|jjS)N)rJÚ is_loopbackrC)rVrrr r¦ s z_BaseNetwork.is_loopback)#rrrr�rzr|r‡rˆr‹rwrvrr�rŽrrrCr�r�r‘r’r“rƒrar—r˜rOrDr>r r¡r¢r£r¤r¥r¦rrrr rNVs>         N 0 5)      rNc @seZdZfZdZdedZedƒZeddddd d d d d h ƒZ eZ iZ dd„Z e dd„ƒZe dd„ƒZe dd„ƒZe dd„ƒZdd„Zdd„Zdd„Zedd„ƒZed d!„ƒZd"S)#rgrrr%Ú 0123456789éÿéþéüéøéðéàéÀrrcCs t|ƒS)N)r )rVrrr rU0sz$_BaseV4._explode_shorthand_ip_stringc Cs‘||jkr†t|tƒr'|}n7y|j|ƒ}Wn!tk r]|j|ƒ}YnXt|j|ƒƒ}||f|j|<|j|S)N)Ú_netmask_cacher4rjrkr rnr rb)r`ÚargrarŒrrr Ú _make_netmask3s   z_BaseV4._make_netmaskcCs¨|stdƒ‚|jdƒ}t|ƒdkrCtd|ƒ‚y tjt|j|ƒdƒSWn>tk r£}ztd||fƒd‚WYdd}~XnXdS)NzAddress cannot be emptyÚ.rzExpected 4 octets in %rrz%s in %r)rr!r"rjÚ from_bytesÚmapÚ _parse_octetr )r`rmZoctetsÚexcrrr rlKs  z_BaseV4._ip_int_from_stringcCsÃ|stdƒ‚|jj|ƒs:d}t||ƒ‚t|ƒdkrbd}t||ƒ‚t|dƒ}|dkr£|ddkr£d }t||ƒ‚|d kr¿td |ƒ‚|S) NzEmpty octet not permittedz#Only decimal digits permitted in %réz$At most 3 characters permitted in %ré érÚ0z3Ambiguous (octal/decimal) value in %r not permittedr¨zOctet %d (> 255) not permitted)r rhrir"rj)r`Z octet_strr]Z octet_intrrr rµes  z_BaseV4._parse_octetcCs"djtt|jddƒƒƒS)Nr²rr)Újoinr´r r)r`rdrrr r{Šs z_BaseV4._string_from_ip_intcCsñ|jdƒ}t|ƒdkr­y.x'|D]}t|ƒ|jkr+dSq+WWntk rgdSYnXx>t|ƒD]0\}}|dkru|||dkrudSquWdSyt|ƒ}Wntk rÕdSYnXd|koî|jkSS)Nr²rFrr%T)r!r"rjÚ_valid_mask_octetsr Ú enumerater8)rVrŒÚmaskr†ÚidxÚyrrr Ú_is_valid_netmask—s"        z_BaseV4._is_valid_netmaskc s†|jdƒ}y&‡fdd†tt|ƒDƒ}Wntk rMdSYnXt|ƒt|ƒkrjdS|d|dkr‚dSdS) Nr²cs%g|]}|ˆjkr|‘qSr)r¼)Ú.0r†)rVrr ú Âs z(_BaseV4._is_hostmask..Frr%TrF)r!r´rjr r")rVrmr1Úpartsr)rVr Ú _is_hostmask¶s &  z_BaseV4._is_hostmaskcCs3t|ƒjdƒddd…}dj|ƒdS)Nr²r%z .in-addr.arparF)r r!r»)rVZreverse_octetsrrr rYËs"z_BaseV4._reverse_pointercCs|jS)N)r8)rVrrr Ú max_prefixlenÔsz_BaseV4.max_prefixlencCs|jS)N)rG)rVrrr r7Øsz_BaseV4.versionN)rrrrqrGÚ IPV4LENGTHr9Ú frozensetrhr¼r8r¯rUrsr±rlrµr{rÁrÅrYrrrÆr7rrrr rgs"  ' %   rgc@sÊeZdZdZdd„Zedd„ƒZedd„ƒZeej ƒd d „ƒƒZ eej ƒd d „ƒƒZ ed d„ƒZ edd„ƒZ edd„ƒZedd„ƒZdS)r r(Ú __weakref__cCsŸt|tƒr)|j|ƒ||_dSt|tƒra|j|dƒtj|dƒ|_dSt|ƒ}d|kr‰td|ƒ‚|j |ƒ|_dS)NrrrzUnexpected '/' in %r) r4rjr^r(Úbytesr_r³r rrl)rVrÚaddr_strrrr r�ãs    zIPv4Address.__init__cCs t|jƒS)N)rr()rVrrr ÚpackedszIPv4Address.packedcCs||jjkS)N)Ú _constantsÚ_reserved_network)rVrrr r¡ s zIPv4Address.is_reservedcs#t‡fdd†ˆjjDƒƒS)Nc3s|]}ˆ|kVqdS)Nr)rÂr:)rVrr ú sz)IPv4Address.is_private..)ÚanyrÍÚ_private_networks)rVr)rVr r£s zIPv4Address.is_privatecCs||jjko|j S)N)rÍÚ_public_networkr£)rVrrr r¤"szIPv4Address.is_globalcCs||jjkS)N)rÍÚ_multicast_network)rVrrr r 's zIPv4Address.is_multicastcCs||jjkS)N)rÍÚ_unspecified_address)rVrrr r¥2s zIPv4Address.is_unspecifiedcCs||jjkS)N)rÍÚ_loopback_network)rVrrr r¦=szIPv4Address.is_loopbackcCs||jjkS)N)rÍÚ_linklocal_network)rVrrr r¢GszIPv4Address.is_link_localN)r(rÉ)rrrrqr�rrrÌr¡Ú functoolsÚ lru_cacher£r¤r r¥r¦r¢rrrr r Ýs  #     r c@s�eZdZdd„Zdd„Zdd„Zdd„Zd d „Zej Z e d d „ƒZ e d d„ƒZ e dd„ƒZ e dd„ƒZdS)rcCs;t|ttfƒrGtj||ƒt|jƒ|_|j|_ dSt|t ƒrÕtj||dƒt |ƒdkr’t|dƒ|_ n |j|_ t|ddƒ|_|jj |_ |jj |_ dSt|ƒ}tj||dƒt|ddƒ|_|jj |_ |jj |_ |jj |_ dS)Nrr%rF)r4rÊrjr r�rr(r„r8rHÚtupler"rŒr�r$)rVrr#rrr r�Ts(   zIPv4Interface.__init__cCs d|j|jƒ|jjfS)Nz%s/%d)r{r(r„ra)rVrrr r|pszIPv4Interface.__str__c CsZtj||ƒ}| s%|tkr)|Sy|j|jkSWntk rUdSYnXdS)NF)r rvrQr„rI)rVruÚ address_equalrrr rvts zIPv4Interface.__eq__c Csktj||ƒ}|tkr"tSy,|j|jkpL|j|jkoL|SWntk rfdSYnXdS)NF)r rwrQr„rI)rVruÚ address_lessrrr rw€s  zIPv4Interface.__lt__cCs|j|jAt|jjƒAS)N)r(rHrjr„rJ)rVrrr rŒszIPv4Interface.__hash__cCs t|jƒS)N)r r()rVrrr r-‘szIPv4Interface.ipcCsd|j|jƒ|jfS)Nz%s/%s)r{r(rH)rVrrr r�•szIPv4Interface.with_prefixlencCsd|j|jƒ|jfS)Nz%s/%s)r{r(rŒ)rVrrr r‘šszIPv4Interface.with_netmaskcCsd|j|jƒ|jfS)Nz%s/%s)r{r(r�)rVrrr r’ŸszIPv4Interface.with_hostmaskN)rrrr�r|rvrwrrTrprrr-r�r‘r’rrrr rRs     rc@sCeZdZeZddd„Zeejƒdd„ƒƒZ dS)rTcCstj||ƒt|ttfƒrVt|ƒ|_|j|jƒ\|_ |_ dSt|t ƒrt |ƒdkr„|d}n |j}t|dƒ|_|j|ƒ\|_ |_ t|jƒ}|t|j ƒ@|kr|rüt d|ƒ‚nt|t|j ƒ@ƒ|_dSt|ƒ}t|j|dƒƒ|_t |ƒdkrc|d}n |j}|j|ƒ\|_ |_ |rÈtt|jƒt|j ƒ@ƒ|jkrÈt d|ƒ‚tt|jƒt|j ƒ@ƒ|_|j |jdkr|j|_dS)Nr%rz%s has host bits setr)rNr�r4rjrÊr rJr±r8rŒrHrÙr"r r$rlrˆr‡)rVrrr°rÌr#rrr r�´s@%      zIPv4Network.__init__cCs3|jtdƒko'|jtdƒk o2|j S)Nz 100.64.0.0/10)rJrrCr£)rVrrr r¤s zIPv4Network.is_globalN) rrrr rƒr�rrr×rØr¤rrrr r¥s Trc@sÜeZdZedƒZedƒZedƒZedƒZedƒedƒedƒedƒedƒedƒed ƒed ƒed ƒed ƒed ƒedƒedƒedƒgZedƒZ e dƒZ dS)Ú_IPv4Constantsz169.254.0.0/16z 127.0.0.0/8z 224.0.0.0/4z 100.64.0.0/10z 0.0.0.0/8z 10.0.0.0/8z 172.16.0.0/12z 192.0.0.0/29z192.0.0.170/31z 192.0.2.0/24z192.168.0.0/16z 198.18.0.0/15z198.51.100.0/24z203.0.113.0/24z 240.0.0.0/4z255.255.255.255/32z0.0.0.0N) rrrrrÖrÕrÓrÒrÑrÎr rÔrrrr rÜs(                   rÜc@sáeZdZfZdZdedZdZedƒZ eZ iZ e dd„ƒZ e dd „ƒZe d d „ƒZe d d „ƒZe ddd„ƒZdd„Zdd„Zedd„ƒZedd„ƒZdS)Ú_BaseV6r3rr%rcZ0123456789ABCDEFabcdefcCsi||jkr^t|tƒr'|}n|j|ƒ}t|j|ƒƒ}||f|j|<|j|S)N)r¯r4rjrkr rb)r`r°rarŒrrr r±Ms  z_BaseV6._make_netmaskcCs²|stdƒ‚|jdƒ}d}t|ƒ|krUd||f}t|ƒ‚d|dkríyt|jƒƒj}Wn>tk r¾}ztd||fƒd‚WYdd}~XnX|jd|d ?d @ƒ|jd|d @ƒ|jd}t|ƒ|kr,d |d|f}t|ƒ‚d}xStdt|ƒdƒD]8} || sL|dk r~d |}t|ƒ‚| }qLW|dk rQ|} t|ƒ|d} |d sÞ| d8} | rÞd}t||ƒ‚|ds| d8} | rd}t||ƒ‚|j| | } | dkrÝd}t||jd|fƒ‚nŒt|ƒ|jkr…d}t||j|fƒ‚|d s¥d}t||ƒ‚|dsÅd}t||ƒ‚t|ƒ} d } d } y�d } x5t| ƒD]'} | d K} | |j || ƒO} qóW| d | K} x9t| d ƒD]'} | d K} | |j || ƒO} q=W| SWn>t k r­}ztd||fƒd‚WYdd}~XnXdS)NzAddress cannot be emptyú:r·z At least %d parts expected in %rr²r%z%s in %rz%xriÿÿz!At most %d colons permitted in %rz At most one '::' permitted in %rrz0Leading ':' 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 %rrFrFrF) rr!r"r r=r(r@Ú _HEXTET_COUNTr‚Ú _parse_hextetr )r`rmrÄZ _min_partsr]Zipv4_intr¶Z _max_partsZ skip_indexÚiZparts_hiZparts_loZ parts_skippedrdrrr rl_s„  ,                    z_BaseV6._ip_int_from_stringcCsW|jj|ƒs"td|ƒ‚t|ƒdkrJd}t||ƒ‚t|dƒS)NzOnly hex digits permitted in %rrz$At most 4 characters permitted in %rr)Ú _HEX_DIGITSrir r"rj)r`Z hextet_strr]rrr ràÇs z_BaseV6._parse_hextetc Cséd}d}d}d}xit|ƒD][\}}|dkrt|d7}|dkrY|}||kr€|}|}q%d}d}q%W|dkrå||}|t|ƒkr¹|dg7}dg|||…<|dkrådg|}|S) Nr%rrºÚrFrFrFrF)r½r") r`ÚhextetsZbest_doublecolon_startZbest_doublecolon_lenZdoublecolon_startZdoublecolon_lenÚindexZhextetZbest_doublecolon_endrrr Ú_compress_hextetsás.          z_BaseV6._compress_hextetsNcs�|dkrt|jƒ}||jkr6tdƒ‚d|‰‡fdd†tdddƒDƒ}|j|ƒ}dj|ƒS) NzIPv6 address is too largez%032xcs1g|]'}dtˆ||d…dƒ‘qS)z%xrr)rj)rÂr†)Úhex_strrr rÃ&s z/_BaseV6._string_from_ip_int..rrrrÞ)rjr(r9r r‚rær»)r`rdrär)rçr r{s   %z_BaseV6._string_from_ip_intcsÈt|tƒr!t|jƒ}n-t|tƒrBt|jƒ}n t|ƒ}|j|ƒ}d|‰‡fdd†tdddƒDƒ}t|ttfƒr»ddj |ƒ|j fSdj |ƒS) Nz%032xcs$g|]}ˆ||d…‘qS)rr)rÂr†)rçrr rÃ>s z8_BaseV6._explode_shorthand_ip_string..rrrz%s/%drÞ) r4rr rJrr-rlr‚rNr»rH)rVrmrdrÄr)rçr rU+s   %z$_BaseV6._explode_shorthand_ip_stringcCs3|jddd…jddƒ}dj|ƒdS)Nr%rÞrãr²z .ip6.arparF)rWÚreplacer»)rVZ reverse_charsrrr rYCs"z_BaseV6._reverse_pointercCs|jS)N)r8)rVrrr rÆLsz_BaseV6.max_prefixlencCs|jS)N)rG)rVrrr r7Psz_BaseV6.version)rrrrqrGÚ IPV6LENGTHr9rßrÈrâr8r¯rsr±rlràrær{rUrYrrrÆr7rrrr rÝ9s"  h0  rÝc@seZdZdZdd„Zedd„ƒZedd„ƒZed d „ƒZed d „ƒZ ed d„ƒZ ee j ƒdd„ƒƒZ edd„ƒZedd„ƒZedd„ƒZedd„ƒZedd„ƒZedd„ƒZdS)r r(rÉcCsŸt|tƒr)|j|ƒ||_dSt|tƒra|j|dƒtj|dƒ|_dSt|ƒ}d|kr‰td|ƒ‚|j |ƒ|_dS)NrrrzUnexpected '/' in %r) r4rjr^r(rÊr_r³r rrl)rVrrËrrr r�[s    zIPv6Address.__init__cCs t|jƒS)N)rr()rVrrr rÌszIPv6Address.packedcCs||jjkS)N)rÍrÓ)rVrrr r „s zIPv6Address.is_multicastcs#t‡fdd†ˆjjDƒƒS)Nc3s|]}ˆ|kVqdS)Nr)rÂr†)rVrr rϘsz*IPv6Address.is_reserved..)rÐrÍÚ_reserved_networks)rVr)rVr r¡�s zIPv6Address.is_reservedcCs||jjkS)N)rÍrÖ)rVrrr r¢šszIPv6Address.is_link_localcCs||jjkS)N)rÍÚ_sitelocal_network)rVrrr Ú is_site_local¤s zIPv6Address.is_site_localcs#t‡fdd†ˆjjDƒƒS)Nc3s|]}ˆ|kVqdS)Nr)rÂr:)rVrr rϼsz)IPv6Address.is_private..)rÐrÍrÑ)rVr)rVr r£²s zIPv6Address.is_privatecCs|j S)N)r£)rVrrr r¤¾s zIPv6Address.is_globalcCs |jdkS)Nr)r()rVrrr r¥És zIPv6Address.is_unspecifiedcCs |jdkS)Nr%)r()rVrrr r¦Ôs zIPv6Address.is_loopbackcCs(|jd?dkrdSt|jd@ƒS)Nriÿÿlÿÿ)r(r )rVrrr Ú ipv4_mappedßs zIPv6Address.ipv4_mappedcCs@|jd?dkrdSt|jd?d@ƒt|jd@ƒfS)Né`i é@lÿÿ)r(r )rVrrr Úteredoìs zIPv6Address.teredocCs,|jd?dkrdSt|jd?d@ƒS)Népi éPlÿÿ)r(r )rVrrr Ú sixtofourûs zIPv6Address.sixtofourN)r(rÉ)rrrrqr�rrrÌr r¡r¢rìr×rØr£r¤r¥r¦rírðrórrrr r Us  $        r c@sÁeZdZdd„Zdd„Zdd„Zdd„Zd d „Zej Z e d d „ƒZ e d d„ƒZ e dd„ƒZ e dd„ƒZe dd„ƒZe dd„ƒZdS)rcCs;t|ttfƒrGtj||ƒt|jƒ|_|j|_ dSt|t ƒrÕtj||dƒt |ƒdkr’t|dƒ|_ n |j|_ t|ddƒ|_|jj |_ |jj |_ dSt|ƒ}tj||dƒt|ddƒ|_|jj |_ |jj |_ |jj |_ dS)Nrr%rF)r4rÊrjr r�rr(r„r8rHrÙr"rŒr�r$)rVrr#rrr r� s(   zIPv6Interface.__init__cCs d|j|jƒ|jjfS)Nz%s/%d)r{r(r„ra)rVrrr r|#szIPv6Interface.__str__c CsZtj||ƒ}| s%|tkr)|Sy|j|jkSWntk rUdSYnXdS)NF)r rvrQr„rI)rVrurÚrrr rv's zIPv6Interface.__eq__c Csktj||ƒ}|tkr"tSy,|j|jkpL|j|jkoL|SWntk rfdSYnXdS)NF)r rwrQr„rI)rVrurÛrrr rw3s  zIPv6Interface.__lt__cCs|j|jAt|jjƒAS)N)r(rHrjr„rJ)rVrrr r?szIPv6Interface.__hash__cCs t|jƒS)N)r r()rVrrr r-DszIPv6Interface.ipcCsd|j|jƒ|jfS)Nz%s/%s)r{r(rH)rVrrr r�HszIPv6Interface.with_prefixlencCsd|j|jƒ|jfS)Nz%s/%s)r{r(rŒ)rVrrr r‘MszIPv6Interface.with_netmaskcCsd|j|jƒ|jfS)Nz%s/%s)r{r(r�)rVrrr r’RszIPv6Interface.with_hostmaskcCs|jdko|jjS)Nr)r(r„r¥)rVrrr r¥WszIPv6Interface.is_unspecifiedcCs|jdko|jjS)Nr%)r(r„r¦)rVrrr r¦[szIPv6Interface.is_loopbackN)rrrr�r|rvrwrrTrprrr-r�r‘r’r¥r¦rrrr r s     rc@sCeZdZeZddd„Zdd„Zedd„ƒZdS) rTcCstj||ƒt|ttfƒrVt|ƒ|_|j|jƒ\|_ |_ dSt|t ƒrt |ƒdkr„|d}n |j}|j|ƒ\|_ |_ t|dƒ|_t|jƒ}|t|j ƒ@|kr|rüt d|ƒ‚nt|t|j ƒ@ƒ|_dSt|ƒ}t|j|dƒƒ|_t |ƒdkrc|d}n |j}|j|ƒ\|_ |_ |rÈtt|jƒt|j ƒ@ƒ|jkrÈt d|ƒ‚tt|jƒt|j ƒ@ƒ|_|j |jdkr|j|_dS)Nr%rz%s has host bits setr)rNr�r4rÊrjr rJr±r8rŒrHrÙr"r r$rlrˆr‡)rVrrr°rÌr#rrr r�ps@       zIPv6Network.__init__ccsRt|jƒ}t|jƒ}x-t|d|dƒD]}|j|ƒVq6WdS)Nr%)rjrJrCr‚rƒ)rVr„r…r†rrr r‡¾szIPv6Network.hostscCs|jjo|jjS)N)rJrìrC)rVrrr rìÊs zIPv6Network.is_site_localN) rrrr rƒr�r‡rrrìrrrr r`s N rc@s!eZdZedƒZedƒZedƒedƒedƒedƒedƒedƒed ƒed ƒed ƒedƒg Zed ƒed ƒedƒedƒedƒedƒedƒedƒedƒedƒedƒedƒedƒedƒedƒgZedƒZdS)Ú_IPv6Constantsz fe80::/10zff00::/8z::1/128z::/128z ::ffff:0:0/96z100::/64z 2001::/23z 2001:2::/48z 2001:db8::/32z 2001:10::/28zfc00::/7z::/8z100::/8z200::/7z400::/6z800::/5z1000::/4z4000::/3z6000::/3z8000::/3zA000::/3zC000::/3zE000::/4zF000::/5zF800::/6zFE00::/9z fec0::/10N) rrrrrÖrÓrÑrêrërrrr rôÚs*            rô)"Ú __version__r×rÇrér rr rrrrrr$r.r2r;rErMrSrTÚtotal_orderingr5rNrgr rrrÜrÍrÝr rrrôrrrr Ú sH   #      7 1 6 š : ÿÃÄuSr ÿ´Wz!