
    Dji              	         d dl m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mZmZmZmZmZmZmZmZ d dlmZmZ d d	lmZmZmZ d d
lm Z m!Z! d dl"m#Z#  ej        ddd          Z$ej%        ej&        ej'        ej(        ej)        ej*        ej+        ej,        ej-        f         Z. G d de/          Z0d1dZ1d2dZ2d3dZ3 G d d           Z4 G d! d"          Z5 G d# d$ej6                  Z7 G d% d&e/          Z8ej9        Z9ej:        Z:ej;        Z;ej<        Z<ej=        Z=ej>        Z>ej?        Z?ej@        Z@ejA        ZAejB        ZBejC        ZC G d' d(          ZD G d) d*          ZE G d+ d,          ZF G d- d.          ZGd4d0ZHdS )5    )annotationsN)Iterable)utils)x509)hashes)	dsaeced448ed25519mldsapaddingrsax448x25519) CertificateIssuerPrivateKeyTypesCertificatePublicKeyTypes)	ExtensionExtensionType_make_sequence_methods)Name	_ASN1Type)ObjectIdentifieri     c                        e Zd Zd fdZ xZS )	AttributeNotFoundmsgstroidr   returnNonec                X    t                                          |           || _        d S N)super__init__r   )selfr   r   	__class__s      Q/home/thesage/.hermes/venv/lib/python3.11/site-packages/cryptography/x509/base.pyr$   zAttributeNotFound.__init__7   s&        )r   r   r   r   r   r    __name__
__module____qualname__r$   __classcell__r&   s   @r'   r   r   6   s=                 r(   r   	extensionExtension[ExtensionType]
extensionslist[Extension[ExtensionType]]r   r    c                N    |D ]!}|j         | j         k    rt          d          "d S )Nz$This extension has already been set.)r   
ValueError)r/   r1   es      r'   _reject_duplicate_extensionr6   <   sD    
  E E5IM!!CDDD "E Er(   r   r   
