from collections import OrderedDict
from typing import Any, Mapping, Optional

from ... import PreTrainedTokenizer
from ...configuration_utils import PretrainedConfig
from ...onnx import OnnxConfig, OnnxConfigWithPast, OnnxSeqaSeqConfigWithPast
from ...onnx.utils import compute_effective_axis_dimension
from ...utils import TensorType, is_torch_available, logging


SCREAMING_SNAKE_CASE							     =		logging.get_logger(__name__)

SCREAMING_SNAKE_CASE							     =		{
    """Helsinki-NLP/opus-mt-en-de""": """https://huggingface.co/Helsinki-NLP/opus-mt-en-de/resolve/main/config.json""",
    # See all Marian models at https://huggingface.co/models?filter=marian
}
class    A_ (       a_ ):
  _SCREAMING_SNAKE_CASE    				=			"""marian"""
  _SCREAMING_SNAKE_CASE    				=			["""past_key_values"""]
  _SCREAMING_SNAKE_CASE    				=			{"""num_attention_heads""": """encoder_attention_heads""", """hidden_size""": """d_model"""}

  def __init__(		self :      str     ,							__SCREAMING_SNAKE_CASE :      str=5_81_01     ,							__SCREAMING_SNAKE_CASE :      int=None     ,							__SCREAMING_SNAKE_CASE :      List[str]=10_24     ,							__SCREAMING_SNAKE_CASE :      str=12     ,							__SCREAMING_SNAKE_CASE :      Any=40_96     ,							__SCREAMING_SNAKE_CASE :      int=16     ,							__SCREAMING_SNAKE_CASE :      Optional[int]=12     ,							__SCREAMING_SNAKE_CASE :      List[str]=40_96     ,							__SCREAMING_SNAKE_CASE :      Any=16     ,							__SCREAMING_SNAKE_CASE :      Any=0.0     ,							__SCREAMING_SNAKE_CASE :      Union[str, Any]=0.0     ,							__SCREAMING_SNAKE_CASE :      Dict=True     ,							__SCREAMING_SNAKE_CASE :      Optional[int]=True     ,							__SCREAMING_SNAKE_CASE :      int="gelu"     ,							__SCREAMING_SNAKE_CASE :      Union[str, Any]=10_24     ,							__SCREAMING_SNAKE_CASE :      Any=0.1     ,							__SCREAMING_SNAKE_CASE :      Tuple=0.0     ,							__SCREAMING_SNAKE_CASE :      List[Any]=0.0     ,							__SCREAMING_SNAKE_CASE :      List[Any]=0.02     ,							__SCREAMING_SNAKE_CASE :      List[str]=5_81_00     ,							__SCREAMING_SNAKE_CASE :      Union[str, Any]=False     ,							__SCREAMING_SNAKE_CASE :      Optional[int]=5_81_00     ,							__SCREAMING_SNAKE_CASE :      str=0     ,							__SCREAMING_SNAKE_CASE :      Tuple=0     ,							__SCREAMING_SNAKE_CASE :      str=True     ,							**__SCREAMING_SNAKE_CASE :      Tuple     ,							):
   __a       =  vocab_size
   __a       =  decoder_vocab_size or vocab_size
   __a       =  max_position_embeddings
   __a       =  d_model
   __a       =  encoder_ffn_dim
   __a       =  encoder_layers
   __a       =  encoder_attention_heads
   __a       =  decoder_ffn_dim
   __a       =  decoder_layers
   __a       =  decoder_attention_heads
   __a       =  dropout
   __a       =  attention_dropout
   __a       =  activation_dropout
   __a       =  activation_function
   __a       =  init_std
   __a       =  encoder_layerdrop
   __a       =  decoder_layerdrop
   __a       =  use_cache
   __a       =  encoder_layers
   __a       =  scale_embedding  # scale factor will be sqrt(d_model) if True
   __a       =  share_encoder_decoder_embeddings
   super().__init__(
       pad_token_id=__SCREAMING_SNAKE_CASE     ,							eos_token_id=__SCREAMING_SNAKE_CASE     ,							is_encoder_decoder=__SCREAMING_SNAKE_CASE     ,							decoder_start_token_id=__SCREAMING_SNAKE_CASE     ,							forced_eos_token_id=__SCREAMING_SNAKE_CASE     ,							**__SCREAMING_SNAKE_CASE     ,							)
