
    Zg                       U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZ d dlmZ d d	lmZmZmZmZ d d
lm Z m!Z!m"Z"m#Z#m$Z$m%Z% 	 d dl&m'Z( dZ)dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5 ejl                  d      Z7dZ8dZ9dZ:dZ;dZ<d Z=d!Z> ejl                  e9d"z   e:z   ej~                        Z@ eA eB eCd#d$                  ZDe G d% d&             ZE eEej                  d'ej                  d!d!dd(       eEej                  d'ej                  d!d!dd(       eEej                  d'ej                  d!d)d!d(      d*ZJd+eKd,<   e.e/e0d-ZLd^d.ZMd_d/ZNe9d0z   e:d0z   f	 	 	 	 	 	 	 d`d1ZOdad2ZPdbd3ZQ	 	 	 	 	 	 	 	 	 	 dcd4ZRddd5ZSddd6ZTded7ZUddd8ZVdfd9ZW G d: d;      ZX G d< d=      ZY G d> d?      ZZ G d@ dA      Z[ G dB dC      Z\dgdDZ] G dE dF      Z^ G dG dH      Z_e, eY       e- eZ       e+ e\       e. e[dI ej                               e/ e[dJ ej                               e0 e[dK ej                               e2 e^       e3 e_       iZcdhdLZdej                  ej                  ej                  ej                  ej                  f   Zj	 di	 	 	 	 	 	 	 djdMZk	 	 	 	 	 	 	 	 dkdNZlej                  ej                  ej                  ej                  ej                  f   Zqej                  ej                  ej                  ej                  f   Zr G dO dPej                        Zt G dQ dR      ZudldSZv	 d\	 	 	 dmdTZw	 	 	 	 dmdUZxdndVZy	 di	 	 	 	 	 dodWZzdpdXZ{ej                  ej                  ej                  ej                  f   Z|dYZ} G dZ d[      Z~y# e*$ r dZ)	 d\	 	 	 	 	 	 	 	 	 	 	 d]dZ(Y Pw xY w)q    )annotationsN)encodebytes)	dataclass)utilsUnsupportedAlgorithm)hashes)dsaeced25519paddingrsa)AEADDecryptionContextCipher
algorithmsmodes)EncodingKeySerializationEncryptionNoEncryptionPrivateFormatPublicFormat_KeySerializationEncryption)kdfTFc                    t        d      )NzNeed bcrypt moduler   )passwordsaltdesired_key_bytesroundsignore_few_roundss        m/var/www/django_project/virt/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/ssh.py_bcrypt_kdfr!   1   s     ##788    s   ssh-ed25519s   ssh-rsas   ssh-dsss   ecdsa-sha2-nistp256s   ecdsa-sha2-nistp384s   ecdsa-sha2-nistp521s   -cert-v01@openssh.coms   sk-ssh-ed25519@openssh.coms"   sk-ecdsa-sha2-nistp256@openssh.coms   rsa-sha2-256s   rsa-sha2-512s   \A(\S+)[ \t]+(\S+)s   openssh-key-v1 s#   -----BEGIN OPENSSH PRIVATE KEY-----s!   -----END OPENSSH PRIVATE KEY-----s   bcrypts   none
   aes256-ctr   s   (.*?)      c                  T    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   y)
_SSHCipherztype[algorithms.AES]algintkey_lenz3type[modes.CTR] | type[modes.CBC] | type[modes.GCM]mode	block_leniv_len
int | Nonetag_lenboolis_aeadN)__name__
__module____qualname____annotations__ r"   r    r(   r(   \   s(    	L
==NKMr"   r(       )r)   r+   r,   r-   r.   r0   r2      )r#   s
   aes256-cbcs   aes256-gcm@openssh.comzdict[bytes, _SSHCipher]_SSH_CIPHERS)	secp256r1	secp384r1	secp521r1c                   t        | t        j                        rt        | j	                               }|S t        | t        j
                        rt        |       }|S t        | t        j                  t        j                  f      rt        }|S t        | t        j                  t        j                  f      rt        }|S t        | t        j                  t        j                   f      rt"        }|S t%        d      )NUnsupported key type)
isinstancer   EllipticCurvePrivateKey_ecdsa_key_type
public_keyEllipticCurvePublicKeyr   RSAPrivateKeyRSAPublicKey_SSH_RSAr
   DSAPrivateKeyDSAPublicKey_SSH_DSAr   Ed25519PrivateKeyEd25519PublicKey_SSH_ED25519
ValueError)keykey_types     r    _get_ssh_key_typerQ      s    #r112"3>>#34 O 
C22	3"3' O 
C#++S-=-=>	? O 
C#++S-=-=>	? O 
g'')A)AB
   O /00r"   c                    | j                   }|j                  t        vrt        d|j                        t        |j                     S )z3Return SSH key_type and curve_name for private key.z'Unsupported curve for ssh private key: )curvename_ECDSA_KEY_TYPErN   )rC   rS   s     r    rB   rB      sE    Ezz(5ejj^D
 	
 5::&&r"      
c                <    dj                  |t        |       |g      S )Nr"   )join_base64_encode)dataprefixsuffixs      r    _ssh_pem_encoder]      s    
 88V^D16:;;r"   c                @    | rt        |       |z  dk7  rt        d      y)zRequire data to be full blocksr   zCorrupt data: missing paddingN)lenrN   )rZ   r-   s     r    _check_block_sizer`      s&    3t9y(A-899 .r"   c                    | rt        d      y)z!All data should have been parsed.zCorrupt data: unparsed dataN)rN   rZ   s    r    _check_emptyrc      s    677 r"   c                   |st        d      t        |    }t        |||j                  |j                  z   |d      }t        |j                  |d|j                         |j                  ||j                  d             S )z$Generate key + iv and return cipher.zKey is password-protected.TN)rN   r:   r!   r+   r.   r   r)   r,   )
