o
    6h{                     @   sX	  d 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
 G d	d
 d
eZG dd deZG dd deZG dd deZG dd deZdd Zdd Zdd Zdd Zee
ddZee
ddZee
ddZee
ddZee
d dZee
d!dZdZeeeeeZej eeeded"d#Z!ee
ddZee
d$dZee
d%dZee
d&dZee
d'dZee
d(dZd)ZeeeeeZ"ej e"eeded"d#Z#ee
d*dZee
d+dZee
d,dZee
d-dZee
d.dZdZeed/eeZ$ej e$eeded"d#Z%ee
d0dZee
d1dZee
d2dZee
d3dZee
d4dZdZeed/eeZ&ej e&eeded"d#Z'd5Zd6Zee
d7dZee
d8dZee
d9dZeed/edZ(ej e(eeded"d#Z)ee
d:Zee
d;Zee
d<dZee
d=dZee
d>dZeed/edZ*ej e*eeded"d#Z+ee
d?Zee
d@Zee
dAdZee
dBdZee
dCdZeed/edZ,ej e,eeded"d#Z-ee
dDZee
dEZee
dFdZee
dGdZee
dHdZeed/edZ.ej e.eeded"d#Z/edIZedJZee
dKdZee
dLdZee
dMdZeed/edZ0ej e0eeded"d#Z1dZdNZdOZdPZdQZdRZeeeedZ2ej e2eeded"d#Z3dSZdTZdUZdVZdWZdXZ4eeeedZ5ej e5eede4d"d#Z6dYZdZZd[Zd\ZdXZ4eeeedZ7ej e7eede4d"d#Z8d]Zd^Zd_Zd`ZdaZdbZ4eeeedZ9ej e9eede4d"d#Z:dcZddZdeZdfZdbZ4eeeedZ;ej e;eede4d"d#Z<dgZdhZdiZdjZdkZdlZ4eeeedZ=ej e=eede4d"d#Z>dmZdnZdoZdpZdlZ4eeeedZ?ej e?eede4d"d#Z@dqZdrZdsZdtZduZdvZ4eeeedZAej eAeede4d"d#ZBdwZdxZdyZdzZdvZ4eeeedZCej eCeede4d"d#ZDee
d{dZee
d|dZee
d}dZee
d~dZee
ddZee
ddZ4eeeedZEej eEeede4d"d#ZFee
ddZee
ddZee
ddZee
ddZee
ddZ4eeeedZGej eGeede4d"d#ZHee
ddZee
ddZee
ddZee
ddZee
ddZee
ddZ4eeeedZIej eIeede4d"d#ZJee
ddZee
ddZee
ddZee
ddZee
ddZ4eeeedZKej eKeede4d"d#ZLee
ddZee
ddZee
ddZee
ddZee
ddZee
ddZ4eeeedZMej eMeede4d"d#ZNee
ddZee
ddZee
ddZee
ddZee
ddZ4eeeedZOej eOeede4d"d#ZPdS )aB  
Low level implementation of Elliptic-Curve Digital Signatures.

.. note ::
    You're most likely looking for the :py:class:`~ecdsa.keys` module.
    This is a low-level implementation of the ECDSA that operates on
    integers, not byte strings.

NOTE: This a low level implementation of ECDSA, for normal applications
you should be looking at the keys.py module.

Classes and methods for elliptic-curve signatures:
private keys, public keys, signatures,
and definitions of prime-modulus curves.

Example:

.. code-block:: python

   # (In real-life applications, you would probably want to
   # protect against defects in SystemRandom.)
   from random import SystemRandom
   randrange = SystemRandom().randrange

   # Generate a public/private key pair using the NIST Curve P-192:

   g = generator_192
   n = g.order()
   secret = randrange( 1, n )
   pubkey = Public_key( g, g * secret )
   privkey = Private_key( pubkey, secret )

   # Signing a hash value:

   hash = randrange( 1, n )
   signature = privkey.sign( hash, randrange( 1, n ) )

   # Verifying a signature for a hash value:

   if pubkey.verifies( hash, signature ):
     print("Demo verification succeeded.")
   else:
     print("*** Demo verification failed.")

   # Verification fails if the hash value is modified:

   if pubkey.verifies( hash-1, signature ):
     print("**** Demo verification failed to reject tampered hash.")
   else:
     print("Demo verification correctly rejected tampered hash.")

Revision history:
      2005.12.31 - Initial version.

      2008.11.25 - Substantial revisions introducing new classes.

      2009.05.16 - Warn against using random.randrange in real applications.

      2009.05.17 - Use random.SystemRandom by default.

Originally written in 2005 by Peter Pearson and placed in the public domain,
modified as part of the python-ecdsa package.
    N)int2byte   )ellipticcurve)numbertheory)