class    A_ (       a_ ):

  @property
  # Copied from transformers.models.bart.configuration_bart.BartOnnxConfig.inputs
  def 		_UpperCAmelCase   (		self :      Any       ):
   if self.task in ["default", "seq2seq-lm"]:
    __a       =  OrderedDict(
        [
            ("input_ids", {0: "batch", 1: "encoder_sequence"}),
            ("attention_mask", {0: "batch", 1: "encoder_sequence"}),
        ]       )

    if self.use_past:
     __a       =  {0: "batch"}
     __a       =  {0: "batch", 1: "past_decoder_sequence + sequence"}
    else:
     __a       =  {0: "batch", 1: "decoder_sequence"}
     __a       =  {0: "batch", 1: "decoder_sequence"}

    if self.use_past:
     self.fill_with_past_key_values_(__SCREAMING_SNAKE_CASE     ,							direction="inputs"       )
   elif self.task == "causal-lm":
    # TODO: figure this case out.
    __a       =  OrderedDict(
        [
            ("input_ids", {0: "batch", 1: "encoder_sequence"}),
            ("attention_mask", {0: "batch", 1: "encoder_sequence"}),
        ]       )
    if self.use_past:
     __a       ,     __a       =  self.num_layers
     for i in range(__SCREAMING_SNAKE_CASE       ):
      __a       =  {0: "batch", 2: "past_sequence + sequence"}
      __a       =  {0: "batch", 2: "past_sequence + sequence"}
   else:
    __a       =  OrderedDict(
        [
            ("input_ids", {0: "batch", 1: "encoder_sequence"}),
            ("attention_mask", {0: "batch", 1: "encoder_sequence"}),
            ("decoder_input_ids", {0: "batch", 1: "decoder_sequence"}),
            ("decoder_attention_mask", {0: "batch", 1: "decoder_sequence"}),
        ]       )

   return common_inputs

  @property
  # Copied from transformers.models.bart.configuration_bart.BartOnnxConfig.outputs
  def 		_UpperCAmelCase   (		self :      Dict       ):
   if self.task in ["default", "seq2seq-lm"]:
    __a       =  super().outputs
   else:
    __a       =  super(__SCREAMING_SNAKE_CASE     ,							self       ).outputs
    if self.use_past:
     __a       ,     __a       =  self.num_layers
     for i in range(__SCREAMING_SNAKE_CASE       ):
      __a       =  {0: "batch", 2: "past_sequence + sequence"}
      __a       =  {0: "batch", 2: "past_sequence + sequence"}
   return common_outputs

  def 		_UpperCAmelCase   (		self :      List[str]     ,							__SCREAMING_SNAKE_CASE :      List[Any]     ,							__SCREAMING_SNAKE_CASE :      List[str] = -1     ,							__SCREAMING_SNAKE_CASE :      Optional[int] = -1     ,							__SCREAMING_SNAKE_CASE :      int = False     ,							__SCREAMING_SNAKE_CASE :      Tuple = None     ,							):
   __a       =  self._generate_dummy_inputs_for_encoder_and_decoder(
       __SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE       )

   # Generate decoder inputs
   __a       =  seq_length if not self.use_past else 1
   __a       =  self._generate_dummy_inputs_for_encoder_and_decoder(
       __SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE       )
   __a       =  {f"""decoder_{name}""": tensor for name, tensor in decoder_inputs.items()}
   __a       =  dict(**__SCREAMING_SNAKE_CASE     ,							**__SCREAMING_SNAKE_CASE       )

   if self.use_past:
    if not is_torch_available():
     raise ValueError("Cannot generate dummy past_keys inputs without PyTorch installed."       )
    else:
     import torch
    __a       ,     __a       =  common_inputs["input_ids"].shape
    __a       =  common_inputs["decoder_input_ids"].shape[1]
    __a       ,     __a       =  self.num_attention_heads
    __a       =  (
        batch,
        num_encoder_attention_heads,
        encoder_seq_length,
        self._config.hidden_size // num_encoder_attention_heads,
    )
    __a       =  decoder_seq_length + 3
    __a       =  (
        batch,
        num_decoder_attention_heads,
        decoder_past_length,
        self._config.hidden_size // num_decoder_attention_heads,
    )

    __a       =  torch.cat(
        [common_inputs["decoder_attention_mask"], torch.ones(__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE       )]     ,							dim=1       )

    __a       =  []
    # If the number of encoder and decoder layers are present in the model configuration, both are considered
    __a       ,     __a       =  self.num_layers
    __a       =  min(__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE       )
    __a       =  max(__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE       ) - min_num_layers
    __a       =  "encoder" if num_encoder_layers > num_decoder_layers else "decoder"

    for _ in range(__SCREAMING_SNAKE_CASE       ):
     common_inputs["past_key_values"].append(
         (
             torch.zeros(__SCREAMING_SNAKE_CASE       ),
             torch.zeros(__SCREAMING_SNAKE_CASE       ),
             torch.zeros(__SCREAMING_SNAKE_CASE       ),
             torch.zeros(__SCREAMING_SNAKE_CASE       ),
         )       )
    # TODO: test this.
    __a       =  encoder_shape if remaining_side_name == "encoder" else decoder_shape
    for _ in range(__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE       ):
     common_inputs["past_key_values"].append((torch.zeros(__SCREAMING_SNAKE_CASE       ), torch.zeros(__SCREAMING_SNAKE_CASE       ))       )
   return common_inputs

  def 		_UpperCAmelCase   (		self :      Optional[int]     ,							__SCREAMING_SNAKE_CASE :      Dict     ,							__SCREAMING_SNAKE_CASE :      Any = -1     ,							__SCREAMING_SNAKE_CASE :      Union[str, Any] = -1     ,							__SCREAMING_SNAKE_CASE :      Any = False     ,							__SCREAMING_SNAKE_CASE :      str = None     ,							):
   __a       =  self._generate_dummy_inputs_for_encoder_and_decoder(
       __SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE       )

   if self.use_past:
    if not is_torch_available():
     raise ValueError("Cannot generate dummy past_keys inputs without PyTorch installed."       )
    else:
     import torch
    __a       ,     __a       =  common_inputs["input_ids"].shape
    # Not using the same length for past_key_values
    __a       =  seqlen + 2
    __a       ,     __a       =  self.num_layers
    __a       ,     __a       =  self.num_attention_heads
    __a       =  (
        batch,
        num_encoder_attention_heads,
        past_key_values_length,
        self._config.hidden_size // num_encoder_attention_heads,
    )

    __a       =  common_inputs["attention_mask"].dtype
    __a       =  torch.cat(
        [common_inputs["attention_mask"], torch.ones(__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							dtype=__SCREAMING_SNAKE_CASE       )]     ,							dim=1       )
    __a       =  [
        (torch.zeros(__SCREAMING_SNAKE_CASE       ), torch.zeros(__SCREAMING_SNAKE_CASE       )) for _ in range(__SCREAMING_SNAKE_CASE       )
    ]
   return common_inputs

  def 		_UpperCAmelCase   (		self :      Any     ,							__SCREAMING_SNAKE_CASE :      str     ,							__SCREAMING_SNAKE_CASE :      List[Any] = -1     ,							__SCREAMING_SNAKE_CASE :      Tuple = -1     ,							__SCREAMING_SNAKE_CASE :      int = False     ,							__SCREAMING_SNAKE_CASE :      Any = None     ,							):
   # Copied from OnnxConfig.generate_dummy_inputs
   # Did not use super(OnnxConfigWithPast, self).generate_dummy_inputs for code clarity.
   # If dynamic axis (-1) we forward with a fixed dimension of 2 samples to avoid optimizations made by ONNX
   __a       =  compute_effective_axis_dimension(
       __SCREAMING_SNAKE_CASE     ,							fixed_dimension=OnnxConfig.default_fixed_batch     ,							num_token_to_add=0       )

   # If dynamic axis (-1) we forward with a fixed dimension of 8 tokens to avoid optimizations made by ONNX
   __a       =  tokenizer.num_special_tokens_to_add(__SCREAMING_SNAKE_CASE       )
   __a       =  compute_effective_axis_dimension(
       __SCREAMING_SNAKE_CASE     ,							fixed_dimension=OnnxConfig.default_fixed_sequence     ,							num_token_to_add=__SCREAMING_SNAKE_CASE       )

   # Generate dummy inputs according to compute batch and sequence
   __a       =  [" ".join([tokenizer.unk_token]       ) * seq_length] * batch_size
   __a       =  dict(tokenizer(__SCREAMING_SNAKE_CASE     ,							return_tensors=__SCREAMING_SNAKE_CASE       )       )
   return common_inputs

  def 		_UpperCAmelCase   (		self :      str     ,							__SCREAMING_SNAKE_CASE :      Tuple     ,							__SCREAMING_SNAKE_CASE :      int = -1     ,							__SCREAMING_SNAKE_CASE :      List[Any] = -1     ,							__SCREAMING_SNAKE_CASE :      str = False     ,							__SCREAMING_SNAKE_CASE :      Optional[int] = None     ,							):
   if self.task in ["default", "seq2seq-lm"]:
    __a       =  self._generate_dummy_inputs_for_default_and_seqaseq_lm(
        __SCREAMING_SNAKE_CASE     ,							batch_size=__SCREAMING_SNAKE_CASE     ,							seq_length=__SCREAMING_SNAKE_CASE     ,							is_pair=__SCREAMING_SNAKE_CASE     ,							framework=__SCREAMING_SNAKE_CASE       )

   else:
    __a       =  self._generate_dummy_inputs_for_causal_lm(
        __SCREAMING_SNAKE_CASE     ,							batch_size=__SCREAMING_SNAKE_CASE     ,							seq_length=__SCREAMING_SNAKE_CASE     ,							is_pair=__SCREAMING_SNAKE_CASE     ,							framework=__SCREAMING_SNAKE_CASE       )

   return common_inputs

  def 		_UpperCAmelCase   (		self :      Optional[int]     ,							__SCREAMING_SNAKE_CASE :      List[Any]     ,							__SCREAMING_SNAKE_CASE :      Dict     ,							__SCREAMING_SNAKE_CASE :      Tuple     ,							__SCREAMING_SNAKE_CASE :      Optional[Any]       ):
   if self.task in ["default", "seq2seq-lm"]:
    __a       =  super()._flatten_past_key_values_(__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE       )
   else:
    __a       =  super(__SCREAMING_SNAKE_CASE     ,							self       )._flatten_past_key_values_(
        __SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE       )

  @property
  def 		_UpperCAmelCase   (		self :      List[Any]       ):
   return 1E-4