ciphernamer   r   r   ciphseeds         r    _init_cipherrh      s|     566
#D$t{{2FDD n%&		$t||~&' r"   c                r    t        |       dk  rt        d      t        j                  | dd d      | dd fS )Uint32   Invalid dataNbig	byteorderr_   rN   r*   
from_bytesrb   s    r    _get_u32rr      <    
4y1}((>>$r(e>4d12h>>r"   c                r    t        |       dk  rt        d      t        j                  | dd d      | dd fS )Uint64   rl   Nrm   rn   rp   rb   s    r    _get_u64rw      rs   r"   c                d    t        |       \  }} |t        |       kD  rt        d      | d| | |d fS )zBytes with u32 length prefixrl   N)rr   r_   rN   )rZ   ns     r    _get_sshstrrz      s<    tnGAt3t9}((8T!"Xr"   c                x    t        |       \  }} |r|d   dkD  rt        d      t        j                  |d      | fS )zBig integer.r      rl   rm   )rz   rN   r*   rq   )rZ   vals     r    
_get_mpintr~      s>    D!IC
s1v}((>>#u%t++r"   c                    | dk  rt        d      | sy| j                         dz   dz  }t        j                  | |      S )z!Storage format for signed bigint.r   znegative mpint not allowedr"   rv   )rN   
bit_lengthr   int_to_bytes)r}   nbytess     r    	_to_mpintr      sD    
Qw566nn"q(Fc6**r"   c                  h    e Zd ZU dZded<   dddZddZddZddZdd	Z	dd
Z
ddZdddZddZy)	_FragListz,Build recursive structure without data copy.list[bytes]flistNc                N    g | _         |r| j                   j                  |       y y N)r   extend)selfinits     r    __init__z_FragList.__init__   s#    
JJd# r"   c                :    | j                   j                  |       y)zAdd plain bytesN)r   appendr   r}   s     r    put_rawz_FragList.put_raw  s    

#r"   c                \    | j                   j                  |j                  dd             y)zBig-endian uint32rk   rm   lengthro   Nr   r   to_bytesr   s     r    put_u32z_FragList.put_u32	  !    

#,,a5,ABr"   c                \    | j                   j                  |j                  dd             y)zBig-endian uint64rv   rm   r   Nr   r   s     r    put_u64z_FragList.put_u64  r   r"   c                .   t        |t        t        t        f      r6| j	                  t        |             | j                  j                  |       y| j	                  |j                                | j                  j                  |j                         y)zBytes prefixed with u32 lengthN)
r@   bytes
memoryview	bytearrayr   r_   r   r   sizer   r   s     r    
put_sshstrz_FragList.put_sshstr  s]    cE:y9:LLS"JJc"LL$JJcii(r"   c                8    | j                  t        |             y)z*Big-endian bigint prefixed with u32 lengthN)r   r   r   s     r    	put_mpintz_FragList.put_mpint  s    	#'r"   c                H    t        t        t        | j                              S )zCurrent number of bytes)summapr_   r   r   s    r    r   z_FragList.size  s    3sDJJ'((r"   c                V    | j                   D ]  }t        |      }|||z   }}||||  |S )zWrite into bytearray)r   r_   )r   dstbufposfragflenstarts         r    renderz_FragList.render"  s>    JJ 	%Dt9DcDj3E $F5	% 
r"   c                    t        t        | j                                     }| j                  |       |j	                         S )zReturn as bytes)r   r   r   r   tobytes)r   bufs     r    r   z_FragList.tobytes*  s/    499;/0C{{}r"   r   )r   zlist[bytes] | NonereturnNone)r}   r   r   r   )r}   r*   r   r   )r}   zbytes | _FragListr   r   r   r*   )r   )r   r   r   r*   r   r*   r   r   )r3   r4   r5   __doc__r6   r   r   r   r   r   r   r   r   r   r7   r"   r    r   r      s:    6$
CC)()r"   r   c                  h    e Zd ZdZ	 	 	 	 ddZ	 	 	 	 d	dZ	 	 	 	 d
dZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZy)_SSHFormatRSAzhFormat for RSA keys.

    Public:
        mpint e, n
    Private:
        mpint n, e, d, iqmp, p, q
    c                F    t        |      \  }}t        |      \  }}||f|fS )zRSA public fieldsr~   )r   rZ   ery   s       r    
get_publicz_SSHFormatRSA.get_public:  s.     T"4T"41vt|r"   c                    | j                  |      \  \  }}}t        j                  ||      }|j                         }||fS )zMake RSA public key from data.)r   r   RSAPublicNumbersrC   )r   rZ   r   ry   public_numbersrC   s         r    load_publicz_SSHFormatRSA.load_publicB  sE     t,A--a3#..0
4r"   c           	        t        |      \  }}t        |      \  }}t        |      \  }}t        |      \  }}t        |      \  }}t        |      \  }}||f|k7  rt        d      t        j                  ||      }	t        j                  ||      }
t        j
                  ||      }t        j                  ||||	|
||      }|j                         }||fS )zMake RSA private key from data.z Corrupt data: rsa field mismatch)r~   rN   r   rsa_crt_dmp1rsa_crt_dmq1r   RSAPrivateNumbersprivate_key)r   rZ   	pubfieldsry   r   diqmppqdmp1dmq1r   private_numbersr   s                 r    load_privatez_SSHFormatRSA.load_privateK  s     T"4T"4T"4%
dT"4T"4q6Y?@@1%1%--a3//q!T4~
 &113D  r"   c                    |j                         }|j                  |j                         |j                  |j                         y)zWrite RSA public keyN)r   r   r   ry   )r   rC   f_pubpubns       r    encode_publicz_SSHFormatRSA.encode_publica  s2     ((*r"   c                   |j                         }|j                  }|j                  |j                         |j                  |j                         |j                  |j
                         |j                  |j                         |j                  |j                         |j                  |j                         y)zWrite RSA private keyN)	r   r   r   ry   r   r   r   r   r   )r   r   f_privr   r   s        r    encode_privatez_SSHFormatRSA.encode_privatei  s     &557(77))*))***+--.**+**+r"   N)rZ   r   r   z"tuple[tuple[int, int], memoryview])rZ   r   r   z#tuple[rsa.RSAPublicKey, memoryview])rZ   r   r   z$tuple[rsa.RSAPrivateKey, memoryview])rC   zrsa.RSAPublicKeyr   r   r   r   )r   zrsa.RSAPrivateKeyr   r   r   r   	r3   r4   r5   r   r   r   r   r   r   r7   r"   r    r   r   1  s    	+  	, !!	-!, * 3< 	 ,,,6?,	,r"   r   c                  h    e Zd ZdZd	dZ	 	 	 	 d
