o
    ei                     @   s:  U d 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 dd	lmZ dd
lmZ ddlmZmZmZmZmZ ddlmZ ddlmZ ddlmZ ddlm Z m!Z!m"Z"m#Z#m$Z$ e rsddl%m&Z& ndZ&e rddl'm(Z( ndZ(e)e*Z+i Z,e-e.e/e f e0d< i Z1e-e.e/e f e0d< ee.e.dB f g de rdndfde rdndfde rdndfde rdndfde rdndfd e rdndfd!e rd"ndfd#e rd$ndfd%d&e rdndfd'e rd(ndfd)d*d+e rd,ndfd-e rd.ndfd/d0e r#d1ndfd2d3e r/dndfd4e r9d5ndfd6d7e rEdndfd8d9e rQd:ndfd;d<e r]dndfd=d>e ridndfd?e rsdndfd@dAe rdBndfdCe rd5ndfdDe rdndfdEe rdndfdFe rdndfdGe rdndfdHe rdIndfdJdKdLdMdNe rd5ndfdOe rdPndfdQe rdRndfdSdTe rdndfdUe rdVndfdWe rdndfdXe rd5ndfdYe rdndfdZd[e r!d\ndfd]e r+d^ndfd_d`e r7dndfdae rAd5ndfdbe rKdcndfdde rUdendfdfdge radhndfdie rkdjndfdke rudjndfdle rdjndfdme rdjndfdne rdjndfdoe rdjndfdpe rdndfdqe rdrndfdse rdrndfdte rdrndfdue rdrndfdve rdrndfdwe rdrndfdxe rdrndfdye rdrndfdze rdrndfd{e rd|ndfd}e rd5ndfd~e rd5ndfde r)d5ndfde r3d\ndfdde r?d5ndfddddde rQdndfde r[dndfde redndfddde rsdndfde r}dndfde rd5ndfde rd5ndfde rdndfde rd5ndfde rdndfde rdndfde rdndfde rdndfde rdndfde rdndfde rdndfde rdndfde rdndfde r	d"ndfde rd"ndfde rdndfdde r)dndfde r3dndfde r=d\ndfde rGd\ndfde rQdndfde r[dndfde redndfde rodndfdde r{dndfde rdndfdde	 rdne rdrndfde	 rdne rdrndfde	 rdne rdrndfde	 rdne rdrndfde rdndfde rdndfde rdndfde rdndfde rd\ndfdȑde rdndfde rdndfde rdndfde r#dndfdΑde r/dndfde r9dndfde rCdndfde rMdndfde rWdndfde rad\ndfde rkd\ndfde rud5ndfde rd\ndfde rdndfde rdndfde rdndfde rd5ndfde rdndfde rdndfde rdndfde rd.ndfde rd.ndfdde rd5ndfdde rdndfde	 rdne rdrndfde rdndfdde rdndfde r!dndfde r+dndfde r5dndfde r?dndfde rIdndfde rSdndfde r]dndfde rgdndfde rqdndfde r{dndfde rdndfde rdndfde rdndfde rdndfdde rdndfde rdjndfde rĐd ndfde rАdndfde rdndfdddde rdndfd	e rd\ndfd
e rdndfde rdndfde rdndfde r)dndfde r4djndfde r@dndfde rLdndfde rXdndfde rddndfdde rrdndfde r}d\ndfde rd5ndfde rdndfde rdndfde rdjndfdd e rdndfd!e rdndfd"e rΐd#ndfd$e rdndfd%d&d'e rdndfd(e rdndfd)d*e	 rdne r	drndfd+e	 rdne rdrndfd,d-d.d/d0e r2d1ndfd2e r=dndfd3e rId4ndfd5d6e rWdndfd7e rbdndfd8e rnd9ndfd:e ryd\ndfd;e rdndfd<e rdndfZ2ee e2Z3d=d> e 4 D Z5d?d@ Z6dAdB Z7dCe.dDe/e dB fdEdFZ8		G				G	HdVdIe.ej9e. B dJe.ej9e. B dB dKe:dLe-e.e.f dB dMe:e.B dB dNe.dB dOe:dPe.dDe-e.ef fdQdRZ;G dSdT dTZ<dUdTgZ=dS (W  zAuto Tokenizer class.    N)OrderedDict)Any)is_mistral_common_available   )PreTrainedConfig)get_class_from_dynamic_moduleresolve_trust_remote_code)load_gguf_checkpoint)TOKENIZER_CONFIG_FILE)extract_commit_hashis_g2p_en_availableis_sentencepiece_availableis_tokenizers_availablelogging)cached_file   )EncoderDecoderConfig   )_LazyAutoMapping)CONFIG_MAPPING_NAMES
AutoConfigconfig_class_to_model_typemodel_type_to_module_name!replace_list_option_in_docstrings)TokenizersBackend)SentencePieceBackendREGISTERED_TOKENIZER_CLASSESREGISTERED_FAST_ALIASESaimv2CLIPTokenizeralbertAlbertTokenizeralignBertTokenizeraudioflamingo3Qwen2Tokenizer
aya_visionCohereTokenizerbarkbartRobertaTokenizerbarthezBarthezTokenizer)bartphoBartphoTokenizerbertzbert-generationBertGenerationTokenizer)zbert-japaneseBertJapaneseTokenizer)bertweetBertweetTokenizerbig_birdBigBirdTokenizerbigbird_pegasusPegasusTokenizer)biogptBioGptTokenizer
blenderbotBlenderbotTokenizer)zblenderbot-smallBlenderbotSmallTokenizerblipzblip-2GPT2Tokenizer)bridgetowerr*   bros)byt5ByT5Tokenizer	camembertCamembertTokenizer)canineCanineTokenizerchinese_clip)clapr*   clipclipseg)clvpClvpTokenizer
code_llamaCodeLlamaTokenizercodegencoherecohere2colqwen2convbertcpmCpmTokenizer)cpmantCpmAntTokenizer)ctrlCTRLTokenizer)zdata2vec-audioWav2Vec2CTCTokenizer)zdata2vec-textr*   dbrxdebertaDebertaTokenizerz
deberta-v2DebertaV2Tokenizer)diaDiaTokenizer
distilbertdprDPRQuestionEncoderTokenizerelectraemu3ernie)esmEsmTokenizerfalcon_mambaGPTNeoXTokenizerfastspeech2_conformerFastSpeech2ConformerTokenizer)flaubertFlaubertTokenizerflava	flex_olmo	florence2BartTokenizerfnetFNetTokenizer)fsmtFSMTTokenizerfunnelFunnelTokenizergemmaGemmaTokenizergemma2gemma3gemma3_textgemma3ngemma3n_textgitglmr   glm4glm4_moeglm4_moe_liteglm4v	glm4v_moe	glm_imageglmasrgot_ocr2zgpt-sw3GPTSw3Tokenizergpt2gpt_bigcodegpt_neogpt_neox)gpt_neox_japaneseGPTNeoXJapaneseTokenizergptj)graniter>   )
granitemoer>   )granitemoehybridr>   )granitemoesharedr>   zgrounding-dinogroupvitherbertHerbertTokenizer)hubertrZ   )ibertr*   ideficsLlamaTokenizeridefics2instructblipinstructblipvideointernvljais2zkosmos-2XLMRobertaTokenizerlasr_ctcParakeetTokenizerlasr_encoderlayoutlm
layoutlmv2LayoutLMv2Tokenizer
layoutlmv3LayoutLMv3Tokenizer	layoutxlmLayoutXLMTokenizerledLEDTokenizerlighton_ocrQwen2TokenizerFastlilt
longformerlongt5T5Tokenizer)lukeLukeTokenizerlxmertLxmertTokenizerm2m_100M2M100Tokenizermambamamba2marianMarianTokenizermarkuplmMarkupLMTokenizermbartMBartTokenizermbart50MBart50Tokenizer)megar*   zmegatron-bert
metaclip_2)zmgp-strMgpstrTokenizer
ministral3MistralCommonBackendmistralmistral3mixtralmlukeMLukeTokenizerzmm-grounding-dino
mobilebertMobileBertTokenizermpnetMPNetTokenizermpt)mrar*   mt5musicgenmusicgen_melodymvpMvpTokenizer)myt5MyT5TokenizernezhanllbNllbTokenizerznllb-moenougatNougatTokenizernystromformerolmoolmo2olmo3olmoezomdet-turbo	oneformerz
openai-gptOpenAIGPTTokenizeroptovis2owlv2owlvitpegasus	pegasus_x)	perceiverPerceiverTokenizerphi)phobertPhobertTokenizer
pix2structpixtralplbartPLBartTokenizer)
prophetnetProphetNetTokenizerqdqbertqwen2qwen2_5_omni
qwen2_5_vlqwen2_audio	qwen2_moeqwen2_vlqwen3qwen3_5Qwen3_5Tokenizerqwen3_5_moe	qwen3_moe
qwen3_nextqwen3_omni_moeqwen3_vlqwen3_vl_moe)ragRagTokenizerrealmrecurrent_gemmareformerReformerTokenizerrembertRemBertTokenizer	retribert)robertar*   )zroberta-prelayernormr*   )roc_bertRoCBertTokenizerroformerRoFormerTokenizerrwkvsam3
sam3_videoseamless_m4tSeamlessM4TTokenizerseamless_m4t_v2shieldgemma2siglipSiglipTokenizersiglip2Siglip2Tokenizerspeech_to_textSpeech2TextTokenizerspeecht5SpeechT5Tokenizer)splinterSplinterTokenizersqueezebertstablelm
starcoder2switch_transformerst5t5gemma)tapasTapasTokenizertrocrtvpudopUdopTokenizerumt5)	unispeechrZ   )zunispeech-satrZ   viltvisual_bert)vitsVitsTokenizervoxtralvoxtral_realtime)wav2vec2rZ   )zwav2vec2-bertrZ   )zwav2vec2-conformerrZ   )wav2vec2_phonemeWav2Vec2PhonemeCTCTokenizerwhisperWhisperTokenizerxclipxglmXGLMTokenizer)xlmXLMTokenizerzxlm-robertazxlm-roberta-xlxlnetXLNetTokenizerxlstmxmodyosoc                 C   s   i | ]\}}||qS  rK  ).0kvrK  rK  h/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/transformers/models/auto/tokenization_auto.py
<dictcomp>P  s    rP  c                 C   s<   t | ddd}t|W  d   S 1 sw   Y  dS )z*Loads a vocabulary file into a dictionary.rutf-8encodingN)openjsonload)
vocab_filereaderrK  rK  rO  
load_vocabS  s   $rZ  c                 C   sj   g }t | ddd"}|D ]}| }|r"|ds"|t|  qW d   |S 1 s.w   Y  |S )z Loads a merges file into a list.rQ  rR  rS  #N)rU  strip
startswithappendtuplesplit)merges_filemergesrY  linerK  rK  rO  load_mergesY  s   
rd  
class_namereturnc              	   C   s   | dv rt S | tv rt|  S | tv rt|  S | dkrt S t D ]6\}}|| krVt|}|dv r;| dkr;tdd}n	td| d}zt|| W   S  t	yU   Y q w q t
j D ]}t|d	d | krj|  S q\td}t|| rzt|| S d S )
N>   BloomTokenizerBloomTokenizerFastr   )r   r   r   	ministralr   r   r:  r   z.tokenization_mistral_commontransformers.ztransformers.models__name__)r   r   r   TOKENIZER_MAPPING_NAMESitemsr   	importlibimport_modulegetattrAttributeErrorTOKENIZER_MAPPING_extra_contentvalueshasattr)re  module_nametokenizer_classmodule	tokenizermain_modulerK  rK  rO  tokenizer_class_from_named  s:   