from binascii import hexlify
from hashlib import shaaaa
from os import urandom

# RFC 3526 - More Modular Exponential (MODP) Diffie-Hellman groups for
# Internet Key Exchange (IKE) https://tools.ietf.org/html/rfc3526

SCREAMING_SNAKE_CASE :	Tuple							     =		{
    # 1536-bit
    5: {
        """prime""": int(
            """FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"""
            + """29024E088A67CC74020BBEA63B139B22514A08798E3404DD"""
            + """EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"""
            + """E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"""
            + """EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"""
            + """C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"""
            + """83655D23DCA3AD961C62F356208552BB9ED529077096966D"""
            + """670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF""",
            base=16,
        ),
        """generator""": 2,
    },
    # 2048-bit
    14: {
        """prime""": int(
            """FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"""
            + """29024E088A67CC74020BBEA63B139B22514A08798E3404DD"""
            + """EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"""
            + """E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"""
            + """EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"""
            + """C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"""
            + """83655D23DCA3AD961C62F356208552BB9ED529077096966D"""
            + """670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"""
            + """E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"""
            + """DE2BCBF6955817183995497CEA956AE515D2261898FA0510"""
            + """15728E5A8AACAA68FFFFFFFFFFFFFFFF""",
            base=16,
        ),
        """generator""": 2,
    },
    # 3072-bit
    15: {
        """prime""": int(
            """FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"""
            + """29024E088A67CC74020BBEA63B139B22514A08798E3404DD"""
            + """EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"""
            + """E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"""
            + """EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"""
            + """C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"""
            + """83655D23DCA3AD961C62F356208552BB9ED529077096966D"""
            + """670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"""
            + """E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"""
            + """DE2BCBF6955817183995497CEA956AE515D2261898FA0510"""
            + """15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"""
            + """ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7"""
            + """ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"""
            + """F12FFA06D98A0864D87602733EC86A64521F2B18177B200C"""
            + """BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"""
            + """43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF""",
            base=16,
        ),
        """generator""": 2,
    },
    # 4096-bit
    16: {
        """prime""": int(
            """FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"""
            + """29024E088A67CC74020BBEA63B139B22514A08798E3404DD"""
            + """EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"""
            + """E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"""
            + """EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"""
            + """C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"""
            + """83655D23DCA3AD961C62F356208552BB9ED529077096966D"""
            + """670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"""
            + """E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"""
            + """DE2BCBF6955817183995497CEA956AE515D2261898FA0510"""
            + """15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"""
            + """ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7"""
            + """ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"""
            + """F12FFA06D98A0864D87602733EC86A64521F2B18177B200C"""
            + """BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"""
            + """43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7"""
            + """88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA"""
            + """2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6"""
            + """287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED"""
            + """1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9"""
            + """93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199"""
            + """FFFFFFFFFFFFFFFF""",
            base=16,
        ),
        """generator""": 2,
    },
    # 6144-bit
    17: {
        """prime""": int(
            """FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08"""
            + """8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B"""
            + """302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9"""
            + """A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"""
            + """49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8"""
            + """FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D"""
            + """670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C"""
            + """180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718"""
            + """3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D"""
            + """04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D"""
            + """B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226"""
            + """1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C"""
            + """BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC"""
            + """E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26"""
            + """99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB"""
            + """04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2"""
            + """233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127"""
            + """D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492"""
            + """36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406"""
            + """AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918"""
            + """DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151"""
            + """2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03"""
            + """F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F"""
            + """BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA"""
            + """CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B"""
            + """B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632"""
            + """387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E"""
            + """6DCC4024FFFFFFFFFFFFFFFF""",
            base=16,
        ),
        """generator""": 2,
    },
    # 8192-bit
    18: {
        """prime""": int(
            """FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"""
            + """29024E088A67CC74020BBEA63B139B22514A08798E3404DD"""
            + """EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"""
            + """E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"""
            + """EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"""
            + """C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"""
            + """83655D23DCA3AD961C62F356208552BB9ED529077096966D"""
            + """670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"""
            + """E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"""
            + """DE2BCBF6955817183995497CEA956AE515D2261898FA0510"""
            + """15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"""
            + """ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7"""
            + """ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"""
            + """F12FFA06D98A0864D87602733EC86A64521F2B18177B200C"""
            + """BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"""
            + """43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7"""
            + """88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA"""
            + """2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6"""
            + """287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED"""
            + """1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9"""
            + """93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492"""
            + """36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BD"""
            + """F8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831"""
            + """179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B"""
            + """DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF"""
            + """5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6"""
            + """D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F3"""
            + """23A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA"""
            + """CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE328"""
            + """06A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55C"""
            + """DA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE"""
            + """12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E4"""
            + """38777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300"""
            + """741FA7BF8AFC47ED2576F6936BA424663AAB639C5AE4F568"""
            + """3423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9"""
            + """22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B"""
            + """4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A"""
            + """062B3CF5B3A278A66D2A13F83F44F82DDF310EE074AB6A36"""
            + """4597E899A0255DC164F31CC50846851DF9AB48195DED7EA1"""
            + """B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F92"""
            + """4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E47"""
            + """9558E4475677E9AA9E3050E2765694DFC81F56E880B96E71"""
            + """60C980DD98EDD3DFFFFFFFFFFFFFFFFF""",
            base=16,
        ),
        """generator""": 2,
    },
}
class    A_ :

  def __init__(		self :      List[Any]     ,							__SCREAMING_SNAKE_CASE :      int = 14       ):
   if group not in primes:
    raise ValueError("Unsupported Group"       )
   __a       =  primes[group]["prime"]
   __a       =  primes[group]["generator"]

   __a       =  int(hexlify(urandom(32       )       )     ,							base=16       )

  def 		_UpperCAmelCase   (		self :      Tuple       ):
   return hex(self.__private_key       )[2:]

  def 		_UpperCAmelCase   (		self :      Optional[Any]       ):
   __a       =  pow(self.generator     ,							self.__private_key     ,							self.prime       )
   return hex(__SCREAMING_SNAKE_CASE       )[2:]

  def 		_UpperCAmelCase   (		self :      Tuple     ,							__SCREAMING_SNAKE_CASE :      int       ):
   # check if the other public key is valid based on NIST SP800-56
   return (
       2 <= key <= self.prime - 2
       and pow(__SCREAMING_SNAKE_CASE     ,							(self.prime - 1) // 2     ,							self.prime       ) == 1
   )

  def 		_UpperCAmelCase   (		self :      str     ,							__SCREAMING_SNAKE_CASE :      str       ):
   __a       =  int(__SCREAMING_SNAKE_CASE     ,							base=16       )
   if not self.is_valid_public_key(__SCREAMING_SNAKE_CASE       ):
    raise ValueError("Invalid public key"       )
   __a       =  pow(__SCREAMING_SNAKE_CASE     ,							self.__private_key     ,							self.prime       )
   return shaaaa(str(__SCREAMING_SNAKE_CASE       ).encode()       ).hexdigest()

  @staticmethod
  def 		_UpperCAmelCase   (		__SCREAMING_SNAKE_CASE :      int     ,							__SCREAMING_SNAKE_CASE :      int       ):
   # check if the other public key is valid based on NIST SP800-56
   return (
       2 <= remote_public_key_str <= prime - 2
       and pow(__SCREAMING_SNAKE_CASE     ,							(prime - 1) // 2     ,							__SCREAMING_SNAKE_CASE       ) == 1
   )

  @staticmethod
  def 		_UpperCAmelCase   (		__SCREAMING_SNAKE_CASE :      str     ,							__SCREAMING_SNAKE_CASE :      str     ,							__SCREAMING_SNAKE_CASE :      int = 14       ):
   __a       =  int(__SCREAMING_SNAKE_CASE     ,							base=16       )
   __a       =  int(__SCREAMING_SNAKE_CASE     ,							base=16       )
   __a       =  primes[group]["prime"]
   if not DiffieHellman.is_valid_public_key_static(__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE       ):
    raise ValueError("Invalid public key"       )
   __a       =  pow(__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE     ,							__SCREAMING_SNAKE_CASE       )
   return shaaaa(str(__SCREAMING_SNAKE_CASE       ).encode()       ).hexdigest()


if __name__ == "__main__":
  import doctest

  doctest.testmod()