bit_length)remove_whitespacec                   @      e Zd ZdS )RSZeroErrorN__name__
__module____qualname__ r   r   _/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/ecdsa/ecdsa.pyr	   K       r	   c                   @   r   )InvalidPointErrorNr
   r   r   r   r   r   O   r   r   c                   @   s    e Zd ZdZdd Zdd ZdS )	Signaturez
    ECDSA signature.

    :ivar int r: the ``r`` element of the ECDSA signature
    :ivar int s: the ``s`` element of the ECDSA signature
    c                 C   s   || _ || _d S )N)rs)selfr   r   r   r   r   __init__[   s   
zSignature.__init__c                 C   s  |  }| }| j}| j}|}|}t|d| | |  |  |  }	t	|	| }
|
d dkr8|
n| |
 }t
|||d|}t|||| | | |   }t||}t
||| d|}t|||| | | |   }t||}||gS )aL  
        Returns two public keys for which the signature is valid

        :param int hash: signed hash
        :param AbstractPoint generator: is the generator used in creation
            of the signature
        :rtype: tuple(Public_key, Public_key)
        :return: a pair of public keys that can validate the signature
              r   r   )curveorderr   r   powpabr   square_root_mod_primer   PointJacobiinverse_mod
Public_key)r   hash	generatorr   nr   r   exalphabetayR1Q1Pk1R2Q2Pk2r   r   r   recover_public_keys_   s$   
""
"
zSignature.recover_public_keysN)r   r   r   __doc__r   r1   r   r   r   r   r   S   s    r   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )r"   zPublic key for ECDSA.Tc                 C   s   |  | _ || _|| _| }| j  }d|   kr |k r5n tdd|   kr4|k s9td td|rJ| j | | sJtd|sPtd|rd| j 	 dkrf|| t
jkshtddS dS dS )ax  Low level ECDSA public key object.

        :param generator: the Point that generates the group (the base point)
        :param point: the Point that defines the public key
        :param bool verify: if True check if point is valid point on curve

        :raises InvalidPointError: if the point parameters are invalid or
            point does not lay on the curve
        r   z)The public point has x or y out of range.zPoint does not lay on the curvez Generator point must have order.r   zGenerator point order is bad.N)r   r$   pointr   r   r'   r*   r   contains_pointcofactorr   INFINITY)r   r$   r3   verifyr%   r   r   r   r   r      s:   

zPublic_key.__init__c                 C   &   t |tr| j|jko| j|jkS tS )zReturn True if the keys are identical, False otherwise.

        Note: for comparison, only placement on the same curve and point
        equality is considered, use of the same generator point is not
        considered.
        )
isinstancer"   r   r3   NotImplementedr   otherr   r   r   __eq__   s   
zPublic_key.__eq__c                 C   
   | |k S )z7Return False if the keys are identical, True otherwise.r   r;   r   r   r   __ne__      
zPublic_key.__ne__c                 C   s   | j }| }|j}|j}|dk s||d krdS |dk s#||d kr%dS t||}|| | }|| | }	t|drE||| j|	}
n	|| |	| j  }
|
	 | }||kS )zkVerify that signature is a valid signature of hash.
        Return True if the signature is valid.
        r   Fmul_add)
r$   r   r   r   r   r!   hasattrrA   r3   r'   )r   r#   	signatureGr%   r   r   cu1u2xyvr   r   r   verifies   s    
zPublic_key.verifiesN)T)r   r   r   r2   r   r=   r?   rJ   r   r   r   r   r"      s    
"r"   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Private_keyzPrivate key for ECDSA.c                 C   s   || _ || _dS )zYpublic_key is of class Public_key;
        secret_multiplier is a large integer.
        N)