r|  F pretrained_model_name_or_path	cache_dirforce_downloadproxiestokenrevisionlocal_files_only	subfolderc                 K   s   | d}	t| t|||||||ddd|	d}
|
du r!td i S t|
|	}	t|
dd}t|}W d   n1 s<w   Y  |	|d< |S )aY  
    Loads the tokenizer configuration from a pretrained model tokenizer configuration.

    Args:
        pretrained_model_name_or_path (`str` or `os.PathLike`):
            This can be either:

            - a string, the *model id* of a pretrained model configuration hosted inside a model repo on
              huggingface.co.
            - a path to a *directory* containing a configuration file saved using the
              [`~PreTrainedTokenizer.save_pretrained`] method, e.g., `./my_model_directory/`.

        cache_dir (`str` or `os.PathLike`, *optional*):
            Path to a directory in which a downloaded pretrained model configuration should be cached if the standard
            cache should not be used.
        force_download (`bool`, *optional*, defaults to `False`):
            Whether or not to force to (re-)download the configuration files and override the cached versions if they
            exist.
        proxies (`dict[str, str]`, *optional*):
            A dictionary of proxy servers to use by protocol or endpoint, e.g., `{'http': 'foo.bar:3128',
            'http://hostname': 'foo.bar:4012'}.` The proxies are used on each request.
        token (`str` or *bool*, *optional*):
            The token to use as HTTP bearer authorization for remote files. If `True`, will use the token generated
            when running `hf auth login` (stored in `~/.huggingface`).
        revision (`str`, *optional*, defaults to `"main"`):
            The specific model version to use. It can be a branch name, a tag name, or a commit id, since we use a
            git-based system for storing models and other artifacts on huggingface.co, so `revision` can be any
            identifier allowed by git.
        local_files_only (`bool`, *optional*, defaults to `False`):
            If `True`, will only try to load the tokenizer configuration from local files.
        subfolder (`str`, *optional*, defaults to `""`):
            In case the tokenizer config is located inside a subfolder of the model repo on huggingface.co, you can
            specify the folder name here.

    <Tip>

    Passing `token=True` is required when you want to use a private model.

    </Tip>

    Returns:
        `dict`: The configuration of the tokenizer.

    Examples:

    ```python
    # Download configuration from huggingface.co and cache.
    tokenizer_config = get_tokenizer_config("google-bert/bert-base-uncased")
    # This model does not have a tokenizer config so the result will be an empty dict.
    tokenizer_config = get_tokenizer_config("FacebookAI/xlm-roberta-base")

    # Save a pretrained tokenizer locally and you can reload its config
    from transformers import AutoTokenizer

    tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased")
    tokenizer.save_pretrained("tokenizer-test")
    tokenizer_config = get_tokenizer_config("tokenizer-test")
    ```_commit_hashF)r  r  r  r  r  r  r   _raise_exceptions_for_gated_repo%_raise_exceptions_for_missing_entries'_raise_exceptions_for_connection_errorsr  Nz\Could not locate the tokenizer configuration file, will try to use the model config instead.rR  rS  )	getr   r
   loggerinfor   rU  rV  rW  )r~  r  r  r  r  r  r  r  kwargscommit_hashresolved_config_filerY  resultrK  rK  rO  get_tokenizer_config  s2   
