





'''simple docstring'''


import os
from pickle import UnpicklingError
from typing import Dict, Tuple

import jax
import jax.numpy as jnp
import numpy as np
from flax.serialization import from_bytes
from flax.traverse_util import flatten_dict, unflatten_dict

import transformers

from .utils import logging


lowerCAmelCase :					Dict 							=logging.get_logger(__name__)
def 							UpperCAmelCase_  (						__lowerCamelCase : Optional[Any]     ,__lowerCamelCase : List[str]     ,__lowerCamelCase : Optional[Any]     ,__lowerCamelCase : Union[str, Any]=False			):
   try:
      import torch  # noqa: F401
   except ImportError:
      logger.error(
          "Loading a PyTorch model in Flax, requires both PyTorch and Flax to be installed. Please see"
          " https://pytorch.org/ and https://flax.readthedocs.io/en/latest/installation.html for installation"
          " instructions."			)
      raise

   if not is_sharded:
      lowercase_      :str         =			os.path.abspath(__lowerCamelCase			)
      logger.info(F'Loading PyTorch weights from {pt_path}'			)

      lowercase_      :Dict         =			torch.load(__lowerCamelCase     ,map_location="cpu"			)
      logger.info(F'PyTorch checkpoint contains {sum(t.numel() for t in pt_state_dict.values()			):,} parameters.'			)

      lowercase_      :str         =			convert_pytorch_state_dict_to_flax(__lowerCamelCase     ,__lowerCamelCase			)
   else:
      # model is sharded and pytorch_checkpoint_path already contains the list of .pt shard files
      lowercase_      :Union[str, Any]         =			convert_pytorch_sharded_state_dict_to_flax(__lowerCamelCase     ,__lowerCamelCase			)
   return flax_state_dict
def 							UpperCAmelCase_  (						__lowerCamelCase : Tuple[str]     ,__lowerCamelCase : np.ndarray     ,__lowerCamelCase : Dict[str, jnp.ndarray]     ,__lowerCamelCase : str     ,):

   def is_key_or_prefix_key_in_dict(__lowerCamelCase : Tuple[str]			) -> bool:
      return len(set(__lowerCamelCase			) & {key, (model_prefix,) + key}			) > 0

   # layer norm
   lowercase_      :Optional[Any]         =			pt_tuple_key[:-1] + ("scale",)
   if pt_tuple_key[-1] in ["weight", "gamma"] and is_key_or_prefix_key_in_dict(__lowerCamelCase			):
      return renamed_pt_tuple_key, pt_tensor

   # batch norm layer mean
   lowercase_      :List[Any]         =			pt_tuple_key[:-1] + ("mean",)
   if pt_tuple_key[-1] == "running_mean" and not is_key_or_prefix_key_in_dict(__lowerCamelCase			):
      return renamed_pt_tuple_key, pt_tensor

   # batch norm layer var
   lowercase_      :Union[str, Any]         =			pt_tuple_key[:-1] + ("var",)
   if pt_tuple_key[-1] == "running_var" and not is_key_or_prefix_key_in_dict(__lowerCamelCase			):
      return renamed_pt_tuple_key, pt_tensor

   # embedding
   lowercase_      :Dict         =			pt_tuple_key[:-1] + ("embedding",)
   if pt_tuple_key[-1] == "weight" and is_key_or_prefix_key_in_dict(__lowerCamelCase			):
      return renamed_pt_tuple_key, pt_tensor

   # conv layer
   lowercase_      :Optional[Any]         =			pt_tuple_key[:-1] + ("kernel",)
   if pt_tuple_key[-1] == "weight" and pt_tensor.ndim == 4 and not is_key_or_prefix_key_in_dict(__lowerCamelCase			):
      lowercase_      :Tuple         =			pt_tensor.transpose(2     ,3     ,1     ,0			)
      return renamed_pt_tuple_key, pt_tensor

   # linear layer
   lowercase_      :Optional[Any]         =			pt_tuple_key[:-1] + ("kernel",)
   if pt_tuple_key[-1] == "weight" and not is_key_or_prefix_key_in_dict(__lowerCamelCase			):
      lowercase_      :Optional[int]         =			pt_tensor.T
      return renamed_pt_tuple_key, pt_tensor

   # old PyTorch layer norm weight
   lowercase_      :Any         =			pt_tuple_key[:-1] + ("weight",)
   if pt_tuple_key[-1] == "gamma":
      return renamed_pt_tuple_key, pt_tensor

   # old PyTorch layer norm bias
   lowercase_      :List[str]         =			pt_tuple_key[:-1] + ("bias",)
   if pt_tuple_key[-1] == "beta":
      return renamed_pt_tuple_key, pt_tensor

   # New `weight_norm` from https://github.com/huggingface/transformers/pull/24030
   lowercase_      :List[str]         =			None
   if pt_tuple_key[-3::2] == ("parametrizations", "original0"):
      lowercase_      :str         =			pt_tuple_key[-2] + "_g"
   elif pt_tuple_key[-3::2] == ("parametrizations", "original1"):
      lowercase_      :Optional[int]         =			pt_tuple_key[-2] + "_v"
   if name is not None:
      lowercase_      :Tuple         =			pt_tuple_key[:-3] + (name,)
      return renamed_pt_tuple_key, pt_tensor

   return pt_tuple_key, pt_tensor