attributes0list[tuple[ObjectIdentifier, bytes, int | None]]c                B    |D ]\  }}}|| k    rt          d          d S )Nz$This attribute has already been set.)r4   )r   r7   attr_oid_s       r'   _reject_duplicate_attributer<   F   sD    
 % E E!Qs??CDDD E Er(   timedatetime.datetimec                    | j         D|                                 }|r|nt          j                    }|                     d          |z
  S | S )zNormalizes a datetime to a naive datetime in UTC.

    time -- datetime to normalize. Assumed to be in UTC if not timezone
            aware.
    N)tzinfo)r@   	utcoffsetdatetime	timedeltareplace)r=   offsets     r'   _convert_to_naive_utc_timerF   P   sP     {!!!;x'9';';||4|((611r(   c                  v    e Zd Zej        j        fdd	Zedd
            Zedd            ZddZ	ddZ
ddZdS )	Attributer   r   valuebytes_typeintr   r    c                0    || _         || _        || _        d S r"   )_oid_valuerK   )r%   r   rI   rK   s       r'   r$   zAttribute.__init___   s     	


r(   c                    | j         S r"   )rN   r%   s    r'   r   zAttribute.oidi   s
    yr(   c                    | j         S r"   )rO   rQ   s    r'   rI   zAttribute.valuem   s
    {r(   r   c                (    d| j          d| j        dS )Nz<Attribute(oid=z, value=)>)r   rI   rQ   s    r'   __repr__zAttribute.__repr__q   s    CCC4:CCCCr(   otherobjectboolc                    t          |t                    st          S | j        |j        k    o| j        |j        k    o| j        |j        k    S r"   )
isinstancerH   NotImplementedr   rI   rK   )r%   rV   s     r'   __eq__zAttribute.__eq__t   sO    %++ 	"!! H	! *
ek)*
ek)	
r(   c                D    t          | j        | j        | j        f          S r"   )hashr   rI   rK   rQ   s    r'   __hash__zAttribute.__hash__~   s    TXtz4:6777r(   N)r   r   rI   rJ   rK   rL   r   r    )r   r   )r   rJ   r   r   )rV   rW   r   rX   r   rL   )r*   r+   r,   r   
UTF8StringrI   r$   propertyr   rU   r\   r_    r(   r'   rH   rH   ^   s        
 )/	        X    XD D D D
 
 
 
8 8 8 8 8 8r(   rH   c                  D    e Zd ZddZ ed          \  ZZZddZddZ	dS )
Attributesr7   Iterable[Attribute]r   r    c                .    t          |          | _        d S r"   )list_attributes)r%   r7   s     r'   r$   zAttributes.__init__   s      
++r(   rj   r   c                    d| j          dS )Nz<Attributes(rT   )rj   rQ   s    r'   rU   zAttributes.__repr__   s    2d.2222r(   r   r   rH   c                R    | D ]}|j         |k    r|c S t          d| d|          )NzNo z attribute was found)r   r   )r%   r   attrs      r'   get_attribute_for_oidz Attributes.get_attribute_for_oid   sH     	 	Dx3    ?c ? ? ?EEEr(   N)r7   rg   r   r    r`   )r   r   r   rH   )
r*   r+   r,   r$   r   __len____iter____getitem__rU   rn   rd   r(   r'   rf   rf      so        , , , , &<%;M%J%J"GX{3 3 3 3F F F F F Fr(   rf   c                      e Zd ZdZdZdS )Versionr      N)r*   r+   r,   v1v3rd   r(   r'   rs   rs      s        	
B	
BBBr(   rs   c                        e Zd Zd fdZ xZS )	InvalidVersionr   r   parsed_versionrL   r   r    c                X    t                                          |           || _        d S r"   )r#   r$   ry   )r%   r   ry   r&   s      r'   r$   zInvalidVersion.__init__   s)    ,r(   )r   r   ry   rL   r   r    r)   r.   s   @r'   rx   rx      s=        - - - - - - - - - -r(   rx   c                  P    e Zd Zdg g fd'dZd(dZd)dZddd*dZ	 d+dddd,d&ZdS )- CertificateSigningRequestBuilderNsubject_nameName | Noner1   r2   r7   r8   c                0    || _         || _        || _        dS )zB
        Creates an empty X.509 certificate request (v1).
        N)_subject_name_extensionsrj   )r%   r}   r1   r7   s       r'   r$   z)CertificateSigningRequestBuilder.__init__   s"     *%%r(   namer   r   c                    t          |t                    st          d          | j        t	          d          t          || j        | j                  S )zF
        Sets the certificate requestor's distinguished name.
        Expecting x509.Name object.N&The subject name may only be set once.)rZ   r   	TypeErrorr   r4   r|   r   rj   r%   r   s     r'   r}   z-CertificateSigningRequestBuilder.subject_name   s\     $%% 	;9:::)EFFF/$"D$4
 
 	
r(   extvalr   criticalrX   c                    t          |t                    st          d          t          |j        ||          }t          || j                   t          | j        g | j        || j	                  S )zE
        Adds an X.509 extension to the certificate request.
        "extension must be an ExtensionType)
rZ   r   r   r   r   r6   r   r|   r   rj   r%   r   r   r/   s       r'   add_extensionz.CertificateSigningRequestBuilder.add_extension   sz     &-00 	B@AAAfj(F;;	#It/?@@@/*d*	*
 
 	
r(   )_tagr   r   rI   rJ   r   _ASN1Type | Nonec               n   t          |t                    st          d          t          |t                    st          d          |$t          |t                    st          d          t          || j                   ||j        }nd}t          | j	        | j
        g | j        |||f          S )zK
        Adds an X.509 attribute with an OID and associated value.
        zoid must be an ObjectIdentifierzvalue must be bytesNztag must be _ASN1Type)rZ   r   r   rJ   r   r<   rj   rI   r|   r   r   )r%   r   rI   r   tags        r'   add_attributez.CertificateSigningRequestBuilder.add_attribute   s     #/00 	?=>>>%'' 	31222JtY$?$?3444#C)9:::*CCC/2d2eS 12
 
 	
r(   rsa_paddingecdsa_deterministicprivate_keyr   	algorithm_AllowedHashTypes | Nonebackend
typing.Anyr   %padding.PSS | padding.PKCS1v15 | Noner   bool | NoneCertificateSigningRequestc               t   | j         t          d          |^t          |t          j        t          j        f          st          d          t          |t          j                  st          d          |)t          |t          j
                  st          d          t          j        | ||||          S )zF
        Signs the request using the requestor's private key.
        Nz/A CertificateSigningRequest must have a subjectPadding must be PSS or PKCS1v15&Padding is only supported for RSA keys1Deterministic ECDSA is only supported for EC keys)r   r4   rZ   r   PSSPKCS1v15r   r   RSAPrivateKeyr	   EllipticCurvePrivateKey	rust_x509create_x509_csrr%   r   r   r   r   r   s         r'   signz%CertificateSigningRequestBuilder.sign  s     %NOOO"kGK9I+JKK C ABBBk3+<== J HIII*k2+EFF G   (
 
 	
r(   )r}   r~   r1   r2   r7   r8   )r   r   r   r|   )r   r   r   rX   r   r|   )r   r   rI   rJ   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   r(   r'   r|   r|      s         %)57GI	& & & & &

 

 

 


 
 
 
. "&
 
 
 
 
 
H #	!
 >B+/!
 !
 !
 !
 !
 !
 !
 !
r(   r|   c                      e Zd ZU ded<   ddddddg dfd5dZd6dZd6dZddd7dZd8dZd9d"Z	d9d#Z
d:d(Z	 d;ddd)d<d4ZdS )=CertificateBuilderr2   r   Nissuer_namer~   r}   
public_key CertificatePublicKeyTypes | Noneserial_number
int | Nonenot_valid_beforedatetime.datetime | Nonenot_valid_afterr1   public_key_rsa_paddingtype[padding.PSS] | Noner   r    c	                    t           j        | _        || _        || _        || _        || _        || _        || _        || _	        || _
        d S r"   )rs   rv   _version_issuer_namer   _public_key_serial_number_not_valid_before_not_valid_afterr   _public_key_rsa_padding)	r%   r   r}   r   r   r   r   r1   r   s	            r'   r$   zCertificateBuilder.__init__(  sS      
')%+!1 /%'=$$$r(   r   r   c           
         t          |t                    st          d          | j        t	          d          t          || j        | j        | j        | j	        | j
        | j        | j                  S )z3
        Sets the CA's distinguished name.
        r   N%The issuer name may only be set once.)rZ   r   r   r   r4   r   r   r   r   r   r   r   r   r   s     r'   r   zCertificateBuilder.issuer_name=  s|     $%% 	;9:::(DEEE!"!(	
 	
 		
r(   c           
         t          |t                    st          d          | j        t	          d          t          | j        || j        | j        | j	        | j
        | j        | j                  S )z:
        Sets the requestor's distinguished name.
        r   Nr   )rZ   r   r   r   r4   r   r   r   r   r   r   r   r   r   s     r'   r}   zCertificateBuilder.subject_nameP  s|     $%% 	;9:::)EFFF!"!(	
 	
 		
r(   )r   keyr   r   c               @   t          |t          j        t          j        t
          j        t          j        t          j
        t          j        t          j        t          j        t          j        t"          j        f
          st'          d          |F|t(          j        urt'          d          t          |t          j                  st'          d          | j        t/          d          t1          | j        | j        || j        | j        | j        | j        |          S )zT
        Sets the requestor's public key (as found in the signing request).
        zExpecting one of DSAPublicKey, RSAPublicKey, EllipticCurvePublicKey, Ed25519PublicKey, Ed448PublicKey, MLDSA44PublicKey, MLDSA65PublicKey, MLDSA87PublicKey, X25519PublicKey, or X448PublicKey.Nz2rsa_padding must be the PSS class, not an instancez2rsa_padding is only supported with RSA public keysz$The public key may only be set once.)rZ   r   DSAPublicKeyr   RSAPublicKeyr	   EllipticCurvePublicKeyr   Ed25519PublicKeyr
   Ed448PublicKeyr   MLDSA44PublicKeyMLDSA65PublicKeyMLDSA87PublicKeyr   X25519PublicKeyr   X448PublicKeyr   r   r   r   r4   r   r   r   r   r   r   r   )r%   r   r   s      r'   r   zCertificateBuilder.public_keyc  s      )($&&&&"
 
 	 !   "'+--H   c3#344 H   'CDDD!"!	
 	
 		
r(   numberrL   c           
     `   t          |t                    st          d          | j        t	          d          |dk    rt	          d          |                                dk    rt	          d          t          | j        | j        | j	        || j
        | j        | j        | j                  S )z5
        Sets the certificate serial number.
        'Serial number must be of integral type.N'The serial number may only be set once.r   z%The serial number should be positive.   3The serial number should not be more than 159 bits.)rZ   rL   r   r   r4   
bit_lengthr   r   r   r   r   r   r   r   r%   r   s     r'   r   z CertificateBuilder.serial_number  s     &#&& 	GEFFF*FGGGQ;;DEEE #%%E   ""!(	
 	
 		
r(   r=   r>   c           
        t          |t          j                  st          d          | j        t	          d          t          |          }|t          k     rt	          d          | j        || j        k    rt	          d          t          | j	        | j
        | j        | j        || j        | j        | j                  S )z7
        Sets the certificate activation time.
        Expecting datetime object.Nz*The not valid before may only be set once.z>The not valid before date must be on or after 1950 January 1).zBThe not valid before date must be before the not valid after date.)rZ   rB   r   r   r4   rF   _EARLIEST_UTC_TIMEr   r   r   r   r   r   r   r   r%   r=   s     r'   r   z#CertificateBuilder.not_valid_before  s     $ 122 	:8999!-IJJJ)$//$$$$    ,8M1M1M   "!(	
 	
 		