E

r  c                   @   sF   e Zd ZdZdd Zeeedee	B fddZ
e	dd	d
ZdS )AutoTokenizera  
    This is a generic tokenizer class that will be instantiated as one of the tokenizer classes of the library when
    created with the [`AutoTokenizer.from_pretrained`] class method.

    This class cannot be instantiated directly using `__init__()` (throws an error).
    c                 C   s   t d)Nz}AutoTokenizer is designed to be instantiated using the `AutoTokenizer.from_pretrained(pretrained_model_name_or_path)` method.)OSError)selfrK  rK  rO  __init__  s   zAutoTokenizer.__init__rf  c              
   O   s  | dd}d|d< | dd}| dd}| dd}|d}|dur^t|d}	|	du rBtd	| d
ddd tD  dt|	}
|
du rRtd|	 d|
j|g|R i |S |rzt||fi |}t|ddd }t	j
d)i |}n$|du rzt	j|fd|i|}W n ty   tj|fi |}Y nw |j}t|fi |}|dd}d}d|v rt|d ttfr|d }n|d dd}|du r,|dur,|dur,|dkr,t|ddd|ddkr,tdurztj|g|R i |W S  ty } ztd|  W Y d}~nd}~ww t|j|g|R i |S d|v r7|d |d< |r@|dd}|du}t|tv p^|duo^t|dup^t|d du}|r|d durn|d }n|d }d|v r|dd }nd}t|||||}|r|rt||fi |}
| dd}|
  |