def 							UpperCAmelCase_  (						__lowerCamelCase : Optional[int]     ,__lowerCamelCase : Dict			):
   # convert pytorch tensor to numpy
   lowercase_      :Any         =			{k: v.numpy() for k, v in pt_state_dict.items()}

   lowercase_      :Union[str, Any]         =			flax_model.base_model_prefix

   # use params dict if the model contains batch norm layers
   if "params" in flax_model.params:
      lowercase_      :Union[str, Any]         =			flax_model.params["params"]
   else:
      lowercase_      :Optional[int]         =			flax_model.params
   lowercase_      :List[str]         =			flatten_dict(__lowerCamelCase			)

   # add batch_stats keys,values to dict
   if "batch_stats" in flax_model.params:
      lowercase_      :List[str]         =			flatten_dict(flax_model.params["batch_stats"]			)
      random_flax_state_dict.update(__lowerCamelCase			)

   lowercase_      :Dict         =			{}

   lowercase_      :List[Any]         =			(model_prefix not in flax_model_params) and (
       model_prefix in {k.split("."			)[0] for k in pt_state_dict.keys()}
   )
   lowercase_      :List[str]         =			(model_prefix in flax_model_params) and (
       model_prefix not in {k.split("."			)[0] for k in pt_state_dict.keys()}
   )

   # Need to change some parameters name to match Flax names
   for pt_key, pt_tensor in pt_state_dict.items():
      lowercase_      :Optional[Any]         =			tuple(pt_key.split("."			)			)

      # remove base model prefix if necessary
      lowercase_      :List[str]         =			pt_tuple_key[0] == model_prefix
      if load_model_with_head_into_base_model and has_base_model_prefix:
         lowercase_      :Optional[Any]         =			pt_tuple_key[1:]

      # Correctly rename weight parameters
      lowercase_      ,							lowercase_      :Optional[int]         =			rename_key_and_reshape_tensor(
          __lowerCamelCase     ,__lowerCamelCase     ,__lowerCamelCase     ,__lowerCamelCase			)

      # add model prefix if necessary
      lowercase_      :int         =			(model_prefix,) + flax_key in random_flax_state_dict
      if load_base_model_into_model_with_head and require_base_model_prefix:
         lowercase_      :Optional[Any]         =			(model_prefix,) + flax_key

      if flax_key in random_flax_state_dict:
         if flax_tensor.shape != random_flax_state_dict[flax_key].shape:
            raise ValueError(
                F'PyTorch checkpoint seems to be incorrect. Weight {pt_key} was expected to be of shape '
                F'{random_flax_state_dict[flax_key].shape}, but is {flax_tensor.shape}.'			)

        # add batch stats if the model contains batchnorm layers
      if "batch_stats" in flax_model.params:
         if "mean" in flax_key[-1] or "var" in flax_key[-1]:
            lowercase_      :List[str]         =			jnp.asarray(__lowerCamelCase			)
            continue
         # remove num_batches_tracked key
         if "num_batches_tracked" in flax_key[-1]:
            flax_state_dict.pop(__lowerCamelCase     ,__lowerCamelCase			)
            continue

         # also add unexpected weight so that warning is thrown
         lowercase_      :Dict         =			jnp.asarray(__lowerCamelCase			)

      else:
         # also add unexpected weight so that warning is thrown
         lowercase_      :Optional[int]         =			jnp.asarray(__lowerCamelCase			)

   return unflatten_dict(__lowerCamelCase			)