r(   c           
        t          |t          j                  st          d          | j        t	          d          t          |          }|t          k     rt	          d          | j        || j        k     rt	          d          t          | j	        | j
        | j        | j        | j        || j        | j                  S )z7
        Sets the certificate expiration time.
        r   Nz)The not valid after may only be set once.z<The not valid after date must be on or after 1950 January 1.zAThe not valid after date must be after the not valid before date.)rZ   rB   r   r   r4   rF   r   r   r   r   r   r   r   r   r   r   s     r'   r   z"CertificateBuilder.not_valid_after  s     $ 122 	:8999 ,HIII)$//$$$N   ".t---   ""(	
 	
 		
r(   r   r   r   rX   c           
     $   t          |t                    st          d          t          |j        ||          }t          || j                   t          | j        | j	        | j
        | j        | j        | j        g | j        || j                  S )z=
        Adds an X.509 extension to the certificate.
        r   )rZ   r   r   r   r   r6   r   r   r   r   r   r   r   r   r   r   s       r'   r   z CertificateBuilder.add_extension  s     &-00 	B@AAAfj(F;;	#It/?@@@!"!*d*	*(	
 	
 		
r(   r   r   r   r   r   r   r   r   r   r   Certificatec               P   | j         t          d          | j        t          d          | j        t          d          | j        t          d          | j        t          d          | j        t          d          |^t          |t          j	        t          j
        f          st          d          t          |t          j                  st          d	          |)t          |t          j                  st          d
          t!          j        | ||||          S )zC
        Signs the certificate using the CA's private key.
        Nz&A certificate must have a subject namez&A certificate must have an issuer namez'A certificate must have a serial numberz/A certificate must have a not valid before timez.A certificate must have a not valid after timez$A certificate must have a public keyr   r   r   )r   r4   r   r   r   r   r   rZ   r   r   r   r   r   r   r	   r   r   create_x509_certificater   s         r'   r   zCertificateBuilder.sign	  sA    %EFFF$EFFF&FGGG!)NOOO (MNNN#CDDD"kGK9I+JKK C ABBBk3+<== J HIII*k2+EFF G   0
 
 	
r(   )r   r~   r}   r~   r   r   r   r   r   r   r   r   r1   r2   r   r   r   r    )r   r   r   r   )r   r   r   r   r   r   )r   rL   r   r   )r=   r>   r   r   )r   r   r   rX   r   r   r"   )r   r   r   r   r   r   r   r   r   r   r   r   )r*   r+   r,   __annotations__r$   r   r}   r   r   r   r   r   r   rd   r(   r'   r   r   %  s#        //// $($(7;$(594857;?> > > > >*
 
 
 