j|g|R d|i|S |dur|}t|}
|
du r|dst|d }
|
dur|
jdkrt}
|
du rt}
|
j|g|R i |S t|ddr|j}d|vr|dd}t|}
|
j|g|R i |S t|t r5t|j!t|j"ur2t#d |j"j$ d!|j!j$ d" |j"}t%t|jpBt|d#d}|duratt|t}
|
dura|
j|g|R i |S |dd}|dur|d$kr|d|v r||dd% }t|}
|
du r|dst|d }
|
dur|
jdkrt}
|
du rt}
|
j|g|R i |S td&|j$ d'dd(d tD  d)*a  
        Instantiate one of the tokenizer classes of the library from a pretrained model vocabulary.

        The tokenizer class to instantiate is selected based on the `model_type` property of the config object (either
        passed as an argument or loaded from `pretrained_model_name_or_path` if possible), or when it's missing, by
        falling back to using pattern matching on `pretrained_model_name_or_path`:

        List options

        Params:
            pretrained_model_name_or_path (`str` or `os.PathLike`):
                Can be either:

                    - A string, the *model id* of a predefined tokenizer hosted inside a model repo on huggingface.co.
                    - A path to a *directory* containing vocabulary files required by the tokenizer, for instance saved
                      using the [`~PreTrainedTokenizer.save_pretrained`] method, e.g., `./my_model_directory/`.
                    - A path or url to a single saved vocabulary file if and only if the tokenizer only requires a
                      single vocabulary file (like Bert or XLNet), e.g.: `./my_model_directory/vocab.txt`. (Not
                      applicable to all derived classes)
            inputs (additional positional arguments, *optional*):
                Will be passed along to the Tokenizer `__init__()` method.
            config ([`PreTrainedConfig`], *optional*)
                The configuration object used to determine the tokenizer class to instantiate.
            cache_dir (`str` or `os.PathLike`, *optional*):
                Path to a directory in which a downloaded pretrained model configuration should be cached if the
                standard cache should not be used.
            force_download (`bool`, *optional*, defaults to `False`):
                Whether or not to force the (re-)download the model weights and configuration files and override the
                cached versions if they exist.
            proxies (`dict[str, str]`, *optional*):
                A dictionary of proxy servers to use by protocol or endpoint, e.g., `{'http': 'foo.bar:3128',
                'http://hostname': 'foo.bar:4012'}`. The proxies are used on each request.
            revision (`str`, *optional*, defaults to `"main"`):
                The specific model version to use. It can be a branch name, a tag name, or a commit id, since we use a
                git-based system for storing models and other artifacts on huggingface.co, so `revision` can be any
                identifier allowed by git.
            subfolder (`str`, *optional*):
                In case the relevant files are located inside a subfolder of the model repo on huggingface.co (e.g. for
                facebook/rag-token-base), specify it here.
            tokenizer_type (`str`, *optional*):
                Tokenizer type to be loaded.
            backend (`str`, *optional*, defaults to `"tokenizers"`):
                Backend to use for tokenization. Valid options are:
                - `"tokenizers"`: Use the HuggingFace tokenizers library backend (default)
                - `"sentencepiece"`: Use the SentencePiece backend
            trust_remote_code (`bool`, *optional*, defaults to `False`):
                Whether or not to allow for custom models defined on the Hub in their own modeling files. This option
                should only be set to `True` for repositories you trust and in which you have read the code, as it will
                execute code present on the Hub on your local machine.
            kwargs (additional keyword arguments, *optional*):
                Will be passed to the Tokenizer `__init__()` method. Can be used to set special tokens like
                `bos_token`, `eos_token`, `unk_token`, `sep_token`, `pad_token`, `cls_token`, `mask_token`,
                `additional_special_tokens`. See parameters in the `__init__()` for more details.

        Examples:

        ```python
        >>> from transformers import AutoTokenizer

        >>> # Download vocabulary from huggingface.co and cache.
        >>> tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")

        >>> # Download vocabulary from huggingface.co (user-uploaded) and cache.
        >>> tokenizer = AutoTokenizer.from_pretrained("dbmdz/bert-base-german-cased")

        >>> # If vocabulary files are in a directory (e.g. tokenizer was saved using *save_pretrained('./test/saved_model/')*)
        >>> # tokenizer = AutoTokenizer.from_pretrained("./test/bert_saved_model/")

        >>> # Download vocabulary from huggingface.co and define model-specific arguments
        >>> tokenizer = AutoTokenizer.from_pretrained("FacebookAI/roberta-base", add_prefix_space=True)

        >>> # Explicitly use the tokenizers backend
        >>> tokenizer = AutoTokenizer.from_pretrained("hf-internal-testing/llama-tokenizer", backend="tokenizers")

        >>> # Explicitly use the sentencepiece backend
        >>> tokenizer = AutoTokenizer.from_pretrained("hf-internal-testing/llama-tokenizer", backend="sentencepiece")
        ```configNT
