
    hR                        d dl mZ d dlZd dlmZ ddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZmZ dd	lmZmZmZmZmZ 	 eZ G d
 de      Zd Z eddddddddde      Z edddddde      Z edddde      Z ed d!d"d#d$d%d&d'd(d)d*d+d,e      Z ed-dd.d/d0d1d2e      Z dLd3Z G d4 d5e!      Z" G d6 d7e!      Z# G d8 d9e!      Z$ G d: d;e!      Z% G d< d=e!      Z&d> Z' G d? de&      Z( G d@ de&      Z)dA Z*dB Z+ G dC de&      Z, G dD dEe&      Z- G dF de-      Z. G dG de&      Z/dH Z0dI Z1 G dJ de&      Z2e)e,e(e.e/e2dKZ3y#  Y xY w)M    )print_functionN)chain   )Bimap
BimapError)get_bitsset_bits)BufferError)	DNSBufferDNSLabelset_avahi_379)IP4IP6HIcheck_bytesc                       e Zd Zy)DNSErrorN__name__
__module____qualname__     P/jellyfin/media/venv/lib/python3.12/site-packages/copyparty/stolen/dnslib/dns.pyr   r          r   r   c                     |r	 d|fz  S |j                  d      r	 t        |dd        S t        | d|d      #  t        | d|d      xY w#  Y +xY w)NzTYPE%dz: Invalid forward lookup: []TYPE   z: Invalid reverse lookup: [)r   
startswithint)namekeyforwards      r   unknown_qtyper&      sn    	Msf$$ >>&!3qr7|# T3GHH	MsKLL
s   ; A AAQTYPEAPTRTXTAAAASRVNSECANY)r            !   /      CLASSINNone*F_IN)r      r4   i  QRQUERYRESPONSE)r   r   RCODENOERRORFORMERRSERVFAILNXDOMAINNOTIMPREFUSEDYXDOMAINYXRRSETNXRRSETNOTAUTHNOTZONE)r   r         r                	   
   OPCODEIQUERYSTATUSNOTIFYUPDATE)r   r   rJ   r    rL   c                     | j                  d      rt        |       S t        |t              r|j                  |       S t        |      j                  |       S N.)endswithr   
isinstanceadd)labelorigins     r   r]   r]   I   sI    ~~c$VX6QQRWXXHV<LQQRWXXr   c                       e Zd Zed        Zedd       Z	 ddZddZd Zd Z	d Z
d	 Zd
 Zd Z ee      Zd Z ee      Zd Zd ZddZeZd ZeZy)	DNSRecordc                    t        |      }	 t        j                  |      }g }g }g }g }t        |j                        D ]&  }|j                  t        j                  |             ( t        |j                        D ]&  }|j                  t        j                  |             ( t        |j                        D ]&  }|j                  t        j                  |             ( t        |j                        D ]&  }|j                  t        j                  |             (  | |||||      S # t        t        f$ r}	t        d|j                  |	fz        d }	~	ww xY w)N)autharz)Error unpacking DNSRecord [offset=%d]: %s)r   	DNSHeaderparserangeqappendDNSQuestionaRRrb   rc   r
   r   r   offset)
clspacketbufferheader	questionsrrrb   rc   ies
             r   re   zDNSRecord.parseQ   s/   6"	__V,FIBDB688_ <  !2!26!:;<688_ ,		"((6*+,6;;' .BHHV,-.699% ,		"((6*+,vy"4B??Z( 	;v}}a>PP 	s   D!D/ /E>EEc           
      h    t        t        |t        t        |      t        t        |                  S )Nrg   )r`   ri   getattrr'   r5   )rm   qnameqtypeqclasss       r   questionzDNSRecord.questionh   s)    %!6v8NO
 	
r   Nc                    |xs
 t               | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        |r| j                  j                  |       |r| j                  j                  |       | j                          y N)rd   rp   rq   rr   rb   rc   rh   set_header_qa)selfrp   rq   rr   rg   rj   rb   rc   s           r   __init__zDNSRecord.__init__n   sr     +	#/r8ZR	8NN!!!$GGNN1r   c           	          t        t        | j                  j                  | j                  j                  d||      | j
                        S )Nr   )idbitmapqrraaarv   )r`   rd   rp   r   r   rg   )r   r   r   s      r   replyzDNSRecord.reply}   s9    0B0BqRTVWff
 	