&
 
 
 
. 15	3
 3
 3
 3
 3
 3
j
 
 
 
8
 
 
 
<
 
 
 
@
 
 
 
6 #	0
 >B+/0
 0
 0
 0
 0
 0
 0
 0
r(   r   c                  t    e Zd ZU ded<   ded<   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/dddd0d(Z
dS )1 CertificateRevocationListBuilderr2   r   list[RevokedCertificate]_revoked_certificatesNr   r~   last_updater   next_updater1   revoked_certificatesc                L    || _         || _        || _        || _        || _        d S r"   )r   _last_update_next_updater   r   )r%   r   r   r   r1   r   s         r'   r$   z)CertificateRevocationListBuilder.__init__@  s2     (''%%9"""r(   r   r   c                    t          |t                    st          d          | j        t	          d          t          || j        | j        | j        | j	                  S )Nr   r   )
rZ   r   r   r   r4   r   r   r   r   r   )r%   r   s     r'   r   z,CertificateRevocationListBuilder.issuer_nameN  sj     +t,, 	;9:::(DEEE/&
 
 	
r(   r>   c                b   t          |t          j                  st          d          | j        t	          d          t          |          }|t          k     rt	          d          | j        || j        k    rt	          d          t          | j	        || j        | j
        | j                  S )Nr   !Last update may only be set once.8The last update date must be on or after 1950 January 1.z9The last update date must be before the next update date.)rZ   rB   r   r   r4   rF   r   r   r   r   r   r   )r%   r   s     r'   r   z,CertificateRevocationListBuilder.last_update]  s     +x'899 	:8999(@AAA0==+++J   ([4;L-L-LK   0&
 
 	
r(   c                b   t          |t          j                  st          d          | j        t	          d          t          |          }|t          k     rt	          d          | j        || j        k     rt	          d          t          | j	        | j        || j
        | j                  S )Nr   r   r   z8The next update date must be after the last update date.)rZ   rB   r   r   r4   rF   r   r   r   r   r   r   )r%   r   s     r'   r   z,CertificateRevocationListBuilder.next_updateu  s     +x'899 	:8999(@AAA0==+++J   ([4;L-L-LJ   0&
 
 	
r(   r   r   r   rX   c                    t          |t                    st          d          t          |j        ||          }t          || j                   t          | j        | j	        | j
        g | j        || j                  S )zM
        Adds an X.509 extension to the certificate revocation list.
        r   )rZ   r   r   r   r   r6   r   r   r   r   r   r   r   s       r'   r   z.CertificateRevocationListBuilder.add_extension  s     &-00 	B@AAAfj(F;;	#It/?@@@/*d*	*&
 
 	
r(   revoked_certificateRevokedCertificatec                    t          |t                    st          d          t          | j        | j        | j        | j        g | j        |          S )z8
        Adds a revoked certificate to the CRL.
        z)Must be an instance of RevokedCertificate)	rZ   r   r   r   r   r   r   r   r   )r%   r   s     r'   add_revoked_certificatez8CertificateRevocationListBuilder.add_revoked_certificate  sc     -/ABB 	IGHHH/>d(>*=>
 
 	