_from_autouse_fasttokenizer_typetrust_remote_code	gguf_filezPassed `tokenizer_type` z3 does not exist. `tokenizer_type` should be one of z, c                 s   s    | ]}|V  qd S NrK  rL  crK  rK  rO  	<genexpr>`  s    z0AutoTokenizer.from_pretrained.<locals>.<genexpr>rk  zTokenizer class z is not currently imported.F)return_tensorsrx  auto_mapr  r}  Fastz!Failed to use TokenizersBackend: r  r   r   z--code_revisionPythonBackendPreTrainedTokenizerFastz The encoder model config class: z3 is different from the decoder model config class: z. It is not recommended to use the `AutoTokenizer.from_pretrained()` method in this case. Please use the encoder and decoder specific tokenizer classes.
model_typer   z!Unrecognized configuration class z8 to build an AutoTokenizer.
Model type should be one of c                 s   s    | ]}|j V  qd S r  )rl  r  rK  rK  rO  r    s    rK  )&popr  rm  
ValueErrorjoinr|  from_pretrainedr   r	   r   	for_model	Exceptionr   r  r  
isinstancer_  listreplacer   r  debugtypers  r`  r   r   register_for_auto_classendswithrl  rq  rx  r   decoderencoderwarning	__class__r   )clsr~  inputsr  r  _r  r  r  tokenizer_class_namerx  	gguf_pathconfig_dictconfig_model_typetokenizer_configtokenizer_config_classtokenizer_auto_mapehas_remote_codehas_local_code	class_refupstream_repotokenizer_class_candidate_classr  rK  rK  rO  r    s  R





