r   c                 Z    | j                   j                  |       | j                          y r}   )rq   extendr~   )r   rg   s     r   add_questionzDNSRecord.add_question   s     a r   c                 Z    | j                   j                  |       | j                          y r}   )rr   r   r~   )r   rr   s     r   
add_answerzDNSRecord.add_answer       rr   c                 Z    | j                   j                  |       | j                          y r}   )rb   r   r~   )r   rb   s     r   add_authzDNSRecord.add_auth   s     		r   c                 Z    | j                   j                  |       | j                          y r}   )rc   r   r~   )r   rc   s     r   add_arzDNSRecord.add_ar   r   r   c                 $   t        | j                        | j                  _        t        | j                        | j                  _        t        | j                        | j                  _        t        | j                        | j                  _        y r}   )lenrq   rp   rg   rr   rj   rb   rc   r   s    r   r~   zDNSRecord.set_header_qa   sP    DNN+DGGtyy>TWWr   c                 L    | j                   r| j                   d   S t               S Nr   )rq   ri   r   s    r   get_qzDNSRecord.get_q   s    $(NNt~~a EEr   c                 L    | j                   r| j                   d   S t               S r   )rr   rk   r   s    r   get_azDNSRecord.get_a   s    !WWtwwqz."$.r   c                    | j                          t               }| j                  j                  |       | j                  D ]  }|j                  |        | j
                  D ]  }|j                  |        | j                  D ]  }|j                  |        | j                  D ]  }|j                  |        |j                  S r}   )	r~   r   rp   packrq   rr   rb   rc   data)r   ro   rg   rr   rb   rc   s         r   r   zDNSRecord.pack   s      	AFF6N	'' 	BGGFO	II 	DIIf	'' 	BGGFO	{{r   c                     t        t        | j                  j                  | j                  j                  d            S )Nr   )r   r   tc)r`   rd   rp   r   r   r   s    r   truncatezDNSRecord.truncate   s)    dkknnT[[=O=OTUVWWr   c           
      Z   |rt         nd }t        | j                        g}|j                   || j                  D cg c]  }t        |       c}             |j                   || j
                  D cg c]  }t        |       c}             |j                   || j                  D cg c]  }t        |       c}             |j                   || j                  D cg c]  }t        |       c}             |d|z   j                  |      z   S c c}w c c}w c c}w c c}w )Nc                     | S r}   r   xs    r   <lambda>z"DNSRecord.format.<locals>.<lambda>   s    ! r   
)	sortedreprrp   r   rq   rr   rb   rc   join)r   prefixsortssectionsrg   rr   s          r   formatzDNSRecord.format   s    F%&DNN;q47;<=dgg648678dii84889:dgg648678,,X666	 <686s   D5D-D#%D(c                 "    | j                         S r}   )r   r   s    r   __repr__zDNSRecord.__repr__   s    {{}r   )r(   r6   )NNNNNNN)r   r   ) F)r   r   r   classmethodre   r{   r   r   r   r   r   r   r~   r   propertyrg   r   rj   r   r   r   shortr   __str__r   r   r   r`   r`   P   s     , 
 
 SW
&F 	A/ 	AX7 E Gr   r`   c                      e Zd Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z	e
d        Zd d	Zd
 Zd Z eee      Zd Zd Z eee      Zd Zd Z eee      Zd Zd Z eee      Zd Zd Z eee      Zd Zd Z eee      Zd Z d Z! ee e!      Z"d Z#d Z$ ee#e$      Z%d Z&d Z' ee&e'      Z(d Z)d Z* ee)e*      Z+d Z,d Z-e-Z.y)!rd   r   r   rg   rj   rb   rc   c                     	 |j                  d      \  }}}}}} | ||||||      S # t        t        f$ r}t        d|j                  |fz        d }~ww xY w)N!HHHHHHz)Error unpacking DNSHeader [offset=%d]: %sunpackr
   r   r   rl   )	rm   ro   r   r   rg   rj   rb   rc   rt   s	            r   re   zDNSHeader.parse   sj    	+1==+C(RAtRr61ar22Z( 	;v}}a>PP 	s   $' AAANc                    |r|nd| _         |d| _        n|| _        || _        || _        || _        || _        |j                         D ]  \  }}	|j                         dk(  r|	| _        "|j                         dk(  r|	| _	        =|j                         dk(  r|	| _
        X|j                         dk(  r|	| _        s|j                         dk(  r|	| _        |j                         dk(  r|	| _        |j                         dk(  r|	| _        |j                         d	k(  r|	| _        |j                         d
k(  r|	| _        |j                         dk(  s|	| _         y )Nr   r   opcoder   r   rdr   zadcdrcode)r   r   rg   rj   rb   rc   itemslowerr   r   r   r   r   r   r   r   r   r   )
r   r   r   rg   rj   rb   rc   argskvs
             r   r   zDNSHeader.__init__   s'   ">DK DK	JJL 	DAqwwyD h&d"d"d"d"c!d"d"g%
)	r   c                 .    t        | j                  d      S N   r   r   r   s    r   get_qrzDNSHeader.get_qr       R((r   c                 <    t        | j                  |d      | _        y r   r	   r   r   vals     r   set_qrzDNSHeader.set_qr       t{{C4r   c                 0    t        | j                  dd      S N   r    r   r   s    r   
get_opcodezDNSHeader.get_opcode   s    R++r   c                 >    t        | j                  |dd      | _        y r   r   r   s     r   
set_opcodezDNSHeader.set_opcode  s    t{{CQ7r   c                 .    t        | j                  d      S NrQ   r   r   s    r   get_aazDNSHeader.get_aa  r   r   c                 <    t        | j                  |d      | _        y r   r   r   s     r   set_aazDNSHeader.set_aa
  r   r   c                 .    t        | j                  d      S NrP   r   r   s    r   get_tczDNSHeader.get_tc      Q''r   c                 <    t        | j                  |d      | _        y r   r   r   s     r   set_tczDNSHeader.set_tc      t{{C3r   c                 .    t        | j                  d      S NrO   r   r   s    r   get_rdzDNSHeader.get_rd  r   r   c                 <    t        | j                  |d      | _        y r   r   r   s     r   set_rdzDNSHeader.set_rd  r   r   c                 .    t        | j                  d      S NrN   r   r   s    r   get_razDNSHeader.get_ra  r   r   c                 <    t        | j                  |d      | _        y r   r   r   s     r   set_razDNSHeader.set_ra"  r   r   c                 .    t        | j                  d      S NrM   r   r   s    r   get_zzDNSHeader.get_z'  r   r   c                 <    t        | j                  |d      | _        y r   r   r   s     r   set_zzDNSHeader.set_z*  r   r   c                 .    t        | j                  d      S NrL   r   r   s    r   get_adzDNSHeader.get_ad/  r   r   c                 <    t        | j                  |d      | _        y r   r   r   s     r   set_adzDNSHeader.set_ad2  r   r   c                 .    t        | j                  d      S Nr    r   r   s    r   get_cdzDNSHeader.get_cd7  r   r   c                 <    t        | j                  |d      | _        y r   r   r   s     r   set_cdzDNSHeader.set_cd:  r   r   c                 0    t        | j                  dd      S Nr   r    r   r   s    r   	get_rcodezDNSHeader.get_rcode?  s    Q**r   c                 >    t        | j                  |dd      | _        y r   r   r   s     r   	set_rcodezDNSHeader.set_rcodeB  s    t{{CA6r   c           	          |j                  d| j                  | j                  | j                  | j                  | j
                  | j                         y )Nr   )r   r   r   rg   rj   rb   rc   r   ro   s     r   r   zDNSHeader.packG  s5    ItwwTVVTVVTYYPTPWPWXr   c                    | j                   xr d| j                  xr d| j                  xr d| j                  xr d| j                  xr d| j
                  xr d| j                  xr dg}t        j                  | j                        dk(  r	d	}d
}d}d}nd}d}d}d}d| j                  t        j                  | j                        t        j                  | j                        dj                  t        d |            t        j                  | j                         || j"                  || j$                  || j&                  || j(                  fz  S )NAATCRDRAZADCDrV   zoprupr   rg   rj   nsrc   zS<DNS Header: id=0x%x type=%s opcode=%s flags=%s rcode='%s' %s=%d %s=%d %s=%d %s=%d>,)r   r   r   r   r   r   r   rR   getr   r   r;   r   r   filterr>   r   rg   rj   rb   rc   )r   ff1f2f3f4s         r   r   zDNSHeader.__repr__J  s!   GGGGGGGGFFNsGGGG
 ::dkk"h.BBBBBBBB2 tww

4;;'a)		$**%			
r   )NNr   r   r   r   )/r   r   r   r   r   r   rg   rj   rb   rc   r   re   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   rd   rd      sS   	
4Bx[F	#A	#AV9D	
4B @)5 
&&	!B,8 j*-F)5 
&&	!B(4 
&&	!B(4 
&&	!B(4 
&&	!B(4 	A(4 
&&	!B(4 
&&	!B+7 Y	*EY&
P Gr   rd   c                   R    e Zd Zed        ZddZd Zd Z eee      Z	d Z
d ZeZy)	ri   c                     	 |j                         }|j                  d      \  }} | |||      S # t        t        f$ r}t	        d|j
                  |fz        d }~ww xY w)N!HHz+Error unpacking DNSQuestion [offset=%d]: %s)decode_namer   r
   r   r   rl   )rm   ro   rx   ry   rz   rt   s         r   re   zDNSQuestion.parsev  sj    	&&(E"MM%0ME6ueV,,Z( 	=PQ@RR 	s   -0 AAANc                 .    || _         || _        || _        y r}   )rx   ry   rz   )r   rx   ry   rz   s       r   r   zDNSQuestion.__init__  s    

r   c                 T    t        |t              r|| _        y t        |      | _        y r}   )r[   r   _qname)r   rx   s     r   	set_qnamezDNSQuestion.set_qname      eX&DK"5/DKr   c                     | j                   S r}   )r  r   s    r   	get_qnamezDNSQuestion.get_qname      {{r   c                     |j                  | j                         |j                  d| j                  | j                         y )Nr  )encode_namerx   r   ry   rz   r  s     r   r   zDNSQuestion.pack  s,    4::&E4::t{{3r   c                     d| j                   dt        j                  | j                        dt        j                  | j
                        dS )Nz<DNS Question: 'z' qtype=z qclass=>)rx   r'   r  ry   r5   rz   r   s    r   r   zDNSQuestion.__repr__  s3    JJIIdjj!IIdkk"
 	
