


import os
from shutil import copyfile
from typing import Any, Dict, List, Optional, Tuple

import sentencepiece as spm

from ...tokenization_utils import AddedToken, PreTrainedTokenizer
from ...utils import logging


__UpperCAmelCase    :Optional[Any]				       =     logging.get_logger(__name__)

__UpperCAmelCase    :Union[str, Any]				       =     "▁"

__UpperCAmelCase    :int				       =     {"vocab_file": "sentencepiece.bpe.model"}

__UpperCAmelCase    :Any				       =     {
    "vocab_file": {
        "xlm-roberta-base": "https://huggingface.co/xlm-roberta-base/resolve/main/sentencepiece.bpe.model",
        "xlm-roberta-large": "https://huggingface.co/xlm-roberta-large/resolve/main/sentencepiece.bpe.model",
        "xlm-roberta-large-finetuned-conll02-dutch": (
            "https://huggingface.co/xlm-roberta-large-finetuned-conll02-dutch/resolve/main/sentencepiece.bpe.model"
        ),
        "xlm-roberta-large-finetuned-conll02-spanish": (
            "https://huggingface.co/xlm-roberta-large-finetuned-conll02-spanish/resolve/main/sentencepiece.bpe.model"
        ),
        "xlm-roberta-large-finetuned-conll03-english": (
            "https://huggingface.co/xlm-roberta-large-finetuned-conll03-english/resolve/main/sentencepiece.bpe.model"
        ),
        "xlm-roberta-large-finetuned-conll03-german": (
            "https://huggingface.co/xlm-roberta-large-finetuned-conll03-german/resolve/main/sentencepiece.bpe.model"
        ),
    }
}

__UpperCAmelCase    :Optional[Any]				       =     {
    "xlm-roberta-base": 5_1_2,
    "xlm-roberta-large": 5_1_2,
    "xlm-roberta-large-finetuned-conll02-dutch": 5_1_2,
    "xlm-roberta-large-finetuned-conll02-spanish": 5_1_2,
    "xlm-roberta-large-finetuned-conll03-english": 5_1_2,
    "xlm-roberta-large-finetuned-conll03-german": 5_1_2,
}