zAutoTokenizer.from_pretrainedNFc                 C   s|   |du r|dur|}n|dur|}nt d|||fD ]}|dur&|t|j< q|dur4|dur4|t|j< tj| ||d dS )a  
        Register a new tokenizer in this mapping.

        Args:
            config_class ([`PreTrainedConfig`]):
                The configuration corresponding to the model to register.
            tokenizer_class: The tokenizer class to register (V5 - preferred parameter).
            slow_tokenizer_class: (Deprecated) The slow tokenizer to register.
            fast_tokenizer_class: (Deprecated) The fast tokenizer to register.
        Nz$You need to pass a `tokenizer_class`)exist_ok)r  r   rl  r   rs  register)config_classrx  slow_tokenizer_classfast_tokenizer_classr  	candidaterK  rK  rO  r    s   

zAutoTokenizer.register)NNNF)rl  
__module____qualname____doc__r  classmethodr   rm  r   r   r  staticmethodr  rK  rK  rK  rO  r    s     vr  rs  )NFNNNFr}  )>r  ro  rV  oscollectionsr   typingr   transformers.utils.import_utilsr   configuration_utilsr   dynamic_module_utilsr   r   modeling_gguf_pytorch_utilsr	   tokenization_utils_baser
   utilsr   r   r   r   r   	utils.hubr   encoder_decoderr   auto_factoryr   configuration_autor   r   r   r   r   tokenization_utils_tokenizersr    tokenization_utils_sentencepiecer   
get_loggerrl  r  r   dictstrr  __annotations__r   rm  rs  rn  CONFIG_TO_TYPErZ  rd  r|  PathLikeboolr  r  __all__rK  rK  rK  rO  <module>   s2  	
	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{}   
                             !  "  #  $  %  &  '  (  )  *  +  ,  -  .  /  0  1  2  3  4  5  7  <  =  >  ?  @  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z  [  \  ]  ^  _  `  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  s  y  ~                                     	    
            
".


`  (