r   )Nr   r   )r   r   r   r   re   r   r  r"  r   rx   r   r   r   r   r   r   ri   ri   u  sB     
* Y	*E4
 Gr   ri   c                       e Zd Z ed      Z ed      Z ed      Z ed      Ze	d        Z
ddZd Zd	 Z eee      Zd
 Zd ZeZy)rk   rtyperclassttlrdlengthc                 `   	 |j                         }|j                  d      \  }}}}|r>t        j                  t        j                  |      t
              j                  ||      }nt        d      } | |||||      S # t        t        f$ r}t        d|j                  |fz        d }~ww xY w)Nz!HHIH   az"Error unpacking RR [offset=%d]: %s)r  r   RDMAPr  r'   r  re   r
   r   r   rl   )	rm   ro   rnamer)  r*  r+  r,  rdatart   s	            r   re   zRR.parse  s    		V&&(E+1==+A(E63		%))E"2B7==fhO4ueVS%88Z( 	V?6==RSBTTUU	Vs   A<A? ?B-B((B-Nc                 J    || _         || _        || _        || _        || _        y r}   )r0  r)  r*  r+  r1  )r   r0  r)  r*  r+  r1  s         r   r   zRR.__init__  s%    


r   c                 T    t        |t              r|| _        y t        |      | _        y r}   )r[   r   _rname)r   r0  s     r   	set_rnamezRR.set_rname  r   r   c                     | j                   S r}   )r4  r   s    r   	get_rnamezRR.get_rname  r#  r   c                 l   |j                  | j                         |j                  d| j                  | j                  | j
                         |j                  }|j                  dd       |j                  }| j                  j                  |       |j                  }|j                  |d||z
         y )Nz!HHIz!Hr   )	r%  r0  r   r)  r*  r+  rl   r1  update)r   ro   rdlength_ptrstartends        r   r   zRR.pack  s    4::&FDJJTXX>}}D!

mmlD#+6r   c                     d| j                   t        j                  | j                        t        j                  | j
                        | j                  | j                  fz  S )Nz3<DNS RR: '%s' rtype=%s rclass=%s ttl=%d rdata='%s'>)r0  r'   r  r)  r5   r*  r+  r1  r   s    r   r   zRR.__repr__  sJ    DJJIIdjj!IIdkk"HHJJH
 
 	
r   )Nr   r   r   N)r   r   r   r   r)  r*  r   r+  r,  r   re   r   r5  r7  r   r0  r   r   r   r   r   r   rk   rk     sh    gJEx[F
E(C}H
V 
V* Y	*E7
 Gr   rk   c                   4    e Zd Zed        ZddZd Zd ZdZy)r  c                     	 |j                  |      } | |      S # t        t        f$ r}t        d|j                  |fz        d }~ww xY w)Nz"Error unpacking RD [offset=%d]: %s)r  r
   r   r   rl   rm   ro   lengthr   rt   s        r   re   zRD.parse  sR    	V::f%Dt9Z( 	V?6==RSBTTUU	V    A	AA	c                 <    t        d|       t        |      | _        y )Nr   )r   bytesr   r   r   s     r   r   zRD.__init__  s    FD!$K	r   c                 :    |j                  | j                         y r}   )rh   r   r  s     r   r   zRD.pack  s    dii r   c                     t        | j                        dkD  rSdt        | j                        t        j                  | j                        j	                         j                         fz  S y)Nr   z\# %d %sz\# 0)r   r   binasciihexlifydecodeupperr   s    r   r   zRD.__repr__  sX    tyy>ADII  +224::<"  
 r   r   N)r   )	r   r   r   r   re   r   r   r   attrsr   r   r   r  r    s,    V V ! Er   r  c                 F    t        | t              r| S | j                         S r}   )r[   rD  encoder   s    r   _force_bytesrP    s    !Uxxzr   c                   .    e Zd Zed        Zd Zd Zd Zy)r*   c                    	 t               }|j                  }d}|j                  ||z   k  rd|j                  d      \  }||z   |k  r&||z  }|j                  |j	                  |             nt        d||fz        |j                  ||z   k  rd | |      S # t        t        f$ r}t        d|j                  |fz        d }~ww xY w)Nr   !Bz(Invalid TXT record: len(%d) > RD len(%d)z#Error unpacking TXT [offset=%d]: %s)listrl   r   rh   r  r   r
   r   )rm   ro   rA  r   start_bo
now_length	txtlengthrt   s           r   re   z	TXT.parse  s    	W6D}}HJ--(V"33%}}T2	)F2)+JKK

9 56"BiQWEXX  --(V"33 t9Z( 	W@FMMSTCUUVV	Ws   BB B C'CCc                 4   t        |      t        t        fv r|D cg c]  }t        |       c}| _        nt        |      g| _        t        | j                  D cg c]  }t        |      dkD   c}      rt        d| j                  z        y c c}w c c}w )Nr4   TXT record too long: %s)typetuplerT  rP  r   anyr   r   )r   r   r   s      r   r   zTXT.__init__  sz    :%&267Qa7DI%d+,DIdii0A014tyy@AA 2 8 1s   BBc                     | j                   D ]J  }t        |      dkD  rt        d|z        |j                  dt        |             |j	                  |       L y )Nr4   rY  rS  )r   r   r   r   rh   )r   ro   ditems      r   r   zTXT.pack  sP    YY 	!E5zC85@AAKKc%j)MM% 		!r   c                 p    dj                  | j                  D cg c]  }t        |       c}      S c c}w )Nr  )r   r   r   )r   r   s     r   r   zTXT.__repr__!  s'    xx$))4Qa4554s   3N)r   r   r   r   re   r   r   r   r   r   r   r*   r*     s&    W W&B!6r   c                   >    e Zd Z ed      Zed        Zd Zd Zd Z	y)r(   r   c                     	 |j                  d      } | |      S # t        t        f$ r}t        d|j                  |fz        d }~ww xY w)N!BBBBz!Error unpacking A [offset=%d]: %sr   r@  s        r   re   zA.parse)  sR    	U==)Dt9Z( 	U>&--QRASSTT	UrB  c                     t        |      t        t        fv rt        |      | _        y t        t	        t
        |j                  d      j                  d                  | _        y rX   )rZ  r[  rT  r   mapr"   rstripsplitrE  s     r   r   z
A.__init__1  sD    :%&dDIc#t{{3'7'='=c'BCDDIr   c                 >     |j                   dg| j                    y )Nrb  r   r   r  s     r   r   zA.pack7  s    G(dii(r   c                      d| j                   z  S )Nz%d.%d.%d.%drL  r   s    r   r   z
A.__repr__:  s    tyy((r   N)
r   r   r   r   r   r   re   r   r   r   r   r   r   r(   r(   %  s/    v;DU UE))r   c                    | j                  d      \  }}}t        t        |j                  d      D cg c]  }|st	        t        |d      d       c}       }t        t        |j                  d      D cg c]  }|st	        t        |d      d       c}       }dgdt        |      z
  t        |      z
  z  }t        ||z   |z         S c c}w c c}w )N:::r0      r   )	partitionrT  r   rf  divmodr"   r   r[  )rj   l_rr   l_groupsr_groupszeross           r   _parse_ipv6rv  >  s    kk$GAq!EQWWS\OQF3q":s3OPQHEQWWS\OQF3q":s3OPQHC2H%H56EE!H,-- POs   CC8C Cc                    g }g }d}t        ddd      D ]  }| |   dz  | |dz      z   }|dk(  rK|dk(  r1|dk  r,| |dz      dz  | |dz      z   dk(  rd	}=|j                  d
       O|j                  d|z         d|dk(  rt        |      dk(  rx|j                  d|z          t        |      dk  r&dj                  |      dz   dj                  |      z   S dj                  |      S )Nleftr   r0   rJ   rO   r      rK   right0z%xrl  rk  )rf   rh   r   r   )rj   rx  rz  currentrs   groups         r   _format_ipv6r~  F  s    DEG1b!_ +1aAh&fza"fa!eHMQq1uX-2%GKK$D5L)zc%jAoTE\*+ 4y1}xx~$sxx66xx~r   c                   >    e Zd Z ed      Zed        Zd Zd Zd Z	y)r+   r   c                     	 |j                  d      } | |      S # t        t        f$ r}t        d|j                  |fz        d }~ww xY w)N!16Bz$Error unpacking AAAA [offset=%d]: %sr   r@  s        r   re   z
AAAA.parseb  sR    	X==(Dt9Z( 	XAV]]TUDVVWW	XrB  c                 t    t        |      t        t        fv rt        |      | _        y t	        |      | _        y r}   )rZ  r[  rT  r   rv  rE  s     r   r   zAAAA.__init__j  s)    :%&dDI#D)DIr   c                 >     |j                   dg| j                    y )Nr  rh  r  s     r   r   z	AAAA.packp  s    F'TYY'r   c                 ,    t        | j                        S r}   )r~  r   r   s    r   r   zAAAA.__repr__s  s    DII&&r   N)
r   r   r   r   r   r   re   r   r   r   r   r   r   r+   r+   _  s.    v;DX X*('r   c                   R    e Zd Zed        Zd	dZd Zd Z eee      Z	d Z
d ZdZy)
CNAMEc                     	 |j                         } | |      S # t        t        f$ r}t        d|j                  |fz        d }~ww xY w)Nz%Error unpacking CNAME [offset=%d]: %s)r  r
   r   r   rl   )rm   ro   rA  r]   rt   s        r   re   zCNAME.parsex  sR    	Y&&(Eu:Z( 	YBfmmUVEWWXX	Ys    AAANc                     || _         y r}   r]   r   r]   s     r   r   zCNAME.__init__  s	    
r   c                 T    t        |t              r|| _        y t        |      | _        y r}   r[   r   _labelr  s     r   	set_labelzCNAME.set_label  r   r   c                     | j                   S r}   r  r   s    r   	get_labelzCNAME.get_label  r#  r   c                 :    |j                  | j                         y r}   )r%  r]   r  s     r   r   z
CNAME.pack  s    4::&r   c                      d| j                   z  S )Nz%sr  r   s    r   r   zCNAME.__repr__  s    tzz""r   r  r}   r   r   r   r   re   r   r  r  r   r]   r   r   rM  r   r   r   r  r  w  sD    Y Y* Y	*E'# Er   r  c                       e Zd Zy)r)   Nr   r   r   r   r)   r)     r   r   c                       e Zd Z ed      Z ed      Z ed      Zed        ZddZ	d Z
d Z eee
      Zd	 Zd
 ZdZy)r,   priorityweightportc                     	 |j                  d      \  }}}|j                         } | ||||      S # t        t        f$ r}t	        d|j
                  |fz        d }~ww xY w)N!HHHz#Error unpacking SRV [offset=%d]: %s)r   r  r
   r   r   rl   )rm   ro   rA  r  r  r  targetrt   s           r   re   z	SRV.parse  sn    	W%+]]6%:"Hfd'')Fxv66Z( 	W@FMMSTCUUVV	Ws   /2 A AA Nc                 <    || _         || _        || _        || _        y r}   r  r  r  r  )r   r  r  r  r  s        r   r   zSRV.__init__  s     	r   c                 T    t        |t              r|| _        y t        |      | _        y r}   )r[   r   _target)r   r  s     r   
set_targetzSRV.set_target  s    fh'!DL#F+DLr   c                     | j                   S r}   )r  r   s    r   
get_targetzSRV.get_target  s    ||r   c                     |j                  d| j                  | j                  | j                         |j	                  | j
                         y )Nr  )r   r  r  r  r%  r  r  s     r   r   zSRV.pack  s2    FDMM4;;		B4;;'r   c                 d    d| j                   | j                  | j                  | j                  fz  S )Nz%d %d %d %sr  r   s    r   r   zSRV.__repr__  s&    t{{DIIt{{SSSr   r  )r   r   r   N)r   r   r   r   r  r  r  r   re   r   r  r  r   r  r   r   rM  r   r   r   r,   r,     s`    }Hx[FV9DW W, j*-F(T 5Er   c                 b   g }t        |       }|j                         r|j                  d      \  }}t        |j	                  |            }t        |      D ]D  \  }}t        d      D ]1  }||z  dz  sd|z  d|z  z   |z   }	|j                  t        |	          3 F |j                         r|S )NBBrO      rm  )	r   	remainingr   	bytearrayr  	enumeraterf   rh   r'   )