class 			a       (	_a ):


     """simple docstring"""






     SCREAMING_SNAKE_CASE :				Optional[Any]							     =     VOCAB_FILES_NAMES
     SCREAMING_SNAKE_CASE :				Optional[Any]							     =     PRETRAINED_VOCAB_FILES_MAP
     SCREAMING_SNAKE_CASE :				List[str]							     =     PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
     SCREAMING_SNAKE_CASE :				List[str]							     =     ["input_ids", "attention_mask"]

     def __init__(       self  :	List[Any]							,				snake_case  :	int							,				snake_case  :	Optional[int]="<s>"							,				snake_case  :	int="</s>"							,				snake_case  :	List[Any]="</s>"							,				snake_case  :	str="<s>"							,				snake_case  :	Any="<unk>"							,				snake_case  :	Any="<pad>"							,				snake_case  :	Optional[Any]="<mask>"							,				snake_case  :	Optional[Dict[str, Any]] = None							,				**snake_case  :	Any							,				)		->							None:
          # Mask token behave like a normal word, i.e. include the space before it
          __UpperCAmelCase			:				Tuple													=    AddedToken(snake_case							,				lstrip=snake_case							,				rstrip=snake_case    ) if isinstance(snake_case							,				snake_case    ) else mask_token

          __UpperCAmelCase			:				str													=    {} if sp_model_kwargs is None else sp_model_kwargs

          super().__init__(
              bos_token=snake_case							,				eos_token=snake_case							,				unk_token=snake_case							,				sep_token=snake_case							,				cls_token=snake_case							,				pad_token=snake_case							,				mask_token=snake_case							,				sp_model_kwargs=self.sp_model_kwargs							,				**snake_case							,				)

          __UpperCAmelCase			:				Tuple													=    spm.SentencePieceProcessor(**self.sp_model_kwargs    )
          self.sp_model.Load(str(snake_case    )    )
          __UpperCAmelCase			:				List[str]													=    vocab_file

          # Original fairseq vocab and spm vocab must be "aligned":
          # Vocab    |    0    |    1    |   2    |    3    |  4  |  5  |  6  |   7   |   8   |  9
          # -------- | ------- | ------- | ------ | ------- | --- | --- | --- | ----- | ----- | ----
          # fairseq  | '<s>'   | '<pad>' | '</s>' | '<unk>' | ',' | '.' | '▁' | 's'   | '▁de' | '-'
          # spm      | '<unk>' | '<s>'   | '</s>' | ','     | '.' | '▁' | 's' | '▁de' | '-'   | '▁a'

          # Mimic fairseq token-to-id alignment for the first 4 token
          __UpperCAmelCase			:				Tuple													=    {'''<s>''': 0, '''<pad>''': 1, '''</s>''': 2, '''<unk>''': 3}

          # The first "real" token "," has position 4 in the original fairseq vocab and position 3 in the spm vocab
          __UpperCAmelCase			:				Optional[Any]													=    1

          __UpperCAmelCase			:				Optional[Any]													=    len(self.sp_model    ) + self.fairseq_offset
          __UpperCAmelCase			:				List[Any]													=    {v: k for k, v in self.fairseq_tokens_to_ids.items()}

     def __getstate__(       self  :	Dict    )		->							Union[str, Any]:
          __UpperCAmelCase			:				Optional[int]													=    self.__dict__.copy()
          __UpperCAmelCase			:				str													=    None
          __UpperCAmelCase			:				int													=    self.sp_model.serialized_model_proto()
          return state

     def __setstate__(       self  :	List[Any]							,				snake_case  :	Any    )		->							Optional[int]:
          __UpperCAmelCase			:				Tuple													=    d

          # for backward compatibility
          if not hasattr(self							,				'''sp_model_kwargs'''    ):
               __UpperCAmelCase			:				List[Any]													=    {}

          __UpperCAmelCase			:				Tuple													=    spm.SentencePieceProcessor(**self.sp_model_kwargs    )
          self.sp_model.LoadFromSerializedProto(self.sp_model_proto    )

     def 				lowerCamelCase__				(       self  :	Any							,				snake_case  :	List[int]							,				snake_case  :	Optional[List[int]] = None    )		->							List[int]:

          if token_ids_a is None:
               return [self.cls_token_id] + token_ids_a + [self.sep_token_id]
          __UpperCAmelCase			:				str													=    [self.cls_token_id]
          __UpperCAmelCase			:				int													=    [self.sep_token_id]
          return cls + token_ids_a + sep + sep + token_ids_a + sep

     def 				lowerCamelCase__				(       self  :	List[str]							,				snake_case  :	List[int]							,				snake_case  :	Optional[List[int]] = None							,				snake_case  :	bool = False    )		->							List[int]:

          if already_has_special_tokens:
               return super().get_special_tokens_mask(
                   token_ids_a=snake_case							,				token_ids_a=snake_case							,				already_has_special_tokens=snake_case    )

          if token_ids_a is None:
               return [1] + ([0] * len(snake_case    )) + [1]
          return [1] + ([0] * len(snake_case    )) + [1, 1] + ([0] * len(snake_case    )) + [1]

     def 				lowerCamelCase__				(       self  :	List[Any]							,				snake_case  :	List[int]							,				snake_case  :	Optional[List[int]] = None    )		->							List[int]:
          __UpperCAmelCase			:				List[Any]													=    [self.sep_token_id]
          __UpperCAmelCase			:				Tuple													=    [self.cls_token_id]

          if token_ids_a is None:
               return len(cls + token_ids_a + sep    ) * [0]
          return len(cls + token_ids_a + sep + sep + token_ids_a + sep    ) * [0]

     @property
     def 				lowerCamelCase__				(       self  :	Optional[Any]    )		->							str:
          return len(self.sp_model    ) + self.fairseq_offset + 1  # Add the <mask> token

     def 				lowerCamelCase__				(       self  :	Optional[int]    )		->							Union[str, Any]:
          __UpperCAmelCase			:				Optional[int]													=    {self.convert_ids_to_tokens(snake_case    ): i for i in range(self.vocab_size    )}
          vocab.update(self.added_tokens_encoder    )
          return vocab

     def 				lowerCamelCase__				(       self  :	List[Any]							,				snake_case  :	str    )		->							List[str]:
          return self.sp_model.encode(snake_case							,				out_type=snake_case    )

     def 				lowerCamelCase__				(       self  :	List[str]							,				snake_case  :	Dict    )		->							List[Any]:
          if token in self.fairseq_tokens_to_ids:
               return self.fairseq_tokens_to_ids[token]
          __UpperCAmelCase			:				Any													=    self.sp_model.PieceToId(snake_case    )

          # Need to return unknown token if the SP model returned 0
          return spm_id + self.fairseq_offset if spm_id else self.unk_token_id

     def 				lowerCamelCase__				(       self  :	Dict							,				snake_case  :	List[str]    )		->							Optional[Any]:
          if index in self.fairseq_ids_to_tokens:
               return self.fairseq_ids_to_tokens[index]
          return self.sp_model.IdToPiece(index - self.fairseq_offset    )

     def 				lowerCamelCase__				(       self  :	Optional[Any]							,				snake_case  :	Union[str, Any]    )		->							Dict:
          __UpperCAmelCase			:				str													=    ''''''.join(snake_case    ).replace(snake_case							,				''' '''    ).strip()
          return out_string






     def 				lowerCamelCase__				(       self  :	List[str]							,				snake_case  :	str							,				snake_case  :	Optional[str] = None    )		->							Tuple[str]:
          if not os.path.isdir(snake_case    ):
               logger.error(f'Vocabulary path ({save_directory}) should be a directory'    )
               return
          __UpperCAmelCase			:				List[str]													=    os.path.join(
              snake_case							,				(filename_prefix + '''-''' if filename_prefix else '''''') + VOCAB_FILES_NAMES['''vocab_file''']    )

          if os.path.abspath(self.vocab_file    ) != os.path.abspath(snake_case    ) and os.path.isfile(self.vocab_file    ):
               copyfile(self.vocab_file							,				snake_case    )
          elif not os.path.isfile(self.vocab_file    ):
               with open(snake_case							,				'''wb'''    ) as fi:
                    __UpperCAmelCase			:				List[str]													=    self.sp_model.serialized_model_proto()
                    fi.write(snake_case    )

          return (out_vocab_file,)