public_keysecret_multiplier)r   rL   rM   r   r   r   r      s   
zPrivate_key.__init__c                 C   r8   )z9Return True if the points are identical, False otherwise.)r9   rK   rL   rM   r:   r;   r   r   r   r=      s
   

zPrivate_key.__eq__c                 C   r>   )z9Return False if the points are identical, True otherwise.r   r;   r   r   r   r?      r@   zPrivate_key.__ne__c                 C   s   | j j}| }|| }|| }|| }t|t|kr!|| }n|| }| | }	|	dkr3tdt|||| j|	 |   | }
|
dkrLtdt	|	|
S )a  Return a signature for the provided hash, using the provided
        random nonce.  It is absolutely vital that random_k be an unpredictable
        number in the range [1, self.public_key.point.order()-1].  If
        an attacker can guess random_k, he can compute our private key from a
        single signature.  Also, if an attacker knows a few high-order
        bits (or a few low-order bits) of random_k, he can compute our private
        key from many signatures.  The generation of nonces with adequate
        cryptographic strength is very difficult and far beyond the scope
        of this comment.

        May raise RuntimeError, in which case retrying with a new
        random value k is in order.
        r   z!amazingly unlucky random number rz!amazingly unlucky random number s)
rL   r$   r   r   r'   r	   r   r!   rM   r   )r   r#   random_krD   r%   kksktp1r   r   r   r   r   sign   s&   