type_bitmaprrlistbufwinnumwinlenr   posvaluers   bitposs
             r   decode_type_bitmapr    s    F
K
 C
--/D)3776?+%f- 	1LS%1X 1QJ$&!Flq3w7!;FMM%-01	1 --/ Mr   c           	         t        | D cg c]  }t        t        |       c}      } t               }| d   dz  }t	        d      }t        |       dz
  }t        |       D ]  \  }}||dz  z
  }||dz  xx   dd|dz  z
  z  z  cc<   ||k(  s| |dz      |dz   dz  k\  s>|d   dk(  r|d d }|d   dk(  r|j                  d|t        |             |j                  |       ||k7  s| |dz      dz  }t	        d      } |j                  S c c}w )	Nr   rm      r   rO   rN   r  )
r   rw   r'   r   r  r   r  r   rh   r   )r  rr   r  	curWindowr   nrs   r   s           r   encode_type_bitmapr    s"   &9BWUB'9:F
+Cq	S Ir]FFaA6" '2S qAv!AE	**6VAE]y1}&;;*/ */HHT9c&k2JJvAv"1q5MS0	"2' 88O' :s   D	c                   P    e Zd Zed        Zd Zd Zd Z eee      Z	d Z
d ZdZy)	r-   c                    	 |j                   |z   }|j                         }t        |j                  ||j                   z
              } | ||      S # t        t
        f$ r}t        d|j                   |fz        d }~ww xY w)Nz$Error unpacking NSEC [offset=%d]: %s)rl   r  r  r  r
   r   r   )rm   ro   rA  r<  r#   r  rt   s          r   re   z