r(   r   r   r   r   r   r   r   r   r   r   r   CertificateRevocationListc                  | j         t          d          | j        t          d          | j        t          d          |^t	          |t
          j        t
          j        f          st          d          t	          |t          j
                  st          d          |)t	          |t          j                  st          d          t          j        | ||||          S )NzA CRL must have an issuer namez"A CRL must have a last update timez"A CRL must have a next update timer   r   r   )r   r4   r   r   rZ   r   r   r   r   r   r   r	   r   r   create_x509_crlr   s         r'   r   z%CertificateRevocationListBuilder.sign  s     $=>>>$ABBB$ABBB"kGK9I+JKK C ABBBk3+<== J HIII*k2+EFF G   (
 
 	
r(   )
r   r~   r   r   r   r   r1   r2   r   r   )r   r   r   r   )r   r>   r   r   )r   r>   r   r   )r   r   r   rX   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   r(   r'   r   r   <  s         ////3333 $(0404579;: : : : :
 
 
 

 
 
 
0
 
 
 
0
 
 
 
&
 
 
 
* #	$
 >B+/$
 $
 $
 $
 $
 $
 $
 $
r(   r   c                  @    e Zd Zddg fddZddZddZddZdddZdS )RevokedCertificateBuilderNr   r   revocation_dater   r1   r2   c                0    || _         || _        || _        d S r"   )r   _revocation_dater   )r%   r   r   r1   s       r'   r$   z"RevokedCertificateBuilder.__init__  s"     , /%r(   r   rL   r   c                $   t          |t                    st          d          | j        t	          d          |dk    rt	          d          |                                dk    rt	          d          t          || j        | j                  S )Nr   r   r   z$The serial number should be positiver   r   )	rZ   rL   r   r   r4   r   r   r   r   r   s     r'   r   z'RevokedCertificateBuilder.serial_number  s    &#&& 	GEFFF*FGGGQ;;CDDD #%%E   )D)4+;
 
 	
r(   r=   r>   c                   t          |t          j                  st          d          | j        t	          d          t          |          }|t          k     rt	          d          t          | j        || j	                  S )Nr   z)The revocation date may only be set once.z7The revocation date must be on or after 1950 January 1.)
rZ   rB   r   r   r4   rF   r   r   r   r   r   s     r'   r   z)RevokedCertificateBuilder.revocation_date  s     $ 122 	:8999 ,HIII)$//$$$I   )t'7
 
 	
r(   r   r   r   rX   c                    t          |t                    st          d          t          |j        ||          }t          || j                   t          | j        | j	        g | j        |          S )Nr   )
rZ   r   r   r   r   r6   r   r   r   r   r   s       r'   r   z'RevokedCertificateBuilder.add_extension  sz     &-00 	B@AAAfj(F;;	#It/?@@@(!*d*	*
 
 	
r(   r   r   r   c                    | j         t          d          | j        t          d          t          j        |           S )Nz/A revoked certificate must have a serial numberz1A revoked certificate must have a revocation date)r   r4   r   r   create_revoked_certificate)r%   r   s     r'   buildzRevokedCertificateBuilder.build  sK    &NOOO (C   3D999r(   )r   r   r   r   r1   r2   )r   rL   r   r   )r=   r>   r   r   )r   r   r   rX   r   r   r"   )r   r   r   r   )r*   r+   r,   r$   r   r   r   r   rd   r(   r'   r   r     s         %)4857	& & & & &
 
 
 