'''simple docstring'''



import unittest

from transformers import JukeboxTokenizer
from transformers.testing_utils import require_torch



class 			a       (	unittest.TestCase ):


     """simple docstring"""






     SCREAMING_SNAKE_CASE :				Any							     =     JukeboxTokenizer
     SCREAMING_SNAKE_CASE :				Tuple							     =     {
         "artist": "Zac Brown Band",
         "genres": "Country",
         "lyrics": "I met a traveller from an antique land,\n        Who said \"Two vast and trunkless legs of stone\n        Stand in the desert. . . . Near them, on the sand,\n        Half sunk a shattered visage lies, whose frown,\n        And wrinkled lip, and sneer of cold command,\n        Tell that its sculptor well those passions read\n        Which yet survive, stamped on these lifeless things,\n        The hand that mocked them, and the heart that fed;\n        And on the pedestal, these words appear:\n        My name is Ozymandias, King of Kings;\n        Look on my Works, ye Mighty, and despair!\n        Nothing beside remains. Round the decay\n        Of that colossal Wreck, boundless and bare\n        The lone and level sands stretch far away\n        ",
     }

     @require_torch
     def 				lowerCamelCase__				(       self  :	Optional[int]    )		->							Optional[Any]:
          import torch

          __UpperCAmelCase			:				List[str]													=    JukeboxTokenizer.from_pretrained('''openai/jukebox-1b-lyrics'''    )
          __UpperCAmelCase			:				int													=    tokenizer(**self.metas    )['''input_ids''']
          # fmt: off
          __UpperCAmelCase			:				List[str]													=    [
              torch.tensor([[
                  0, 0, 0, 7169, 507, 9, 76, 39, 31, 46, 76, 27,
                  76, 46, 44, 27, 48, 31, 38, 38, 31, 44, 76, 32,
                  44, 41, 39, 76, 27, 40, 76, 27, 40, 46, 35, 43,
                  47, 31, 76, 38, 27, 40, 30, 64, 78, 76, 76, 76,
                  76, 76, 76, 76, 76, 23, 34, 41, 76, 45, 27, 35,
                  30, 76, 71, 20, 49, 41, 76, 48, 27, 45, 46, 76,
                  27, 40, 30, 76, 46, 44, 47, 40, 37, 38, 31, 45,
                  45, 76, 38, 31, 33, 45, 76, 41, 32, 76, 45, 46,
                  41, 40, 31, 78, 76, 76, 76, 76, 76, 76, 76, 76,
                  19, 46, 27, 40, 30, 76, 35, 40, 76, 46, 34, 31,
                  76, 30, 31, 45, 31, 44, 46, 63, 76, 63, 76, 63,
                  76, 63, 76, 14, 31, 27, 44, 76, 46, 34, 31, 39,
                  64, 76, 41, 40, 76, 46, 34, 31, 76, 45, 27, 40,
                  30, 64, 78, 76, 76, 76, 76, 76, 76, 76, 76, 8,
                  27, 38, 32, 76, 45, 47, 40, 37, 76, 27, 76, 45,
                  34, 27, 46, 46, 31, 44, 31, 30, 76, 48, 35, 45,
                  27, 33, 31, 76, 38, 35, 31, 45, 64, 76, 49, 34,
                  41, 45, 31, 76, 32, 44, 41, 49, 40, 64, 78, 76,
                  76, 76, 76, 76, 76, 76, 76, 1, 40, 30, 76, 49,
                  44, 35, 40, 37, 38, 31, 30, 76, 38, 35, 42, 64,
                  76, 27, 40, 30, 76, 45, 40, 31, 31, 44, 76, 41,
                  32, 76, 29, 41, 38, 30, 76, 29, 41, 39, 39, 27,
                  40, 30, 64, 78, 76, 76, 76, 76, 76, 76, 76, 76,
                  20, 31, 38, 38, 76, 46, 34, 27, 46, 76, 35, 46,
                  45, 76, 45, 29, 47, 38, 42, 46, 41, 44, 76, 49,
                  31, 38, 38, 76, 46, 34, 41, 45, 31, 76, 42, 27,
                  45, 45, 35, 41, 40, 45, 76, 44, 31, 27, 30, 78,
                  76, 76, 76, 76, 76, 76, 76, 76, 23, 34, 35, 29,
                  34, 76, 51, 31, 46, 76, 45, 47, 44, 48, 35, 48,
                  31, 64, 76, 45, 46, 27, 39, 42, 31, 30, 76, 41,
                  40, 76, 46, 34, 31, 45, 31, 76, 38, 35, 32, 31,
                  38, 31, 45, 45, 76, 46, 34, 35, 40, 33, 45, 64,
                  78, 76, 76, 76, 76, 76, 76, 76, 76, 20, 34, 31,
                  76, 34, 27, 40, 30, 76, 46, 34, 27, 46, 76, 39,
                  41, 29, 37, 31, 30, 76, 46, 34, 31, 39, 64, 76,
                  27, 40, 30, 76, 46, 34, 31, 76, 34, 31, 27, 44,
                  46, 76, 46, 34, 27, 46, 76, 32, 31, 30, 66, 78,
                  76, 76, 76, 76, 76, 76, 76, 76, 1, 40, 30, 76,
                  41, 40, 76, 46, 34, 31, 76, 42, 31, 30, 31, 45,
                  46, 27, 38, 64, 76, 46, 34, 31, 45, 31, 76, 49,
                  41, 44, 30, 45, 76, 27, 42, 42, 31, 27, 44, 65,
                  78, 76, 76, 76, 76, 76, 76, 76, 76, 13, 51, 76,
                  40, 27, 39, 31, 76, 35, 45, 76, 15, 52, 51, 39,
                  27, 40, 30, 35, 27, 45, 64, 76, 11, 35, 40, 33,
                  76, 41, 32, 76, 11, 35, 40, 33, 45, 66, 78, 76,
                  76, 76, 76, 76, 76, 76, 76, 12, 41, 41, 37, 76,
                  41, 40, 76, 39, 51, 76, 23, 41, 44, 37, 45, 64,
                  76, 51, 31, 76, 13, 35, 33, 34, 46, 51, 64, 76,
                  27, 40, 30, 76, 30, 31, 45, 42, 27, 35, 44, 67,
                  78, 76, 76, 76, 76, 76, 76, 76, 76, 14, 41, 46,
                  34, 35, 40, 33, 76, 28, 31, 45, 35, 30, 31, 76,
                  44, 31, 39, 27, 35, 40, 45, 63, 76, 18, 41, 47,
                  40, 30, 76, 46, 34, 31, 76, 30, 31, 29, 27, 51,
                  78, 76, 76, 76, 76, 76, 76, 76, 76, 15, 32, 76,
                  46, 34, 27, 46, 76, 29, 41, 38, 41, 45, 45, 27,
                  38, 76, 23, 44, 31, 29, 37, 64, 76, 28, 41, 47,
                  40, 30, 38, 31, 45, 45, 76, 27, 40, 30, 76, 28,
                  27, 44, 31, 78, 76, 76, 76, 76, 76, 76, 76, 76,
                  20, 34, 31, 76, 38, 41, 40, 31, 76, 27, 40, 30,
                  76, 38, 31, 48, 31, 38, 76, 45, 27, 40, 30, 45,
                  76, 45, 46, 44, 31, 46, 29, 34, 76, 32, 27, 44,
                  76, 27, 49, 27, 51, 78, 76, 76, 76, 76, 76, 76,
                  76, 76]]    ),
              torch.tensor([[0, 0, 0, 1069, 11]]    ),
              torch.tensor([[0, 0, 0, 1069, 11]]    ),
          ]
          # fmt: on
          self.assertTrue(torch.allclose(tokens[0]							,				EXPECTED_OUTPUT[0]    )    )
          self.assertTrue(torch.allclose(tokens[1]							,				EXPECTED_OUTPUT[1]    )    )
          self.assertTrue(torch.allclose(tokens[2]							,				EXPECTED_OUTPUT[2]    )    )






     @require_torch
     def 				lowerCamelCase__				(       self  :	Union[str, Any]    )		->							Union[str, Any]:
          import torch

          __UpperCAmelCase			:				Optional[int]													=    JukeboxTokenizer.from_pretrained('''openai/jukebox-5b-lyrics'''    )
          __UpperCAmelCase			:				List[Any]													=    tokenizer(**self.metas    )['''input_ids''']
          # fmt: off
          __UpperCAmelCase			:				List[str]													=    [
              torch.tensor([[
                  0, 0, 0, 1069, 11, -1, -1, -1, -1, 9, 77, 39,
                  31, 46, 77, 27, 77, 46, 44, 27, 48, 31, 38, 38,
                  31, 44, 77, 32, 44, 41, 39, 77, 27, 40, 77, 27,
                  40, 46, 35, 43, 47, 31, 77, 38, 27, 40, 30, 64,
                  79, 77, 77, 77, 77, 77, 77, 77, 77, 23, 34, 41,
                  77, 45, 27, 35, 30, 77, 72, 20, 49, 41, 77, 48,
                  27, 45, 46, 77, 27, 40, 30, 77, 46, 44, 47, 40,
                  37, 38, 31, 45, 45, 77, 38, 31, 33, 45, 77, 41,
                  32, 77, 45, 46, 41, 40, 31, 79, 77, 77, 77, 77,
                  77, 77, 77, 77, 19, 46, 27, 40, 30, 77, 35, 40,
                  77, 46, 34, 31, 77, 30, 31, 45, 31, 44, 46, 63,
                  77, 63, 77, 63, 77, 63, 77, 14, 31, 27, 44, 77,
                  46, 34, 31, 39, 64, 77, 41, 40, 77, 46, 34, 31,
                  77, 45, 27, 40, 30, 64, 79, 77, 77, 77, 77, 77,
                  77, 77, 77, 8, 27, 38, 32, 77, 45, 47, 40, 37,
                  77, 27, 77, 45, 34, 27, 46, 46, 31, 44, 31, 30,
                  77, 48, 35, 45, 27, 33, 31, 77, 38, 35, 31, 45,
                  64, 77, 49, 34, 41, 45, 31, 77, 32, 44, 41, 49,
                  40, 64, 79, 77, 77, 77, 77, 77, 77, 77, 77, 1,
                  40, 30, 77, 49, 44, 35, 40, 37, 38, 31, 30, 77,
                  38, 35, 42, 64, 77, 27, 40, 30, 77, 45, 40, 31,
                  31, 44, 77, 41, 32, 77, 29, 41, 38, 30, 77, 29,
                  41, 39, 39, 27, 40, 30, 64, 79, 77, 77, 77, 77,
                  77, 77, 77, 77, 20, 31, 38, 38, 77, 46, 34, 27,
                  46, 77, 35, 46, 45, 77, 45, 29, 47, 38, 42, 46,
                  41, 44, 77, 49, 31, 38, 38, 77, 46, 34, 41, 45,
                  31, 77, 42, 27, 45, 45, 35, 41, 40, 45, 77, 44,
                  31, 27, 30, 79, 77, 77, 77, 77, 77, 77, 77, 77,
                  23, 34, 35, 29, 34, 77, 51, 31, 46, 77, 45, 47,
                  44, 48, 35, 48, 31, 64, 77, 45, 46, 27, 39, 42,
                  31, 30, 77, 41, 40, 77, 46, 34, 31, 45, 31, 77,
                  38, 35, 32, 31, 38, 31, 45, 45, 77, 46, 34, 35,
                  40, 33, 45, 64, 79, 77, 77, 77, 77, 77, 77, 77,
                  77, 20, 34, 31, 77, 34, 27, 40, 30, 77, 46, 34,
                  27, 46, 77, 39, 41, 29, 37, 31, 30, 77, 46, 34,
                  31, 39, 64, 77, 27, 40, 30, 77, 46, 34, 31, 77,
                  34, 31, 27, 44, 46, 77, 46, 34, 27, 46, 77, 32,
                  31, 30, 66, 79, 77, 77, 77, 77, 77, 77, 77, 77,
                  1, 40, 30, 77, 41, 40, 77, 46, 34, 31, 77, 42,
                  31, 30, 31, 45, 46, 27, 38, 64, 77, 46, 34, 31,
                  45, 31, 77, 49, 41, 44, 30, 45, 77, 27, 42, 42,
                  31, 27, 44, 65, 79, 77, 77, 77, 77, 77, 77, 77,
                  77, 13, 51, 77, 40, 27, 39, 31, 77, 35, 45, 77,
                  15, 52, 51, 39, 27, 40, 30, 35, 27, 45, 64, 77,
                  11, 35, 40, 33, 77, 41, 32, 77, 11, 35, 40, 33,
                  45, 66, 79, 77, 77, 77, 77, 77, 77, 77, 77, 12,
                  41, 41, 37, 77, 41, 40, 77, 39, 51, 77, 23, 41,
                  44, 37, 45, 64, 77, 51, 31, 77, 13, 35, 33, 34,
                  46, 51, 64, 77, 27, 40, 30, 77, 30, 31, 45, 42,
                  27, 35, 44, 67, 79, 77, 77, 77, 77, 77, 77, 77,
                  77, 14, 41, 46, 34, 35, 40, 33, 77, 28, 31, 45,
                  35, 30, 31, 77, 44, 31, 39, 27, 35, 40, 45, 63,
                  77, 18, 41, 47, 40, 30, 77, 46, 34, 31, 77, 30,
                  31, 29, 27, 51, 79, 77, 77, 77, 77, 77, 77, 77,
                  77, 15, 32, 77, 46, 34, 27, 46, 77, 29, 41, 38,
                  41, 45, 45, 27, 38, 77, 23, 44, 31, 29, 37, 64,
                  77, 28, 41, 47, 40, 30, 38, 31, 45, 45, 77, 27,
                  40, 30, 77, 28, 27, 44, 31, 79, 77, 77, 77, 77,
                  77, 77, 77, 77, 20, 34, 31, 77, 38, 41, 40, 31,
                  77, 27, 40, 30, 77, 38, 31, 48, 31, 38, 77, 45,
                  27, 40, 30, 45, 77, 45, 46, 44, 31, 46, 29, 34,
                  77, 32, 27, 44, 77, 27, 49, 27, 51, 79, 77, 77,
                  77, 77, 77, 77, 77, 77]]    ),
              torch.tensor([[0, 0, 0, 1069, 11, -1, -1, -1, -1]]    ),
              torch.tensor([[0, 0, 0, 1069, 11, -1, -1, -1, -1]]    ),
          ]
          # fmt: on
          self.assertTrue(torch.allclose(tokens[0]							,				EXPECTED_OUTPUT[0]    )    )
          self.assertTrue(torch.allclose(tokens[1]							,				EXPECTED_OUTPUT[1]    )    )
          self.assertTrue(torch.allclose(tokens[2]							,				EXPECTED_OUTPUT[2]    )    )