zPrivate_key.signN)r   r   r   r2   r   r=   r?   rS   r   r   r   r   rK      s    	rK   c                 C   s`   t dt | dksJ | dkrdS g }| r'| d@ }|t| | dL } | s|  d|S )z7Convert integer x into a string of bytes, as per X9.62.zZFunction is unused in library code. If you use this code, change to util.number_to_string.r                 )warningswarnDeprecationWarningappendr   reversejoin)r'   resultordinalr   r   r   int_to_string  s   
r`   c                 C   s<   t dt d}| D ]}t|tst|}d| | }q
|S )z8Convert a string of bytes into an integer, as per X9.62.zZFunction is unused in library code. If you use this code, change to util.string_to_number.r      )rX   rY   rZ   r9   intord)r   r^   rE   r   r   r   string_to_int&  s   
rd   c                 C   s,   t dt ddlm} t|t|  S )zlConvert an integer into a string of bytes, compute
    its SHA-1 hash, and convert the result to an integer.zFunction is unused in library code. If you use this code, change to a one-liner with util.number_to_string and util.string_to_number methods.r   )sha1)rX   rY   rZ   hashlibre   rd   r`   digest)mre   r   r   r   digest_integer6  s   ri   c                 C   s   |   }|  }| }d|  kr|k r%n dS d|  kr$|k s'dS  dS |||s/dS | dkrD|t|||d tjksDdS dS )z=Is (x,y) a valid public key based on the specified generator?r   Fr   T)r   r   r   r4   r5   r   r    r6   )r$   r'   r*   r%   r   r   r   r   r   point_is_validJ  s"   rj   zDB7C 2ABF62E3 5E668076 BEAD208B   zDB7C 2ABF62E3 5E668076 BEAD2088z659E F8BA0439 16EEDE89 11702B22z09487239 995A5EE7 6B55F9C2 F098zA89C E5AF8724 C0A23E0E 0FF77500zDB7C 2ABF62E3 5E7628DF AC6561C5T)r$   z6127 C24C05F3 8A0AAAF6 5C0EF02Cz51DE F1815DB5 ED74FCC3 4C85D709z4BA30AB5 E892B4E1 649DD092 8643zADCD 46F5882E 3747DEF3 6E956E97z36DF 0AAFD8B8 D7597CA1 0520D04B   z#FFFFFFFD FFFFFFFF FFFFFFFF FFFFFFFFz#E87579C1 1079F43D D824993C 2CEE5ED3z#161FF752 8B899B2D 0C28607C A52C5B86z#CF5AC839 5BAFEB13 C02DA292 DDED7A83z#FFFFFFFE 00000000 75A30D1B 9038A115z,FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 7FFFFFFFz,1C97BEFC 54BD7A8B 65ACF89F 81D4D4AD C565FA45z,4A96B568 8EF57328 46646989 68C38BB9 13CBFC82z,23A62855 3168947D 59DCC912 04235137 7AC5FB32z/01 00000000 00000000 0001F4C8 F927AED3 CA752257l   l   1(i&^#a;z:
    64210519 E59C80E7 0FA7E9AB 72243049 FEB8DEEC C146B9B1z:
    188DA80E B03090F6 7CBF20EB 43A18800 F4FF0AFD 82FF1012z:
    07192B95 FFC8DA78 631011ED 6B24CDD5 73F977A1 1E794811zN
    2695994666715063979466701508701963067355791626002630814351
    0066298881zN
    2695994666715063979466701508701962594045780771442439172168
    2722368061zG
    B4050A85 0C04B3AB F5413256 5044B0B7 D7BFD8BA 270B3943
    2355FFB4zG
    B70E0CBD 6BB4BF7F 321390B9 4A03C1D3 56C21122 343280D6
    115C1D21zG
    BD376388 B5F723FB 4C22DFE6 CD4375A0 5A074764 44D58199
    85007E34zX
    1157920892103562487626974469494075735300861434152903141955
    33631308867097853951zX
    115792089210356248762697446949407573529996955224135760342
    422259061068512044369zP
    5AC635D8 AA3A93E7 B3EBBD55 769886BC 651D06B0 CC53B0F6
    3BCE3C3E 27D2604BzP
    6B17D1F2 E12C4247 F8BCE6E5 63A440F2 77037D81 2DEB33A0
    F4A13945 D898C296zP
    4FE342E2 FE1A7F9B 8EE7EB4A 7C0F9E16 2BCE3357 6B315ECE
    CBB64068 37BF51F5z~
    3940200619639447921227904010014361380507973927046544666794
    8293404245721771496870329047266088258938001861606973112319z~
    3940200619639447921227904010014361380507973927046544666794
    6905279627659399113263569398956308152294913554433653942643zt
    B3312FA7 E23EE7E4 988E056B E3F82D19 181D9C6E FE814112
    0314088F 5013875A C656398D 8A2ED19D 2A85C8ED D3EC2AEFzt
    AA87CA22 BE8B0537 8EB1C71E F320AD74 6E1D3B62 8BA79B98
    59F741E0 82542A38 5502F25D BF55296C 3A545E38 72760AB7zt
    3617DE4A 96262C6F 5D9E98BF 9292DC29 F8F41DBD 289A147C
    E9DA3113 B5F0B8C0 0A60B1CE 1D7E819D 7A431D7C 90EA0E5Fڝ6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151ڝ6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449z
         051 953EB961 8E1C9A1F 929A21A0 B68540EE A2DA725B
    99B315F3 B8B48991 8EF109E1 56193951 EC7E937B 1652C0BD
    3BB1BF07 3573DF88 3D2C34F1 EF451FD4 6B503F00z
          C6 858E06B7 0404E9CD 9E3ECB66 2395B442 9C648139
    053FB521 F828AF60 6B4D3DBA A14B5E77 EFE75928 FE1DC127
    A2FFA8DE 3348B3C1 856A429B F97E7E31 C2E5BD66z
         118 39296A78 9A3BC004 5C8A5FB4 2C7D1BD9 98F54449
    579B4468 17AFBD17 273E662C 97EE7299 5EF42640 C550B901
    3FAD0761 353C7086 A272C240 88BE9476 9FD16650   l   /| l   -lO96M:WZEuw>?3yl   T!v?B>bAP)("8p'UxI;m:Hl   AAl 3z~i9nW~ l    CQ_vSW8]u@b l   X^0#Wdo"i!51y l   b**N`-zw,8s_<l   [y{kZcDqR^+l   !c-]4t(0GzGOY l   	|<%"w,8s_<l   b**N`-zw,8s_<l   s8-hSmD=^)m*l   x#K	3-XK/Npw;b3l   `%\"B8#|X>|,l   (4W\Pacl   %~_QPSkhA9#Q=GQil   bPCr~x[1z$QMmTLv0l   _n&!qzQ 	[qXSImz#
l   St~3.  )0
/8z4Kl   ,5
DG_SQMmTLv0l   bPCr~x[1z$QMmTLv0l   y{OPB[/lf-|hpk+=l   )h+#brz~y(0xl2,Ol   yyO-?KrZ:DYbq l   Cg)! -CST)&0p`sJ<)l   @pM6&]&Dx1'b	"L`	l   @}'>yuahu%`04d"&5l   }@%\;`t1I'#>2GPrR5dl   (lM[Uis)	fNq<,wJ*l   OKrnD"4f}hu%`04d"&5l   @}'>yuahu%`04d"&5l   @)44vv7Nok&4ol   UiSV(	?i;
Yb/Lh<l   L[4|uUc@9G|M~~H3rCQ> l   5af-RJF[Ip*@guA3~
Z}l   cpf^W
B?.f3OhIR:6.&l   wS>t  $nrvBT0C7U{h+) l   b25N"R#<wxxo/o?AZ2Jr\W l   i^S`Ee=D;I;BQh0BYXp|~Tl   V.
: yo4,(qvBT0C7U{h+) l   tS>t  $nrvBT0C7U{h+) l   +},WVe+qI7L;5O	60,fl   &\XEMBU1PIJH2w|s0u# l   IK6#_mp:7[^i~YW8A6-zZ
    3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9
    F492F375A97D860EB4zZ
    520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539
    816F5EB4AC8FB1F1A6zZ
    D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC
    28FCD412B1F1B32E27zZ
    43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599
    C710AF8D0D39E20611zZ
    14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6A
    C7D35245D1692E8EE1zZ
    D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658
    E98691555B44C59311zZ
    D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC
    28FCD412B1F1B32E24zZ
    A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547
    CEB5B4FEF422340353zZ
    925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136F
    FF3357F624A21BED52zZ
    63BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE7
    1B1B9BC0455FB0D2C3zj
    7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F9
    0F8AA5814A503AD4EB04A8C7DD22CE2826zj
    04A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62
    D57CB4390295DBC9943AB78696FA504C11zj
    8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB711
    23ACD3A729901D1A71874700133107EC53zj
    1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10
    E8E826E03436D646AAEF87B2E247D4AF1Ezj
    8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF991292
    80E4646217791811142820341263C5315zj
    8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425
    A7CF3AB6AF6B7FC3103B883202E9046565zj
    8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB711
    23ACD3A729901D1A71874700133107EC50zj
    7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE
    1D2074AA263B88805CED70355A33B471EEzj
    18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AAB
    FFC4FF191B946A5F54D8D0AA2F418808CCzj
    25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CC
    FE469408584DC2B2912675BF5B9E582928z
    7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863
    BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CAz
    3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117
    A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723z
    AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308
    717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3z
    81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D009
    8EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822z
    7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F81
    11B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892z
    AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308
    70553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069z
    AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308
    717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F0z
    7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36
    A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423Ez
    640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C031
    3D82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DAz
    5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CE
    E9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332)Qr2   rX   sixr    r   r   utilr   _compatr   RuntimeErrorr	   r   objectr   r"   rK   r`   rd   ri   rj   rb   _p_a_b_Gx_Gy_r_hCurveFpcurve_112r1r    generator_112r1curve_112r2generator_112r2curve_128r1generator_128r1curve_160r1generator_160r1	curve_192generator_192	curve_224generator_224	curve_256generator_256	curve_384generator_384	curve_521generator_521curve_secp256k1generator_secp256k1_qcurve_brainpoolp160r1generator_brainpoolp160r1curve_brainpoolp160t1generator_brainpoolp160t1curve_brainpoolp192r1generator_brainpoolp192r1curve_brainpoolp192t1generator_brainpoolp192t1curve_brainpoolp224r1generator_brainpoolp224r1curve_brainpoolp224t1generator_brainpoolp224t1curve_brainpoolp256r1generator_brainpoolp256r1curve_brainpoolp256t1generator_brainpoolp256t1curve_brainpoolp320r1generator_brainpoolp320r1curve_brainpoolp320t1generator_brainpoolp320t1curve_brainpoolp384r1generator_brainpoolp384r1curve_brainpoolp384t1generator_brainpoolp384t1curve_brainpoolp512r1generator_brainpoolp512r1curve_brainpoolp512t1generator_brainpoolp512t1r   r   r   r   <module>   s  @1N?							
						