dZ	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddZ	y)_SSHFormatDSAzhFormat for DSA keys.

    Public:
        mpint p, q, g, y
    Private:
        mpint p, q, g, y, x
    c                    t        |      \  }}t        |      \  }}t        |      \  }}t        |      \  }}||||f|fS )zDSA public fieldsr   )r   rZ   r   r   gys         r    r   z_SSHFormatDSA.get_public  sM    T"4T"4T"4T"41a|T!!r"   c                    | j                  |      \  \  }}}}}t        j                  |||      }t        j                  ||      }| j	                  |       |j                         }||fS )zMake DSA public key from data.)r   r
   DSAParameterNumbersDSAPublicNumbers	_validaterC   )	r   rZ   r   r   r   r   parameter_numbersr   rC   s	            r    r   z_SSHFormatDSA.load_public  sl     "__T2Aq!d33Aq!<--a1BC~&#..0
4r"   c                H   | j                  |      \  \  }}}}}t        |      \  }}||||f|k7  rt        d      t        j                  |||      }t        j
                  ||      }	| j                  |	       t        j                  ||	      }
|
j                         }||fS )zMake DSA private key from data.z Corrupt data: dsa field mismatch)	r   r~   rN   r
   r   r   r   DSAPrivateNumbersr   )r   rZ   r   r   r   r   r   xr   r   r   r   s               r    r   z_SSHFormatDSA.load_private  s     "__T2Aq!dT"4q!Q<9$?@@33Aq!<--a1BC~&//>B%113D  r"   c                6   |j                         }|j                  }| j                  |       |j                  |j                         |j                  |j
                         |j                  |j                         |j                  |j                         y)zWrite DSA public keyN)r   r   r   r   r   r   r   r   )r   rC   r   r   r   s        r    r   z_SSHFormatDSA.encode_public  su     $224*<<~&)++,)++,)++,(()r"   c                    | j                  |j                         |       |j                  |j                         j                         y)zWrite DSA private keyN)r   rC   r   r   r   )r   r   r   s      r    r   z_SSHFormatDSA.encode_private  s:     	;113V<446889r"   c                l    |j                   }|j                  j                         dk7  rt        d      y )Ni   z#SSH supports only 1024 bit DSA keys)r   r   r   rN   )r   r   r   s      r    r   z_SSHFormatDSA._validate  s6    *<<))+t3BCC 4r"   N)rZ   r   r   ztuple[tuple, memoryview])rZ   r   r   z#tuple[dsa.DSAPublicKey, memoryview])rZ   r   r   z$tuple[dsa.DSAPrivateKey, memoryview])rC   zdsa.DSAPublicKeyr   r   r   r   )r   zdsa.DSAPrivateKeyr   r   r   r   )r   zdsa.DSAPublicNumbersr   r   )
r3   r4   r5   r   r   r   r   r   r   r   r7   r"   r    r   r   y  sv    "	 	 	,	 !!	-! ***3<*	*:,:6?:	:Dr"   r   c                  p    e Zd ZdZd	dZ	 	 	 	 d
dZ	 	 	 	 ddZ	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	y)_SSHFormatECDSAzFormat for ECDSA keys.

    Public:
        str curve
        bytes point
    Private:
        str curve
        bytes point
        mpint secret
    c                     || _         || _        y r   )ssh_curve_namerS   )r   r   rS   s      r    r   z_SSHFormatECDSA.__init__  s    ,