def 							UpperCAmelCase_  (						__lowerCamelCase : Dict     ,__lowerCamelCase : Union[str, Any]			):
   import torch

   # Load the index
   lowercase_      :Dict         =			{}
   for shard_file in shard_filenames:
      # load using msgpack utils
      lowercase_      :Dict         =			torch.load(__lowerCamelCase			)
      lowercase_      :str         =			{k: v.numpy() for k, v in pt_state_dict.items()}

      lowercase_      :Union[str, Any]         =			flax_model.base_model_prefix

      # use params dict if the model contains batch norm layers and then add batch_stats keys,values to dict
      if "batch_stats" in flax_model.params:
         lowercase_      :List[Any]         =			flax_model.params["params"]

         lowercase_      :Optional[int]         =			flatten_dict(__lowerCamelCase			)
         random_flax_state_dict.update(flatten_dict(flax_model.params["batch_stats"]			)			)
      else:
         lowercase_      :Optional[int]         =			flax_model.params
         lowercase_      :str         =			flatten_dict(__lowerCamelCase			)

      lowercase_      :Any         =			(model_prefix not in flax_model_params) and (
          model_prefix in {k.split("."			)[0] for k in pt_state_dict.keys()}
      )
      lowercase_      :Optional[int]         =			(model_prefix in flax_model_params) and (
          model_prefix not in {k.split("."			)[0] for k in pt_state_dict.keys()}
      )
      # Need to change some parameters name to match Flax names
      for pt_key, pt_tensor in pt_state_dict.items():
         lowercase_      :Dict         =			tuple(pt_key.split("."			)			)

         # remove base model prefix if necessary
         lowercase_      :Union[str, Any]         =			pt_tuple_key[0] == model_prefix
         if load_model_with_head_into_base_model and has_base_model_prefix:
            lowercase_      :List[str]         =			pt_tuple_key[1:]

         # Correctly rename weight parameters
         lowercase_      ,							lowercase_      :Tuple         =			rename_key_and_reshape_tensor(
             __lowerCamelCase     ,__lowerCamelCase     ,__lowerCamelCase     ,__lowerCamelCase			)
         # add model prefix if necessary
         lowercase_      :Dict         =			(model_prefix,) + flax_key in random_flax_state_dict
         if load_base_model_into_model_with_head and require_base_model_prefix:
            lowercase_      :List[Any]         =			(model_prefix,) + flax_key

         if flax_key in random_flax_state_dict:
            if flax_tensor.shape != random_flax_state_dict[flax_key].shape:
               raise ValueError(
                   F'PyTorch checkpoint seems to be incorrect. Weight {pt_key} was expected to be of shape '
                   F'{random_flax_state_dict[flax_key].shape}, but is {flax_tensor.shape}.'			)

            # add batch stats if the model contains batchnorm layers
         if "batch_stats" in flax_model.params:
            if "mean" in flax_key[-1]:
               lowercase_      :List[str]         =			jnp.asarray(__lowerCamelCase			)
               continue
            if "var" in flax_key[-1]:
               lowercase_      :Union[str, Any]         =			jnp.asarray(__lowerCamelCase			)
               continue
            # remove num_batches_tracked key
            if "num_batches_tracked" in flax_key[-1]:
               flax_state_dict.pop(__lowerCamelCase     ,__lowerCamelCase			)
               continue

            # also add unexpected weight so that warning is thrown
            lowercase_      :Optional[int]         =			jnp.asarray(__lowerCamelCase			)

         else:
            # also add unexpected weight so that warning is thrown
            lowercase_      :List[str]         =			jnp.asarray(__lowerCamelCase			)
   return unflatten_dict(__lowerCamelCase			)
def 							UpperCAmelCase_  (						__lowerCamelCase : List[str]     ,__lowerCamelCase : Tuple			):
   lowercase_      :Any         =			os.path.abspath(__lowerCamelCase			)
   logger.info(F'Loading Flax weights from {flax_checkpoint_path}'			)

   # import correct flax class
   lowercase_      :Union[str, Any]         =			getattr(__lowerCamelCase     ,"Flax" + model.__class__.__name__			)

   # load flax weight dict
   with open(__lowerCamelCase     ,"rb"			) as state_f:
      try:
         lowercase_      :Optional[Any]         =			from_bytes(__lowerCamelCase     ,state_f.read()			)
      except UnpicklingError:
         raise EnvironmentError(F'Unable to convert {flax_checkpoint_path} to Flax deserializable object. '			)

   return load_flax_weights_in_pytorch_model(__lowerCamelCase     ,__lowerCamelCase			)