NSEC.parse  s    	X--&(C%%'D'

33F(GHFtV$$Z( 	XAV]]TUDVVWW	Xs   AA A? A::A?c                      || _         || _        y r}   r]   r  )r   r]   r  s      r   r   zNSEC.__init__  s    
r   c                 T    t        |t              r|| _        y t        |      | _        y r}   r  r  s     r   r  zNSEC.set_label  r   r   c                     | j                   S r}   r  r   s    r   r  zNSEC.get_label  r#  r   c                     |j                  | j                         |j                  t        | j                               y r}   )r%  r]   rh   r  r  r  s     r   r   z	NSEC.pack  s*    4::&(56r   c                 V    | j                   ddj                  | j                        S )N )r]   r   r  r   s    r   r   zNSEC.__repr__  s    **chht{{&;<<r   r  Nr  r   r   r   r-   r-     sD    X X* Y	*E7=  Er   )r(   r+   r*   r)   r,   r-   r}   )4
__future__r   rH  	itertoolsr   bimapr   r   bitr   r	   ro   r
   r]   r   r   r   rangesr   r   r   r   r   xrangerf   	Exceptionr   r&   r'   r5   r;   r>   rR   objectr`   rd   ri   rk   r  rP  r*   r(   rv  r~  r+   r  r)   r,   r  r  r-   r/  r   r   r   <module>r     s   &   $ #  5 5 / /	E
	y 	I 	Ev5f5Q	 	g4f3GR
4W,h7 	$ 
'h8XNPX

Yr rjm m`'& 'T8 8v 8%6" %6P) )2.2'2 '0B @	% 	&5" &5R.! 2 ! H c#c4Py	s    E E