r"   c                    t        |      \  }}t        |      \  }}|| j                  k7  rt        d      |d   dk7  rt        d      ||f|fS )zECDSA public fieldszCurve name mismatchr   rk   zNeed uncompressed point)rz   r   rN   NotImplementedError)r   rZ   rS   points       r    r   z_SSHFormatECDSA.get_public  s`     "$'t!$'tD'''2338q=%&?@@u~t##r"   c                    | j                  |      \  \  }}}t        j                  j                  | j                  |j                               }||fS z Make ECDSA public key from data.)r   r   rD   from_encoded_pointrS   r   )r   rZ   _r   rC   s        r    r   z_SSHFormatECDSA.load_public  sM      ??40
ED..AAJJ

 4r"   c                    | j                  |      \  \  }}}t        |      \  }}||f|k7  rt        d      t        j                  || j
                        }||fS )z!Make ECDSA private key from data.z"Corrupt data: ecdsa field mismatch)r   r~   rN   r   derive_private_keyrS   )r   rZ   r   
curve_namer   secretr   s          r    r   z_SSHFormatECDSA.load_private  sd     %)OOD$9!UT!$')+ABB++FDJJ?D  r"   c                    |j                  t        j                  t        j                        }|j                  | j                         |j                  |       y)zWrite ECDSA public keyN)public_bytesr   X962r   UncompressedPointr   r   )r   rC   r   r   s       r    r   z_SSHFormatECDSA.encode_public  sG     ''MM<99
 	,,-r"   c                    |j                         }|j                         }| j                  ||       |j                  |j                         y)zWrite ECDSA private keyN)rC   r   r   r   private_value)r   r   r   rC   r   s        r    r   z_SSHFormatECDSA.encode_private  sD     !++-
%557:v.667r"   N)r   r   rS   ec.EllipticCurve)rZ   r   r   z0tuple[tuple[memoryview, memoryview], memoryview]rZ   r   r   z,tuple[ec.EllipticCurvePublicKey, memoryview])rZ   r   r   z-tuple[ec.EllipticCurvePrivateKey, memoryview])rC   ec.EllipticCurvePublicKeyr   r   r   r   )r   zec.EllipticCurvePrivateKeyr   r   r   r   )
r3   r4   r5   r   r   r   r   r   r   r   r7   r"   r    r   r     s    	
$
$	9
$  	5 
!
!	6
! 3 <E 	 858?H8	8r"   r   c                  h    e Zd ZdZ	 	 	 	 ddZ	 	 	 	 d	dZ	 	 	 	 d
dZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZy)_SSHFormatEd25519z~Format for Ed25519 keys.

    Public:
        bytes point
    Private:
        bytes point
        bytes secret_and_point
    c                (    t        |      \  }}|f|fS )zEd25519 public fields)rz   )r   rZ   r   s      r    r   z_SSHFormatEd25519.get_public  s     "$'tx~r"   c                    | j                  |      \  \  }}t        j                  j                  |j	                               }||fS z"Make Ed25519 public key from data.)r   r   rL   from_public_bytesr   )r   rZ   r   rC   s       r    r   z_SSHFormatEd25519.load_public  sD     .$--??MMO

 4r"   c                    | j                  |      \  \  }}t        |      \  }}|dd }|dd }||k7  s|f|k7  rt        d      t        j                  j                  |      }||fS )z#Make Ed25519 private key from data.Nr8   z$Corrupt data: ed25519 field mismatch)r   rz   rN   r   rK   from_private_bytes)r   rZ   r   r   keypairr   point2r   s           r    r   z_SSHFormatEd25519.load_private!  sy     .$#D)"F?uh)3CDD//BB6JD  r"   c                    |j                  t        j                  t        j                        }|j	                  |       y)zWrite Ed25519 public keyN)r   r   Rawr   r   )r   rC   r   raw_public_keys       r    r   z_SSHFormatEd25519.encode_public/  s3     $00LL,**
 	(r"   c                N   |j                         }|j                  t        j                  t        j                  t                     }|j                  t        j                  t        j                        }t        ||g      }| j                  ||       |j                  |       y)zWrite Ed25519 private keyN)rC   private_bytesr   r	  r   r   r   r   r   r   r   )r   r   r   rC   raw_private_keyr
  	f_keypairs          r    r   z _SSHFormatEd25519.encode_private8  s     !++-
%33LL-++\^
 $00LL,**
 ?@	:v.)$r"   N)rZ   r   r   z$tuple[tuple[memoryview], memoryview]rZ   r   r   z+tuple[ed25519.Ed25519PublicKey, memoryview])rZ   r   r   z,tuple[ed25519.Ed25519PrivateKey, memoryview])rC   zed25519.Ed25519PublicKeyr   r   r   r   )r   zed25519.Ed25519PrivateKeyr   r   r   r   r   r7   r"   r    r   r     s    	-  	4 !!	5!)2);D)	)%4%>G%	%r"   r   c                    t        |       \  }} |j                         j                  d      st        d| d      || fS )z!
    U2F application strings
    s   ssh:z4U2F application string does not start with b'ssh:' ())rz   r   
startswithrN   )rZ   applications     r    load_applicationr  I  sU     $D)K ++G4}A
 	
 r"   c                       e Zd ZdZ	 	 	 	 ddZy)_SSHFormatSKEd25519z
    The format of a sk-ssh-ed25519@openssh.com public key is:

        string		"sk-ssh-ed25519@openssh.com"
        string		public key
        string		application (user-specified, but typically "ssh:")
    c                h    t        t              j                  |      \  }}t        |      \  }}||fS r  )_lookup_kformatrM   r   r  r   rZ   rC   r   s       r    r   z_SSHFormatSKEd25519.load_public_  s7     +<8DDTJ
D"4(44r"   Nr  r3   r4   r5   r   r   r7   r"   r    r  r  V  s      	4 r"   r  c                       e Zd ZdZ	 	 	 	 ddZy)_SSHFormatSKECDSAz
    The format of a sk-ecdsa-sha2-nistp256@openssh.com public key is:

        string		"sk-ecdsa-sha2-nistp256@openssh.com"
        string		curve name
        ec_point	Q
        string		application (user-specified, but typically "ssh:")
    c                h    t        t              j                  |      \  }}t        |      \  }}||fS r   )r  _ECDSA_NISTP256r   r  r  s       r    r   z_SSHFormatSKECDSA.load_publicr  s7     +?;GGM
D"4(44r"   Nr   r  r7   r"   r    r  r  h  s      	5 r"   r  s   nistp256s   nistp384s   nistp521c                    t        | t              st        |       j                         } | t        v r	t        |    S t        d|       )z"Return valid format or throw errorzUnsupported key type: )r@   r   r   r   _KEY_FORMATSr   )rP   s    r    r  r    sE    h&h'//1<H%%
!7|D
EEr"   c                   t        j                  d|        |t        j                  d|       t        j	                  |       }|st        d      |j                  d      }|j                  d      }t        j                  t        |       ||       } | j                  t              st        d      t        |       t        t              d } t        |       \  }} t        |       \  }} t        |       \  }} t        |       \  }	} |	dk7  rt        d      t        |       \  }
} t        |
      \  }}
t!        |      }|j#                  |
      \  }}
t%        |
       ||ft&        t&        fk7  r|j)                         }|t*        vrt-        d|      |t.        k7  rt-        d|      t*        |   j0                  }t*        |   j2                  }t        |       \  }} t*        |   j4                  r$t7        |       }t        |      |k7  rt        d	      t%        |        t9        ||       t        |      \  }}t        |      \  }}t%        |       t;        |||j)                         |      }|j=                         }t        |j?                  |            }t*        |   j4                  r-tA        |tB              sJ t%        |jE                               nAt%        |jG                                n't        |       \  }} t%        |        d
}t9        ||       t        |      \  }}t        |      \  }}||k7  rt        d      t        |      \  }}||k7  rt        d      |jI                  ||      \  }}t        |      \  }}|tJ        dt        |       k7  rt        d      tA        |tL        jN                        r&tQ        jR                  dt         jT                  d       |S )z.Load private key from OpenSSH custom encoding.rZ   Nr   zNot OpenSSH private key formatr%   zOnly one key supportedzUnsupported cipher: zUnsupported KDF: z+Corrupt data: invalid tag length for cipherrv   zCorrupt data: broken checksumzCorrupt data: key type mismatchzCorrupt data: invalid paddingDSSH DSA keys are deprecated and will be removed in a future release.   
stacklevel)+r   _check_byteslike_check_bytes_PEM_RCsearchrN   r   endbinascii
a2b_base64r   r  	_SK_MAGICr_   rz   rr   r  r   rc   _NONEr   r:   r   _BCRYPTr-   r0   r2   r   r`   rh   	decryptorupdater@   r   finalize_with_tagfinalizer   _PADDINGr
   rH   warningswarnDeprecatedIn40)rZ   r   backendmp1p2re   kdfname
kdfoptionsnkeyspubdatapub_key_typekformatr   ciphername_bytesblklenr0   edatatagr   kbufr   rf   decck1ck2rP   r   r   s                                r    load_ssh_private_keyrJ    s    
64(:x0tA9::	
B	
qBz$/267D??9%9::dC	N,-D #4(J%MGT"4(J4.KE4z122  %MGT'0L'l+G ++G4IwG.%--/</&&'7&:;  g&):7+'FGG./99/088!$'t ()11+C3x7" !NOO%( ,
d~T,hOnn3::e,-()11c#8999..s34 ( "$'tT%(%JC%JC
cz899 "%(OHe<:;; --eY?K5!HAu 3u:&&899+s001  		
 r"   c                   t        j                  d|       t        | t        j                        r&t        j                  dt         j                  d       t        |       }t        |      }t               }|rt        }t        |   j                  }t        }t        }	t        |t               r|j"                  |j"                  }	t%        j&                  d      }
|j)                  |
       |j+                  |	       t-        |||
|	      }nt.        x}}d}d}d}t%        j&                  d      }d	}t               }|j)                  |       |j1                  | j3                         |       t        ||g      }|j)                  |       |j5                  | |       |j)                  |       |j7                  t8        d||j;                         |z  z
          t               }|j7                  t<               |j)                  |       |j)                  |       |j)                  |       |j+                  |       |j)                  |       |j)                  |       |j;                         }|j;                         }t?        tA        ||z               }|jC                  |       ||z
  }|&|jE                         jG                  ||| ||d        tI        |d|       S )
z3Serialize private key with OpenSSH custom encoding.r   ISSH DSA key support is deprecated and will be removed in a future releaserk   r$  Nr$   rv   r%   r"   )%r   r'  r@   r
   rH   r5  r6  r7  rQ   r  r   _DEFAULT_CIPHERr:   r-   r/  _DEFAULT_ROUNDSr   _kdf_roundsosurandomr   r   rh   r.  r   rC   r   r   r4  r   r-  r   r   r   	encryptorupdate_intor]   )r   r   encryption_algorithmrP   rA  f_kdfoptionsre   rC  r<  r   r   rf   r>  checkvalcommentf_public_key	f_secretsf_mainslenmlenr   ofss                         r    _serialize_ssh_private_keyr^     s    
z8,+s001*  		
 !-Hh'G ;L$
j)33 +-HI$00<)55Fzz"~%V$J$?$$
WEzz!}HG ;LH%+002LA8X./I";	2!hE9>>+;f+D!EFG [F
NN9
j!
g
l#
NN5
l#
i  >>D;;=D
Ytf}-
.C
MM#
+C $$ST]CI>3u:&&r"   c                      e Zd ZdZdZy)SSHCertificateTyper%   r#  N)r3   r4   r5   USERHOSTr7   r"   r    r`  r`  [  s    DDr"   r`  c                     e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZe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edd
       Zedd       ZddZddZddZy)SSHCertificatec                6   || _         || _        || _        	 t        |      | _        || _        || _        || _        || _	        |	| _
        |
| _        || _        || _        || _        || _        || _        || _        || _        y # t
        $ r t        d      w xY w)NzInvalid certificate type)_nonce_public_key_serialr`  _typerN   _key_id_valid_principals_valid_after_valid_before_critical_options_extensions	_sig_type_sig_key_inner_sig_type
_signature_cert_key_type
_cert_body_tbs_cert_body)r   rf  rg  rh  _cctyperj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rv  rt  ru  s                     r    r   zSSHCertificate.__init__a  s    ( &	9+G4DJ !2(*!2&" .$,$,  	9788	9s   B Bc                ,    t        | j                        S r   )r   rf  r   s    r    noncezSSHCertificate.nonce  s    T[[!!r"   c                J    t        j                  t        | j                        S r   )typingcastSSHCertPublicKeyTypesrg  r   s    r    rC   zSSHCertificate.public_key  s     {{0$2B2BCCr"   c                    | j                   S r   )rh  r   s    r    serialzSSHCertificate.serial  s    ||r"   c                    | j                   S r   )ri  r   s    r    typezSSHCertificate.type  s    zzr"   c                ,    t        | j                        S r   )r   rj  r   s    r    key_idzSSHCertificate.key_id  s    T\\""r"   c                    | j                   S r   )rk  r   s    r    valid_principalszSSHCertificate.valid_principals      %%%r"   c                    | j                   S r   )rm  r   s    r    valid_beforezSSHCertificate.valid_before  s    !!!r"   c                    | j                   S r   )rl  r   s    r    valid_afterzSSHCertificate.valid_after  s       r"   c                    | j                   S r   )rn  r   s    r    critical_optionszSSHCertificate.critical_options  r  r"   c                    | j                   S r   )ro  r   s    r    
extensionszSSHCertificate.extensions  s    r"   c                    t        | j                        }|j                  | j                        \  }}t	        |       |S r   )r  rp  r   rq  rc   )r   	sigformatsignature_keysigkey_rests       r    r  zSSHCertificate.signature_key  s7    #DNN3	%.%:%:4==%I"{[!r"   c                    t        | j                        dz   t        j                  t        | j                        d      z   S )N    F)newline)r   rt  r+  
b2a_base64ru  r   s    r    r   zSSHCertificate.public_bytes  s<    $%%&!!%"8%HI	
r"   c                   | j                         }t        |t        j                        r9|j	                  t        | j                        t        | j                               y t        |t        j                        rt        | j                        \  }}t        |      \  }}t        |       t        j                  ||      }t        |j                        }|j	                  |t        | j                        t        j                   |             y t        |t"        j$                        sJ | j&                  t(        k(  rt+        j,                         }nQ| j&                  t.        k(  rt+        j0                         }n)| j&                  t2        k(  sJ t+        j4                         }|j	                  t        | j                        t        | j                        t7        j8                         |       y r   )r  r@   r   rL   verifyr   rs  rv  r   rD   r~   rc   
asym_utilsencode_dss_signature_get_ec_hash_algrS   ECDSAr   rF   rr  rG   r	   SHA1_SSH_RSA_SHA256SHA256_SSH_RSA_SHA512SHA512r   PKCS1v15)r   r  rrZ   scomputed_sighash_algs          r    verify_cert_signaturez$SSHCertificate.verify_cert_signature  sl   **,mW%=%=>  doo&d.A.A(B r'@'@A 1GAt &GAt%::1a@L'(;(;<H  eD$7$78"((8:L mS-=-=>>>##x/!;;=%%8!==?++>>>!==?  doo&d))*  "	r"   N)"rf  r   rg  SSHPublicKeyTypesrh  r*   rw  r*   rj  r   rk  r   rl  r*   rm  r*   rn  dict[bytes, bytes]ro  r  rp  r   rq  r   rr  r   rs  r   rv  r   rt  r   ru  r   r   )r   r}  r   )r   r`  )r   r   )r   r  )r   r   )r3   r4   r5   r   propertyry  rC   r  r  r  r  r  r  r  r  r  r   r  r7   r"   r    rd  rd  `  sy   '-'- ''- 	'-
 '- '- ''- '- '- .'- ('- '- '- $'- '-  #!'-" #'-$ %'-R " "D
     # # & & " " ! ! & &    
r"   rd  c                   t        | t        j                        rt        j                         S t        | t        j
                        rt        j                         S t        | t        j                        sJ t        j                         S r   )	r@   r   	SECP256R1r	   r  	SECP384R1SHA384	SECP521R1r  )rS   s    r    r  r    sV    %&}}	E2<<	(}}%...}}r"   c                   t        j                  d|        t        j                  |       }|st	        d      |j                  d      x}}|j                  d      }d}|j                  t              rd}|d t        t                }|t        k(  r|st        d      t        |      }	 t        t        j                  |            }|r|}	t#        |      \  }
}|
|k7  rt	        d	      |rt#        |      \  }}|j%                  |      \  }}|rt'        |      \  }}t)        |      \  }}t#        |      \  }}t#        |      \  }}g }|r+t#        |      \  }}|j+                  t-        |             |r+t'        |      \  }}t'        |      \  }}t#        |      \  }}t/        |      }t#        |      \  }}t/        |      }t#        |      \  }}t#        |      \  }}t#        |      \  }}|t        k(  r|st        d
      	d t        |        }t#        |      \  }}t1        |       t#        |      \  }} |t2        k(  r|t4        t6        t2        fvs|t2        k7  r||k7  rt	        d      t#        |       \  }!} t1        |        t9        |||||||||||||!|||	      S t1        |       |S # t        t        j                   f$ r t	        d      w xY w)NrZ   zInvalid line formatr%   r#  FTz-DSA keys aren't supported in SSH certificateszInvalid formatzInvalid key formatz3DSA signatures aren't supported in SSH certificatesz!Signature key type does not match)r   r&  _SSH_PUBKEY_RCmatchrN   groupendswith_CERT_SUFFIXr_   rJ   r   r  r   r+  r,  	TypeErrorErrorrz   r   rw   rr   r   r   _parse_exts_optsrc   rG   r  r  rd  )"rZ   _legacy_dsa_allowedr9  rP   orig_key_typekey_body	with_certrA  rest	cert_bodyinner_key_typery  rC   r  cctyper  
principalsr  	principalr  r  crit_optionsr  extsr  r   sig_key_rawsig_typesig_keytbs_cert_bodysignature_rawinner_sig_typesig_rest	signatures"                                     r    _load_ssh_public_identityr    s    
64(T"A.// wwqz)H}wwqzHI&	0s<0018$7";
 	
 h'G+(--h78 	&t,ND&-..!$'t**40J~~"4(&t,
D$/
$;!Iz##E)$45  %TNT%d^d(.d+L9 &
d%d+
d#4'-T'4'x(;&E  ",SYJ/)$/tT#.}#=   #_h?@("~'A@AA)(3	8X#
 	
( 	TK x~~& +)**+s   +J3 3%Kc                    t        |       S r   )r  rb   s    r    load_ssh_public_identityr  J  s     %T**r"   c                2   i }d }| rt        |       \  }} t        |      }||v rt        d      |||k  rt        d      t        |       \  }} t        |      dkD  r't        |      \  }}t        |      dkD  rt        d      t        |      ||<   |}| r|S )NzDuplicate namezFields not lexically sortedr   z!Unexpected extra data after value)rz   r   rN   r_   )	exts_optsresult	last_namerT   bnamevalueextras          r    r  r  P  s    !#FI
%i0iT{F?-.. UY%6:;;&y1yu:>&u-LE55zA~ !DEEeu	  Mr"   c                    t        | d      }t        |t              r|j                         }n|}t        |t        j
                        r&t        j                  dt        j                  d       |S )NT)r  r"  r#  r$  )
r  r@   rd  rC   r
   rI   r5  r6  r   r7  )rZ   r8  cert_or_keyrC   s       r    load_ssh_public_keyr  d  sb     ,DdKK+~. ++-
 
*c../  		
 r"   c                   t        | t        j                        r&t        j                  dt
        j                  d       t        |       }t        |      }t               }|j                  |       |j                  | |       t        j                  |j                               j                         }dj!                  |d|g      S )z&One-line public key format for OpenSSHrL  rk   r$  r"   r  )r@   r
   rI   r5  r6  r   r7  rQ   r  r   r   r   r+  r  r   striprX   )rC   rP   rA  r   pubs        r    serialize_ssh_public_keyr  x  s    *c../*  		
 !,Hh'GKE	X*e,


emmo
.
4
4
6C88XtS)**r"      c            
          e Zd Zddddg dddg g f
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 ddZddZddZddZ	 	 	 	 ddZd	 Z	dd
Z
ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddZy)SSHCertificateBuilderNFc                    || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        y r   
rg  rh  ri  rj  rk  _valid_for_all_principalsrm  rl  rn  ro  )r   rg  rh  ri  rj  rk  r  rm  rl  rn  ro  s              r    r   zSSHCertificateBuilder.__init__  sQ     '
!2)B&*(!2&r"   c                   t        |t        j                  t        j                  t
        j                  f      st        d      | j                  t        d      t        || j                  | j                  | j                  | j                  | j                  | j                   | j"                  | j$                  | j&                  
      S )Nr?   zpublic_key already setr  )r@   r   rD   r   rF   r   rL   r  rg  rN   r  rh  ri  rj  rk  r  rm  rl  rn  ro  )r   rC   s     r    rC   z SSHCertificateBuilder.public_key  s     ))  ((
 233'566$"LL**LL"44&*&D&D,,**"44((
 	
r"   c                   t        |t              st        d      d|cxk  rdk  st        d       t        d      | j                  t        d      t        | j                  || j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  
      S )Nzserial must be an integerr               z"serial must be between 0 and 2**64zserial already setr  )r@   r*   r  rN   rh  r  rg  ri  rj  rk  r  rm  rl  rn  ro  )r   r  s     r    r  zSSHCertificateBuilder.serial  s    &#&788F"U"ABB #ABB<<#122$((**LL"44&*&D&D,,**"44((
 	
r"   c                D   t        |t              st        d      | j                  t	        d      t        | j                  | j                  || j                  | j                  | j                  | j                  | j                  | j                  | j                  
      S )Nz"type must be an SSHCertificateTypeztype already setr  )r@   r`  r  ri  rN   r  rg  rh  rj  rk  r  rm  rl  rn  ro  )r   r  s     r    r  zSSHCertificateBuilder.type  s    $ 23@AA::!/00$((LLLL"44&*&D&D,,**"44((
 	
r"   c                D   t        |t              st        d      | j                  t	        d      t        | j                  | j                  | j                  || j                  | j                  | j                  | j                  | j                  | j                  
      S )Nzkey_id must be byteszkey_id already setr  )r@   r   r  rj  rN   r  rg  rh  ri  rk  r  rm  rl  rn  ro  )r   r  s     r    r  zSSHCertificateBuilder.key_id  s    &%(233<<#122$((LL**"44&*&D&D,,**"44((
 	
r"   c                   | j                   rt        d      t        d |D              r|st        d      | j                  rt        d      t        |      t        kD  rt        d      t        | j                  | j                  | j                  | j                  || j                   | j                  | j                  | j                  | j                  
      S )NzDPrincipals can't be set because the cert is valid for all principalsc              3  <   K   | ]  }t        |t                y wr   )r@   r   ).0r   s     r    	<genexpr>z9SSHCertificateBuilder.valid_principals.<locals>.<genexpr>  s     CQJq%(Cs   z5principals must be a list of bytes and can't be emptyzvalid_principals already setz:Reached or exceeded the maximum number of valid_principalsr  )r  rN   allr  rk  r_   _SSHKEY_CERT_MAX_PRINCIPALSr  rg  rh  ri  rj  rm  rl  rn  ro  )r   r  s     r    r  z&SSHCertificateBuilder.valid_principals  s     ))% 
 C2BCC#G  !!;<< #>>L  %((LL**LL.&*&D&D,,**"44((
 	
r"   c                <   | j                   rt        d      | j                  rt        d      t        | j                  | j
                  | j                  | j                  | j                   d| j                  | j                  | j                  | j                  
      S )Nz@valid_principals already set, can't set valid_for_all_principalsz$valid_for_all_principals already setTr  )rk  rN   r  r  rg  rh  ri  rj  rm  rl  rn  ro  r   s    r    valid_for_all_principalsz.SSHCertificateBuilder.valid_for_all_principals,  s    !!+  ))CDD$((LL**LL"44&*,,**"44((
 	
r"   c                   t        |t        t        f      st        d      t        |      }|dk  s|dk\  rt	        d      | j
                  t	        d      t        | j                  | j                  | j                  | j                  | j                  | j                  || j                  | j                  | j                  
      S )Nz$valid_before must be an int or floatr   r  zvalid_before must [0, 2**64)zvalid_before already setr  )r@   r*   floatr  rN   rm  r  rg  rh  ri  rj  rk  r  rl  rn  ro  )r   r  s     r    r  z"SSHCertificateBuilder.valid_beforeB  s    ,e5BCC<(!|u4;<<)788$((LL**LL"44&*&D&D&**"44((
 	
r"   c                   t        |t        t        f      st        d      t        |      }|dk  s|dk\  rt	        d      | j
                  t	        d      t        | j                  | j                  | j                  | j                  | j                  | j                  | j                  || j                  | j                  
      S )Nz#valid_after must be an int or floatr   r  zvalid_after must [0, 2**64)zvalid_after already setr  )r@   r*   r  r  rN   rl  r  rg  rh  ri  rj  rk  r  rm  rn  ro  )r   r  s     r    r  z!SSHCertificateBuilder.valid_afterX  s    +U|4ABB+&?kU2:;;(677$((LL**LL"44&*&D&D,,$"44((
 	
r"   c                   t        |t              rt        |t              st        d      || j                  D cg c]  \  }}|	 c}}v rt	        d      t        | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  g | j                  |f| j                  
      S c c}}w )Nname and value must be byteszDuplicate critical option namer  )r@   r   r  rn  rN   r  rg  rh  ri  rj  rk  r  rm  rl  ro  r   rT   r  r   s       r    add_critical_optionz)SSHCertificateBuilder.add_critical_optionn  s     $&j.F:;;(>(>?WT1D??=>>$((LL**LL"44&*&D&D,,**F 6 6FuF((
 	
 @   Cc                   t        |t              rt        |t              st        d      || j                  D cg c]  \  }}|	 c}}v rt	        d      t        | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  g | j                  |f
      S c c}}w )Nr  zDuplicate extension namer  )r@   r   r  ro  rN   r  rg  rh  ri  rj  rk  r  rm  rl  rn  r  s       r    add_extensionz#SSHCertificateBuilder.add_extension  s     $&j.F:;;(8(89WT1D99788$((LL**LL"44&*&D&D,,**"44:$**:T5M:
 	
 :r  c           
     "   t        |t        j                  t        j                  t
        j                  f      st        d      | j                  t        d      | j                  dn| j                  }| j                  t        d      | j                  dn| j                  }| j                  s| j                  st        d      | j                  t        d      | j                   t        d      | j                   | j                  kD  rt        d	      | j"                  j%                  d
        | j&                  j%                  d        t)        | j                        }|t*        z   }t-        j.                  d      }t1        |      }t3               }|j5                  |       |j5                  |       |j7                  | j                  |       |j9                  |       |j;                  | j                  j<                         |j5                  |       t3               }	| j                  D ]  }
|	j5                  |
        |j5                  |	j?                                |j9                  | j                          |j9                  | j                         t3               }| j"                  D ]p  \  }}|j5                  |       tA        |      dkD  r;t3               }|j5                  |       |j5                  |j?                                `|j5                  |       r |j5                  |j?                                t3               }| j&                  D ]p  \  }}|j5                  |       tA        |      dkD  r;t3               }|j5                  |       |j5                  |j?                                `|j5                  |       r |j5                  |j?                                |j5                  d       t)        |      }t1        |      }t3               }|j5                  |       |j7                  |jC                         |       |j5                  |j?                                t        |t
        j                        rl|jE                  |j?                               }t3               }|j5                  |       |j5                  |       |j5                  |j?                                nt        |t        j                        rtG        |jH                        }|jE                  |j?                         t        jJ                  |            }tM        jN                  |      \  }}t3               }|j5                  |       t3               }|jQ                  |       |jQ                  |       |j5                  |j?                                |j5                  |j?                                nt        |t        j                        sJ t3               }|j5                  tR               |jE                  |j?                         tU        jV                         tY        jZ                               }|j5                  |       |j5                  |j?                                t]        j^                  |j?                               ja                         }tc        jd                  tf        ti        djk                  |d|g                  S )NzUnsupported private key typezpublic_key must be setr   ztype must be setr"   zAvalid_principals must be set if valid_for_all_principals is Falsezvalid_before must be setzvalid_after must be setz-valid_after must be earlier than valid_beforec                    | d   S Nr   r7   r   s    r    <lambda>z,SSHCertificateBuilder.sign.<locals>.<lambda>  s
    !A$ r"   )rO   c                    | d   S r  r7   r  s    r    r  z,SSHCertificateBuilder.sign.<locals>.<lambda>  s
    AaD r"   r8   r  )6r@   r   rA   r   rE   r   rK   r  rg  rN   rh  ri  rj  rk  r  rm  rl  rn  sortro  rQ   r  rP  rQ  r  r   r   r   r   r   r  r   r_   rC   signr  rS   r  r  decode_dss_signaturer   r  r   r  r	   r  r+  r  r  r{  r|  rd  r  rX   )r   r   r  r  rP   cert_prefixry  rA  ffprincipalsr   fcritrT   r  foptvalfextfextvalca_typecaformatcafr  fsigr  r  r  fsigblob	cert_datas                              r    r  zSSHCertificateBuilder.sign  sh   **!!))
 :;;#566 ll*::/00 ,$,, %%d.L.L 
 %788$677t111LMM 	###7.1$T%5%56- 

2!(+K	[!	Ud..2			&			$**""#	Vk'' 	&A""1%	&	[((*+			$##$			$$$%11 	(KD%T"5zA~#+""5)  !23  '	( 	
U]]_%{++ 	'KD%OOD!5zA~#+""5) 12&	' 	
T\\^$	S#K0"7+kw{557=	S[[]# k7#<#<=#((5I;DOOG$OOI&LL(R%?%?@'(9(9:H#((bhhx6HII229=DAq;DOOG$ {Hq!q!OOH,,./LL( k3+<+<===
 ;DOOO,#((		W--/I OOI&LL(''		4::<	 {{$SXX{D).L%MN
 	
r"   )rg  zSSHCertPublicKeyTypes | Nonerh  r/   ri  zSSHCertificateType | Nonerj  bytes | Nonerk  r   r  r1   rm  r/   rl  r/   rn  list[tuple[bytes, bytes]]ro  r  )rC   r}  r   r  )r  r*   r   r  )r  r`  r   r  )r  r   r   r  )r  r   r   r  )r  int | floatr   r  )r  r  r   r  )rT   r   r  r   r   r  )r   SSHCertPrivateKeyTypesr   rd  )r3   r4   r5   r   rC   r  r  r  r  r  r  r  r  r  r  r7   r"   r    r  r    s    59"+/ $)+*/$(#'7913'1' ' )	'
 ' '' $(' "' !' 5' /'0
/
	
8
*
&
&"
 +"
	"
H
,
,
,

"'
	
,

"'
	
,G
r"   r  )F)r   r   r   r   r   r*   r   r*   r   r1   r   r   )rO   z&SSHPrivateKeyTypes | SSHPublicKeyTypesr   r   )rC   r   r   r   )rZ   r   r[   r   r\   r   r   r   )rZ   r   r-   r*   r   r   )rZ   r   r   r   )
re   r   r   r  r   r   r   r*   r   z)Cipher[modes.CBC | modes.CTR | modes.GCM])rZ   r   r   ztuple[int, memoryview])rZ   r   r   tuple[memoryview, memoryview])r}   r*   r   r   )r   r  )rP   r   r   )rZ   r   r   r  r8  
typing.Anyr   SSHPrivateKeyTypes)r   r  r   r   rT  r   r   r   )rS   r   r   zhashes.HashAlgorithm)rZ   r   r   z"SSHCertificate | SSHPublicKeyTypes)r  r   r   r  )rZ   r   r8  r  r   r  )rC   r  r   r   )
__future__r   r+  enumrP  rer{  r5  base64r   rY   dataclassesr   cryptographyr   cryptography.exceptionsr   cryptography.hazmat.primitivesr	   )cryptography.hazmat.primitives.asymmetricr
   r   r   r   r   r  &cryptography.hazmat.primitives.ciphersr   r   r   r   ,cryptography.hazmat.primitives.serializationr   r   r   r   r   r   bcryptr   r!   _bcrypt_supportedImportErrorrM   rG   rJ   r  _ECDSA_NISTP384_ECDSA_NISTP521r  _SK_SSH_ED25519_SK_SSH_ECDSA_NISTP256r  r  compiler  r-  	_SK_START_SK_ENDr/  r.  rM  rN  DOTALLr(  r   r   ranger4  r(   AESCTRCBCGCMr:   r6   rU   rQ   rB   r]   r`   rc   rh   rr   rw   rz   r~   r   r   r   r   r   r   r  r  r  r  r  r  r   r  UnionrA   rE   rH   rK   r  rJ  r^  rD   rF   rI   rL   r  r}  Enumr`  rd  r  r  r  r  r  r  r  r  r  r7   r"   r    <module>r5     sK  
 #   	 	   0 !  8 1  J  9) (((' 0>  "!23	2	
.
 "**Y)G3RYY
? ia 012    NNYY NNYY  *NNYY ')% @ !  &' %eO<
<< < 	<:8  	
 /(??,+3 3lE, E,PCD CDLD8 D8N@% @%F
   $   ( momo#%_[,",,.A_[,",,.A_[,",,.A(*-/	F \\  e
ee e 	ePJ'#J'J' 5J' 	J'Z LL    
~ ~B \
\ (\~+
+'+* (,
$(+(    " I
 I
U#  
9 #(999 9 	9
  9 
9
9s   /N, ,OO