def 							UpperCAmelCase_  (						__lowerCamelCase : Optional[Any]     ,__lowerCamelCase : str			):

   try:
      import torch  # noqa: F401
   except ImportError:
      logger.error(
          "Loading a Flax weights in PyTorch, requires both PyTorch and Flax to be installed. Please see"
          " https://pytorch.org/ and https://flax.readthedocs.io/en/latest/installation.html for installation"
          " instructions."			)
      raise

   # check if we have bf16 weights
   lowercase_      :Optional[Any]         =			flatten_dict(jax.tree_util.tree_map(lambda __lowerCamelCase			: x.dtype == jnp.bfloataa     ,__lowerCamelCase			)			).values()
   if any(__lowerCamelCase			):
      # convert all weights to fp32 if the are bf16 since torch.from_numpy can-not handle bf16
      # and bf16 is not fully supported in PT yet.
      logger.warning(
          "Found ``bfloat16`` weights in Flax model. Casting all ``bfloat16`` weights to ``float32`` "
          "before loading those in PyTorch model."			)
      lowercase_      :List[Any]         =			jax.tree_util.tree_map(
          lambda __lowerCamelCase			: params.astype(np.floataa			) if params.dtype == jnp.bfloataa else params     ,__lowerCamelCase			)

   lowercase_      :Dict         =			flatten_dict(__lowerCamelCase			)
   lowercase_      :Union[str, Any]         =			pt_model.state_dict()

   lowercase_      :Optional[int]         =			(pt_model.base_model_prefix in flax_state) and (
       pt_model.base_model_prefix not in {k.split("."			)[0] for k in pt_model_dict.keys()}
   )
   lowercase_      :Dict         =			(pt_model.base_model_prefix not in flax_state) and (
       pt_model.base_model_prefix in {k.split("."			)[0] for k in pt_model_dict.keys()}
   )

   # keep track of unexpected & missing keys
   lowercase_      :List[str]         =			[]
   lowercase_      :Union[str, Any]         =			set(pt_model_dict.keys()			)

   for flax_key_tuple, flax_tensor in flax_state_dict.items():
      lowercase_      :Optional[int]         =			flax_key_tuple[0] == pt_model.base_model_prefix
      lowercase_      :Optional[Any]         =			".".join((pt_model.base_model_prefix,) + flax_key_tuple			) in pt_model_dict

      # adapt flax_key to prepare for loading from/to base model only
      if load_model_with_head_into_base_model and has_base_model_prefix:
         lowercase_      :str         =			flax_key_tuple[1:]
      elif load_base_model_into_model_with_head and require_base_model_prefix:
         lowercase_      :str         =			(pt_model.base_model_prefix,) + flax_key_tuple

      # rename flax weights to PyTorch format
      if flax_key_tuple[-1] == "kernel" and flax_tensor.ndim == 4 and ".".join(__lowerCamelCase			) not in pt_model_dict:
         # conv layer
         lowercase_      :str         =			flax_key_tuple[:-1] + ("weight",)
         lowercase_      :str         =			jnp.transpose(__lowerCamelCase     ,(3, 2, 0, 1)			)
      elif flax_key_tuple[-1] == "kernel" and ".".join(__lowerCamelCase			) not in pt_model_dict:
         # linear layer
         lowercase_      :int         =			flax_key_tuple[:-1] + ("weight",)
         lowercase_      :int         =			flax_tensor.T
      elif flax_key_tuple[-1] in ["scale", "embedding"]:
         lowercase_      :Any         =			flax_key_tuple[:-1] + ("weight",)

      # adding batch stats from flax batch norm to pt
      elif "mean" in flax_key_tuple[-1]:
         lowercase_      :Optional[int]         =			flax_key_tuple[:-1] + ("running_mean",)
      elif "var" in flax_key_tuple[-1]:
         lowercase_      :Union[str, Any]         =			flax_key_tuple[:-1] + ("running_var",)

      if "batch_stats" in flax_state:
         lowercase_      :Dict         =			".".join(flax_key_tuple[1:]			)  # Remove the params/batch_stats header
      else:
         lowercase_      :int         =			".".join(__lowerCamelCase			)

      # We also need to look at `pt_model_dict` and see if there are keys requiring further transformation.
      lowercase_      :int         =			{}
      # New `weight_norm` from https://github.com/huggingface/transformers/pull/24030
      for key in pt_model_dict:
         lowercase_      :Dict         =			key.split("."			)
         lowercase_      :str         =			None
         if key_components[-3::2] == ["parametrizations", "original0"]:
            lowercase_      :Optional[Any]         =			key_components[-2] + "_g"
         elif key_components[-3::2] == ["parametrizations", "original1"]:
            lowercase_      :List[str]         =			key_components[-2] + "_v"
         if name is not None:
            lowercase_      :Optional[Any]         =			key_components[:-3] + [name]
            lowercase_      :List[Any]         =			".".join(__lowerCamelCase			)
            lowercase_      :int         =			key

      if flax_key in special_pt_names:
         lowercase_      :Tuple         =			special_pt_names[flax_key]

      if flax_key in pt_model_dict:
         if flax_tensor.shape != pt_model_dict[flax_key].shape:
            raise ValueError(
                F'Flax checkpoint seems to be incorrect. Weight {flax_key_tuple} was expected '
                F'to be of shape {pt_model_dict[flax_key].shape}, but is {flax_tensor.shape}.'			)
         else:
            # add weight to pytorch dict
            lowercase_      :List[str]         =			np.asarray(__lowerCamelCase			) if not isinstance(__lowerCamelCase     ,np.ndarray			) else flax_tensor
            lowercase_      :Dict         =			torch.from_numpy(__lowerCamelCase			)
            # remove from missing keys
            missing_keys.remove(__lowerCamelCase			)
      else:
         # weight is not expected by PyTorch model
         unexpected_keys.append(__lowerCamelCase			)

   pt_model.load_state_dict(__lowerCamelCase			)

   # re-transform missing_keys to list
   lowercase_      :List[str]         =			list(__lowerCamelCase			)

   if len(__lowerCamelCase			) > 0:
      logger.warning(
          "Some weights of the Flax model were not used when initializing the PyTorch model"
          F' {pt_model.__class__.__name__}: {unexpected_keys}\n- This IS expected if you are initializing'
          F' {pt_model.__class__.__name__} from a Flax model trained on another task or with another architecture'
          " (e.g. initializing a BertForSequenceClassification model from a FlaxBertForPreTraining model).\n- This"
          F' IS NOT expected if you are initializing {pt_model.__class__.__name__} from a Flax model that you expect'
          " to be exactly identical (e.g. initializing a BertForSequenceClassification model from a"
          " FlaxBertForSequenceClassification model)."			)
   else:
      logger.warning(F'All Flax model weights were used when initializing {pt_model.__class__.__name__}.\n'			)
   if len(__lowerCamelCase			) > 0:
      logger.warning(
          F'Some weights of {pt_model.__class__.__name__} were not initialized from the Flax model and are newly'
          F' initialized: {missing_keys}\nYou should probably TRAIN this model on a down-stream task to be able to'
          " use it for predictions and inference."			)
   else:
      logger.warning(
          F'All the weights of {pt_model.__class__.__name__} were initialized from the Flax model.\n'
          "If your task is similar to the task the model of the checkpoint was trained on, "
          F'you can already use {pt_model.__class__.__name__} for predictions without further training.'			)

   return pt_model