$
 
 
 
 
 
 
 
: : : : : : :r(   r   rL   c                 b    t                               t          j        d          d          dz	  S )N   bigr   )rL   
from_bytesosurandomrd   r(   r'   random_serial_numberr    s#    >>"*R..%00A55r(   )r/   r0   r1   r2   r   r    )r   r   r7   r8   r   r    )r=   r>   r   r>   ra   )I
__future__r   rB   r  typingcollections.abcr   cryptographyr   "cryptography.hazmat.bindings._rustr   r   cryptography.hazmat.primitivesr   )cryptography.hazmat.primitives.asymmetricr   r	   r
   r   r   r   r   r   r   /cryptography.hazmat.primitives.asymmetric.typesr   r   cryptography.x509.extensionsr   r   r   cryptography.x509.namer   r   cryptography.x509.oidr   r   UnionSHA224SHA256SHA384SHA512SHA3_224SHA3_256SHA3_384SHA3_512_AllowedHashTypes	Exceptionr   r6   r<   rF   rH   rf   Enumrs   rx   r   r   r   r   load_pem_x509_certificateload_der_x509_certificateload_pem_x509_certificatesload_pem_x509_csrload_der_x509_csrload_pem_x509_crlload_der_x509_crlr|   r   r   r   r  rd   r(   r'   <module>r&     s*  
 # " " " " "  				  $ $ $ $ $ $       @ @ @ @ @ @ 1 1 1 1 1 1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                
 3 2 2 2 2 2 2 2 2 2 2 2 2 2&X&tQ22  L
M
M
M
M
O
O
O
O	     	   E E E EE E E E   !8 !8 !8 !8 !8 !8 !8 !8HF F F F F F F F(    ej   
- - - - -Y - - - #1  &? %?  &? %? &A / / / / m
 m
 m
 m
 m
 m
 m
 m
`T
 T
 T
 T
 T
 T
 T
 T
nY
 Y
 Y
 Y
 Y
 Y
 Y
 Y
xB: B: B: B: B: B: B: B:J6 6 6 6 6 6r(   