'''simple docstring'''


import sys

lowerCAmelCase :					List[Any] 							=(
    '''73167176531330624919225119674426574742355349194934'''
    '''96983520312774506326239578318016984801869478851843'''
    '''85861560789112949495459501737958331952853208805511'''
    '''12540698747158523863050715693290963295227443043557'''
    '''66896648950445244523161731856403098711121722383113'''
    '''62229893423380308135336276614282806444486645238749'''
    '''30358907296290491560440772390713810515859307960866'''
    '''70172427121883998797908792274921901699720888093776'''
    '''65727333001053367881220235421809751254540594752243'''
    '''52584907711670556013604839586446706324415722155397'''
    '''53697817977846174064955149290862569321978468622482'''
    '''83972241375657056057490261407972968652414535100474'''
    '''82166370484403199890008895243450658541227588666881'''
    '''16427171479924442928230863465674813919123162824586'''
    '''17866458359124566529476545682848912883142607690042'''
    '''24219022671055626321111109370544217506941658960408'''
    '''07198403850962455444362981230987879927244284909188'''
    '''84580156166097919133875499200524063689912560717606'''
    '''05886116467109405077541002256983155200055935729725'''
    '''71636269561882670428252483600823257530420752963450'''
)
def 							UpperCAmelCase_  (						__lowerCamelCase : str			):
   lowercase_      :List[str]         =			1
   for digit in s:
      product *= int(__lowerCamelCase			)
   return product
def 							UpperCAmelCase_  (						__lowerCamelCase : str = N			):
   lowercase_      :Any         =			-sys.maxsize - 1
   lowercase_      :int         =			n[:13]
   lowercase_      :Optional[int]         =			13
   while cur_index < len(__lowerCamelCase			) - 13:
      if int(n[cur_index]			) >= int(substr[0]			):
         lowercase_      :str         =			substr[1:] + n[cur_index]
         cur_index += 1
      else:
         lowercase_      :List[str]         =			max(__lowerCamelCase     ,str_eval(__lowerCamelCase			)			)
         lowercase_      :Any         =			n[cur_index : cur_index + 13]
         cur_index += 13
   return largest_product


if __name__ == "__main__":
 print(F'''{solution() = }''')


