├── .github └── workflows │ └── python.yaml ├── .gitignore ├── .pre-commit-config.yaml ├── .vscode ├── launch.json └── settings.json ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── pyproject.toml ├── src └── openai_messages_token_helper │ ├── __init__.py │ ├── function_format.py │ ├── images_helper.py │ ├── message_builder.py │ ├── model_helper.py │ └── py.typed └── tests ├── __init__.py ├── conftest.py ├── functions.py ├── image_large.png ├── image_messages.py ├── messages.py ├── test_imageshelper.py ├── test_messagebuilder.py ├── test_modelhelper.py ├── verify_functions.py └── verify_openai.py /.github/workflows/python.yaml: -------------------------------------------------------------------------------- 1 | name: Python checks 2 | 3 | on: 4 | push: 5 | branches: [ main, master ] 6 | pull_request: 7 | branches: [ main, master ] 8 | 9 | jobs: 10 | build: 11 | name: Test with Python ${{ matrix.python_version }} 12 | runs-on: ubuntu-latest 13 | strategy: 14 | fail-fast: false 15 | matrix: 16 | python_version: ["3.9", "3.10", "3.11", "3.12"] 17 | steps: 18 | - uses: actions/checkout@v3 19 | - name: Set up Python 3 20 | uses: actions/setup-python@v3 21 | with: 22 | python-version: ${{ matrix.python_version }} 23 | - name: Install dependencies 24 | run: | 25 | python3 -m pip install --upgrade pip 26 | python3 -m pip install -e '.[dev]' 27 | - name: Lint with ruff 28 | run: ruff check . 29 | - name: Check formatting with black 30 | run: black . --check --verbose 31 | - name: Run unit tests 32 | run: | 33 | python3 -m pytest -s -vv --cov --cov-fail-under=97 34 | - name: Run type checks 35 | run: python3 -m mypy . 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/pre-commit/pre-commit-hooks 3 | rev: v5.0.0 4 | hooks: 5 | - id: check-yaml 6 | - id: end-of-file-fixer 7 | - id: trailing-whitespace 8 | - repo: https://github.com/astral-sh/ruff-pre-commit 9 | rev: v0.9.0 10 | hooks: 11 | - id: ruff 12 | - repo: https://github.com/psf/black 13 | rev: 24.10.0 14 | hooks: 15 | - id: black 16 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Python: Debug Tests", 9 | "type": "debugpy", 10 | "request": "launch", 11 | "program": "${file}", 12 | "purpose": ["debug-test"], 13 | "console": "integratedTerminal", 14 | "justMyCode": false 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.testing.pytestArgs": [ 3 | "tests" 4 | ], 5 | "python.testing.unittestEnabled": false, 6 | "python.testing.pytestEnabled": true, 7 | "files.exclude": { 8 | ".coverage": true, 9 | ".pytest_cache": true, 10 | "__pycache__": true, 11 | ".ruff_cache": true, 12 | ".mypy_cache": true, 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | ## [0.1.11] - Jan 10, 2025 6 | 7 | - When no "detail" is provided for an "image_url" message part, "auto" is now assumed. 8 | 9 | ## [0.1.10] - Aug 7, 2024 10 | 11 | - Add additional OpenAI.com model names to the `get_token_limit` function. 12 | 13 | ## [0.1.9] - Aug 7, 2024 14 | 15 | - Add gpt-4o-mini support, by adding a 33.3x multiplier to the token cost. 16 | 17 | ## [0.1.8] - Aug 3, 2024 18 | 19 | - Fix the type for the tool_choice param to be inclusive of "auto" and other options. 20 | 21 | ## [0.1.7] - Aug 3, 2024 22 | 23 | - Fix bug where you couldn't pass in example tool calls in `few_shots` to `build_messages`. 24 | 25 | ## [0.1.6] - Aug 2, 2024 26 | 27 | - Fix bug where you couldn't pass in `tools` and `default_to_cl100k` to True with a non-OpenAI model. 28 | 29 | ## [0.1.5] - June 4, 2024 30 | 31 | - Remove spurious `print` call when counting tokens for function calling. 32 | 33 | ## [0.1.4] - May 14, 2024 34 | 35 | - Add support and tests for gpt-4o, which has a different tokenizer. 36 | 37 | ## [0.1.3] - May 2, 2024 38 | 39 | - Use openai type annotations for more precise type hints, and add a typing test. 40 | 41 | ## [0.1.2] - May 2, 2024 42 | 43 | - Add `py.typed` file so that mypy can find the type hints in this package. 44 | 45 | ## [0.1.0] - May 2, 2024 46 | 47 | - Add `count_tokens_for_system_and_tools` to count tokens for system message and tools. You should count the tokens for both together, since the token count for tools varies based off whether a system message is provided. 48 | - Updated `build_messages` to allow for `tools` and `tool_choice` to be passed in. 49 | - Breaking change: Changed `new_user_message` to `new_user_content` in `build_messages` for clarity. 50 | 51 | ## [0.0.6] - April 24, 2024 52 | 53 | - Add keyword argument `fallback_to_default` to `build_messages` function to allow for defaulting to the CL100k token encoder and minimum GPT token limit if the model is not found. 54 | - Fixed usage of `past_messages` argument of `build_messages` to not skip the last past message. (New user message should *not* be passed in) 55 | 56 | ## [0.0.5] - April 24, 2024 57 | 58 | - Add keyword argument `default_to_cl100k` to `count_tokens_for_message` function to allow for defaulting to the CL100k token limit if the model is not found. 59 | - Add keyword argument `default_to_minimum` to `get_token_limit` function to allow for defaulting to the minimum token limit if the model is not found. 60 | 61 | ## [0.0.4] - April 21, 2024 62 | 63 | - Rename to openai-messages-token-helper from llm-messages-token-helper to reflect library's current OpenAI focus. 64 | 65 | ## [0.0.3] - April 21, 2024 66 | 67 | - Fix for `count_tokens_for_message` function to match OpenAI output precisely, particularly for calls with images to GPT-4 vision. 68 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to contribute 2 | 3 | ## Development 4 | 5 | Install the project dependencies: 6 | 7 | ```sh 8 | python3 -m pip install -e '.[dev]' 9 | pre-commit install 10 | ``` 11 | 12 | Run the tests: 13 | 14 | ```sh 15 | python3 -m pytest 16 | ``` 17 | 18 | ## Publishing 19 | 20 | 1. Update the CHANGELOG with description of changes 21 | 22 | 2. Update the version number in pyproject.toml 23 | 24 | 3. Push the changes to the main branch 25 | 26 | 4. Publish to PyPi: 27 | 28 | ```shell 29 | export FLIT_USERNAME=__token__ 30 | export FLIT_PASSWORD= 31 | flit publish 32 | ``` 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2023 Brian Okken 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # openai-messages-token-helper 2 | 3 | A helper library for estimating tokens used by messages and building messages lists that fit within the token limits of a model. 4 | Currently designed to work with the OpenAI GPT models (including GPT-4 turbo with vision). 5 | Uses the tiktoken library for tokenizing text and the Pillow library for image-related calculations. 6 | 7 | ## Installation 8 | 9 | Install the package: 10 | 11 | ```sh 12 | python3 -m pip install openai-messages-token-helper 13 | ``` 14 | 15 | ## Usage 16 | 17 | The library provides the following functions: 18 | 19 | * [`build_messages`](#build_messages) 20 | * [`count_tokens_for_message`](#count_tokens_for_message) 21 | * [`count_tokens_for_image`](#count_tokens_for_image) 22 | * [`get_token_limit`](#get_token_limit) 23 | 24 | ### `build_messages` 25 | 26 | Build a list of messages for a chat conversation, given the system prompt, new user message, 27 | and past messages. The function will truncate the history of past messages if necessary to 28 | stay within the token limit. 29 | 30 | Arguments: 31 | 32 | * `model` (`str`): The model name to use for token calculation, like gpt-3.5-turbo. 33 | * `system_prompt` (`str`): The initial system prompt message. 34 | * `tools` (`List[openai.types.chat.ChatCompletionToolParam]`): (Optional) The tools that will be used in the conversation. These won't be part of the final returned messages, but they will be used to calculate the token count. 35 | * `tool_choice` (`openai.types.chat.ChatCompletionToolChoiceOptionParam`): (Optional) The tool choice that will be used in the conversation. This won't be part of the final returned messages, but it will be used to calculate the token count. 36 | * `new_user_content` (`str | List[openai.types.chat.ChatCompletionContentPartParam]`): (Optional) The content of new user message to append. 37 | * `past_messages` (`list[openai.types.chat.ChatCompletionMessageParam]`): (Optional) The list of past messages in the conversation. 38 | * `few_shots` (`list[openai.types.chat.ChatCompletionMessageParam]`): (Optional) A few-shot list of messages to insert after the system prompt. 39 | * `max_tokens` (`int`): (Optional) The maximum number of tokens allowed for the conversation. 40 | * `fallback_to_default` (`bool`): (Optional) Whether to fallback to default model/token limits if model is not found. Defaults to `False`. 41 | 42 | 43 | Returns: 44 | 45 | * `list[openai.types.chat.ChatCompletionMessageParam]` 46 | 47 | Example: 48 | 49 | ```python 50 | from openai_messages_token_helper import build_messages 51 | 52 | messages = build_messages( 53 | model="gpt-35-turbo", 54 | system_prompt="You are a bot.", 55 | new_user_content="That wasn't a good poem.", 56 | past_messages=[ 57 | { 58 | "role": "user", 59 | "content": "Write me a poem", 60 | }, 61 | { 62 | "role": "assistant", 63 | "content": "Tuna tuna I love tuna", 64 | }, 65 | ], 66 | few_shots=[ 67 | { 68 | "role": "user", 69 | "content": "Write me a poem", 70 | }, 71 | { 72 | "role": "assistant", 73 | "content": "Tuna tuna is the best", 74 | }, 75 | ] 76 | ) 77 | ``` 78 | 79 | ### `count_tokens_for_message` 80 | 81 | Counts the number of tokens in a message. 82 | 83 | Arguments: 84 | 85 | * `model` (`str`): The model name to use for token calculation, like gpt-3.5-turbo. 86 | * `message` (`openai.types.chat.ChatCompletionMessageParam`): The message to count tokens for. 87 | * `default_to_cl100k` (`bool`): Whether to default to the CL100k token limit if the model is not found. 88 | 89 | Returns: 90 | 91 | * `int`: The number of tokens in the message. 92 | 93 | Example: 94 | 95 | ```python 96 | from openai_messages_token_helper import count_tokens_for_message 97 | 98 | message = { 99 | "role": "user", 100 | "content": "Hello, how are you?", 101 | } 102 | model = "gpt-4" 103 | num_tokens = count_tokens_for_message(model, message) 104 | ``` 105 | 106 | ### `count_tokens_for_image` 107 | 108 | Count the number of tokens for an image sent to GPT-4-vision, in base64 format. 109 | 110 | Arguments: 111 | 112 | * `image` (`str`): The base64-encoded image. 113 | 114 | Returns: 115 | 116 | * `int`: The number of tokens used up for the image. 117 | 118 | Example: 119 | 120 | ```python 121 | 122 | Count the number of tokens for an image sent to GPT-4-vision: 123 | 124 | ```python 125 | from openai_messages_token_helper import count_tokens_for_image 126 | 127 | image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEA..." 128 | num_tokens = count_tokens_for_image(image) 129 | ``` 130 | 131 | ### `get_token_limit` 132 | 133 | Get the token limit for a given GPT model name (OpenAI.com or Azure OpenAI supported). 134 | 135 | Arguments: 136 | 137 | * `model` (`str`): The model name to use for token calculation, like gpt-3.5-turbo (OpenAI.com) or gpt-35-turbo (Azure). 138 | * `default_to_minimum` (`bool`): Whether to default to the minimum token limit if the model is not found. 139 | 140 | Returns: 141 | 142 | * `int`: The token limit for the model. 143 | 144 | Example: 145 | 146 | ```python 147 | from openai_messages_token_helper import get_token_limit 148 | 149 | model = "gpt-4" 150 | max_tokens = get_token_limit(model) 151 | ``` 152 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "openai-messages-token-helper" 3 | description = "A helper library for estimating tokens used by messages sent through OpenAI Chat Completions API." 4 | version = "0.1.11" 5 | authors = [{name = "Pamela Fox"}] 6 | requires-python = ">=3.9" 7 | readme = "README.md" 8 | license = {file = "LICENSE"} 9 | dependencies = [ 10 | "openai", 11 | "tiktoken", 12 | "pillow" 13 | ] 14 | classifiers = [ 15 | "License :: OSI Approved :: MIT License", 16 | "Programming Language :: Python", 17 | "Programming Language :: Python :: 3", 18 | "Programming Language :: Python :: 3.9", 19 | "Programming Language :: Python :: 3.10", 20 | "Programming Language :: Python :: 3.11", 21 | "Framework :: Pytest" 22 | ] 23 | 24 | [project.urls] 25 | Home = "https://github.com/pamelafox/openai-messages-token-helper" 26 | 27 | [project.optional-dependencies] 28 | dev = [ 29 | "pytest", 30 | "pytest-cov", 31 | "pre-commit", 32 | "ruff", 33 | "black", 34 | "flit", 35 | "azure-identity", 36 | "python-dotenv", 37 | "mypy" 38 | ] 39 | 40 | [build-system] 41 | requires = ["flit_core >=3.2,<4"] 42 | build-backend = "flit_core.buildapi" 43 | 44 | [tool.ruff] 45 | line-length = 120 46 | target-version = "py39" 47 | output-format = "full" 48 | 49 | [tool.ruff.lint] 50 | select = ["E", "F", "I", "UP"] 51 | ignore = ["D203", "E501"] 52 | 53 | [tool.black] 54 | line-length = 120 55 | target-version = ["py39"] 56 | 57 | [tool.pytest.ini_options] 58 | addopts = "-ra --cov" 59 | 60 | [tool.coverage.report] 61 | show_missing = true 62 | -------------------------------------------------------------------------------- /src/openai_messages_token_helper/__init__.py: -------------------------------------------------------------------------------- 1 | from .images_helper import count_tokens_for_image 2 | from .message_builder import build_messages 3 | from .model_helper import count_tokens_for_message, count_tokens_for_system_and_tools, get_token_limit 4 | 5 | __all__ = [ 6 | "build_messages", 7 | "count_tokens_for_message", 8 | "count_tokens_for_image", 9 | "get_token_limit", 10 | "count_tokens_for_system_and_tools", 11 | ] 12 | -------------------------------------------------------------------------------- /src/openai_messages_token_helper/function_format.py: -------------------------------------------------------------------------------- 1 | # Based on https://github.com/forestwanglin/openai-java/blob/main/jtokkit/src/main/java/xyz/felh/openai/jtokkit/utils/TikTokenUtils.java 2 | 3 | 4 | def format_function_definitions(tools): 5 | lines = [] 6 | lines.append("namespace functions {") 7 | lines.append("") 8 | for tool in tools: 9 | function = tool.get("function") 10 | if function_description := function.get("description"): 11 | lines.append(f"// {function_description}") 12 | function_name = function.get("name") 13 | parameters = function.get("parameters", {}) 14 | properties = parameters.get("properties") 15 | if properties and properties.keys(): 16 | lines.append(f"type {function_name} = (_: {{") 17 | lines.append(format_object_parameters(parameters, 0)) 18 | lines.append("}) => any;") 19 | else: 20 | lines.append(f"type {function_name} = () => any;") 21 | lines.append("") 22 | lines.append("} // namespace functions") 23 | return "\n".join(lines) 24 | 25 | 26 | def format_object_parameters(parameters, indent): 27 | properties = parameters.get("properties") 28 | if not properties: 29 | return "" 30 | required_params = parameters.get("required", []) 31 | lines = [] 32 | for key, props in properties.items(): 33 | description = props.get("description") 34 | if description: 35 | lines.append(f"// {description}") 36 | question = "?" 37 | if required_params and key in required_params: 38 | question = "" 39 | lines.append(f"{key}{question}: {format_type(props, indent)},") 40 | return "\n".join([" " * max(0, indent) + line for line in lines]) 41 | 42 | 43 | def format_type(props, indent): 44 | type = props.get("type") 45 | if type == "string": 46 | if "enum" in props: 47 | return " | ".join([f'"{item}"' for item in props["enum"]]) 48 | return "string" 49 | elif type == "array": 50 | # items is required, OpenAI throws an error if it's missing 51 | return f"{format_type(props['items'], indent)}[]" 52 | elif type == "object": 53 | return f"{{\n{format_object_parameters(props, indent + 2)}\n}}" 54 | elif type in ["integer", "number"]: 55 | if "enum" in props: 56 | return " | ".join([f'"{item}"' for item in props["enum"]]) 57 | return "number" 58 | elif type == "boolean": 59 | return "boolean" 60 | elif type == "null": 61 | return "null" 62 | else: 63 | # This is a guess, as an empty string doesn't yield the expected token count 64 | return "any" 65 | -------------------------------------------------------------------------------- /src/openai_messages_token_helper/images_helper.py: -------------------------------------------------------------------------------- 1 | import base64 2 | import math 3 | import re 4 | from fractions import Fraction 5 | from io import BytesIO 6 | from typing import Optional 7 | 8 | from PIL import Image 9 | 10 | 11 | def get_image_dims(image_uri: str) -> tuple[int, int]: 12 | # From https://github.com/openai/openai-cookbook/pull/881/files 13 | if re.match(r"data:image\/\w+;base64", image_uri): 14 | image_uri = re.sub(r"data:image\/\w+;base64,", "", image_uri) 15 | image = Image.open(BytesIO(base64.b64decode(image_uri))) 16 | return image.size 17 | else: 18 | raise ValueError("Image must be a base64 string.") 19 | 20 | 21 | def count_tokens_for_image(image_uri: str, detail: str = "auto", model: Optional[str] = None) -> int: 22 | # From https://github.com/openai/openai-cookbook/pull/881/files 23 | # Based on https://platform.openai.com/docs/guides/vision 24 | multiplier = Fraction(1, 1) 25 | if model == "gpt-4o-mini": 26 | multiplier = Fraction(100, 3) 27 | COST_PER_TILE = 85 * multiplier 28 | LOW_DETAIL_COST = COST_PER_TILE 29 | HIGH_DETAIL_COST_PER_TILE = COST_PER_TILE * 2 30 | 31 | if detail == "auto": 32 | # assume high detail for now 33 | detail = "high" 34 | 35 | if detail == "low": 36 | # Low detail images have a fixed cost 37 | return int(LOW_DETAIL_COST) 38 | elif detail == "high": 39 | # Calculate token cost for high detail images 40 | width, height = get_image_dims(image_uri) 41 | # Check if resizing is needed to fit within a 2048 x 2048 square 42 | if max(width, height) > 2048: 43 | # Resize dimensions to fit within a 2048 x 2048 square 44 | ratio = 2048 / max(width, height) 45 | width = int(width * ratio) 46 | height = int(height * ratio) 47 | # Further scale down to 768px on the shortest side 48 | if min(width, height) > 768: 49 | ratio = 768 / min(width, height) 50 | width = int(width * ratio) 51 | height = int(height * ratio) 52 | # Calculate the number of 512px squares 53 | num_squares = math.ceil(width / 512) * math.ceil(height / 512) 54 | # Calculate the total token cost 55 | total_cost = num_squares * HIGH_DETAIL_COST_PER_TILE + COST_PER_TILE 56 | return math.ceil(total_cost) 57 | else: 58 | # Invalid detail_option 59 | raise ValueError("Invalid value for detail parameter. Use 'low' or 'high'.") 60 | -------------------------------------------------------------------------------- /src/openai_messages_token_helper/message_builder.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import unicodedata 3 | from collections.abc import Iterable 4 | from typing import Optional, Union 5 | 6 | from openai.types.chat import ( 7 | ChatCompletionAssistantMessageParam, 8 | ChatCompletionContentPartParam, 9 | ChatCompletionMessageParam, 10 | ChatCompletionMessageToolCallParam, 11 | ChatCompletionRole, 12 | ChatCompletionSystemMessageParam, 13 | ChatCompletionToolChoiceOptionParam, 14 | ChatCompletionToolMessageParam, 15 | ChatCompletionToolParam, 16 | ChatCompletionUserMessageParam, 17 | ) 18 | 19 | from .model_helper import count_tokens_for_message, count_tokens_for_system_and_tools, get_token_limit 20 | 21 | 22 | def normalize_content(content: Union[str, Iterable[ChatCompletionContentPartParam], None]): 23 | if content is None: 24 | return None 25 | if isinstance(content, str): 26 | return unicodedata.normalize("NFC", content) 27 | else: 28 | for part in content: 29 | if part["type"] == "text": 30 | part["text"] = unicodedata.normalize("NFC", part["text"]) 31 | return content 32 | 33 | 34 | class _MessageBuilder: 35 | """ 36 | A class for building and managing messages in a chat conversation. 37 | Attributes: 38 | message (list): A list of dictionaries representing chat messages. 39 | model (str): The name of the ChatGPT model. 40 | token_count (int): The total number of tokens in the conversation. 41 | Methods: 42 | __init__(self, system_content: str, chatgpt_model: str): Initializes the MessageBuilder instance. 43 | insert_message(self, role: str, content: str, index: int = 1): Inserts a new message to the conversation. 44 | """ 45 | 46 | def __init__(self, system_content: str): 47 | self.system_message = ChatCompletionSystemMessageParam(role="system", content=normalize_content(system_content)) 48 | self.messages: list[ChatCompletionMessageParam] = [] 49 | 50 | @property 51 | def all_messages(self) -> list[ChatCompletionMessageParam]: 52 | return [self.system_message] + self.messages 53 | 54 | def insert_message( 55 | self, 56 | role: ChatCompletionRole, 57 | content: Union[str, Iterable[ChatCompletionContentPartParam], None], 58 | index: int = 0, 59 | tool_calls: Optional[Iterable[ChatCompletionMessageToolCallParam]] = None, 60 | tool_call_id: Optional[str] = None, 61 | ): 62 | """ 63 | Inserts a message into the conversation at the specified index, 64 | or at index 0 if no index is specified. 65 | Args: 66 | role (str): The role of the message sender (either "user", "system", or "assistant"). 67 | content (str | List[ChatCompletionContentPartParam]): The content of the message. 68 | index (int): The index at which to insert the message. 69 | """ 70 | message: ChatCompletionMessageParam 71 | if role == "user": 72 | message = ChatCompletionUserMessageParam(role="user", content=normalize_content(content)) 73 | elif role == "assistant" and isinstance(content, str): 74 | message = ChatCompletionAssistantMessageParam(role="assistant", content=normalize_content(content)) 75 | elif role == "assistant" and tool_calls is not None: 76 | message = ChatCompletionAssistantMessageParam(role="assistant", tool_calls=tool_calls) 77 | elif role == "tool" and tool_call_id is not None: 78 | message = ChatCompletionToolMessageParam( 79 | role="tool", tool_call_id=tool_call_id, content=normalize_content(content) 80 | ) 81 | else: 82 | raise ValueError("Invalid message for builder") 83 | self.messages.insert(index, message) 84 | 85 | 86 | def build_messages( 87 | model: str, 88 | system_prompt: str, 89 | *, 90 | tools: Optional[list[ChatCompletionToolParam]] = None, 91 | tool_choice: Optional[ChatCompletionToolChoiceOptionParam] = None, 92 | new_user_content: Union[str, list[ChatCompletionContentPartParam], None] = None, # list is for GPT4v usage 93 | past_messages: list[ChatCompletionMessageParam] = [], # *not* including system prompt 94 | few_shots: list[ChatCompletionMessageParam] = [], # will always be inserted after system prompt 95 | max_tokens: Optional[int] = None, 96 | fallback_to_default: bool = False, 97 | ) -> list[ChatCompletionMessageParam]: 98 | """ 99 | Build a list of messages for a chat conversation, given the system prompt, new user message, 100 | and past messages. The function will truncate the history of past messages if necessary to 101 | stay within the token limit. 102 | Args: 103 | model (str): The model name to use for token calculation, like gpt-3.5-turbo. 104 | system_prompt (str): The initial system prompt message. 105 | tools (list[ChatCompletionToolParam]): A list of tools to include in the conversation. 106 | tool_choice (ChatCompletionToolChoiceOptionParam): The tool to use in the conversation. 107 | new_user_content (str | List[ChatCompletionContentPartParam]): Content of new user message to append. 108 | past_messages (list[ChatCompletionMessageParam]): The list of past messages in the conversation. 109 | few_shots (list[ChatCompletionMessageParam]): A few-shot list of messages to insert after the system prompt. 110 | max_tokens (int): The maximum number of tokens allowed for the conversation. 111 | fallback_to_default (bool): Whether to fallback to default model if the model is not found. 112 | """ 113 | if max_tokens is None: 114 | max_tokens = get_token_limit(model, default_to_minimum=fallback_to_default) 115 | 116 | # Start with the required messages: system prompt, few-shots, and new user message 117 | message_builder = _MessageBuilder(system_prompt) 118 | 119 | for shot in reversed(few_shots): 120 | if shot["role"] is None or (shot.get("content") is None and shot.get("tool_calls") is None): 121 | raise ValueError("Few-shot messages must have role and either content or tool_calls") 122 | tool_call_id = shot.get("tool_call_id") 123 | if tool_call_id is not None and not isinstance(tool_call_id, str): 124 | raise ValueError("tool_call_id must be a string value") 125 | tool_calls = shot.get("tool_calls") 126 | if tool_calls is not None and not isinstance(tool_calls, Iterable): 127 | raise ValueError("tool_calls must be a list of tool calls") 128 | message_builder.insert_message( 129 | shot["role"], shot.get("content"), tool_calls=tool_calls, tool_call_id=tool_call_id # type: ignore[arg-type] 130 | ) 131 | 132 | append_index = len(few_shots) 133 | 134 | if new_user_content: 135 | message_builder.insert_message("user", new_user_content, index=append_index) 136 | 137 | total_token_count = count_tokens_for_system_and_tools( 138 | model, message_builder.system_message, tools, tool_choice, default_to_cl100k=fallback_to_default 139 | ) 140 | for existing_message in message_builder.messages: 141 | total_token_count += count_tokens_for_message(model, existing_message, default_to_cl100k=fallback_to_default) 142 | 143 | newest_to_oldest = list(reversed(past_messages)) 144 | for message in newest_to_oldest: 145 | potential_message_count = count_tokens_for_message(model, message, default_to_cl100k=fallback_to_default) 146 | if (total_token_count + potential_message_count) > max_tokens: 147 | logging.info("Reached max tokens of %d, history will be truncated", max_tokens) 148 | break 149 | 150 | if message["role"] is None or message["content"] is None: 151 | raise ValueError("Few-shot messages must have both role and content") 152 | message_builder.insert_message(message["role"], message["content"], index=append_index) # type: ignore[arg-type] 153 | total_token_count += potential_message_count 154 | return message_builder.all_messages 155 | -------------------------------------------------------------------------------- /src/openai_messages_token_helper/model_helper.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | import logging 4 | 5 | import tiktoken 6 | from openai.types.chat import ( 7 | ChatCompletionMessageParam, 8 | ChatCompletionSystemMessageParam, 9 | ChatCompletionToolChoiceOptionParam, 10 | ChatCompletionToolParam, 11 | ) 12 | 13 | from .function_format import format_function_definitions 14 | from .images_helper import count_tokens_for_image 15 | 16 | MODELS_2_TOKEN_LIMITS = { 17 | "gpt-35-turbo": 4000, 18 | "gpt-3.5-turbo": 4000, 19 | "gpt-35-turbo-16k": 16000, 20 | "gpt-3.5-turbo-16k": 16000, 21 | "gpt-4": 8100, 22 | "gpt-4-32k": 32000, 23 | "gpt-4v": 128000, 24 | "gpt-4o": 128000, 25 | "gpt-4o-mini": 128000, 26 | # OpenAI specific model names: 27 | # https://platform.openai.com/docs/models/gpt-4-turbo-and-gpt-4 28 | "gpt-4-0613": 8192, 29 | "gpt-4-turbo": 128000, 30 | "gpt-4-turbo-2024-04-09": 128000, 31 | "gpt-4-turbo-preview": 128000, 32 | "gpt-4-0125-preview": 128000, 33 | "gpt-4-1106-preview": 128000, 34 | } 35 | 36 | 37 | AOAI_2_OAI = {"gpt-35-turbo": "gpt-3.5-turbo", "gpt-35-turbo-16k": "gpt-3.5-turbo-16k", "gpt-4v": "gpt-4-turbo-vision"} 38 | 39 | logger = logging.getLogger("openai_messages_token_helper") 40 | 41 | 42 | def get_token_limit(model: str, default_to_minimum=False) -> int: 43 | """ 44 | Get the token limit for a given GPT model name (OpenAI.com or Azure OpenAI supported). 45 | Args: 46 | model (str): The name of the model to get the token limit for. 47 | default_to_minimum (bool): Whether to default to the minimum token limit if the model is not found. 48 | Returns: 49 | int: The token limit for the model. 50 | """ 51 | if model not in MODELS_2_TOKEN_LIMITS: 52 | if default_to_minimum: 53 | min_token_limit = min(MODELS_2_TOKEN_LIMITS.values()) 54 | logger.warning("Model %s not found, defaulting to minimum token limit %d", model, min_token_limit) 55 | return min_token_limit 56 | else: 57 | raise ValueError(f"Called with unknown model name: {model}") 58 | return MODELS_2_TOKEN_LIMITS[model] 59 | 60 | 61 | def encoding_for_model(model: str, default_to_cl100k=False) -> tiktoken.Encoding: 62 | """ 63 | Get the encoding for a given GPT model name (OpenAI.com or Azure OpenAI supported). 64 | Args: 65 | model (str): The name of the model to get the encoding for. 66 | default_to_cl100k (bool): Whether to default to the CL100k encoding if the model is not found. 67 | Returns: 68 | tiktoken.Encoding: The encoding for the model. 69 | """ 70 | if ( 71 | model == "" 72 | or model is None 73 | or (model not in AOAI_2_OAI and model not in MODELS_2_TOKEN_LIMITS and not default_to_cl100k) 74 | ): 75 | raise ValueError("Expected valid OpenAI GPT model name") 76 | model = AOAI_2_OAI.get(model, model) 77 | try: 78 | return tiktoken.encoding_for_model(model) 79 | except KeyError: 80 | if default_to_cl100k: 81 | logger.warning("Model %s not found, defaulting to CL100k encoding", model) 82 | return tiktoken.get_encoding("cl100k_base") 83 | else: 84 | raise 85 | 86 | 87 | def count_tokens_for_message(model: str, message: ChatCompletionMessageParam, default_to_cl100k=False) -> int: 88 | """ 89 | Calculate the number of tokens required to encode a message. Based off cookbook: 90 | https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb 91 | 92 | Args: 93 | model (str): The name of the model to use for encoding. 94 | message (Mapping): The message to encode, in a dictionary-like object. 95 | default_to_cl100k (bool): Whether to default to the CL100k encoding if the model is not found. 96 | Returns: 97 | int: The total number of tokens required to encode the message. 98 | 99 | >> model = 'gpt-3.5-turbo' 100 | >> message = {'role': 'user', 'content': 'Hello, how are you?'} 101 | >> count_tokens_for_message(model, message) 102 | 13 103 | """ 104 | encoding = encoding_for_model(model, default_to_cl100k) 105 | 106 | # Assumes we're using a recent model 107 | tokens_per_message = 3 108 | 109 | num_tokens = tokens_per_message 110 | for key, value in message.items(): 111 | if isinstance(value, list): 112 | # For GPT-4-vision support, based on https://github.com/openai/openai-cookbook/pull/881/files 113 | for item in value: 114 | # Note: item[type] does not seem to be counted in the token count 115 | if item["type"] == "text": 116 | num_tokens += len(encoding.encode(item["text"])) 117 | elif item["type"] == "image_url": 118 | num_tokens += count_tokens_for_image( 119 | item["image_url"]["url"], item["image_url"].get("detail", "auto"), model 120 | ) 121 | elif isinstance(value, str): 122 | num_tokens += len(encoding.encode(value)) 123 | else: 124 | raise ValueError(f"Could not encode unsupported message value type: {type(value)}") 125 | if key == "name": 126 | num_tokens += 1 127 | num_tokens += 3 # every reply is primed with <|start|>assistant<|message|> 128 | return num_tokens 129 | 130 | 131 | def count_tokens_for_system_and_tools( 132 | model: str, 133 | system_message: ChatCompletionSystemMessageParam | None = None, 134 | tools: list[ChatCompletionToolParam] | None = None, 135 | tool_choice: ChatCompletionToolChoiceOptionParam | None = None, 136 | default_to_cl100k: bool = False, 137 | ) -> int: 138 | """ 139 | Calculate the number of tokens required to encode a system message and tools. 140 | Both must be calculated together because the count is lower if both are present. 141 | Based on https://github.com/forestwanglin/openai-java/blob/main/jtokkit/src/main/java/xyz/felh/openai/jtokkit/utils/TikTokenUtils.java 142 | 143 | Args: 144 | model (str): The name of the model to use for encoding. 145 | tools (list[dict[str, dict]]): The tools to encode. 146 | tool_choice (str | dict): The tool choice to encode. 147 | system_message (dict): The system message to encode. 148 | default_to_cl100k (bool): Whether to default to the CL100k encoding if the model is not found. 149 | Returns: 150 | int: The total number of tokens required to encode the system message and tools. 151 | """ 152 | encoding = encoding_for_model(model, default_to_cl100k) 153 | 154 | tokens = 0 155 | if system_message: 156 | tokens += count_tokens_for_message(model, system_message, default_to_cl100k) 157 | if tools: 158 | tokens += len(encoding.encode(format_function_definitions(tools))) 159 | tokens += 9 # Additional tokens for function definition of tools 160 | # If there's a system message and tools are present, subtract four tokens 161 | if tools and system_message: 162 | tokens -= 4 163 | # If tool_choice is 'none', add one token. 164 | # If it's an object, add 4 + the number of tokens in the function name. 165 | # If it's undefined or 'auto', don't add anything. 166 | if tool_choice == "none": 167 | tokens += 1 168 | elif isinstance(tool_choice, dict): 169 | tokens += 7 170 | tokens += len(encoding.encode(tool_choice["function"]["name"])) 171 | return tokens 172 | -------------------------------------------------------------------------------- /src/openai_messages_token_helper/py.typed: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pamelafox/openai-messages-token-helper/5c579fd05ca592f4813bae2a49af4bab9eafb6b5/src/openai_messages_token_helper/py.typed -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pamelafox/openai-messages-token-helper/5c579fd05ca592f4813bae2a49af4bab9eafb6b5/tests/__init__.py -------------------------------------------------------------------------------- /tests/conftest.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pamelafox/openai-messages-token-helper/5c579fd05ca592f4813bae2a49af4bab9eafb6b5/tests/conftest.py -------------------------------------------------------------------------------- /tests/functions.py: -------------------------------------------------------------------------------- 1 | search_sources_toolchoice_auto = { 2 | "system_message": { 3 | "role": "system", 4 | "content": "You are a bot.", 5 | }, 6 | "tools": [ 7 | { 8 | "type": "function", 9 | "function": { 10 | "name": "search_sources", 11 | "description": "Retrieve sources from the Azure AI Search index", 12 | "parameters": { 13 | "type": "object", 14 | "properties": { 15 | "search_query": { 16 | "type": "string", 17 | "description": "Query string to retrieve documents from azure search eg: 'Health care plan'", 18 | } 19 | }, 20 | "required": ["search_query"], 21 | }, 22 | }, 23 | } 24 | ], 25 | "tool_choice": "auto", 26 | "count": 66, 27 | } 28 | 29 | search_sources_toolchoice_none = { 30 | "system_message": { 31 | "role": "system", 32 | "content": "You are a bot.", 33 | }, 34 | "tools": [ 35 | { 36 | "type": "function", 37 | "function": { 38 | "name": "search_sources", 39 | "description": "Retrieve sources from the Azure AI Search index", 40 | "parameters": { 41 | "type": "object", 42 | "properties": { 43 | "search_query": { 44 | "type": "string", 45 | "description": "Query string to retrieve documents from azure search eg: 'Health care plan'", 46 | } 47 | }, 48 | "required": ["search_query"], 49 | }, 50 | }, 51 | } 52 | ], 53 | "tool_choice": "none", 54 | "count": 67, 55 | } 56 | 57 | search_sources_toolchoice_name = { 58 | "system_message": { 59 | "role": "system", 60 | "content": "You are a bot.", 61 | }, 62 | "tools": [ 63 | { 64 | "type": "function", 65 | "function": { 66 | "name": "search_sources", 67 | "description": "Retrieve sources from the Azure AI Search index", 68 | "parameters": { 69 | "type": "object", 70 | "properties": { 71 | "search_query": { 72 | "type": "string", 73 | "description": "Query string to retrieve documents from azure search eg: 'Health care plan'", 74 | } 75 | }, 76 | "required": ["search_query"], 77 | }, 78 | }, 79 | } 80 | ], 81 | "tool_choice": {"type": "function", "function": {"name": "search_sources"}}, 82 | "count": 75, 83 | } 84 | 85 | integer_enum = { 86 | "system_message": { 87 | "role": "system", 88 | "content": "You are a bot.", 89 | }, 90 | "tools": [ 91 | { 92 | "type": "function", 93 | "function": { 94 | "name": "data_demonstration", 95 | "description": "This is the main function description", 96 | "parameters": {"type": "object", "properties": {"integer_enum": {"type": "integer", "enum": [-1, 1]}}}, 97 | }, 98 | } 99 | ], 100 | "tool_choice": "none", 101 | "count": 54, 102 | } 103 | 104 | 105 | integer_enum_tool_choice_name = { 106 | "system_message": { 107 | "role": "system", 108 | "content": "You are a bot.", 109 | }, 110 | "tools": [ 111 | { 112 | "type": "function", 113 | "function": { 114 | "name": "data_demonstration", 115 | "description": "This is the main function description", 116 | "parameters": {"type": "object", "properties": {"integer_enum": {"type": "integer", "enum": [-1, 1]}}}, 117 | }, 118 | } 119 | ], 120 | "tool_choice": { 121 | "type": "function", 122 | "function": {"name": "data_demonstration"}, 123 | }, # 4 tokens for "data_demonstration" 124 | "count": 64, 125 | } 126 | 127 | no_parameters = { 128 | "system_message": { 129 | "role": "system", 130 | "content": "You are a bot.", 131 | }, 132 | "tools": [ 133 | { 134 | "type": "function", 135 | "function": { 136 | "name": "search_sources", 137 | "description": "Retrieve sources from the Azure AI Search index", 138 | }, 139 | } 140 | ], 141 | "tool_choice": "auto", 142 | "count": 42, 143 | } 144 | 145 | no_parameters_tool_choice_name = { 146 | "system_message": { 147 | "role": "system", 148 | "content": "You are a bot.", 149 | }, 150 | "tools": [ 151 | { 152 | "type": "function", 153 | "function": { 154 | "name": "search_sources", 155 | "description": "Retrieve sources from the Azure AI Search index", 156 | }, 157 | } 158 | ], 159 | "tool_choice": {"type": "function", "function": {"name": "search_sources"}}, # 2 tokens for "search_sources" 160 | "count": 51, 161 | } 162 | 163 | no_parameter_description_or_required = { 164 | "system_message": { 165 | "role": "system", 166 | "content": "You are a bot.", 167 | }, 168 | "tools": [ 169 | { 170 | "type": "function", 171 | "function": { 172 | "name": "search_sources", 173 | "description": "Retrieve sources from the Azure AI Search index", 174 | "parameters": {"type": "object", "properties": {"search_query": {"type": "string"}}}, 175 | }, 176 | } 177 | ], 178 | "tool_choice": "auto", 179 | "count": 49, 180 | } 181 | 182 | no_parameter_description = { 183 | "system_message": { 184 | "role": "system", 185 | "content": "You are a bot.", 186 | }, 187 | "tools": [ 188 | { 189 | "type": "function", 190 | "function": { 191 | "name": "search_sources", 192 | "description": "Retrieve sources from the Azure AI Search index", 193 | "parameters": { 194 | "type": "object", 195 | "properties": {"search_query": {"type": "string"}}, 196 | "required": ["search_query"], 197 | }, 198 | }, 199 | } 200 | ], 201 | "tool_choice": "auto", 202 | "count": 49, 203 | } 204 | 205 | string_enum = { 206 | "system_message": { 207 | "role": "system", 208 | "content": "You are a bot.", 209 | }, 210 | "tools": [ 211 | { 212 | "type": "function", 213 | "function": { 214 | "name": "summarize_order", 215 | "description": "Summarize the customer order request", 216 | "parameters": { 217 | "type": "object", 218 | "properties": { 219 | "product_name": { 220 | "type": "string", 221 | "description": "Product name ordered by customer", 222 | }, 223 | "quantity": { 224 | "type": "integer", 225 | "description": "Quantity ordered by customer", 226 | }, 227 | "unit": { 228 | "type": "string", 229 | "enum": ["meals", "days"], 230 | "description": "unit of measurement of the customer order", 231 | }, 232 | }, 233 | "required": ["product_name", "quantity", "unit"], 234 | }, 235 | }, 236 | } 237 | ], 238 | "tool_choice": "none", 239 | "count": 86, 240 | } 241 | 242 | inner_object = { 243 | "system_message": { 244 | "role": "system", 245 | "content": "You are a bot.", 246 | }, 247 | "tools": [ 248 | { 249 | "type": "function", 250 | "function": { 251 | "name": "data_demonstration", 252 | "description": "This is the main function description", 253 | "parameters": { 254 | "type": "object", 255 | "properties": { 256 | "object_1": { 257 | "type": "object", 258 | "description": "The object data type as a property", 259 | "properties": { 260 | "string1": {"type": "string"}, 261 | }, 262 | } 263 | }, 264 | "required": ["object_1"], 265 | }, 266 | }, 267 | } 268 | ], 269 | "tool_choice": "none", 270 | "count": 65, # counted 67, over by 2 271 | } 272 | """ 273 | namespace functions { 274 | 275 | // This is the main function description 276 | type data_demonstration = (_: { 277 | // The object data type as a property 278 | object_1: { 279 | string1?: string, 280 | }, 281 | }) => any; 282 | 283 | } // namespace functions 284 | """ 285 | 286 | inner_object_with_enum_only = { 287 | "system_message": { 288 | "role": "system", 289 | "content": "You are a bot.", 290 | }, 291 | "tools": [ 292 | { 293 | "type": "function", 294 | "function": { 295 | "name": "data_demonstration", 296 | "description": "This is the main function description", 297 | "parameters": { 298 | "type": "object", 299 | "properties": { 300 | "object_1": { 301 | "type": "object", 302 | "description": "The object data type as a property", 303 | "properties": {"string_2a": {"type": "string", "enum": ["Happy", "Sad"]}}, 304 | } 305 | }, 306 | "required": ["object_1"], 307 | }, 308 | }, 309 | } 310 | ], 311 | "tool_choice": "none", 312 | "count": 73, # counted 74, over by 1 313 | } 314 | """ 315 | namespace functions { 316 | 317 | // This is the main function description 318 | type data_demonstration = (_: { 319 | // The object data type as a property 320 | object_1: { 321 | string_2a?: "Happy" | "Sad", 322 | }, 323 | }) => any; 324 | 325 | } // namespace functions 326 | """ 327 | 328 | inner_object_with_enum = { 329 | "system_message": { 330 | "role": "system", 331 | "content": "You are a bot.", 332 | }, 333 | "tools": [ 334 | { 335 | "type": "function", 336 | "function": { 337 | "name": "data_demonstration", 338 | "description": "This is the main function description", 339 | "parameters": { 340 | "type": "object", 341 | "properties": { 342 | "object_1": { 343 | "type": "object", 344 | "description": "The object data type as a property", 345 | "properties": { 346 | "string_2a": {"type": "string", "enum": ["Happy", "Sad"]}, 347 | "string_2b": { 348 | "type": "string", 349 | "description": "Description in a second object is lost", 350 | }, 351 | }, 352 | } 353 | }, 354 | "required": ["object_1"], 355 | }, 356 | }, 357 | } 358 | ], 359 | "tool_choice": "none", 360 | "count": 89, # counted 92, over by 3 361 | } 362 | """ 363 | namespace functions { 364 | 365 | // This is the main function description 366 | type data_demonstration = (_: { 367 | // The object data type as a property 368 | object_1: { 369 | string_2a?: "Happy" | "Sad", 370 | // Description in a second object is lost 371 | string_2b?: string, 372 | }, 373 | }) => any; 374 | 375 | } // namespace functions 376 | """ 377 | 378 | inner_object_and_string = { 379 | "system_message": { 380 | "role": "system", 381 | "content": "You are a bot.", 382 | }, 383 | "tools": [ 384 | { 385 | "type": "function", 386 | "function": { 387 | "name": "data_demonstration", 388 | "description": "This is the main function description", 389 | "parameters": { 390 | "type": "object", 391 | "properties": { 392 | "object_1": { 393 | "type": "object", 394 | "description": "The object data type as a property", 395 | "properties": { 396 | "string_2a": {"type": "string", "enum": ["Happy", "Sad"]}, 397 | "string_2b": { 398 | "type": "string", 399 | "description": "Description in a second object is lost", 400 | }, 401 | }, 402 | }, 403 | "string_1": {"type": "string", "description": "Not required gets a question mark"}, 404 | }, 405 | "required": ["object_1"], 406 | }, 407 | }, 408 | } 409 | ], 410 | "tool_choice": "none", 411 | "count": 103, # counted 106, over by 3 412 | } 413 | """ 414 | namespace functions { 415 | 416 | // This is the main function description 417 | type data_demonstration = (_: { 418 | // The object data type as a property 419 | object_1: { 420 | string_2a?: "Happy" | "Sad", 421 | // Description in a second object is lost 422 | string_2b?: string, 423 | }, 424 | // Not required gets a question mark 425 | string_1?: string, 426 | }) => any; 427 | 428 | } // namespace functions 429 | """ 430 | 431 | boolean = { 432 | "system_message": { 433 | "role": "system", 434 | "content": "You are a bot.", 435 | }, 436 | "tools": [ 437 | { 438 | "type": "function", 439 | "function": { 440 | "name": "human_escalation", 441 | "description": "Check if user wants to escalate to a human", 442 | "parameters": { 443 | "type": "object", 444 | "properties": { 445 | "requires_escalation": { 446 | "type": "boolean", 447 | "description": "If user is showing signs of frustration or anger in the query. Also if the user says they want to talk to a real person and not a chat bot.", 448 | } 449 | }, 450 | "required": ["requires_escalation"], 451 | }, 452 | }, 453 | } 454 | ], 455 | "tool_choice": "none", 456 | "count": 89, # over by 3 457 | } 458 | 459 | array = { 460 | "system_message": { 461 | "role": "system", 462 | "content": "You are a bot.", 463 | }, 464 | "tools": [ 465 | { 466 | "type": "function", 467 | "function": { 468 | "name": "get_coordinates", 469 | "description": "Get the latitude and longitude of multiple mailing addresses", 470 | "parameters": { 471 | "type": "object", 472 | "properties": { 473 | "addresses": { 474 | "type": "array", 475 | "description": "The mailing addresses to be located", 476 | "items": {"type": "string"}, 477 | } 478 | }, 479 | "required": ["addresses"], 480 | }, 481 | }, 482 | } 483 | ], 484 | "tool_choice": "none", 485 | "count": 59, 486 | } 487 | 488 | null = { 489 | "system_message": { 490 | "role": "system", 491 | "content": "You are a bot.", 492 | }, 493 | "tools": [ 494 | { 495 | "type": "function", 496 | "function": { 497 | "name": "get_null", 498 | "description": "Get the null value", 499 | "parameters": { 500 | "type": "object", 501 | "properties": { 502 | "null_value": { 503 | "type": "null", 504 | "description": "The null value to be returned", 505 | } 506 | }, 507 | "required": ["null_value"], 508 | }, 509 | }, 510 | } 511 | ], 512 | "tool_choice": "none", 513 | "count": 55, 514 | } 515 | 516 | no_type = { 517 | "system_message": { 518 | "role": "system", 519 | "content": "You are a bot.", 520 | }, 521 | "tools": [ 522 | { 523 | "type": "function", 524 | "function": { 525 | "name": "get_no_type", 526 | "description": "Get the no type value", 527 | "parameters": { 528 | "type": "object", 529 | "properties": { 530 | "no_type_value": { 531 | "description": "The no type value to be returned", 532 | } 533 | }, 534 | "required": ["no_type_value"], 535 | }, 536 | }, 537 | } 538 | ], 539 | "tool_choice": "none", 540 | "count": 59, 541 | } 542 | 543 | FUNCTION_COUNTS = [ 544 | inner_object, 545 | inner_object_and_string, 546 | inner_object_with_enum_only, 547 | inner_object_with_enum, 548 | search_sources_toolchoice_auto, 549 | search_sources_toolchoice_none, 550 | search_sources_toolchoice_name, 551 | integer_enum, 552 | integer_enum_tool_choice_name, 553 | no_parameters, 554 | no_parameters_tool_choice_name, 555 | no_parameter_description_or_required, 556 | no_parameter_description, 557 | string_enum, 558 | boolean, 559 | array, 560 | no_type, 561 | null, 562 | ] 563 | -------------------------------------------------------------------------------- /tests/image_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pamelafox/openai-messages-token-helper/5c579fd05ca592f4813bae2a49af4bab9eafb6b5/tests/image_large.png -------------------------------------------------------------------------------- /tests/image_messages.py: -------------------------------------------------------------------------------- 1 | text_and_tiny_image_message = { 2 | "message": { 3 | "role": "user", 4 | "content": [ 5 | {"type": "text", "text": "Describe this picture:"}, 6 | { 7 | "type": "image_url", 8 | "image_url": { 9 | "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z/C/HgAGgwJ/lK3Q6wAAAABJRU5ErkJggg==", 10 | "detail": "auto", 11 | }, 12 | }, 13 | ], 14 | }, 15 | "count": 266, 16 | "count_4o_mini": 8511, 17 | } 18 | 19 | text_and_tiny_image_message_nodetail = { 20 | "message": { 21 | "role": "user", 22 | "content": [ 23 | {"type": "text", "text": "Describe this picture:"}, 24 | { 25 | "type": "image_url", 26 | "image_url": { 27 | "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z/C/HgAGgwJ/lK3Q6wAAAABJRU5ErkJggg==" 28 | }, 29 | }, 30 | ], 31 | }, 32 | "count": 266, 33 | "count_4o_mini": 8511, 34 | } 35 | 36 | text_and_tiny_image_message_low = { 37 | "message": { 38 | "role": "user", 39 | "content": [ 40 | {"type": "text", "text": "Describe this picture:"}, 41 | { 42 | "type": "image_url", 43 | "image_url": { 44 | "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z/C/HgAGgwJ/lK3Q6wAAAABJRU5ErkJggg==", 45 | "detail": "low", 46 | }, 47 | }, 48 | ], 49 | }, 50 | "count": 96, # 11 + 85 51 | "count_4o_mini": 2844, # 11 + 2833 52 | } 53 | 54 | text_and_large_image_message = { 55 | "message": { 56 | "role": "user", 57 | "content": [ 58 | {"text": "hi", "type": "text"}, 59 | { 60 | "image_url": { 61 | "url": "data:image/png;base64,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bS9leGlmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjE2ODY8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NTg4PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+MTQ0PC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpO4OhZAABAAElEQVR4AeydBbgkxdWGa5FdliCLLBA8BA0OwW0JEiC4e4Dg7g7BHbK4LK7BLRAgG9wluC3yA8EhsMCiC8zfb8Fp6vZtm5meO1e+8zz3zkx3dclb1dVdp06d6vftt9/WnEQEREAEREAEREAEREAEREAEREAEREAERKDLCYzR5SkqQREQAREQAREQAREQAREQAREQAREQAREQAU9Aihk1BBEQAREQAREQAREQAREQAREQAREQARFoEwEpZtoEXsmKgAiIgAiIgAiIgAiIgAiIgAiIgAiIgBQzagMiIAIiIAIiIAIiIAIiIAIiIAIiIAIi0CYCUsy0CbySFQEREAEREAEREAEREAEREAEREAEREAEpZtQGREAEREAEREAEREAEREAEREAEREAERKBNBKSYaRN4JSsCIiACIiACIiACIiACIiACIiACIiACUsyoDYiACIiACIiACIiACIiACIiACIiACIhAmwhIMdMm8EpWBERABERABERABERABERABERABERABKSYURsQAREQAREQAREQAREQAREQAREQAREQgTYRkGKmTeCVrAiIgAiIgAiIgAiIgAiIgAiIgAiIgAhIMaM2IAIiIAIiIAIiIAIiIAIiIAIiIAIiIAJtIiDFTJvAK1kREAEREAEREAEREAEREAEREAEREAERkGJGbUAEREAEREAEREAEREAEREAEREAEREAE2kRAipk2gVeyIiACIiACIiACIiACIiACIiACIiACIiDFjNqACIiACIiACIiACIiACIiACIiACIiACLSJgBQzbQKvZEVABERABERABERABERABERABERABERAihm1AREQAREQAREQAREQAREQAREQAREQARFoEwEpZtoEXsmKgAiIgAiIgAiIgAiIgAiIgAiIgAiIgBQzagMiIAIiIAIiIAIiIAIiIAIiIAIiIAIi0CYCUsy0CbySFQEREAEREAEREAEREAEREAEREAEREAEpZtQGREAEREAEREAEREAEREAEREAEREAERKBNBKSYaRN4JSsCIiACIiACIiACIiACIiACIiACIiACUsyoDYiACIiACIiACIiACIiACIiACIiACIhAmwhIMdMm8EpWBERABERABERABERABERABERABERABKSYURsQAREQAREQAREQAREQAREQAREQAREQgTYRkGKmTeCVrAiIgAiIgAiIgAiIgAiIgAiIgAiIgAhIMaM2IAIiIAIiIAIiIAIiIAIiIAIiIAIiIAJtIiDFTJvAK1kREAEREAEREAEREAEREAEREAEREAERkGJGbUAEREAEREAEREAEREAEREAEREAEREAE2kRAipk2gVeyIiACIiACIiACIiACIiACIiACIiACIiDFjNqACIiACIiACIiACIiACIiACIiACIiACLSJgBQzbQKvZEVABERABERABERABERABERABERABERAihm1AREQAREQAREQAREQAREQAREQAREQARFoEwEpZtoEXsmKgAiIgAiIgAiIgAiIgAiIgAiIgAiIgBQzagMiIAIiIAIiIAIiIAIiIAIiIAIiIAIi0CYCUsy0CbySFQEREAEREAEREAEREAEREAEREAEREAEpZtQGREAEREAEREAEREAEREAEREAEREAERKBNBKSYaRN4JSsCIiACIiACIiACIiACIiACIiACIiACY/UEBF9//bUbPXq0z+p4443nxhhD+qSeUG9l86j6LUuqvnAh1/HHH9/169evvgj6cOgff/zRjRo1yhMYe+yx3cCBA5umEdZHT+3H6IcpBzLOOOO4/v37N82lN0bQG+q6t9UL9zP3Nf0g/WF3k++++8598803Plv0N/Q7EhEQAREQAREQgb5DoEdoOLbddls3ePBg//fSSy/1ndrpIyXtifVbq9XcsGHD3DbbbOMef/zxbllTG2+8cXzfvPXWW90yj901U6+//nrMbosttqgkmz2xnScLfvHFF8dczjvvvORp/f6ZQG+o67zKfPnll91OO+3khg4dGisT8sJ3h3Nzzjmnb7uzzjprd8hOpzycddZZ8b3197//vdN5HRABERABERABEejdBCq3mHn66afdSSed1BS16aabzh122GFNxdGdLn7++efdcccdF2dp/vnndzvvvHP8u8yXZ555xp144ok+6JAhQ9zmm29e5jKFaRGBf/3rX27HHXf0sQ8fPtyNGDHCjTnmmC1Krb3R/vDDD86UEyhITzjhhLoydN9997lzzz3XX7Paaqu5Nddcs67rFbg5AkcccYR75ZVXUiOZaKKJ3AwzzOB++9vfutlnn91NP/30qeF0UARCAltttZV75JFH/CGsv7bccsvwtL6LgAiIgAiIgAiIgAjUSaByxcy7777rmp3tmWeeeXqVYub999/vwOSqq65yCy20kP8rW18hV16EpZgpS6414T7++OM44s8//9x9++23btxxx42P9aYvWAfZPf2b3/ymbsXM//3f/8XXowSQYqZrW8e///1v9+CDDxYmyhLRTTbZxP31r391U001VWF4Bei7BML+L/zed4mo5CIgAiIgAiIgAiLQHIExmru889Ws38b3QNrfgAED4gsYBKSF4VgYLr6gF31hnft2220X+83pRUWLi4Ki4p///Kfbeuut3ciRI+PjveULygWUY3PNNZc79dRTe61SprfUV6vK0dPaOX2r9btJHxb0SxdddJG3nLn99ttbhUzx9gICWMVi+bn++uvLWqYX1KeKIAIiIAIiIAIi0H4ClVvMrLDCCu6zzz5LLdmTTz7pFl54YX/uT3/6k7vmmmtSw/XmgwyMGMyxvIklIfvtt1+vLO7aa6/t7rjjDl+2I488steVkcEtPgEkfZtAT2vnzz33nJt22mnjSvvoo48c/of+8Y9/uNNOO81h/YXjWpaqPPHEE97nRRxYX0TgZwI85/mTiIAIiIAIiIAIiIAIVEOgcouZarLVe2NZa6214h1ejj76aO+bpDeW9vvvv++NxVKZRKADgZ7ezvEZhOUDy5deeOGFWGnzwQcfuD322KNDWfVDBERABERABERABERABESgNQSkmGkN18xY8Q9jjn+xnNl+++0dPjwkIiACItBOAihpzEkz+cA3jUQEREAEREAEREAEREAERKD1BKSYaT3jDikww77//vu7mWaayR9nxxptO9sBkX6IgAi0icBSSy3lJphgAp86Tl2xnJGIgAiIgAiIgAiIgAiIgAi0lkDlPmZam91fYmfAcM4557jrr7/evfnmm65///7eaeXvf/97r/iwwcUvV6R/YxtZdpzBn8J//vMfh+IEh65zzDGH22yzzfxn+pWNHWXrYfyTnHnmmW655Zbz1jIoavC58+tf/7qxSDOuuueeexzbOrNE4cUXX3Ts7IRCiG1x55xzTu+8dpJJJsm4+qfD5A2fQb/61a/iLb+ZST/llFP8Mixm2fnOTlp/+9vf3KuvvuovfPnll+N499lnn3j5FgfxTbDKKqvE59O+1Fu/cN199919/eHHp2jL9sMPP9yxWxYWTMcee2xaFvwx2sX555/vv+NPZOmll/bfP/zwQ3fooYf675QdnxxJueCCC9zjjz/uDx9wwAFuyimndO+9955vtzfeeKNvt+SV9rbooou6vffe27eNZDxpvx977DF38803O/w20W5pU/hvWmSRRdwGG2zgiuo1Lc7ucgwntJdffrnfSQj+tCW2cYYT5cOhdNHW5NzH+LDCd8obb7zh/0aNGuW3hZ555pl9ff3hD39oqMjtbOcNZbjOi2addVb36KOP+qteeuklN/nkk5eOgX4GXzXIH//4R7fqqqvmXnvbbbf5dkygv/zlL26++eZLDU+buOmmm9zFF1/s+xj6fPI199xz+75ngQUWcMsvv3zqtUUHH3jgAd/eCLfuuus6lFNYMXJ/cQ8/88wzjvudLcXnnXdet/jii/u+Ewf2zUqz7TSrH7rlllu8wv+pp55y+BEi79w/22yzjVtsscWazbbnkuzbwkhbna///e9//rmNzyT+eMZRH1NMMYXvI9Zbbz23zDLLhFkq/I7PN3aQQ04++WQ31lj5r0c77bSTo12S5kEHHZQb/9tvv+2uuOIK31fTZ3/66aduwQUX9HnFkTz3XL1SxbvLf//7X3fG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o46yn3V9spsb7wXJ9kQbYAtsLPXYvYj7voxgWYPVH8pK2r6JtSme0XdHlo6Uq6w0++6Ccof3Hlv2TLp2T/GdzQfogyln8r2He9f8gaFgXG211bhEIgIiIAIiIAIiUAGBfpFJba2CeHp0FLyUsKaa5Q8M4NgBgj9278maueopBaZsmBtjns+LIQ6FWTPOALcrhBdQ2LIVKAqZ+eabr8MLdVfkobemwa5LNoM55ZRTet9J4XbFPb3cn3zyib8ncYqJrwMsIhikl7Fkwv8E7Y4/lDo4eE5a2FTJR+08nab1P/jzot5YHsJ29vUI9ceySyzvmK2fcMIJfTuYccYZ/fd64koLe95557ntt9/en8KXV2gBwJIplNzWdxVZSaTFn3esq9tpXl562jnaBZakPNuwdKRvQHGWVOo2Wi6sZmi3LJlEYYPCohlhOSZLK+mTUEIT3/SRL7RmpJl3F54f7ELIEmP4MRHFew/3VZ5gzchOUyz9Mqf5eeF1TgREQAREQAREoBwBKWbKcVIoERABERCBXkggTzHTC4urIomACIiACIiACIiACHRDAl1jNtENC64siYAIiIAIiIAIiIAIiIAIiIAIiIAIiEC7CUgx0+4aUPoiIAIiIAIiIAIiIAIiIAIiIAIiIAJ9loAUM3226lVwERABERABERABERABERABERABERCBdhOQYqbdNaD0RUAEREAEREAEREAEREAEREAEREAE+iwBKWb6bNWr4CIgAiIgAiIgAiIgAiIgAiIgAiIgAu0mIMVMu2tA6YuACIiACIiACIiACIiACIiACIiACPRZAtouu89WvQouAiIgAiLw9ddfu88++8yDmGCCCdy4444rKCIgAiIgAiIgAiIgAiLQpQSkmOlS3EpMBERABERABERABERABERABERABERABH4hoKVMv7DQNxEQAREQAREQAREQAREQAREQAREQARHoUgJjdWlqSkwEREAEREAEREAEShL4brRzI0fV3DffOvft6Jqr1UpemBOsXz/nBozdz40zwLlB4/Vz/cfOCaxTIiACIiACIiACItAFBLSUqQsgKwkREAEREAEREIH6CHwWKWQ++rTmfqxAGZOV8hiRkmbwRP3chJGCRiICIiACIiACIiAC7SIgi5l2kVe6IiACIiACIiACqQRGflFzH0ZKmVYLSp8PPvnJEmfQ+FLOtJq34hcBERABERABEUgnIB8z6Vx0VAREQAREQAREoA0EWL708cjWK2XCopEe6UpEQAREQAREQAREoB0EpJhpB3WlKQIiIAIiIAIikEoAnzKtXL6UlijpffZl1yqD0vKhYyIgAiIgAiIgAn2TgBQzfbPeVWoREAEREAER6JYEcPTbDvn2u3akqjRFQAREQAREQAREwDkpZtQKREAEREAEREAEug2B775vj+XKN9+1J91uA14ZEQEREAEREAERaBsBKWbahl4Ji4AIiIAIiIAIJAn8+GPySNf8ble6XVM6pSICIiACIiACItCdCUgx051rR3kTAREQAREQARGoi8Bt977t9j76ETfyc61NqgucAouACIiACIiACLSNgLbLbht6JSwCIiACIiACIlAVgWde+sRddO0I99KIkT7K0aPbZHpTVYEUjwiIgAiIgAiIQJ8hIMVMn6lqFVQEREAEREAEeh+B+x97311+06vuzbdG9b7CqUQiIAIiIAIiIAJ9goAUM32imlXIVhAYOXKke/rpp91rr73mpppqKjfPPPO4ySefvBVJKU4REIFuRODHyBnJqFE/KQH69+/vxhlnnG6Uu76XlUef+sgrZSYaNMDNMuMg9/DjH/Q9CCqxCIiACIiACIhAjybQJ3zMjB492n3//fc9uqKU+e5DgLZ09NFHu2mmmcYtv/zybrvttnOrrrqqO+mkk7pPJpWTbk2gVqu5YcOGuW222cY9/vjj3TKvPSGP7QL3zDPPuMGDB/u/nXbaqV3ZULo/E/jdLBO5vbad2517/FLu93MNFhcREAEREAEREAER6HEEep3FzHfffef+9a9/udtuu83dd9997v3333effvqpr5hBgwa5SSaZxM0yyyxuhRVWcCuuuKKbdtppe1ylKcPtJbDRRhu5G264Ic7EGGOM4ZhBl4hAWQL0UTvuuKMPPnz4cDdixAg35phjlr28S8L1hDx2CQgl0u0JrLDk1N0+j8qgCIiACIiACIiACOQR6DWKGQbGl112mTv88MPdm2++mVpmlp7wx9KTW2+91S2xxBKOQZFEBMoSQCFjSpnZZ5/dnXPOOX4JE23q66+/LhuNwvVxAh9//HFM4PPPP3fffvutG3fcceNj3eFLT8hjd+CkPIiACIiACIiACIiACIhAswR6hWLms88+c1gxMMMbCmv/Z511VjfXXHM5rBreeust//d///d/DjN9iQjUS+D000/3l/Tr189dcsklDuUMghWWRATKElhzzTXdvffe65544gm3xx57dKlS5pNPPnH/+Mc/HMtxTjjhhMwstzOPmZnSCREQAREQAREQAREQARHohQR6vGLm3Xff9UuSXnrppbh61llnHbf33nu72WabzY099tjxcfuCdcMFF1zgXn/9dTukTxEoRcDa2W9/+9tYKVPqQgUSgYAAzmLPOuus4EjXfZ1++um9hQ79Y560M495+dI5ERABERABERABERABEehtBHq0YgZ/Muuvv76zwfKEE07ohg4d6jbccMPcemJQfcQRR+SG0UkRSBJgycmHH37oD7MLk0QEeiIBOULvibWmPIuACIiACIiACIiACPRmAj1aMbPffvu5Rx55xNfPFFNM4Z39yplvb26u7S0bikCTAQMG2Fd9ioAIiIAIiIAIiIAIiIAIiIAIiEDDBHrsdtk4+D377LPjgh911FHaYSmmoS8iIAIiIAIiIAIiIAIiIAIiIAIiIAI9gUCPtZg5/vjj3ejRoz3jxRZbrHD5UiOVwU5PV155pXv00Ufdiy++6F544QW/887vfvc7N8ccc7j555/fbbrppm6ssTpjfOCBB9zll1/uk8X58DbbbFOYBZbJHHrooT4cS2X233//TteQJ+J98MEHvePQl19+2eEzgjQWWWQRt/XWW+duu0ucOEv+1a9+5Y477jgf/7///W93yimn+C17Bw8e7L/PM888HdLGL8+wYcPc888/73CejCPliSee2M0888xuoYUW8j59xh9//A7XZP146KGH/K5YTz75pOMPXxbknT+cOLOtOf43nn32WR/FYYcd5rc5z4qP43fffbeP8z//+Y976qmnfN6oI8rBtsTktRH54osv3L777usv/eabb+IoaAs77LBD/HvyySd3Bx98cPw7/MISqIsvvtg999xzvg3RltiBB8fB/C2zzDJ++/bwmuT3sD2tu+66bqmllvL1eMwxx7i77rrLjRo1yv3xj390J554YvLS3N9p8eIY++abb/Z+mHAQS7tk+d+8887rFl98cbf55pt7Z9pZETfaxoivinp8/PHHffsh72+88Ya/P2kHc889t28Pq666qhs4cGBW9v1x7ol77rnH1xlt/p133nGTTTaZv9e4nnbKvWKSxpH7LKt+wnudvG211VYWVfyJHyzKghxwwAFu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AzJ06FC/TMLywv3DoA5+yfqxMK34bKYe33jjDccfead9ck/QhrKUe3n5x9kuPqawoEAhQ1wMZFEidoXgm8iUx9wr3Hcm3BM4bKUdsTQpVIZYmKJPOHOv4IgcpRv9mjlILro27zwKMZbO0NZR2tDOqYNm+ou89FpxjjLAmGV8KKvg09VLr+gvaH8sS0VhE+4e1kiZk2WiTmxZG/GxrAmLMQQ/Nihi0qTKeywtfh0TAREQAREQAREQgb5IoFcqZvpiRfamMjNgNGUKlg5FO4r0prJ3dVnyFDNdnRel15FAnmKmY0j9EoHmCbB81Hxc4acJX2YSERABERABERABERCBriHQK5YydQ0qpdJVBMxKgPTq9XfRVXlUOiIgAiLQWwjgG4ilsia2lNF+61MEREAEREAEREAERKC1BKSYaS1fxV4nAXZ2OSTacQphGYQ5ofUH9E8EREAERKByAuy6xvIzZO211/ZLditPRBGKgAiIgAiIgAiIgAhkEpBiJhONTlRJgB1b8ImRJ2xTyzbm+J1B2MkJ/xQSERABERCB+gjcc889btiwYY6tt7MEp9ZsC07/jOCjzHY1y7pGx0VABERABERABERABKon0OO3y64eiWJsBQGWJx155JF+R6yVVlrJ70DEMiW2X8W5Kk428Xfy1Vdf+eRxtspuRhIREAEREIH6Cbzzzjtuxx13dAceeKDfrRBHv+wsxe5jKMHZQpudyh5++OE48j322MPvFBcf0BcREAEREAEREAEREIEuISDFTJdgViJG4IEHHnD85QnbcJ900kl+J5y8cDonAiIgAiKQT2DkyJHuzDPPzA3EFuzHHnts5k5MuRfrpAiIgAiIgAiIgAiIQNMEpJhpGqEiKEPgmmuucVdccYW7+uqr/fa84TX9+vVzU001ld+KmO1aV1555fC0vouACIiACNRJAAU3frqwVhw+fLjDwW8obAOO1eJiiy3mDj74YDfxxBOHp/VdBERABERABERABESgCwlou+wuhK2kfiKAg1/8yLz77rt+W2wGBwwSJF1PgK3JP/vsM5/wBBNMoHro+irITJF6oX4Qlp+MNZb06JmwdCKXwI8//ug++OAD3+9+8cUXboYZZvDKcJTiEhEQAREQAREQAREQgfYTkGKm/XWgHIiACIiACIiACIiACIiACIiACIiACPRRApqC7aMVr2KLgAiIgAiIgAiIgAj0HQLfjXZu5Kia++Zb574dXXPRxmxNC4Z3A8bu58YZ4Nyg8fq5/mM3HaUiEAEREIE+SUAWM32y2lVoERABERABERABERCBvkLgs0gh89GnNfdjBcqYLGZjREqawRP1cxNGChqJCIiACIhAfQRkMVMfL4UWAREQAREQAREQAREQgR5DYOQXNfdhpJRptaD0+eCTnyxxBo0v5UyreSt+ERCB3kVgjN5VHJVGBERABERABERABERABEQAAixf+nhk65UyIW3SI12JCIiACIhAeQJSzJRnpZAiIAIiIAIiIAIiIAIi0GMI4FOmlcuX0kCQ3mdfdq0yKC0fOiYCIiACPYmAFDM9qbaUVxEQAREQAREQAREQAREoSQBHv+2Qb79rR6pKUwREQAR6LgEpZnpu3SnnIiACIiACIiACIiACIpBJ4Lvv22O58s137Uk3E4ROiIAIiEA3JyDFTDevIGVPBERABERABERABERABBoh8OOPjVzV/DXtSrf5nCsGERABEWgPAe3K1B7uSlUEREAEREAEREAEREAEuhWB70b/6B584gP34qsj3eejvnOTDBrHzTjdBG6JBadwY46pnZa6VWUpMyIgAr2KgBQzvao6VRgREAEREAEREAEREAERqJ/A48985P523nNu5MjOjmmuuOlVd8SeC7jBk4xTf8S6QgREQAREoJCAljIVIlIAERABERABERABERABEejdBO599H2vlJn5txO6NVb8jdtyw1ndPHNO4gv99rtfuqEXPNu7Aah0IiACItBGArKYaSN8JS0CjRIYOXKke/rpp91rr73mpppqKjfPPPO4ySefvNHoev11P0aL3UeNGuXLOfbYY7uBAwf2+jKrgK0noPuw9YyVggiIQNcR+NXAsdwe28zl/rDolHGia/xxenfEqU+5hx5/3z317P/cV1//4MYdOGZ8Xl9EQAREQASqISCLmWo4KhYR6BIC33//vTv66KPdNNNM45Zffnm33XbbuVVXXdWddNJJXZJ+T03k9ddfd4MHD/Z/W2yxRU8thvLdTQjoPuwmFdHGbAwfPtxtueWW7tprr21jLpR0koDqJUmkvt9brj9rB6WMXb3o/JPZV/fOh1/G3/VFBERABESgOgI91mLmhx9+cDbAYsB1wgknVEdFMYlANyWw0UYbuRtuuCHO3RhjjOGwBpGIgAh0HQHdh13H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IL4SOo8QxNtB3azgmiFeC5jAXcCpBLTbhPvp9vnD/QD3AWIYgSOUclCcOgfs4dYt2u0QkwbPHdoLmLjjfkQ9IomDYO9nuLkhzgM6+sEUFZHW0w1GBb1ucBWBuyFckHSm2rgQon1q2bJl2KeDQSHaODzzuL5wR4Cy1l8QsBR/cDXDYAnXArFrcG0SQQrKMl7ngADgeK7AHAoZcETwa+uim1893Hgu8jtGoPXh3ifYFy6LuJ/w7KLNg9LZOcAOVH5RWebmcwAFNd5buKa4D9DGQSntVLgWFS7B6lnQdhJtOPoQeB9BqWf7YOG8i9y8VsHOj8tJgARIgASKBgEqZorGdWItSSBmBEIpZmJ2UBZMAiRAAiRAAiRAAiRAAiRAAiRgCJR4VybeByRAAiRAAiRAAiRAAiRAAiRAAiRAAiRQWASomCks8jwuCZAACZAACZAACZAACZAACZAACZBAiSdAxUyJvwUIgARIgARIgARIgARIgARIgARIgARIoLAIUDFTWOR5XBIgARIgARIgARIgARIgARIgARIggRJPgIqZEn8LEAAJkAAJkAAJkAAJkAAJkAAJkAAJkEBhEaBiprDI87gkQAIkQAIkQAIkQAIkQAIkQAIkQAIlngDTZZf4W4AASjqBHTt2SFZWlsGQkpIiZcuWLelIeP4kQAIkQAIkQAIkQAIkQAIkEDcCVMzEDTUPRAIkQAIkQAIkQAIkQAIkQAIkQAIkQAK+BOjK5MuDv0iABEiABEiABEiABEiABEiABEiABEggbgSomIkbah6IBEiABEiABEiABEiABEiABEiABEiABHwJUDHjy4O/SIAESIAESIAESIAESIAESIAESIAESCBuBKiYiRtqHogESIAESIAESIAESIAESIAESIAESIAEfAlQMePLg79IgARIgARIgARIgARIgARIgARIgARIIG4EqJiJG2oeiARIgARIgARIgARIgARIgARIgARIgAR8CVAx48uDv0iABEiABEiABEiABEiABEiABEiABEggbgSomIkbah6IBEiABEiABEiABEiABEiABEiABEiABHwJUDHjy4O/SIAESIAESIAESIAESIAESIAESIAESCBuBKiYiRtqHogESIAESIAESIAESIAESIAESIAESIAEfAlQMePLg79IgARIgARIgARIgARIgARIgARIgARIIG4EqJiJG2oeiARIgARIgARIgARIgARIgARIgARIgAR8CVAx48uDv0iABEiABEiABEiABEiABEiABEiABEggbgSomIkbah6IBEiABEiABEiABEiABEiABEiABEiABHwJUDHjy4O/SIAESIAESIAESIAESIAESIAESIAESCBuBKiYiRtqHogESIAESIAESIAESIAESIAESIAESIAEfAlQMePLg79IgARIgARIgARIgARIgARIgARIgARIIG4EqJiJG2oeiARIgARIgARIgARIgARIgARIgARIgAR8CVAx48uDv0iABEiABEiABEiABEiABEiABEiABEggbgSomIkbah6IBEiABEiABEiABEiABEiABEiABEiABHwJUDHjy4O/SIAESIAESIAESIAESIAESIAESIAESCBuBKiYiRtqHogESIAESIAESIAESIAESIAESIAESIAEfAlQMePLg79IgARIgARIgARIgARIgARIgARIgARIIG4EqJiJG2oeiARIgARIgARIgARIgARIgARIgARIgAR8CVAx48uDv0iABEiABEiABEiABEiABEiABEiABEggbgSomIkbah6IBEiABEiABEiABEiABEiABEiABEiABHwJUDHjy4O/SIAESIAESIAESIAESIAESIAESIAESCBuBKiYiRtqHogESIAESIAESIAESIAESIAESIAESIAEfAlQMePLg79IgARIgARIgARIgARIgARIgARIgARIIG4EqJiJG2oeiARIgARIgARIgARIgARIgARIgARIgAR8CVAx48uDv0iABEiABEiABEiABEiABEiABEiABEggbgSomIkbah6IBEiABEiABEiABEiABEiABEiABEiABHwJUDHjy4O/SIAESIAESIAESIAESIAESIAESIAESCBuBKiYiRtqHogESIAESIAESIAESIAESIAESIAESIAEfAlQMePLg79IgARIgARIgARIgARIgARIgARIgARIIG4EqJiJG2oeiARIgARIgARIgARIgARIgARIgARIgAR8CZT1/clfJJDYBPbsFdmVJZKVfVCy95aSAwcPJXaFWTsSIAESIAESIAESIAESKKEEypQuJRXKH5JKFUvrn0jF8iUUBE+bBPIhUCo7O5sj23wgcXXhE9h/oJRs3HpAdu8p/LqwBiRAAiRAAiRAAiRAAiRAApETgHKmbuahrzoAAEAASURBVK0yUrYMh6CR0+MexZkAFTPF+eoWk3NL3ymydcdBOcT2u5hcUZ4GCZAACZAACZAACZBASSWgRjRSq0ZpqVm1pBLgeZNAXgKMMZOXCZckEIF9+0tJOpUyCXRFWBUSIAESIAESIAESIAESiJ4AIhFs3X5Q0M+nkAAJeAhQMcM7IaEJbNhyQBhGJqEvEStHAiRAAiRAAiRAAiRAAhERQP8e/XwKCZCAhwAVM7wTEpbA7j2HBMF+KSRAAiRAAiRAAiRAAiRAAsWLAPr56O9TSIAERKiY4V2QsASyshO2aqwYCZAACZAACZAACZAACZBAAQns0SyrFBIgASpmeA8kMAFayyTwxWHVSIAESIAESIAESIAESKCABLKyDxawBO5OAsWDAC1misd1LJZnsYcWM8XyuvKkSIAESIAESIAESIAESAAEsvaQAwmQAAhQMcP7IGEJHGDU34S9NqwYCZAACZAACZAACZAACRSUALv7BSXI/YsLASpmisuV5HmQAAmQAAmQAAmQAAmQAAmQAAmQAAkUOQJUzBS5S8YKkwAJkAAJkAAJkAAJkAAJkAAJkAAJFBcCVMwUlyvJ8yABEiABEiABEiABEiABEiABEiABEihyBKiYKXKXjBUmARIgARIgARIgARIgARIgARIgARIoLgSomCkuV5LnQQIkQAIkQAIk4BqBbTv3yoEDh1wrjwWRQCITyNi1T7L3MW1xIl8j1o0ESKB4EyhbFE7vwIED8uOPP8rMmTNl0KBB0rJly6JQbVPH6dOny7fffivHHHOM9O/fv8jUu6RVFJ1vZIEqX466ylhc+xvum2CKPf3YpnLc4Q1icYioyzyo/dDJM9PMAOyw7nWkTJlSUZflxo6ffrdc/pyyQapXqyAP39rTjSJZRgACj7w4UzZu2iU9O9WWIee0DrBFYi0qavVNLHrh1wbKmFfemy/T526R3bv2m/Zg2LVdpH/PurI764D8oc9m0wZVpF3LGuEXyi0LhcDiFTtk+eoMObx3Xamc5Nvd/fbX1fLjn2ukXNnS8tQ9hxVK/WJ50HDfI/v2H5IPvloqv/y1TtK37ZFS+vo7/YSmcuXgtrGsHssuYgT2qcKuVOlSUraQ+0dFDBurSwIRE/B9U0W8e2Q7HDp0SKComDNnjvmbO3euLFmyRCpVqiQpKSnSqFEjo8A44YQTpF69et7C33jjDRk6dKj5PWrUKFm+fLlUr17duz5RvyxYsEAOO8zzwn/kkUfkhx9+kKOPPjpRq1ti67ViTYaM0EFay6bVZNjVXWLGYdyfa2WFdhIhdVKSZOCJTc33cP5BJ2vLtmxpVK+ynHpM43B2Sahtlq/0nPe2ndkJVS9UBkqQJ16eZep1w6Ud5cQjGxZqHTel7xHwSq65z/V6bNq6R374fbWsWJspGzfvlp0Ze6VypXJSpVJZaayDzb7dUgXKqZIgq9dlyNp1u6RhvSpF4nTdri/aE7QrgaRqlbJSL7WytGhcTZo2LBp8Ap1HpMvwfAy9b6Jk6HNhBUr7PXs9VgRvfLxQfvx9jVn12sjDpUHdynazhPycs2ib/P3vxjx1K63zD7VrJUm92vqXWknfR5UkqWKZPNsV5QWb9Vre8uA/ckgv3awFW/O827ftyDbtbLliOhkTznsE9/awxybLoiXbvZdau+mya3fwd88X41ZK2pYs+d9ZraRqZc8QAs/H6E8WRdyv8R6UX1wl8M/0NJk+b6ssW7VTtm3PNn3bdq1qyuGqXK5dq2LEx0If6bk358nl57ct9P5RxJXnDiRQxAjETTGzYsUKufrqq2X8+PEBEUFB888//8gnn3wiJ598sowdO9a73a+//ur9npmZabY78cQTvcsS9ctvv/3mU7VffvmFihkfIoX7Iyv7gHz09TIZ+8MKYy0BxUws5d+Zm2XStDTvIRrVqyS9uqR6f4f68vuk9bJqdaZ065xSJBUzoc6tsNftzMzthGZk5g7ICrtebh4fM/3Pjp4jE6emyUE/14wdOzznvHjZDvn173Xy7ejEb1vdZFNSy8rctVe+/XlVvqfft2cduXxQa6lXJ7GVEPmeSBgbvDRmvlHKVK1STv7vqs7SpV0to8CsUMHTVXK2Dxm794dRYuFusnz1zrCuMWpZp3YlOf/MFnJM/wbGaqJwa17wo+/O2meUMigpU110KHkJfKXPv1XKXHFBOzn+8IaSlb3fKOzzbi0Cpc0HXy7VLyJX6/ZWlq7cYe6zYwY0sIv4WQgEtqu13/PvzJNJ+p53yqbNWTLx3zT5/PsV8pBa4TZvXNW5Ouh3KKpffX+BT7816MZcQQIk4AqBmCtmYCXzyiuvyN133y27du2KqtIXX3yxfPfdd7J//35p06aNsarxL2jv3r0yceJE4/L0119/yd9//+2/iau/Z8+ebY4FF6snn3xSunbtmqf8s88+Wx588EHZvn27VK1aVS688MI823BB/AnAj/r731bLlz+uCtoBiUetXnhnvrwyolaRnqnErORv/6zXAf9GefrefoKZ2KImcK3KyMyWQ2rCffLRjYta9fOtL2IG3P/sVJm3YJvZtpbOmA3oVdfMbpZW0+RNW7N08Jkl02dvluy9B/KUBwXmH5M2yAS9xued1kI6tq6ZZxsuKNoEGjeqIsnVK5iT2Lf/oGxVa5o0taiCtQE6+UtX7pTnH+gn1VRhUVwlQ92W/p2xyZzeoNNbSM/Otc33RvVzLYYuG9RGkmtUlGY6sGnbPK/VbiI/Kx3a1jRuOzip/aqcRdu9WZ99q6jF9X769Tky9seVcvl/20i3Dinm/GPxTzw4NWlYVW66vJMsVauBM48rfu26G9fllwlrTTG91VLyzOObmO+VkspIrRqetsD/GGs3ZEpW1n7p2C7ZR3m3aJnH4qZVgGfCvwz+jg0BvOdvfXiSbEzbba7NSWpZ3aNDLalYsazMW5wuY8et0rFIttw+YrI8MqyXtGmWt/2yNVuftks+/2GlcW/br+8DCgmQQPwIxFwxM2TIEPn44499zqhBgwZy5JFHSseOHaVDhw6qhT8ksKiBaxMsZvwFFjRYD9egww8/XAd/eUd/UIA88cQTZle4RsVSfvrpJznttNO8h4DCKJDUrVtXVq5cKRMmTDAuTZUrF/8Zx0AcEmnZ82/Pk5/VpcgGdKyvrkEw27VWA/Goa82aFcwLcot2jN/+bLFc87/cmad4HN/NY2DA/u6ni90sMu5lJVUoIxec2Srux43XAcd8vsSrlDnr5GZy6bltAirQMtUC4MfxHjcNZ91Wr8+U59+aaxZF4n7nLIPfE5vAuSc3l6P71fep5MZNu+VlnS2dqpZ+W9R14U1147n5sk4+2xSnH2t00GmlXcvAyse66vYTqr1O5Gfl9qu6Skqy74Ab70EoZ+Yt3S5jvlgim1VBu1LdbYc/PlVuvqKTHBsjC4h4cYLSPdFimtl7rLA/EVtt/YbdphrtWtUIqzqLVuw027XyG9QvXO5RzLShYiYsjrHYCJZMUMqU1hgw99/cXXpo7DQrXdvXkiN615O79LlGHKH3xy6RB2/JG78OCtO7Rk4RWM9a6dCuprf/YJfxkwRIIHYEYqqY+eKLL/IoZa688kp59NFHpUqV3Fko5+mNHDnSxKFxLsP31NRU8+e/3P6GcideEsmxkpKS5Nhjj41X1XicfAjMW7LNKGUq6GD8DJ0hGqQWADc9MDGuiplqVctJp7bJ8uc/G+S7X1bJUYfVl3Ytgs9e5HNKXE0CIQlMn7fZrG/etKpcfl6boNsizszZqrihkAAIQAlxx7Vd5Yphf8o2taCZk2NxVVzpYMBipYbG2CkJgkDnuM74O1yt6L78aaV8MHapINDnax8slO46uEuuXr4koChx57hLXb1wnSFVq4R3jRdbBUwzX7dvDOTLahDlZmqlRIk/AbgwfaEu+ZCT/tPIRyljawPLv4vObiXPvDFHrWO3yAa1ivF3T8X9YJUyyTUrmu17daktF9zwmy2GnyRAAjEmkNf0xKUDbtu2TW666SZvaWXKlJGvvvpKnn/++aBKGWwMlx9Y01BIIBYEmmrH4cJzWsnoUUeZTCywloi37N93SC47r60k6UAY+sTnNPYHMiNQSMBtAnDbQ2wiSPtWyW4Xz/KKOQG0j21aeGbTN23dLZhlLxGC1DQlTJCRcNApzWXwmS3Nme/StuOld+eXMAol53Sdc5nh3u5LNMsVpE2LXIuydI1RBuvfpo2rSHENpJzod8WyVTu8LoknHNkoaHVhFVlD3dRw7b/NCWLu3LiU3gidOyTLjeoC+NYTRxhrMyyjkAAJxI9AzKaFbr/9dklLyw1Ade2110q0AXuRJnvq1KleKpdddpn6UJaS3bt3ywcffGCWI+aLFbgWIZOTFaTXPuqoo+xP84l4N1AULVq0SFavXi2bNm2S+vXrS4sWLeTMM8+Utm3b+myPH59++qlaVuyQ+fN9OysoB3WEwF1p8ODB5jvO/5tvvjHf8Q9csnCMYIJsU5MmTZKFCxeaP7hstWvXzvyh/rAaCibjxo2TtWvXmtV16tTxulqhrgi4jLg7FStWlM6dO8t///tfn6xXgcpctmyZOV98btiwQRo2bGjczlCfnj17auPu6axj361bt8r777+vL+Vy5tyd6wKVXZjL7rimS2Ee3hwbablT1J3pMrVeeGH0PFm9JlM++36ZDD7d0yEuaAXXbtgl89U0fZVmnVmjbijIugOFVHONI9G9Y+2Q6aC/+83jytJWU8G20DgKiLvwvWbxgel5TU3ffMm5rWWv+hz/NmG9qeaCHN9y/MB29iVeUTN8HOPnGuE8L8zMLFy+Q2Yt3GJmaEzchkZV5bgBDQU+7k6Zu3ibrNIsQugfnHRUI/PpXG+/T5y2Ubbt2GeyC3Vqk9txtOvxactCNokj+ngyvyE7zeSc2BL9NdBpjWq+s4eTNMPB1u17JbVWBROsGZ2alWszNNNHusxZmC7ly5eWFo2qGcsnf1cB57HtdwTinaFWLIjbsVwzgqXozBQyJnTVQKPh7G/LCeezfPkyxrQZcSQ2qTtKJDJe3dR2qXtTmg7IrUxRt5b1abnlHHVYvTxpaDF795dmglm/cZdm79ijaegPmuw1sAo7XM2pg4n/ved/j6QkJ5ksQXBNCCetPWJozNLrg8CU8Jlv3KCqdFCT/S7tUvLcY8HqFO25+N8zcBn5ecI6WaAWexX0mpyl1nr+s5Vu1DfYeRRkOWJKQGrpfaqvpJCyTq85noslynyrWqBglra5Znbqp5m+gmX98WdV0OcLSu7pczabOixdlaHtX1lpru1fJ42L0drPBQMng2x5B3SfZRoo18p4DbZerYrH7QdtdR+NwQFB+uUl6s4Bd4GTHNnbon1WYMH5z/RNJp4P4juBFdpd1BPBeAtDzj6pmfyp579S30v/aFypBWoNEcyiM1LW0XJape3tlFmbTSysNHW9wr3UsG4V6a2z+aHSlvu3KZHyxHOL2FrzNGsRstihrW+Ja6SJAlo3qxF2zKVA7xjbvs1esEUW6bswVbNktWxaXXqqlVI474Fo3yNTNZYY2mVnPLG5i9LNMwA+eM+erFYXW9Kz5ZtfV/kgQ1ZJ3PvfaYw+K4hRBslGZiaHW3P3jina1nomA9w+/2jbZVtnKJhnzNti4g8tVaVGGW3Y2us7uIvGYUJsog3qxjl97lazeaB3nC0Hn9G0ec793fi+UvtHkFLaPiNzZzCBhVyj+pWNKz0Cg/sL+kWP3t7bfzF/kwAJxJFATBQzCMRrFSY4Fwzq77///qhPCwF27733Xu/+l156qRkAIqjudddd511uv+D4zuVQlECxAYEyB4GIoUiAkiWQPPzww3L99dcblys70MR2OIelSzUivZ88/vjj3iWIn2MVM1C0OOsB5UkgxUxWVpaMGDFCnn76aTUt9c0eYLNTJScnmyDDF1xwgfdYzi+wRELWJ0jfvn2NYubWW2+VF154wbmZuS44zrvvvutl4twgIyNDLr/8cvn66691djTw9OhTTz3lc16nnnqq1/0M7ms///yzs0h+D0IASgZkW0JQ1o+/Xq6m5PU0dW/wl2qQYryL96qy4331M4ZJqw3oaFf+KRvM19Y6OL71is5Bj/OSRvSHDNEsLFBQXH/PBNmpA20rMIXdpcoau51djs+XHbOrMIMNpphBLJO7H58iS3P81Z1lfK1ZIu66vpsZnNjliHVhjwff9lYBsmch8N0Tr8yWvdo5bKlm1s/e38/u7vP5xocLZMnynfKfAfW9ihkENLTlN29SLY9i5vNxK2W+pp1FRqyenVM1u9Fc+fmPtT7lwi3tM+V+21WdApoR242Rmv3h52cYX3C7DJ/jdPaqknaKRrjcKaqgs+AN9J5aox236XO26CBruw6ycpWqzjr4f0fMCfisO+Xrn3w76t10dq1ykuc1goHCa8p3/MT1XhN5u+9U2Sxf6Y9vtEN/xzXdArpH2GuAew/p5O8cOdmks7Vl2M8fxq+Wu6/rmkexYdfjE+k9n31zruzZkxvMeNqsLTJW1zXVge+jw0J3Pgt6Ls57pkenVLnziSk+fvoYUDoVMwWtr/Pc3fy+S5UyUCBCECA0lHzx40p5++NF3vhd2BbMIR/pPXinukUFygbiZFXQ5wsDqsdempmnbRmvdcCA85xTm5s0v2V1gGLldY2j47xPsPy9z3Pf8wh0ahUzUOB+9NUyYxngVMxE+qxs1SCcj7www5sRx9bF8kIw5pcfHmAXx/UTbC5WBfz9T003x12uwXMDKWaiYR0pp9XrMuW1jxbKDHW9yCtp8olmVTzp6EZy7YUdAioNnW0KFF6RCFKNP/nabBNfybnfxCmeCcdTjm2sx23vXBX0u/87BkqZYY9OMQo5353WqEV5OX2PdPYGn/Zd7/lVkPfI1+o+be8zW/bvf68X/EGsYmb2wq3y2bfL7SY+n4GW4x2DPyutHe5Obp1/Qdtl1A1KnZGvzJTZ89JtVc3nXzoRgXO/UeNoVaxQ2tsncL7jfHbQH9G2ef7lFPT3NttH00kj/T+k4N06R7fYqoo3CgmQQOIR8PSoXa7X4sWLTQYlWyyyEQWLKWO3idfnli1b5KWXXvI5HCxM9uzZ41XUQDkC5QWsZpARKpYCK5fjjz9eYJkSStLT0wUKKVi/vP7666E2NeuGDx+eRyljd4Ilz/nnn2+sheA6ZgVKKwQ1RtpyK7CygbIJ3AIpslDW9OmeDhz2QaDjnTt3SrVqvj7Itjx++hK46ZKOcu3dE8xA9rm358rIO/qYzoHvVvn/gsvK/2lE/rXrPZnPoIDBDHHjelVkc3qWzvJmyGS1/ID/8A33TpCHbuuVb3adl8csMGlG27SsbnzQ52lHFYJZwx5dUsz3jZuyZJ1a6EC6q+ICHRtItaq+VieepaoY1YHePU/+K7DqOVk7ti1VEbIjQzOq6awkFCZQBDz52ix56aEB3rKQUhwzQcgQg5nwQIqZGbocShnIMh1I7sjYJ9U1lo9TYP1jB5l9dGAcqSC21IvvzpNfdIb9CLUUsQFCZ83fatJJZuh5PPriLHWTO1KqVvY9No7176xNMuKFmaaeMPnu16uOnkt1Y0EBC4Pf1QrpLlVYwbrJTTlfM8yMfGmWtskH5b5R00zw0v+EsGayx0YcpAZ1KwkUaTalaqvm1Xyubfnyua+QbTv2eBVW7dViqYVeW8w+7lVLgAlqzQQFJP4QRPa2Kzvbw+T5xD0yXBUZG9QyB4MflIN7ZIJa4UCZt0KtIEapn/yTd/fNsy8WYPCHwTMEgbb7qkKhhXKG5QcspiZryvo7NcCh/2Dc7JDzj1vnguIw64zzbqgzlY0bVJGFS30nBNyor7Pubn1HIMinlDNcWpDJ67xTWgQt+uHnZxrrCmyA7D+9NKNRdbWwW7Fmp/ykSsz1+rzf8uA/8vyD/YwVTaCCCvp84dre/9Q0c52TNBPJsUc0MBYoUCxPmb1J5i3cJp9+s1zSVSlyi5rqW+mq2Yf27T+g1nbZXkUgAl5WVMsmSDO1hstPInlWoOzCc7523S61YlXLQg2wi3Zg/4GDskGtMmCVVtjSvEl1bxXWbswdbNuF0bKOhBOOBYsiKGXwzumsAUybqVVlQ32nwRrrx/FrjWLjB7XybKkK+xOPaGirV+BPZHK6/6mppo3AvX/8kQ2kQe3KsiNzn7G++2vKxqiPsV3byaden61tWrYcf1RD077BMgfWWH+qciBTj4H7+A5VPiN7nr8U9D3SOidA7361Eps1b6spHorA2skVzXc7Gdlfj20zk2HFL2rx96bGHTrzpKZy3qm5bcHIl2fKTLUueXx4H7XWyI0daRX2plDHPwU5/4K2y7CcHPbYv5Ke7okn1bVTLWmv1sGptSqphXGmjNcMk8++OUd6dQ2thMbpFLTNg2LTabXkQBTya62aSdq/yH3vYmNrJQNrQ8SOCdWH2JJz7niGKCRAAolHwPfpdql+/q4+cH+JhcCKBJYvkI8++sjrNlShQgV56623vIds3Lix97v9csQRRwjcrZDmunZtzyANKbYvuugiWbdundkMljX4bbNAjRo1Sl+amTJr1ixxWsk89NBD0rx5c7NPpBmhbrzxRh+lzEknnSQ33HCDcTmCixDqhHrAOggCS5dzzz3XKHPMggD/TJs2zbhEnXXWWeYc4co1Z84cYwVkrw3KRhrz2267zVsCLHqcSpkHH3xQUD8oZyAbN26UN998U8DdCpRasJj59ttvzSLUjUoZSyf/z/p1KpsZ3NGfLDIDh3F/rDHuOvnv6bvFW7o/lDIwM774nNYyUM3RrZLEbjll5iZVengGWi+NmScvPDAg4Cwjtp+s22K28vG7+3gtLNB5hCks3EhsRP/PvlshqDvkgZt7Bi3PbKD/fP79CjXRT5Jn7jvMZ4B21gnNzEz3JB00w7Xrn+kbpV8PT6cUCpY22nlauHi7TJu7xaRstuXZz0k5gxlYnexWBczM+VvkyBxXJbvNLF0G5Q7OAUEtI5XZ89NlYbntcv+tPYy5ud3/dFUefPLdcnnnk8VmUDhWLWxgWeQUzJC+8O4Co5SBNdHwG7v5patspCldm8gDz8ww1jnYN5Ig485j+X+Hy9YCdW2DtQsG2U++Otu4b6COHdR8O5jcdGlHs2qRDhhuud+jrB2i91aoNLpNtYN/zUUd8ij9Tj+2iVoIeAbv41UBBWVRg7qBrcNwj9TTYKTPPXCY4PmwctbxTWXEizNlilotLNB7YaYqxJBtwilwefj4G49Spl3rGnL3Dd3VBS9XSYisUv+ogvIxVaDllwbUjXNB5xeKl2uGtJdTHanYka4Y4mZ9nRwi/Y5BoXUPg5J33cbd8rsOUpBeFUrI6/SaIjh0IPlVLaTg8gK5bHBb8c3c1UBO07Stt42YYsp6V7OB3H1dt0DFSEGeL/B8TjOHQfnWqGEVeeCm7j6uQAhq/aa2U2P13vrt73Wmjnbwcs9QT33+VsXfo3qPQm6+tJO5BwNWNMDCSJ4V3L9QykAeuLVnnmcFWdOW5FgpBThUXBYhXTKUW1l79hsluvOgBWEdCSd7zL496shV57eVVJ3pd8qpel9dO3yCsWh5XwMWu6mYgasOFLeIx/GcWl/6u7de/t+2qqDZ7axO2N9HaUry1JSK2r71y9MGnqDKpYefm2Ha6Xc0m95h6gKI95UVN94j/8vJQLhTFUCDr/vVFH2Gtq3+/GBtiT8rmEyBdG6T7OPCBesdKBjbNq/hU1e7n/9nQc4fZRWkXR6tWTChlEGgYrTJ/uc8SC3qYHGHZ9QKlB3+4kab96Qq59CniVSGXtZRcJ84pakqLK38rO3bFXp/BhLEA1qUMzGA+xtK4mAKtED7cxkJkEDsCeS2ui4ea968eT6lBYrX4rNBlD+gMDjnnHPMX5s2bbylINCwXY7P3r17e9chS9Lo0aONu81xxx3nVcpggwEDBhiXIrsxrEQQf8YKYuSgPGznlKOPPtp7PMSRCVfg9mMVGtjnmmuuEbguHXPMMaZe4Aa3ookTJ/pYHN1yyy15XJ6cx4TFz6BBg4yyqnv37kZR0r9/f6O4Kls2t3P9+++/O3cz1jh2QdOmTWXYsGFepQyWI/03lETWVctu+9lnnwnczVDeO++8YxfzM0wCZ+lgsUWO2e+b6goAM/dIBDEArGvN6Rq7AoMQf6UMyuuts0CXqJsIBAFhf/xzjfke6B90GK4f0sGrlME2zg5ioH3CWQYXq5vUVBixJ5xSriwUSrnKDPj0O6VvzgzWQl2e5XBPwTboOEHpBKsaZLiCTFO3HX+ZnjM72FFn9KPpjKDuyOKFGAD+MvDEZlJTO/EQKIX85Vvt6CPlMOTWKzv5KWU8W8O6BClqYyFXXdBOblIrAXSgIXM1DsjtD0+We3VWGMoBNwQxEp57oH+egSbKxv143mnNvYdBZz6YgDM4OJUy2BZWRs57ZEbO9XSW8466oED5lqTuVffd1NNHKWO3w2Bn0GnN7M+An26dC5SMUBA6lTI4oHWlcau+AU8igoXfqNIOSgn8Ie7VWHXLg1KmS4dactHAVkGVMnAtsIpZKHB8lTKeCuA6nn9GS/MDbiCIexVICvJ8wQUSlnsYcCGOmH98Ftx/Q/Q8UnRwj/biQ3WBKSyBFQikslrVdWwdWDEayCow3vVtUK+SOeS6nJTK9vjxZP2ffg0EijN/pQzqgjYcSnEIBttQKLol89X6CoJYa/5KGSyHErOpKgCjkb1ISXxttzxKGZTVWa0Uz88JvgwrMyhHnVKY7xHE6oLYYOD4jrhlO3Sw30zdxMLtHxTk/AvSLsMKyrqhDdQ+kr9SBudTTd3Ibr+6i1oIl8PPgOJWm9dA20UomSL9qx6gbq3Uwg1ZFyFoy2cvTM9Td/SbRr0+yyhb7coyZWIyBLTF85MESCAKAjF5Kv3jsMAVJlEE1jFw4wkmUGA4xf9cnOsK+v3VV1/1FlGrVi2BhYo1I/Wu0C8ISAyljZUlS5YYCxj72/8TZSAlub8g1g+UPlZWrVplv5pPBO+1goC/K1assD9DfuJ4iOHTr1/guB4hd+ZK06G5UWdoYe2SpW4jcCGKRH5SBQsGGxiMOk2MA5Vx3OENJUVNsyET1TolmGCbAT3zmlEH2z7c5bBiCDYYgbKmjlpKQDZp4FanwB0FAqud2Qs85td2/UJN4YnOIaxqeuhAEhJo0A5za0jvrnXMZ6T/YNB31glNA+6GgXb3Th73Lv+6Y4dvf11t9mur5+9v5eEsEEGLmzXxdLCcy934jqC5r408wpjPQ4kFQayB6zSO0MvvLcgTF8azRfj/QnESqnMONx4rcIELJnCFCRYHB8qrVLW4gqT5BTNG8Fy460FOU+sjf3NvsyLnnzPVQiuUuHUuOEYgZQWWu1lflFcQwb1dQTMw4Q/tkBW4Olx+259yh7p+ob7+8s+MNJNKG8sHq9IymPTToNpWEPA6kLjxfPXunhrUjB/XtGfOM4ogpoUlVXLcHGG9trwQ65Hf+esrxUi5crn3AxbYtiwerCuqC1MoaazugVbWq2uIWwKlGQRZiDAQd1OOVWuHULHkEHgXlp8Qq8Szx7fs4/0egaXOSr1X8X52Kqrw7oU4lTW2rsE+C3L+BWmXbcBiTE4Ee4+jzji/UK6+brV5cKd8UeNIRfrXVycW/KW0PibXDeloJkDQR7rrsSny3NvzBMG2YVmKWDjXDP/bWCVC2Q5BLKP8ni//4/A3CZBA7Ankmk+4eCxYVjgFCoCUFM+gxbm8sL/DsgRuP1B0IMYLlDD+ihik/Y6VIPuSlYEDB4Z0AYKL0BNPPGE3F8TxgTVMIIECBn+BpFmz3AGJzeJkt4NyxQYLzs7ONpZBQ4cOFcQIChS02O7Hz4ITQGBCWLogBgLcAuBugZn9cMSaGLdG/I8AsynOMqBAgAJjy1bNmhPCFBvbhBpkO8uM5Lt1Hwi2Ty2NCZKmHez07b6DQCht6tapZGLQwJ3JBuNEOWAFQeaXLhovAgM8zKDCEgQDeQj8udM0fgOkT9e8Fi9mRT7/1K2T5HX3CLQpstZAtmmWJ5j7W6sIZC6xx0bsjfwEZsmIoxILgYvCjRrXaKAqmMZooOgJkzcaC5Nv1eJg0bJtcs+NPQTbuCGb9RrAOmKDKmHWb9plPmG5ACVixu7gs9v2mgWrQ7LeI5s2Z5nYSc5t1qlvvZVe+cQQwmw7lI9I8xqORHsu1auXDzgzjmPGsr7hnJNzmxvVPB6pVCG4Pojpg4EuglIj7sIcdeO78YGJ8sqIw33aGGv9UlVjSh3UHZGtLJhgUIUBHp7FQBLt84Wg55u2eMpsrEGGQ9UBsUogmOnHeeJ+jLf0Ues/BE/F8YdrvK1LB7Uxln62vYh3fYIdz8YOa5zThmK7wmSNXATrNN4NsuBs0Ocf96czs0xm5t5gpxLx8n7d6pi4Wlu1fbhDg5BfMbidBMv0F2nhNsZLsP1gjdNA33Um5lrOOwvbxvM9gixKzomb7Rp/CQP+ihVLy9e/rPZWHfFuIIjP5FzeRmPctQmQAQ3bRnv+2NdfImmXcd9AULf8+klNHK5B/sd0s83zL7sgv9tq7KDb1VrweU3gAHfuH7Xtxp9TbtB2Hi7vULgj2xyFBEgg8QjERDHjH1MGCogePXokzNkjtfZ9990nf/zxh/ry5nbm41lBxIxBzBYrNkaN/e3/6R8nB8qkYBJKiQLLHCv+GaAQ+BcuUJ988onZBK5cyIaFbFRYh3g0vXr1srvz02UCMPefMDXNBMp8SeORdNb0yeG43NgOR93U3NnDUFVDVH4IBidOBYJzn1RNTRwLqa3uLqGkauXyZjXcGvwFypivxq3MYw0zWdPNQg7T2fIknfHvoFYn6HjAdckO8m3qy4YNKkcUO8JZh5Sc4IjOZc7vTvPng5oSXXIsDzBohHsNpE4+549tENsBEsh6zqxw4R8ouu7SLDkLjt8uz7w1x8S8wEAAgRwfG9Yn31hBwaoABdRHOuiExdJmHTxFI0gfHkqqBblHnAN+mLznJ9atK9h2bpxL7RzrtEDHcLu+gY4RzTIoKzBrjD8ExkTQ1ac1Ow2s0t7WGA1DL+7gLXZtjpsLAl9fp0HMwxF/Sye7T7TPFxTM9vlC0Gcb+NmWG+gTCqJ0HUy6pYQMdIxgy5De+RJVxoz+dJFh+rTGHAHXEzUQ7ClHNwnofhesrFgtx4DXBsdu5nDZKQzWyI70pc74z1H3DFgZxUPOOrGpLNQU1pgkWaYBx+8YMdm4nJx6XFOjwHTGXom0Pg2DxNZyllM7xaOYSduUqziO53tkmgbTf3XMfGeVzHe4QAda/sfEDYI/K3cP7SoSRDET7fnbsqNtlzfmvI/y64PgOJVzXH7x3V9562abh/LdFMSTa98qWTNELtc4VTtklbrSptauKB1aJ0tvTc6ARAqPvTzLHLJWPv0ZN+vFskiABMInEBPFjH9MGQTLDZbmOfyqurPle++9J1dffbVPjBZkJmrfvr0J4NukSRN57LHH3DlYiFLWrPHVZOdnUVS9enUdLJX2prAOlCHJHi7UgC7UOuyP4MKIyQMGUMxAkDb7q6++Mim0kf4b65xuT2Yj/lNgApgpu1EDrg57ZLKka9BQxG5AnJdQglk0DJggNYJkQvLfv1qOmTaUH8gKUFatB/ylml9GI//10f727+REUg5mmqGYge89OmeIIwGlFGaAoHCxMUlgLQHFDCxrrMmyjfuCODvRSn7PTrDJd9shxHFtHJpo6+D2fhgkPq9xYZAlBgF1kbnmh/FrdIDYKOJDIXjq05rFxw7oYC3SUlOb47ogmG/91CRvVqpQhed3jwS7Ds4Bf3L1gs0GunUuVat4FI2BztfN+gYq361lx/avL9/8vNJkxEIsJ8275C06XTPMQOD+VLlSriusd4MAX8qpRVsgCXZd7bbBni9ndhG4c8JiLhyBBUBhCawjkblsjAZ4RVsFK7sPxy5Ti8kVcu7pzeS/p7b0WtwVRh2RItsKMiFZiTfrt1R59fm3K+zhpZ5miUN96qlFSX2diEAmq5ffyatA8O4Q5RdYiw6/oasgyOsnGkwc75iVOsh9QQNMj/l8sUmTHShjUjiHCyeuBxSHkHLlc+/6eL5H8J58/qFct35cB2THQpwyZMmD7FP2t2qmNTz3jw7rbZbZf0K5akV7/ig72nYZ/SSbiSk/xb89h2CfbrZ5wY5RkOUpyRXkao0pF0y2aJZOSEqMJt+CHZfLSYAEwiOQd0QW3n4ht/K3mHnjjTdMRiB/q4+QhcRg5fr16+Xmm2/2KmVOOeUUufLKKwXBe8uX93Sg4cITD8UMFEBOWb061zzUudx+R92hILHSunVr+9XVT3SOkRXqsssuMxmvxowZI5MnTzbHQJYYuDoh69WIESNcPS4L8xBA/JWTdFCMFKD4g68zMueUCjKGQNBcpARGx35Tzgs3P5aYDYVg4ByORU5+5cVrPdjYrEvTNF7Myf+pJJNysifAjckK3IXe0LSe83SGFab3ZTXA3Sx1xYDYWDV223h8VnNkBdqeo0QLddwMzZYRT4FC8K7ru8uFQ38zh525YEvEihlke3h29FyjlGmqbnkmcLQqffyldOncgYb/uoL+ruZQgmzbmb81xC6N5xRI4nUubtU30Dm4vaxZ42pGMYN2xpnJAyl2kZOtrireXn/scLcPG1Z5qQ6rJNx3R2kQ4qIgiKM04vZemlI8Q77/fbX8/Oc64+r14RdQBOw2QYwL4zxgRfmuZhKDwPWrtWbbsRJP1lPVasMqZfr3qSuXq5WRfxBgZBOLpRyj79+jNaA8LEi+0/cxsvVgIgRBsq/Vey0aBbY6C+Zb5c05rnlQPlmJ53sEmeyc2ezS1NoECvP+GneuUlIZUyVYFMFSDa5JzbXND1+iO/+CtMvoJ5UvX0ayNfDy9p35u7xlqCtQMHGrzXtBXY6CxdsKdmwsH6xB9GH5Eo2g7bbxtdpq+0MhARJIPALhTS1FWG+4yyBVsxW4C9166632Z6F9fvfdd7Jzp2cmCO4+H3/8sSDTklXKoGL5KUjcqjxSSjvjwCCddShZtAjd31zxV37lrnHnG9J+X3HFFfLnn3/Kb7/95lPXZ599VgdguSa27hyRpVgCMHNPzjEzRQpYzJ6VCTELbGenbEwAW06wz405fut2v2DbJdpyzGL2zInRYrMu2fgyh2lKVSs4L1jT7N17UOYtTpclq3YYE3i4GrVrUdNuFrfP+jpotbIxp8Ntfwf6XLvBk7XGrXTZgY7hvyxZlXQNcwJprl4bOGuO/z7O35jJhF87ZPj1XQWWOP6C9KzWmsZ/nRu/66lFjhWnNYpd5vxEBxVKhkASr3Nxq76BzsHtZTbjDYIDV9QBjhVrpbZB4/vYWX67Ll6fcOG0waxXBcn4FK+6RHMcWIAgHfkbjx8pLTVOGOQvDdoJF57CkM81IxcCvUIuOqe1j7tXPFn/+MdaU4faGuz79qu65FHKYCXccWMtUEjgvXOfpmB/8t6+3ow9r3+wwCj+Iz3+xhCx3VAWnqO0zZ7+Vd2cQOdYXljvkUxVYMNKtYG+H6xSBvVZuHQ7PqStxmyJRKI9/4K2y4hhBbH9n1B1XpPzDsY2iAXlFLfavBUaj2uRZpmM9A8Kqmjl57/WmXdwNbWuPqpv0VBgR3uu3I8EiiqBmChmAGPUqFECFyErX3/9tbHEyMzMv9Mfzja23ECfWVlZXjcc53qncqNevXoB3XF++eUX5y5hffd3SwprJ92oc+fO3k3Bxz/NuHelfnnuuee8P5EmvGPHjt7fsf6CTFXOLE/79+83AZNjfdySWj6sWK6/qL05fZhQf/z9spDm+c1ygjMu1rTZS1bmmqAH4ofMKrNzrEdaNo2sQxWoPOcymJXHWqzFyyzNzLRNZ77QOUzWmCSt/fzZe3bxBBuHZc0MdWmC9FAXJ2QviLfgeiI4KuSPyRvydPSc9YFr1qooFCPOMqL9vjPDY6nTqH5uu+1fVjD3D9uRhUVTPXVdCiQILhxLcQ5c/NPM+h8XsZyCSbzOxa36BjsPt5ZDibUgJ8UzUrs6g4Jb5S5mzqfkBAJ167jhloPZ8FSNyQGBq5XDsDTcImKyXbBnJdjB4IJwy2WdvKsXL/MMfL0L4vBlkgZS/1CDgkPganXm8U3Nd/tPLFgH47Q6R8nWXK21ggVGhtVGPAVWToNz0llDgRIq0HSwes3NScUdbP0v6j6Vtcej5HYquAvrPbIo5z5s47CcQt0X5WRkatcyssmOaM+/oO1yvdqe99I8VXhuSQ+slMd5we3p31mb8TWguNXmDVWLqyfv6RvxH1y6oxG0i9/8ssrserJaZcNSlkICJJB4BGL2ZCJFNoLGOuW1116Tnj17ytixYwWuOU6BMgXWGeedd55cfPHFzlVhfU9OTvZuh5lmlOUvTkXR9OnTxZkVCdsioC5SVucnzmNhWwQRjkYQgLhMGc/sI9yUhgwZkicrFMp95plnZNy4cd5D3HXXXeq+EtnL0LtziC/vv/++rFu3LuAWU6dO9S4vW7asOF2xkNFq2LBhJlCwfwpu707F5Iv/7EmsTguBbg/PmdH4TOMO7NbBUTAZeGIzzZbguY9eeX9+yFm8MWOXmBk5DKAHndI8WJFhL6/ucNPZGqYrVdiFB9gQM5c2rfjXmkkIA8K+3Wvn2bKXBrqDzFuUboJG4nu02Ziwb0Hl+CMbmCJWa5wCxC0IJLi3XtVZ2ECBjwNtH84yKHpggp/fffvXlA2yUwO4QtprSm+n1HTELtocxMrEdvKQ7h0zrP4C94i3Pl3sv9jV3wj03Dpn9van8Ws161jgwO6o37saJyKYxOtc3KpvsPNwY3mWmv4//cZcbxyrAb19Z1kRZ8Na973+0SLB9sEEA3Cb0STYNtEuP+P4JmZXWHp8P351yGJwX2DwFQsJ51kJxah6tdzYSJjVjpcgEPW9T02Vh56dYd4PeJ8gnW+geE9usA6Hk7XM2rx1d0AMiDP2Xc5AM+AGBVi4R60tg4nTxcc/rlt+7SzK/OnPtbIsSJp0uNB89t1yc2jETRvQy/d5K4z3yOIVHgWh/+THoqU7zP0RSarsgpx/QdvlE47wvIOhUBszNnj7/+WPK2TDxsD3HOrvVpuH9h+Kt0j/nOnKzY0Sxj8450c1sD+slRCD65RjPO1lGLtyExIggTgTKB3L411zzTXy3//+1+cQK1asMMuQthlWK3379jWDfCgajjvuOPnyyy81LV/wzp1PYY4frVq1cvwS44ZzySWXmExCw4cPN+uc6aWhvEGMGSgU4NIEZUefPn10gBs6IwgK8j8WFE6nnnqqUUQ5Xbh8KhTgR9euXeXGG2/0roE7E3hcdNFF8uSTT8odd9whRxxxhKmj3ahDhw5yyy232J+ufn7xxReC8hHg99VXXxVYD7355psmPtDLL7/sPRbqCFcsCDjinKE8GjlyZJ7r7d2pGHz5/HsNzHjtLzLylVlxORsEcIP7DV6qa0JYUSDzy/k5s3gLNYDrzZrWFnELnAK/6oeemyG/qikrZIiaqEfzgneWie8Iwmjl4+9WiHV5CDUjZbeP5hOzhh3bepSSv03wnEtfTW3qL53bp6hFXGlZvS5TlqkVEWb5e3TKq8Dx3y9Wv889uYWJj4Pyn31zjoz9caXJiGWPB/Pk4aP+1UCg6YIYLW5Jtg4wXlJf9ivu+FM+1mxJsKiyg1IMlDEge0cDkGLwDamhqbIP18G2U5AGHJ05yDgd9FqFB651tt6bkFY51lcYmDylAYDB3QqstO5+4l/jOgSlWiwFboCQ/fs1MOVDk2V6jrWUPSZiUgy9b6KU0Vg3ONdAEs9zcaO+gc4h0mXLdaCI1Lf2b5wOHhHw87Lb/jCZaVBed1V2nuVnQYHsNEPO9rx7kYXrRmU7P8fFwdYB7RfKve7eCRpLZY1d7OrnKUc3lvrqwgh5RbPJvPFxXiUR7kMoPq++829VXkfexwinwuE8K0+9MVte1DraWF+2XChskKnJShfNhuWmzFQrQ3t94RbyiSoA8Kze+sgkueauv2XaLI9lYYd2NeXpew8Lmr3ODdbhcGqR06YsX5khYzTmDSwkrcxTC65hI/+VyjmB7O1ytz6vvftvgUvX7izf+wRppD/93qM4qaMuqs6YN2hrLrplvNyk79+t24NbZMD65+7H/xXrhmvrvFLf8bc89I8ZPGPZRQNb5bHwLIz3yGLN1gdp63BPRX8CirGGDapEHKcu2vMvaLuMgMa4tyG/aDynUZppznl98S57/aOF8vYni6VlM0//1mzs90+itHl+1dI4SFvkl7/Xed/JWI93/QK1pB4+aqpMnLLRTGpdr1n14LpMIQESSEwCMQn+a08V1iDvvPOOnHHGGTJ06FBNn+prHpienq6R0tPt5gX6PP7446VFixYC6w0I3KE++OAD833w4MHmE8oTKDqsNc3atWuNQsGs1H+gKIJLEax6QkmNGmrOqmV++OGHZjMokn7++WfzB0uhSARWM4jBA+UOlBwZGRlGUQRlkb+g7lCYxDIjEiyXEKw5mEChNnr0aO9qXNOlS5d6f8+dO9fE8bGKG++KIv4FZqAfaipWmBj/+c8GOfukZtIyJztBrE4NipMrVTkz6tXZ+R7iDB0wbdGgvt+oFQmyR1w/fIJUUaUO4oZs0QEJ/iAYGJ+nweNOPqpxvmWGs0F7NWNu0riKII3mzxoT4PcJ6zU9Y5LxYx7zzFHhFBHxNr018N1sVWDgnJIqlTVpxf0LQeepU7tkma6ZJPbIAenSITniDqR/mQX5XVUtlG7SjFtPaWpcxFlBcOJ31IIEriGYJcVMFpRHd2l8lmmapQUz//llqYmkPpgBfFePhz8IuO1RKywoUqxgkPPIbb0EwQ2dgnqdoKl8v/tltSzVTvoVt/9l7iukzn310QEm6xKUOV/9tFLgTjd5Wpr5w4wvnpsNarVTURVqj93RW4Zp2tk9USjenfUJ9b1z22Q5V+/vT79ZbiyA7nliqhm8NdK6bND6InAnXN8ev7OX3P/sdNkeYAAVz3Nxo76heIS7bqwOQvEXTI7QgLrXXtg+oAXFMf0byCJVeH2v9wfiXN320CTDvGG9SpKp9zaUf9YKrEenlGCHKNByDPb+76rOJuvXFo07MlaV6F+OW2Hc6qDcRr0yc4JqwwqklP4XCwnnWTmgBmVghT+4ODZQTlAkrtOAv9aF5Wp1ZXUG2nWjrkh5HkpgoXPZ4LaCLFyhxA3W4XAafFoLgSUfYlchBfrHmh2phWZ526puKNv0uUXbedl/OwiecbdlZ+ZeeUstwPCXkpIkdVIqmjhlq9W1GPcyLIpuu7qLz2G/1PYPmX/wB5fVgSc09Vlvf9yslkiwHnxYrZPwjm6gCkW0TTtzFE+Il3TxOW1MoF27j/0sjPfI1Re0lUsHtZYGdavYamismbLyirb9SRXLeZeF+yXa83ejXb5BYznd99R0o1T6TfsqcHltpMoltAlr1nmu7cBTmklrvc8ee9EzARcoXn0itHn+vNdrO/vKu/PlhbfnSW29Z6voOx6BfqEYh+CevVP7Fz0LcYLKv878TQIkkJdATC1m7OEGDhwocB1CBqQuXbqYrD52nfMTipU777zTWF44l4fzHZYuUGb4K1UwuLFuP/gOZc3//vc/nyLhmgNrme+//94od3xWBvnx1FNPGbcr/9X+bk7+6/1/o96IHwPFTrdu3XRm2ldXhjpDGYJtfvrpJ5PS278Mt34jO5UzILGzXKTzhqXO77//Ls7sWqmpqV7XM9QVqciLm1IGHBCbpHPODCYGdo3r53ZSnJzc/n60ZoXATHV+gs7yVarEGaGDX3RY0bnDQAQWNFBgoCMMN4+ndCb0f2flnYnLr/xg68FlmAZmhHIGggEGAgU6gwQG2zfa5TbODPaHaxPiHgQSGygY66LNYhCo3GiXIaMFZqLtbBw6TEtU0YEAlrg2UMr0dWSXivY4zv3gD4/BVgudAdTH0ytwObJKGdzPg89qIS89MkCaNgx8X184sLUcpvW3gthHsDrBHwT31z039hAM4K2s1Y4ugsI2107uQ7f2jLki0x73YrUGG35jN6OAwbJdatmD5wAZObp2qqWpXXsFjYOD7eN9LgWtL+rstiDtdCsNRPufAfVNwNNhOgitGsQ6AffVdaq0ue/m7gIrAgiYw9UBChEMZGHNcsNlHeXis1u7XVVveW00ztRLD/c3dUY2Ibg5oi1CcE20hbiuxxzeQF4eMSCm7VN+z0rvrrUFAW0hGeo+iHsTCk8oZdqqGyHu3dOOcUdx7oXj9wV8YJk3QLMdDR7YQoZd10VeG3lEvkoZW4wbrPPjBEvQEbf3NvchjovrCU67du8z78RHdF2odPS2rtF84r0L5TUEir55C7eZCQ/87te7rjx+d18NJO8bo61rB897GvdZJ1UQB5PaGg/p8Tv7SDu91nBRxv0JpQyeIyizH1bl+DmqHAgm8X6PIJB+I+3vOOOzwa0IyxAXKVKJ9vzdaJdR5+cf6ifI8oXycE/BvRgTS8gsd9E5reQytbrcpZMnVmpU952owPJEafNsHfGJYPJ4pg8cPGTaPUySoI+BunZqnywj7+pDpYwTGL+TQIISKKXpoR1zpvGpJSxMEM8FwXiTkpKkbt265g+D/IIKrE5gNYO/ypUrmwC7gRQFaWlpJsYM0mMfdthhPoGKI6kDYuXAYgSWJgjmC6ubgsjevXsNG5QJ6xtkX8J5xFMWL15sYgBt3bpVzf1rGGUNlEPO7FX+9cE+sOTBdm7J4tX61kwgwUB2oQa8QzBCWGQkssAsF+4kmzQLUIO6lc1sVzAFhhvnAbcYxDNJyzmezVzgRtnFsQwEVF2qbkVor+Cjn6TZbmItMNteszFTFXVZaslySGolJ0mKuvPArQCd1HBkkyr51qzPUOVrBUHQaSgE/QVm/Gt1QLx3735p1yrZzNz5bxOv33A9WK5ZuWrWqCjNNftNuOdp6xfvcylofW29C/MTMXwQFHX7jmzj6pFaK8kVt8lIzgmWWnC5W633alLFsmrxkKSWYEnGvTGScgqybX7PCuLtwJ0pUxUNyXp/1lFOUEYUNSko6/w44b27YdMu835JSionUArBTTXWslffoWu0HUPsNHyHFQICdgdTUKI+uO8RJ8gZhwbLZ87fKner6xXkSVXOW6UO3NcQWLtcuTLSQvsVkU5oFMZ7xJxEhP+4ff5utMtQWqzUPlL6tj3mHex07X7ns8XyiVpdVleXnw+eOzrfs02ENs9WEvcqMj7BCgvnBGVUrSBuu3afRPls3Tj2z3WinCvrQQLBCBSKYiZYZbicBJwEEk0x46wbv5MACZAACZAACZBAfgSCKSby26+4rC9q5//IizM0JkuatGlVQ54a3re4XIaEPw8qZhL+ErGCcSDg6zcThwPyECRAAiRAApERmL0w3Zs1Kdw9+/Wo62N+Hu5+3K7oEOB9UXSuVbQ1RaDeSKSKupx1dTlwcCTH57YkUJQJwP128rRN5hRiHUewKHNi3UmABGJDgIqZ2HBlqSRAAiTgGoH3NM054hxEIl+8cbxUcAYGiGRnblskCPC+KBKXqUCVfPSFmRHtj9hAz9zXL6J9uDEJlAQCyMwWyl0QLuAvvbdAM8N6AjyfpwGoKSRAAiQQTwJUzMSTNo9FAiRAAlEQOOnIRhGn+y4bKJ1EFMfmLolLgPdF4l4bt2p20bmRBUwuKvEk3OLDckggXAJX3vGndNesRCf/p6G0aFLdG/sKqdgXLd2m6bIXedOVDzq1eZGJzRLu+XM7EiCBxCdAxUziXyPWkARIoIQT+I9mCaGQgD8B3hf+RIrf7/N0gEghARIoOAFYwkyalmb+UFpldfs7qNGlkaXQCgLEn31Kcxl4Ep87y4SfJEAC8SNAxUz8WPNIERKoWL6U7Nkb96RhEdaSm5MACZAACZDc2Ze5AABAAElEQVQACZAACSQygduu7iy/T9oo02Ztlv37D8quXfu81U3RjGiwohlydktpohkHKfElgP4+hQRIQIRZmXgXJCyBtPRDsiOTipmEvUCsGAmQAAmQAAmQQEgC+/Yfkl2aFh2C4Mxl1SqjJEminT9SvG/bmS3p27PNtahXp7JULM9UzYV5T9aoWkpSa5as56IwefPYiUuAipnEvTYlvmbbMw7Jpm1UzJT4G4EASIAESIAESIAESIAEiiWBeimlpGolKmaK5cXlSUVEgCriiHBx43gSqFq5lM5mxPOIPBYJkAAJkAAJkAAJkAAJkEA8CKCfXzmJSpl4sOYxEp8AFTOJf41KbA3L6N1Zv3YpYXNdYm8BnjgJkAAJkAAJkAAJkEAxJVC/dmlhEslienF5WhEToGImYmTcIZ4EEBCsdk3epvFkzmORAAmQAAmQAAmQAAmQQCwJpGr/vmL5WB6BZZNA0SLAGDNF63qV2Nru3VdK1m8+IHtzsxqWWBY8cRIgARIgARIgARIgARIoigQq6KRrvVqlpXw5xpEsitePdY4dASpmYseWJbtM4JC239szRLI0hfY+TXCASP8H2aa7TJnFkQAJkAAJkAAJkAAJkIA7BOCqVK5sKSlXTiRJlTI1q7lTLkshgeJGgIqZ4nZFeT4kQAIkQAIkQAIkQAIkQAIkQAIkQAJFhgCDdxSZS8WKkgAJkAAJkAAJkAAJkAAJkAAJkAAJFDcCVMwUtyvK8yEBEiABEiABEiABEiABEiABEiABEigyBKiYKTKXihUlARIgARIgARIgARIgARIgARIgARIobgSomCluV5TnQwIkQAIkQAIkQAIkQAIkQAIkQAIkUGQIUDFTZC4VK0oCJEACJEACJEACJEACJEACJEACJFDcCFAxU9yuKM+HBEiABEiABEiABEiABEiABEiABEigyBCgYqbIXCpWlARIgARIgARIgARIgARIgARIgARIoLgRoGKmuF1Rng8JkAAJkAAJkAAJkAAJkAAJkAAJkECRIUDFTJG5VKwoCZAACZAACZAACZAACZAACZAACZBAcSNAxUxxu6I8HxIgARIgARIgARIgARIgARIgARIggSJDoGw8arpnr8iuLJGs7IOSvbeUHDh4KB6H5TFIgARIgARIgARIgARIgAQiJFCmdCmpUP6QVKpYWv9EKpaPsABuTgIkQAIkEBGBUtnZ2THTkuw/UEo2bj0gu/dEVCduTAIkQAIkQAIkQAIkQAIkkCAEoJypW6uMlC0Ts2FDgpwpq0ECJEAChUMgZoqZ9J0iW3cclENsvwvnyvKoJEACJEACJEACJEACJOASATWikVo1SkvNqi4VyGJIgARIgAS8BGISY2bf/lKSTqWMFzK/kAAJkAAJkAAJkAAJkEBRJoBIBFu3HxT08ykkQAIkQALuEoiJYmbDlgPCMDLuXiiWRgIkQAIkQAIkQAIkQAKFSQD9e/TzKSRAAiRAAu4ScF0xs3vPIUGwXwoJkAAJkAAJkAAJkAAJkEDxIoB+Pvr7FBIgARIgAfcIuK6Yycp2r3IsiQRIgARIgARIgARIgARIILEI7NEsqxQSIAESIAH3CLiumKG1jHsXhyWRAAmQAAmQAAmQAAmQQKIRyMo+mGhVYn1IgARIoEgTcF8xQ4uZIn1DsPIkQAIkQAIkQAIkQAIkEIpA1p5Qa7mOBEiABEggUgKuK2YOMOpvpNeA25MACZAACZAACZAACZBAkSHA7n6RuVSsKAmQQBEh4LpipoicN6tJAiRAAiRAAiRAAiRAAiRAAiRAAiRAAoVOgIqZQr8ErAAJkAAJkAAJkAAJkAAJkAAJkAAJkEBJJUDFTEm98jxvEiABEiABEiABEiABEiABEiABEiCBQidAxUyhXwJWgARIgARIgARIgARIgARIgARIgARIoKQSoGKmpF55njcJkAAJFEMC23bulQMHDhXDM+MpkUBeArzf8zLhEhIgARIgARIoigTKFsVKs87xIXDDfRPMgU4/tqkcd3iD+Bw0zKPszjogf0zZIE0bVJF2LWuEuVfsNnvkxZmycdMu6dmptgw5p3XsDlSCS87cvV/uHDnZEBh8egvp16NuwtPgfRGfS4TB6SvvzZfpc7fI7l37pUyZUjLs2i7Sv2dd2Zy+RybN2CS9O6dIndqV4lMhHiUqAgcPikyemWYUa4d1r2Ouo7OgZ96aK8tW7dA2v6Zce2F756pi8f3T75bLn/peq16tgjx8a8+g5xTqfg+6E1cUKQJQLiPLaflynD8tUheOlSUBEiCBAhAoEoqZvfsOyk9/rpVlq3fKqnWZsnnrHklNqSiN6lWRk//TSFo3q14ABKF3Hf3pYtmTfcBs1K19svTVzmI4smfvQRn9ySKzad9utaVbh5RwdkuobZavzDD12bYzO6Hqhcq88fFC+fH3NaZer408XBrUrVyodVy9LkPWrtslDfWedFs26f3+w++rZcXaTNm4ebfszNgrlSuVkyqVykpjVUz17ZYqGMQUd0FH1d6TOzP3F4nTdfu+mLNom/z978Y8516qlEitGhWkXmolaauD1pSaFfJsU1wX4PkYet9EydDnwgruFbTBkLse/1fWb9gln9WqKKOfPEpKJ/g4Z5y+61as9rS99nzwWU4HaHVTkqRuapLUUwVTakolKVdWL3wxEiglnnh5ljmjGy7tKCce2dDn7NZt3GXaACguiqNsUiUi2rjkmvuCnl5+93ugHb8Yt1LStmTJ/85qJVUre7p9to9SR++pgSc2DbQblxUSgRVrMmSETva0bFpNhl3dJWAt0Ma99uHCgOtCLWzWqGqe5yrU9lxHAiRAAiQQPwIJr5hZuHyHPP3GbDPodWJJ1w7MwsXb5ec/1sqxRzSQGy7uKGV1ltRtGTd+jWRmejpJv05YJ6+MqBHWoGefKpO+/XmVqU4tHSQVRcWM2yzdLC8jM3cQlqGWFMVRYBX07Og5MnFqmhzUTphTduzwnP/iZTvk17/XybejT3Su5vdiSmC5KqdtuxLsFDGAP+XYxnLBGa2kUlKZYJsVm+UvjZlvlDJVq5ST/7uqs3RpV8soMCtUKGssL3ZnedqHrD0HZN+Bg1IhwTUz/87cLJOmpeV7fUqpgql1ixpy2XltpEOrmvluXxQ22JnzrkVdnW18Uah7vOoY6n4PVIdD+ur44MulIvp59QXtvJssXbnDtCXHDEgsa1hvBUvglyydBPzo62Uy9ocVpu2CYiaYHFRrmvzeBYH27aOTOP4Kz0DbcRkJkAAJkED8CSS0Yma/Dkb/76F/5JBOfNatU8m8TFqpdUyFCmVkpc4oYBYIM6G//LlOZ4srykVnt4opwSxVALysg4B7hnaL6XFiXfiSVTvl94nrZbtawtx+VeDZmFjXoaDlXzaojSTrNW/WuKq0bR47i6mC1jPa/bNVsXf/s1Nl3oJtpohaOts/oFddwexm6dKlZNPWLB18Zsn02Zsle6/Host5LFiV/fbPelXqbJSn7+2X8FYCzrrze3gEOrStqRYTHvOPrD371ZIwW9K37REohb/8QdvGjbvl3hu7C6xpiqtkqNvSv+qmBBmk7m09O9c23xvVz7Vcu/O6rqa9O6JPPakQwC0gUZ+V8uVLS/vWuQqXPfqcp23Kkm3bPRaMeC8uWrJdbn94svTtUUcuHdQ6ppaD8eAEl9mMzGw5pPfsyUc3NteS/+QSCOd+z93a823thkzJUuVkx3bJPm3BomXbzQatiuH7059Bov/O2LVPvv9ttXz54ypjERtOfUtpP6Bf7/DcedO3eyYyUe5RfcPbJ5w6cBsSIAESIAF3CSS0Ysae6v/ObinnntLCxyKmnc4UHjugodw+YpLAauCTb5fp7/pSv05sXFqSa1Y0gx7MZE7QwS5iFxRVGfP5Ypk2a4u0bV34sVmiZVhXXTau+V/u7F+05STqfmM+X+JVypx1cjO59Nw2AZUriLvyo1p1+csfkzbIu+qGRym+BG6/qqukJPu6dMxbsk2eeXOuUVhPUYXFr6qAPbZ//WILYY0OOq0g7kgg6ajKDfwFk0R9VvDOeeS2XnmqDaVt2qbdMmHaRvnsuxWyRy2B8F6apkra5x/sJ06lVJ6dC7AgHpySdNLlgjNjO8FSAASFvms497t/JRet2GkWYVLLKQuXexQzbaiYcWKJ+/fn354nP6v7IlyTIPXrVZZdu/eJtYoNViFYiN+tSudw5MHnZpjN2rSsLlBQU0iABEiABBKTQEJ722Oi945ru8rg01v6KGUsSvjXX50TABCzhwtUQRMr6aNxYmrXTjLFvzxmgezKMY+P1fFYbskmMH3eZgOgedOqcrm6KgTzvkCcmbNVcUMhARCASwvaTCtzFm61X4vlJyyErNSoUiTmGWx1o/6E1Q9iS+G9+PrjR4p1RYGl1DOj5wpcVyjFk0A09/tiq4Bp5usWgwmtsmpx16xh1eIJq4icFZTpUMrAEnzQac3luQf6Cdwy3ZK5i7fJ5BzXyEvPa+tWsSyHBEiABEggBgQSWjGDzBpw3wglzRtV82ZuQPyFWAk6u9fmWGjAlPytjz2BfWN1PJZbcgnArHnVao8lQPtWySUXBM88KgIt1L2vcmVPx36DBosuMVKcfbaCXMTk6uXllis6SddOtcwWiLv29S+rgmzNxcWKQJj3+5IVngmrNi1yrcbSNUbZFnV3bdq4igkqXay4FLGTaaqKsQvPaSWjRx1lMjrCasxNeftTT1+1a8daIS0H3TwmyyIBEiABEoiOQJGfYoTVTPnyZYwPdXQIwtsLaQt7d02VIw6rJ3/+s0HGaUag//Sr79qLbv7S7bJ05U5BFhcMplJrJQle2K2b15B2LXxNkP1r/N1vHleWtpo2GoMy+KF/r1l8Vq/PlJqaveKSc1ubYJgz56ebXZHVAbJt+16x++J3g7qVpGt7Twcfv/0FM7IIxjxr4RbjPmZivGiE/+PUpcw/yCiya2Ro5pxaNcoHzWSFWaIf1YQXSq9uHZKDuqH9MXmDZOo5NWlYxct7sXY2l6iJdmlV3p3kl7kD9bbnZZn41z0lOUlZVTNpwMNJR4n4CrMWpus12iHr03bpjHVVtU6ooYFGU/Kcuz+3SH/jfsZ5IeDvJs2kEa4gcOBvE9abzRfkxA/AD9wLpXI68RUrlpFj9L71l1VrM2TKrM0mbk2axq9J0u0a1q0ivbvUDpmO3G3OyzUbDWYQwXlnxj5po/c+XFQ6tQlfQbVdUyf/pZmL1msGl7QtezTl6EETewPP0eG9g5txT5qeJlv1mUitVUF6dUk1s5g/a8DvBVqfCnpNzjq+idTzc5WM533hf82C/cZztTcn7hDakfwEbQ/OEc8U4no1a1RFWjetbtq7YPv6s8IzvFLvoVkL0mWOPieIj9JCleZHHVY/j7tVoDJ36LWeoamuF+t1R7tVR+uN7CFoc1M1vpK/IHPRgf2HTKY+u278pPVSrYrHtQtZqfpotjKIf12xrCDPCu7Pf6ZvkjRtpxHfqbm2I2h3kR2wsNJxDx3SQa65e4Jkaxvw7meL5RSNzxIsGP4+5TZ9zmZZoqyXrsrQDG9lpbm+azppDBL/DIcF4RRNm7JlW7ZMzokZ1L9nHalRrTwuV0QCa9ZfNCA67kfE4kL8uRZNqpkMNy31vg4UZyjQAQK9Y/Bunbdoq8zW7GiI3dK4flVTLrI1VtR7Pj9BQPcZag2Jd/1yjZOXou5q7dTKrasGrPZ3S3SWFe79viU9W7751VcxhwxfeJ98pzFMrIALJBvZIx0ur907pug7zdPWun3+0dwPtr74RCr1GfO26D27U/92SBk1I22v7LporK0mev9uUPe+6XM9FoJHaT+tclLw7m00bZ6zLm5+v+OaLm4W51PWNH3OF6iyFnLROa191vEHCZAACZBA4hEI/uZKvLoGrBGsCxDYDlJH04fGWq46v50OILaaLCDPvTVXXnyof4FmnNARfend+TJZB4XBBKbqV6m1TrCOxkvvzDO7DtHgj+jIXn/PBNmpg1MrCIq8SBUqdju7HHEKnMugdAqmmEEsk7sfnyJLc/zVbRn4/FqzT911fTczOLHLp87eIr/+tU4qaWrOj55P9Vo12fX4ROfoRfWvhpx5UlO54r95zWzRyX7y1dlGSTH0so5exQw67x99tcywD6SYsecFJgiYe+fIyd5Uy+aAOf/8MH618dP2H3A7t4GS6VmN24FYDlYQo2es/miqA7JHh/W2i135xMChgfqZr9H02NPnbFEXve2qnKuRb9m7dNBgz9u58ct6f1lB3AqnYma1pp9/7aOFMkOvV15Jk080Q8RJRzeSay/sENCdyh6voJyhTHj3iyXy2bfLfaqBOCkQPAOXqktXKMGg57UPF8h4jasCRZxTpspm+UoXfKODkzuu6SawNPCXz8etlPk64OrWOUV6dEqVO5+Y4o3zg22hpHLeJ/G+L/zrG+w37hd7/qhzMEGWohfHzJPf//Yo8+x2kzQLGKRn19pyy+WdpXrVvGb1TlY9O6dq9rC5JkOeLQOfUGB/ptlFbruqk/IMXo/pqpB58rXZAWMqvK2DxqGXdMgTF+H19xf4PI843nufa+aZHEGgU6uYcdYVCjdINM/KVrWUfOSFGSbgbs5hzAfaAkhjVWi9/PAA8z3e/0AhdPIxjWXs956YMxtUeRwo1gwGr4+9NDNPOz5eKwzd7TmnNjcpla1SJxpOBWlToOywbUpzVaZEqpj5St9FYz5bIgiG7RS8iyB3Xt81Xytcu5//O2bm/K1y/1PTvM8WtrPXvolangzXd2CoGHdIgfzw8zNkY9puewjziUkevCdH3B78PRLu/T5bXRf921B7sEDL8Y7Bn5XWDncnt86/IPeDrReU7SNfmSmz53kml+zyvzSWGu7bGy/rJBUrlPbeO5joCdRfKkibZ49ZlD7fRzYuFVjLtPGLMVSUzoN1JQESIIGSQqDIK2Z+186/lQ4hAjzabQr6iY7iVee3NcqCdZoR6qNvlsmFA1tFVSwGUPeOmiq7dUANQRrDVs2qSm215litHdQ5Ovts0yHDWuN59T2ulo/vMeLfZKqyCkHeqlYpr7N720zZtXRA3qNLivm+ZPlOE/kf7g5tdTsrLXXmN5Ag3ew9T/6rM4S75GRNw9tSO8w7MvaajD8oCx3NJ1+bJS89NMCb9aGPDurQGca5YRY8kGLhH4cyCjNhgWTOgq1GKYPOF2bPIxXUfbgOsDekZZkUwpg5Rd0nqEUFlEwrdMZ41Btz5Mm7+wYseowqC6AAgtTUWfi+OgvfQmddoQy0vtt3jpySZ5AYsLAIFp6vGWZGvjRL9u8/KPeNmmYCHcNCK5TASsFe442avQX3J6S7KhpyDGakWlVfhQRm/6GUwb6d1VoKVgoN61WRrRq748fxa41VwA9qkdVSO3UnHtEw6OELwhlKmeGj/vV2upvqALebDuSbahyNjVt3a9adzSYlOJSDoWTbjj1e5UD7NjXNLDlmUmE9gkCpyHCFvzc/Xii3Xdk5VFFm1hnbNqxf2cTzWLjUN35VYd0XISutKzen75GnXp9jNuuig5PDewW2EMJA5/YRk809gnvj8L71zOwzvs/Xe+KPiRtkqqZt/r9HJslLqmyAZWIgOaSmMi++O08z46011oQ2AO8sHcQiIG2GPmuPvjhLzfSPlKo57lXOcsb+uFLe/HChsZpD5r0jNTBl/bqVZeOmXfKb1gHKYzwHe1XRdqwjrW/XDimyb/8B2bYj26tw7dCuploteNwAmqm1TiiJ9FmBgvguVUyvXbdLjNWZ1qWVtgP7Nf02LBynKKvCFmf7vU6txfwVM2ivoFhA25VUsawce0QDY+0DJf6U2Ztk3sJt8uk3yyVdFVC3XN7JnE6knLCTW21KpDx/+GOtvPbeArNbq+bV5Mi+9aWGtndbtC1bodYzE/8NPvmR37HA7sFnpkvNGvoO6J6q7WQ1c+/Nmr9FZqmyAK6nQ+//R9+B/SVVJwL85d9Zm2TECzO1LTpoJhP69dJ3Pax39H6F5dLvaumI+wtWsoEk3Pu9v7p+28xkKOcXtfh784OFZuLjvFNbeIse+fJMmakTTI8P7yONtL23EkiZgXUFOf+C3g+wUB322L+Srm0bBG577dU6OLVWJVmlEwvjNfvgs2/OkV759A/caPOg2AyUBdFULMQ/tWomafsX3+72bO0zLsp5b517SvMQteMqEiABEiCBRCEQ3zeFy2cNa5nPv/fMsHdqn+xjseHyoXyKwwD5dzWbx2zZpzrDf4SmLMQAMBKBy8Az2pmA4gKD5f8LMKsM9wBkm0KGni3q0vLe2CVqudA+6GEmz9ykrlCZ8vjdfbyKEAx6EasH5snWRPnep6aaujdqUFkevKVn0PLsis91FraOBj5+5r7DfDr7Z53QzMy+YgC2ek2mmvdvlH49PDGBunesbTqgmLlHtpBAihnMyKFuCECIji1mpGtpx9cp0+d5TJOR0rNmFGbtqHs9zeD03AOH+cxmnnV8Uxnx4kyBRQZMfTEb6m8tBNPrj1XxBmmnGazuvqG7Tx0GnthUzzlNHtOBJxQobgoyJyxQi6Kvf1qls/v7jCIQ5uywfkKA10ACpZ29nsjWMvoTj2/5Azf3DGjtYstAql0oG/0HFKfqDPy1wyeYe+/9sUtDKmYKwnmcDqjsTCgUf7BKszP2qOPgU1uae/8THTRagUIgkECpc81FHbyWVXab049totYOM+Ufzag2XgdBUHw1UAVAIIFSCoqXa4a0l1MdKXvxzEIK875w1neqmqkj+DMElndw3YC10EF1u7xI3RfPPbm5VyHn3A/fR2vcASjuoGS496Ye3rYB63DOR6rLFwai63WbcX+skdP0Xggks9U9cmG57XL/rT2kp8Mq5nS9jp98t1ze+WSxUQSMVWsk3LtOgVXH27oel7J/n7pys856O+MrDDyxuTzw7DSZqwrqd7QNxDNh3Q7vGdrNFPW3Klgf1esKufnSTuZZNz/y+SfSZwXtBJQykAdu7Znn/kLWtCXqnlKY0kCViFbW6HVzqppx78LCE0qZRuoS+sBN3X3crhBA/E1tL2Bx85u6AaFtg5IgUk72+G60KbascD9tXwDWAQ/d2itPm7dt8N6o2mmPcnyqsSC76ZJOPq6r56mFEax0oBDKUsXx+18tNfexs854B77w7gKjlIHF4vAbu/lZLzSSM49rIg88M8NY7GFf//Yt3Psd1pZOVy1MpkA6qyuoc1IH1jt49tuqqzTewaGkoOePsgtyP4xW1zwoZdBPQJvsP0EwSK8BrMCsdSWOF+j14Eab9+TrswVxnCIVWPueEGJiI9Lywtke7S+kpVpB+fdtwtmf25AACZAACcSfQP5O0fGvU1hHhJ88zMoRwA4djCsGtwtrP7c2un5IR3NcKD5gxg//50jkSx2o2I7+TfrSDmTqj9nr805rYWazUfYPavKMQWEwQYfheo014FSC5NfpClaWczlindykgyb/GVjMol+sQeuszFuS22FBjBLELIDAVcFfcB6wtGnepKqJHYP1iDHhLzNyFDO91QInGkHdb9bgmP4m5uW0A+usuz2O8xjvqGsEsn0lqa/6fTf19FHK2O0OUyunQac1sz9d/bzqgnZyk85c4/6GYIB6+8OTBYq1UPdBJJX4T78Ggk6/v1IGZWD2FANsCDrGUIQGk2g5I4bFh197zK1h5XKdKh6dShkcD/fwEPWP76wWIKEE8VSee6B/nkEz9vE8S7mzhhiYBBMoGWG54VTKYFtbr8K+L2y9n9eBNpQS+IOrw8+q4MIg8PQTmspJRzXKMzC1+yF2hHXtuHxwWx+ljN0GbkCwooFY5aRd5/zEdR+kbZRTKWPXDzyxmbEwwO+ZalngL69+uMgMlGEp46+UwbaIW4WA66X0LYX77+ccdxT/cuLxG7P+EFgZBku93appaCudWNezoSP+0Vq1mHEK3E2hiMPgFjEt/GPh4PkYopafKWrtgUHth+rCGK241aZEcvxtavWzYaPHRQjuaoGy2EGxXzs5b7yi/I4DHlCo3HZlFx+ljN3vDFWq9NV4OBDE+IJVhVO+VfdJTKxAbr2yk59SxrMlJnbwnnJbEKsL0sbhCou4ZUjF3EzdcMPpHxT0/AtyPyCezMQpaeYcBqry0F8pgxVQON1+dZeQmYzcavMa6DMG5X+kf9XzsXQ2J+jiP1DSW/fks7QdppAACZAACRQNAkXSYgYmqVDKIB4EOu23XdU5btYy9rIiIOUQnSV9dcx8Yy6KgHvooIUr4/7MCdirlhg2FkKwfS84o6WJ14BBEAK0BrPOSdE6DejpsVgJVlY0y2EtEmwwAmVNHbVIgcuBDSpsj9FHTYunq5vMYo1vAzcUO7uP9ZNyYod0U8samAbDZWuaKmac7gpwy8CMPaRvN0/H1/yI4J8OGhjQqahy7gqOqWoJtGlzlgaJ9XSc7XoEdbVxf07T6xrKDPlMtRz6YGz0Axl7zECfxx3eQLp3SjEWIz8jULIqimCphdgzpxzTxKTShpIpWskvYGVjxyz8er3GwfzUo+X8j1pbbVNrD8j5Z+Sa2gc6nzPU6sVa1gRanx8HpBi2AlevUAKLgUCSKPcF6gY3ExvUGe5adpYYVg9famwXxBy5XOM2WSsTez4IAoptq2ucnROPbGQX5/k8TF02EMMB1wcD30AWaxjon6WKoEACRRbuXSiB/NsGcPw3pw04S1k7LWWcZeEZhVIVSoVYZt1zHjPQ9yo5bliwXkOA6uY6qE00sdcf9Sqn18Up3/662vzsrdc0mLsMnp+eer0Q8wQBY6MVt9qUSI5fSZXI6AugfZyzKF3O1EDdbsoFZ7YM6s6H45yj1mmIzYR39EK1dISVphXLvq2+R0NZLnRSxXQznaiAe60bAiXtSr2OeD87Y/UstOmzHcqa/I5XkPMvyP1gAxZjciJYO4O64/xgyQwL00DiVptnXfwCHSORltl7DtbY/dUilkICJEACJFA0CBQ5xQxmUB56Ti1ldCCdpGb8mP1z+lTHEzvM+/+YvN6YtiITRj99AYYzIwdrnzRVBkDQEc5PGmogWAyiMMu1zi9woHPfNup3Hc4MmHOfcL4H68jbfWtp7BUoZtK3e3zA7XIoZhB4Fp3lmRpDxpn63CpmwCxz1175atxK3WarGTBi9hYCRQ0ECifEPolGgimxbFnJWncoZjan+w7U16mbhZVeIQKoYhtYlqCOsN6KhcC968ZLOspAHQCP0WB+EyZvNEy/1VnwRcu2yT039sjjAhZNPWD1tW5jpv7t0rgZWQJFjHMwnJmZG1Dav/xoOVtTewwKu7YP/Szkdx/61wmKvTWa4WeDKmHWa8wSfOLewgA2Y3dw6x88a8HcnBLpvnh95JHeTC5wVUG8lWU6Q/6VpkuGAuu7X1abuFAjbu/lgwZuLhDEW1qlWeCCCQaZVmAFEEgxU7dOUh7Fj90Hn4htBYFyB3W0VkfIvGSltm6DGd5gUhXBhzWUmL8lQrDtY7EcbRmCp+LeGa7xti4d1MZknLLnE4tjRlrmGn12rTR1tJeIz7Npi8eKo7G+S0KxhrIPAqsKnKtti225kX4WpE2J5Fhw34ESEEprKEgeVdeWi9XKzqkgiaQ8/23bqCttKHG+n5wp6j3v+hxLns61QxVh1uG6RauYgTvjRFV0W9mu7QEseitWLK0p1D2KOaxDvBsI2gvncmTAC6Z4j/b8zYEc/0R6P+BdBEHdnK5YjiK9X5s47nnvwpwvbrZ5/mUn2m8EOB6v8bkgCJqf34RFotWf9SEBEiCBkkygSClmkFoZA33MBDXU+Cj3Du0edAAVj4uKTutNOmC+/p6JJvjri1q3+9V3Pz9BYEs76KmXmhsXINR+yCwExQwGmMEkVYMGx0Jq55Nyt2plT0BZe062DrVVWdG8aVUTnBNKFquYSdfzgIVMspqVw/wf1xMzYghCiRSiSD0Lsa5N0boxoQykIw0l1YLU3TkI/H/2rgTequGPT0gpa0R7KaVNIkJJEdn3JVnSpkWUrUJFWoWKP0JIVCpRkRSl0r6I9n0vLbShkJb7/33nNefNOffc7b1733v3ve+vz+vMOWfW75mZO/Ob3xKNy2GjbhSurPS+g3TSC49VVSvq7VNvDFyiVeFgfBmGHF/pcJmv+H40ZS4RybMx323Ubo4hEZAWSjPOYjgVBMZWpE3gSSfJBv0YGUkRc2+ucGE8XDbQUE37/Rjz07yL9op+G4qyYr9AXcEgAFMYf3Dd20/sV02a9qsYJt2tporUS51jakmIa6TQIM2Gv2gIzEsY3PTSWRFUQ06xRPhh+0Yds2dhq9rAlk00BEZbZlEFaXtjYcbATgXm4X5iYHmQMONvqFNMXFOX9GVaZXRdt2xL/W2wmZjbhJkP5jgIhsyNMfOUJ/7/Y07eIxt3r80v/9jBT+MxpwTnGv7JE40qa6YZVIRnCPN65rwdYkT8LHW7SM/4qdqFzy31LVxNR/L4CKmQU0VqA79htvQlGGIGe7iAj0QwygwKNb+FSw/XyJDg9RLst/k9h4Fv/Bnq2KaqUj6ee9LTfpN3WvvDjmNzeKQ1CMrJf0zlF2Hvb0k85zzkn5VpihhDNl7JbpT5iUQEiAARIALJg0BSMGZwygLPHxCxBl1Xu5hq+VBF8cCRcrqXmXBjs3z/7aW1q1aI5k+buz3Itau3frZYvy1i7I1n3xtR+r/DeKY51cetrZ1HWsPeRU4s+eCkef3Gv8TOzG4n2dxfUk714N0ChBOdC0VaAqpDWFyCMYPTWhgWBSGPtFKkuodaANuL6wKn5Ulr8QlJh03iW2JLBV48YLgY3lTGT90iG8TQaimhKjJQNppffrPBeV24UD4tnVRY7H4UEaYhvM68+0nwYt9JcCyQXpzPiAPGMATbTzxsGbfmkHw5Txh/UIXByXmRs09yPKN462/fw5tZKMrK/cKuc4sHKmoVIowjSKcZxgxO8P/an8J8g3REnjxR/gQck2Kzy0A41Pgx8UIk06f1Js4pIm4fDcEdbmYSDOTCDhKMsYPhBSmgYaLCOHLsBnXvbeeq+8VIdWZK0GzYkmp82GbMwJi1IdjLgvpZNARpi7RQvOaUWMsGUxI2pkaOW6e+mbRFewQzzEccEMD1uy3ZEm3+xx+XKyqm9yHxuAQ68ZhnMIQNYwFheHRKJMFr4VviFcoQvgPsjMBOGaTjQIdkPn+m62yVP19u1atDdRNVXyGZ60fpaT/yS2t/wFxlPDFFYvz71ds8i/ecZ/LNqtdJM7bqqsEzZyjJz6xad9aLCBABIpDTEYhyVZ55MGFj8ebHKae/WFDCUG4kt8EZXdt7by6jpsumECdT74kRTthNCbdRhfSLIXujZ575Xc1pMVzJJhPBBfiwMeu06hnUVrD4M2pMV4iBUUOXiEtnMGZgKPg+ce0IyZk/xdUuJFGqVDjTRMuw66nW5nzvn5FPjg+EYZglotKwG/LC4xerh9tM1tkvXCE2Z2JkzMCrj2HKwCtOM5EI8BoBhtHERJLBGXajItFfYVSpIIUFI9xgypQSxp42gu0j4XGcbLLSQ6a+yCMr9gvTNhjOhW0JGNiGepohGOw+XTaI+8QDWh2xyQAVucyggpZ03zvda6ZZMiOj6w57VVANg/Hob6dsVhNFKgnSJcNGrVNbt/2tVWszuk4oD6pH5uAC/d+25wV7aIYwLupc4e9C3cRJzzWz5xSoND10R1mx+VJGJMW2CYNmk1YNwuHAUy/PVn1fvCJm+0BYg0Qi2FAzUgq2+hSkaAztkzkqEhmmaaR4fu+hamirG0JdGuuQmmJ3DvMBaKXYe4METzlRzYrWTlJ62p+e/oC5Ckyug2IgPqrfB/Fw6UfxnPPe/mSZXpv4lRPuWYNbSysYpU407dpz0HGRDccEJCJABIgAEUguBKI7OsvENn365Wotko8N+svikjWrMWUADU5JnxRXrTA+CDH3D4evUDhlCkVYuBlbMLbNilDxsTD6/ZhxWtgISCYqKyd18GgBgjoTvPDgtBn2gWyGi7HjAgkQxPlFjNuCqlY+K6wNCx0pAf8VFukKQ5GYZwfEBa0xYGvSZMS1gEiEFDtmnHfz1tTNd7RlfydefEAFxQBy+xYXBjFl8A4bvkRSYSkbBFWZSBuArdtT2+h1JwtpGbieB3V6vKqCVJGX/hRJESNN430X7X0y9AvTlv3H1NJsZhLeFTrWt207LyZNRl2LiG0aQ5vD2LkxcbLaFZIXrcUt+4ev1lbnlU6RRoChZKhsZAa9OSiFKQm1k7ZN3My2QiL5ht8m0CbLtk/Kk/j+nxXmFLQI0rTw4APJwseEGQUGBRho73+2IuYGw1007LeEI9iyMmTmNNwXkd96QzuO2fkx935XM8d55ze/uOGegVEE9R24UDdMGcSHYWJQebHZEi2lp/3p7Q+wYQXacUzlNVydt7h+H9wx4zXnbRBbWKvE+2Ssfzg4yAiauWCHUwwZMw4UDBABIkAEkgaBLC0xg8XQ6AkbNZhNxbtIOI8GmY14OdHNvv36UuINZaNmJMHdbigCU6a4eIiBxwS412xw63kK7qVD0cyfdjgbyvOOiSSHihvLc69NmFjSxhIXNmJwmgtpmIIF8ugF8hXiXtQW+4cYevFiJ6stwmBYunK3+lmMBYMMwyaW8uIR115QQ2fbz76GKWemGJvMLPrzrxS1lOJFQhtHhjrSiT7+Y83GvHSJU13fwm4LTlgTSYWPufjF4n/G/O2qVvXQ4yYczmZRni//Ccrk6a03DCWnl5KlX+C77T+msnReKfcmrJhI3a0UBuj6jX8qeEcKZ1MnvXiFSl+s8MnOqzm//K4uqnSWc5+ZgVBjJVSdzpL57OmmF6jHOs7UUVav26fgXSejCAaVh321Vi1ckqIqeq9IG+K3yCZIDJx9VornvHkLf1MP31k2KtUcOw9vOBROWWFOsesKhgwkCeGufdb8nWptGiUAl63eo8L9psMrIwi/7eeVTMUfhuGhqveXSH/+KGrO9W8pE1KaFoZuN6WBwW6314RXST8EnV/azaBedcwjU4XzYuujaW1/evtD4YL5tSTyMmF4QhoE482PoK40XzxWhqJ4zXlthMn3t0hlxkq2FFWsaWOJbxgzsMEYSjUtlvwYlwgQASJABDIWgSwtMTNOFjs45YLLvxvrxG4/w0AZ6STexEvv9eG7ymn1AeSDkznj4cIv34fuPE8/hqTFUPG0E4r+Fb31waPX6NdwtwnDnuml009JWdxEOgVMbzkm/eUXpXijWL5mrzbKiudwxesl411r0Yq9aoXExaI6PfZlvPnHcg8vQ+WOnSp+P3Wr2mZ5abLzwckkpLriSVigj5u8JaIEyfR527W6F8quKH3DptMsEfrdHo9TJl7eY7YQft/9t3nkusKQ7jhRBUgkXVW9kFZXQxlDZBwclPHuRyvkpBdMzFBkXEL/I98D38RL2MAOHJn+75SZ/cLbplD3UHt8/f1F+jUkKGoIE9SmO+qV0mPrP5lbBgxfab8KCgNLbIjiTWDEXiEqFqBvxX03VIPC0aYwXpvCpYvmXTRjBVJ8oei0U1M3i/ityihauHy3at15hmPMt1Txk1WD21N+V7x1gAFcEA4Dvp262fvadY+5DhtdL0WDU2bNKfA8BVt0oei0Y9/Fz55RNOuDgZ+vFlUl/z6wTjCdLsaGQfXE/p2X0VmvdlH9bvOW/eqHWf5zGOqANUO8DktWb0hhzHiZdKvW/qHH/vkxuMpG5dPa/vT2h+uvSsEO68DBo0PP32O+26C27/D/HUP94zXnYf6HNGasf9HaEkRd00pYK0LiGHRhJqh/p7XeTEcEiAARIAKpCGRpxswm8a4AOv30E9UqOenCKXCkv91iO8GmL78Vw4yPTVK930vZqNjv4h2G+HSbxpV0tvAMgY1PKIKY6SUiSQIaPX6D6inuPb161Otlwde2y0ztfQcbrCfktCYeZMR6YVgPDAAserAwTBSjBoZ98+Q5XquazFv4uzY+eckFwYyZS4+5E4WEELArK3rwts58PNoeSx7wwgKCNMcz3eZqiR87PeyvtHlpllZbg92OeNFBaXt/0WV/9LlpaoR4GFojkg1mowSDnPAM9IkYIO334VJdJMqudWnKJtfUAcZ7DY0Yt0H9dUytxd5klzkmSQH7C4NHrRGbKani1suEMdah93yVP3+qJySTXzyvWLDeeWMpnSXGTLsec9R2iwmGfjlFNjOdXpvvMMr8yi97rC2I31cMAG/+NVW1AFIhHSU9mKAYR+mlzOoX3novXLFbu76F+9s5Yp8Jrm9hZ+fR9tOcTcrDd5cNcoELNZxrxI0qaJZ4rnmx70/iLj7VQCyeQz1v7A+bVTPJa83GlMU+nseTmtxXVksYYDPavtdcNXH6r67NNTba2PR2Ea9Nr76/OJ5Fu/KKZqz0/XCxekc83nhxAsMGnpoMXVgxfvawDv53xPm++MYYBxincAXduvNM1VHGJ8YMGNj1xPvKK89fpiAd40c3X1NCFTmmBvuetOPDEau0yqgdF+MEzIGWz89Q/x0KZkJEg1NmzSlwh9yq03SF3w4wYW0CUxfSKqALKxSwX6lo1gfA9w/xUPVs99ki0ZLKQET/nC3jrkOPuZqhAiP2998WzBi7V+zdQJIP9KZ4Sxv93UZXHaHm0qnPfFHx3aPtY7kqmMab1eKtD1TeUunE+gLM9mIirQtJnmgpPe1Pb3+AQeNKFVKke+Blrs+Axervf1L7Jhj5HwhzeZAwzs47N0Wl0K9dWWXO86tbvJ6t3fiHw9jzSknGqwzmQwSIABEgAolFIPpf58TWwzf3ncd0snHS9IwY7ouGmtx/vrr7xnN1VCychol7UBjlmzZ7u34eT1Ugv/pA3QpeoyYes9/hF8c8ayt2afoMWKQWiseimXDvKX9wG4y/reL61KgiwOXs440qKdvThskjLdfrriymPh+7XjNkwAAYLBIfuXMfryqXP0N1aHlhWrIMmwbSDLAVM3fBTrVLFv/VLjzLpfduElcqd4aC1xDYGwGlx022yTM91yrlC6h7xWjfSMEKhog7v/aTZlQUFzHh7WJUFfaEYD/n1ecvVV3e/FkbVE1Ped60OAH8VKQ88AeCXZ5/ZcMM5oMhME56tLtUu0k2z3CtKKLqJUucrMXA0ReniLTJ2WLPBTZWBr9RR0dtcKsYrRapG9hmgQvdEWPXqTLixWi3SEjsFQYnTuCb3l9Jt1snSNB/d99QWiSk9ulxsG7Dn8IMmK7HwJln5NGi/ahzZdlQPdu8imr01FRdC683IDCmvvp+o3bDjn6GP4hzYw7YLhJIeaVfvfJcddWh51z175HUhX1ampTZ/cLUuZ9sUkIRpPXuvuVcde9NpX2jNBGmI2xeLBPptAWLdmlc0ZfPKZhXwWvcbvkzFM5elomTliu8ZT0hxof7i8c99ME3hKH2jsxHsJsEI81bhLlmmNvhNl1pKdtOE81YOSJCWN8K4wt/kLooWjifZtj+KgZ/jdHXlg0rKtvQrl1GWsJgJHbp+3PYpOEMXdsJoTb6bIsq2ivZLrEbNVoOLMZM2KDV/vD78qswNszvDTbiueSfl6LBKTPnFDCper61UDNfiwhjGl7Z9giGRpIC80Hje1OY7WhbtOsDOB3o1PYi1f3NX7TKGn6f7bkJeZ0sGLZvWUWdJXOWl04RpsyTYvenr7hYx1z24Wcr1Scyp2N+/Uv6PQx0QwXqBbGNtUDsr0GqyTu/efOMdN/ywfKqyX3lxCtPqspgPpkD3+t1pahNx8ZsT0/749EfnhBbTi/JOABTCVKTUC2GKjj66Rb55mDs3nXzuaqc/Ha98s4xScHg7it4ZP6cF+m7pef9akvtuKxgQSICRIAIEIHkQyBLS8z8Y52MpAVamNWocuwEE5uOEuLaOiOomdjDOcNngeYtG8ZbsaluJQv6AiLaDwLjAvYfsEiGweMa1c9R/XvWUld6JCK8ecVyD1HrdrKINGLd8ASxR1yq5subOD7dZcekg1DPyy9yq1aYumPzUNWyNXFZVf94Jn5GXBvdU04vyo0B4wMieYLvA08RVS84U1yOXhrSpkla6wfd8KYNyqsycgKIxachqOkYpgzq0+DOMqp/jyuFYRfcr9H3O4hBXzBnQJD6gTFI2xAk+kHP9tVFMillEQdvHWvlpPXA34fUxeIlq4e8C+c62tQrvVfYV+r2zKW6PScd64MYBxC7B6Ourkh3dHmqmhiBDm2HCRubzm2rqassjzPYqEH6prQsUrs9c4nYfojfYjUz+kUknCE5hdPlW0VtZUDvq9RDt5d19R87PSSVXml/mWp4bzn5xikbNcwBEIU3TJkqlQqobu0uEQZpsHSbnVd6wtfVKioujmsoqGlCmgnSexs2/aXAoANTBhveBneUUV2lfySKohkrYBLDSDYI9kIwB2CsgCmDumPjfmvdEomqos4XTNjzy56urhX1jib1z1ddnr5Y/a9LDV9D134VOV9sz/QXD1hXX1lEq9livGNOgCFT/N5gDNWV7/Fuzytd84TJKxqcMmtOKSB9v7p4+UMfwkYdBxtgOoIpA4b2bdeXFMbsZcpWKYllfXDJBQVlfrlYGHL59W805iYwWcC0uKBiATEyXENVkzihCJ6R+olHKMNgRD9fI/0HxtWhMgumTDzUlE355xTMp4rLegdtNIQDEjwLZafFxPO7prX98egPqPNb3WooeA5EH0W/xWEdvGAWEuPKDe8pq5oK0+WAfA9Dp5+Wsp4y97hmlTnPrlM8wyuO2RWC5BYwIxEBIkAEiEDyIZDr4MGD1vl7+huwerP8amYhwkZ2pRi8g4FTuNLMyoTTs40iKn3gwH8KusyFZHFlb8zjXXfoJMObxB9/HVRlxGBhZqoNxbtticgPql7rN/2hzjg9ryot6iBYJCaaILa9Rdwd79r9j5zwBtSZ4mb4LNmEnCmMmWjKh+oTbNZA+qyoGH2FlIKXMEa2/3ZAxzvpJNn8yQYOi7vMINQFnkm2Sp1LyqmoX30j1QvqjHDN/t9/h1WFsgVcroMjpU3L+8zoF2mpZ7g0UHHbuPVP3cdgKPbsM0/y3ZyHyyO972AnBF6Ddoqq3umn5VHnSB3Qz+3NZXrLCJc+mrGC+RLqTPuFeVlA5gHUEZvPZCNIi8CWzOZtf4kExQnqnLOkHTK3RDPuo8Eps+YU/IZi7tiz9x8xaH6c9jRXROa9UL/94dYHUBuDJCEwGfNhPecTQyVo5dq9ItV3ksxRp4RUH3MSeAJQE1wr6qnwvARbLyeJmm9WpHi2P179AQytjSJJByYysLMZbZ98sVpLAkNS6rP/XRMR0qww50WsZBJEKFcic9YKSQANq0gEiAARiBmBbM+YiRkRJiACRIAIEAEiQARyNAKhGBM5BZRka3+Pd34Rm1k7tVRZ306X55TPlOntJGMm0z8BK0AEiEA2QiBxuivZCCQ2hQikBYHFK/c4XpOiTV+jWqEMkxCItk6MF18EZszfEVOGJ4sKC2xXkZIDAUhULF21J6bKQn0xXjbEYiqYkYlANkAAKqtzF/ymWxJPldVsAA2bQASIABEgAkmEABkzSfSxWNXkQmCIuDlftnJvTJUeJSLzeTJKdyOmmjFyvBDo9fbCmLKCDaA3XqoRUxpGzjwENomqRazf+M6bzlXNxG4MiQgQATcC8BYWTl0Qnpn6D1mhoGIHu3z1xag9iQgQASJABIhAMiJAxkwyfjXWOSkQuLF28bAGIf0acYJ4oyFlbwRgcDcWOlNsCpGSB4HCMEga4zcuL/YySESACAQj0Py5aepiMax809XFtC08Y1dmr0imrRJbPx8MX6U9WyHlfbeUVpwvgzHkEyJABIgAEUgOBMiYSY7vxFomIQJX1yiShLVmlRONQH3ZPJCyLwJwmc1vnH2/L1uWsQhAEmbOgp36DyXDO9lRsSYML4WGYAj/7ptLq7tu5NxqMOGVCBABIkAEkg8BMmaS75uxxkSACBABIkAEiAARyPYItGtZRU2Zs0MtWPS7Onz4qHitPOS0+SxhgsKj5CN3n6c9WTovGCACRIAIEAEikIQIxN0r0+YdAfXvf3H1wJ2EsLLKRIAIEAEiQASIQLIi8M/BI+qg/IGM+kyytiUt9c5q7YeL971/HlR79h0UV+i5VOFz8qu8J9JVc1q+bbzS5D0xlypRiOrX8cKT+RABIkAE4s6Y2bknoP7YT8YMuxYRIAJEgAgQASJABIgAEciOCJx+Si519hlkzGTHb8s2EQEikDkIxP24IU/uzGkISyUCRIAIEAEiQASIABEgAkQg8QicRLv0iQeZJRABIpCjEIg7Y+aU/LlEzDRHYcjGEgEiQASIABEgAkSACBCBHIEA1vn5T6K0TI742GwkESACGYZA3Bkzx0uORQrmUpyuM+wbsiAiQASIABEgAkSACBABIpAhCBQpeJw6jgv9DMGahRABIpBzEIg7YwbQwSBYwTMSknXO+TJsKREgAkSACBABIkAEiAARyEIInC3r+7wnZqEKsSpEgAgQgWyCQNyN/9q4/Hcol9r2+xH132H7KcNEgAgQASJABIgAESACRIAIJAsCeeTQtfCZx6kTc9PBR7J8M9aTCBCB5EIgoYwZQBGQ+XvfX0r9Iy60Dx1S6tDhgDrKOT25eglrSwSIABEgAkSACBABIpBjEICqUu4Tcqnc4tTjJGHKnHFqjmk6G0oEiAARyBQEEs6YyZRWsVAiQASIABEgAkSACBABIkAEiAARIAJEgAgkAQI0BJMEH4lVJAJEgAgQASJABIgAESACRIAIEAEiQASyJwJkzGTP78pWEQEiQASIABEgAkSACBABIkAEiAARIAJJgAAZM0nwkVhFIkAEiAARIAJEgAgQASJABIgAESACRCB7IkDGTPb8rmwVESACRIAIEAEiQASIABEgAkSACBABIpAECJAxkwQfiVUkAkSACBABIkAEiAARIAJEgAgQASJABLInAmTMZM/vylYRASJABIgAESACRIAIEAEiQASIABEgAkmAABkzSfCRWEUiQASIABEgAkSACBABIkAEiAARIAJEIHsiQMZM9vyubBURIAJEgAgQASJABIgAESACRIAIEAEikAQIkDGTBB+JVSQCRIAIEAEiQASIABEgAkSACBABIkAEsicCZMxkz+/KVhEBIkAEiAARIAJEgAgQASJABIgAESACSYAAGTNJ8JFYRSJABIgAESACRIAIEAEiQASIABEgAkQgeyJAxkz2/K5sFREgAkSACBABIkAEiAARIAJEgAgQASKQBAiQMZMEH4lVJAJEgAgQASJABIgAESACRIAIEAEiQASyJwJkzGTP78pWEQEiQASIABEgAkSACBABIkAEiAARIAJJgAAZM0nwkVhFIkAEiAARIAJEgAgQASJABIgAESACRCB7IkDGTPb8rmwVESACRIAIEAEiQASIABEgAkSACBABIpAECJAxkwQfiVUkAkSACBABIkAEiAARIAJEgAgQASJABLInAmTMZM/vylYRASJABIgAESACRIAIEAEiQASIABEgAkmAABkzSfCRWEUiQASIABEgAkSACBABIkAEiAARIAJEIHsiQMZM9vyubBURIAJEgAgQASJABIgAESACRIAIEAEikAQIkDGTBB+JVSQCRIAIEAEiQASIABEgAkSACBABIkAEsicCJ2TPZrFVRIAIEIHEIXDkaC516FBAHToSUEeO5FKBQOLKYs5EgAgQASJABIgAESACOQOBXLmUOv74gMp9fC6VO3cudfxxXGTmjC+vVK6DBw/ya+eUr812EgEikC4EAoFc6sA/R9Whw/KrSSICRIAIEAEiQASIABEgAglEIPcJAZX/pONUrlzcsicQ5iyRNRkzWeIzsBJEgAhkdQT+/U+pf/7N6rVk/YgAESACRIAIEAEiQASyEwI4Djwpr1J5TsxOrWJbvAjQgntiiAAAQABJREFUxowXEd4TASJABDwIHBVJmX/JlPGgwlsiQASIABEgAkSACBCBRCMAWRkcDmI9Ssq+CJAxk32/LVtGBIhAnBDYf+CoogBpnMBkNkSACBABIkAEiAARIAIxIYB1KNajpOyLABkz2ffbsmVEgAjEAYFDh5WCsV8SESACRIAIEAEiQASIABHILAS08wlZl5KyJwJkzGTP78pWEQEiECcEDovnJRIRIAJEgAgQASJABIgAEchsBI5QaCazP0HCyidjJmHQMmMiQASyAwJwh00iAkSACBABIkAEiAARIAKZjcDhwzwwzOxvkKjyyZhJFLLMlwgQgWyBwOEj2aIZbAQRIAJEgAgQASJABIhAkiMAFXtS9kSAjJns+V3ZKiJABOKEQIAHE3FCktkQASJABIgAESACRIAIpA8BSnKnD7+sm5qMmaz7bVgzIkAEiAARIAJEgAgQASJABIgAESACRCCbI0DGTDb/wGweESACRIAIEAEiQASIABEgAkSACBABIpB1ESBjJut+G9aMCBABIkAEiAARIAJEgAgQASJABIgAEcjmCJAxk80/MJtHBIgAESACRIAIEAEiQASIABEgAkSACGRdBMiYybrfhjUjAkSACBABIpCtEdi3d4/6Y9/ebN1GNo4IEAEiQASIABEgApEQOCFShGR/X6tWLXX4cIpf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0iReRPXf0aNK8acyI1BnGUSACBABIkAEiAARyN4I4OjvONFpAUMGf3nlYJCUMxCgxEzO+M5sJREgAnFEgD+ScQSTWREBIkAEiAARIAJEgAgQgRyOAG3M5PAOwOYTASJABIgAESACRIAIEAEiQASIABEgApmHABkzmYc9SyYCRIAIEAEiQASIABEgAkSACBABIkAEcjgCZMzk8A7A5hMBIkAEiAARIAJEgAgQASJABIgAESACmYcAGTOZhz1LJgJEgAgQASJABIgAESACRIAIEAEiQARyOAJkzOTwDsDmEwEiQASIABEgAkSACBABIkAEiAARIAKZhwAZM5mHPUsmAkSACBABIkAEiAARIAJEgAgQASJABHI4AmTM5PAOwOYTASJABIgAESACRIAIEAEiQASIABEgApmHABkzmYc9SyYCRIAIEAEiQASIABEgAkSACBABIkAEcjgCZMzk8A7A5hMBIkAEiAARIAJEgAgQASJABIgAESACmYcAGTOZhz1LJgJEgAgQASJABIgAESACRIAIEAEiQARyOAJkzOTwDsDmEwEiQASIABEgAkSACBABIkAEiAARIAKZhwAZM5mHPUsmAkSACBABIkAEiAARIAJEgAgQASJABHI4AidkRPuPHM2lDh0KqENHAurIkVwqEMiIUlkGESACRIAIEAEiQASIABEIjUCuXEodf3xA5T4+l8qdO5c6/jguUkOjxTdEgAgQASKQKARyHTx4MGG/QIFALnXgn6Pq0GH51SMRASJABIgAESACRIAIEIEsjEDuEwIq/0nHqVy5ErY8zsKtZ9WIABEgAkQgsxBIGGPm3/+U+uffzGoWyyUCRIAIEAEiQASIABEgArEjgOPEk/IqlefE2NMyBREgAkSACBCBtCCQEBszR0VS5l8yZdLyPZiGCBABIkAEiAARIAJEIBMRgKwMDhexniURASJABIgAEcgIBBLCmNl/4KiiAGhGfD6WQQSIABEgAkSACBABIhBvBLCOxXqWRASIABEgAkQgIxCIO2Pm0GGlYOyXRASIABEgAkSACBABIkAEkhUB7bxC1rUkIkAEiAARIAKJRiDujJnD4nmJRASIABEgAkSACBABIkAEkh2BIxSaSfZPyPoTASJABJICgbgzZuAOm0QEiAARIAJEgAgQASJABJIdgcOHeeCY7N+Q9ScCRIAIJAMCcWfMHD6S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sr6MJ2+ck17KByxQXmhQ0zzGug3b1GyF2AFXUMQROVdOWY8y7CoBzUlhVvx6TljNoFwckG5VueTvBizrUKeSLYnUkWSUoUQ4xPsuEOtlz55d6vcfyhoMqGD68mgHeX48cVxOp71dHDt2VKBOYzZM+1uIOHW7dm6TbkiHpYvaSfV+L5e/b7DEjEbA5JtDB0Syf3NyRD8xWDS3zTQkQAIkQAIkEESAipkgJNxBAiRAAiRAAv98Aq1aNDTxmaDo+GRjmlXRP//p+YQkED0BKmaiZ8WUJEACJEAC8RHIUK5M8T0izyIBEiABEiABEnAJJOoy6ubHbRIgARIgARIgARIggfgIUDETHzeeRQIkQAIkQAIZloBXfJkM+zC8cRIgARIgARIgARLI4ASomMngL5C3TwIkQAIkQAKxEog2OH2s+TI9CZAACZAACZAACZBA7ASomImdGc8gARIgARIggQxNINqZ6DL0Q/LmSYAESIAESIAESCCDEKBiJoO8KN4mCZAACZAACfhFgPFl/CLJfEiABEiABEiABEggcQK+z8r0089C/PFn4jfGHEiABEiABEiABJJD4Oj335mMs2c/R5ydPbvZ5goJkEAagSyZhTjvnLRtrpEACZAACZBAMghk8TvTzPIHjIoZv6kyPxIgARIgARLwj8CFF13sX2bMiQT+wQQyZ/5bPl2mf/AT8tFIgARIgATSAwHfXZky+55jesDEeyABEiABEiABEiABEvi3EciSmUqZf9s75/OSAAmQwP+DgO9qlKxnCnFGJowuUEiABEiABEiABEiABEggYxJAe/ZM323LMyYL3jUJkAAJkEByCfiumMkkBxbOyc7RheS+NuZOAiRAAiRAAiRAAiSQTAJoz6JdSyEBEiABEiCBZBPwXTGDG0agtOzZkn3rzJ8ESIAESIAESIAESIAE/CeAdizasxQSIAESIAESOB0EkmageVZWIc0/M4mffvlL/PUXhxtOx8vkNUiABEiABEiABEiABOIngEkszj07kzjjDLrlx0+RZ5IACZAACcRKwPfpsr1u4NffhPhTTqGN/3/9JQR/6rwocR8JkAAJkAAJkAAJkMDpJIChwzOk/TgUMvifTQ4sUkiABEiABEjgdBNImsWM/SD8kbNpcJ0ESIAESIAESIAESIAESIAESIAESIAEUggkJcYM4ZIACZAACZAACZAACZAACZAACZAACZAACUQmQMVMZEZMQQIkQAIkQAIkQAIkQAIkQAIkQAIkQAJJIUDFTFKwMlMSIAESIAESIAESIAESIAESIAESIAESiEyAipnIjJiCBEiABEiABEiABEiABEiABEiABEiABJJCgIqZpGBlpiRAAiRAAiRAAiRAAiRAAiRAAiRAAiQQmQAVM5EZMQUJkAAJkAAJkAAJkAAJkAAJkAAJkAAJJIUAFTNJwcpMSYAESIAESIAESIAESIAESIAESIAESCAyASpmIjNiChIgARIgARIgARIgARIgARIgARIgARJICgEqZpKClZmSAAmQAAmQAAmQAAmQAAmQAAmQAAmQQGQCVMxEZsQUJEACJEACJEACJEACJEACJEACJEACJJAUAlTMJAUrMyUBEiABEiABEiABEiABEiABEiABEiCByASomInMiClIgARIgARIgARIgARIgARIgARIgARIICkEqJhJClZmSgIkQAIkQAIkQAIkQAIkQAIkQAIkQAKRCVAxE5kRU5AACZAACZAACZAACZAACZAACZAACZBAUghQMZMUrMyUBEiABEiABEiABEiABEiABEiABEiABCIToGImMiOmIAESIAESIAESIAESIAESIAESIAESIIGkEKBiJilYmSkJkAAJkAAJkAAJkAAJkAAJkAAJkAAJRCZAxUxkRkxBAiRAAiRAAiRAAiRAAiRAAiRAAiRAAkkhQMVMUrAyUxIgARIgARIgARIgARIgARIgARIgARKITICKmciMmIIESIAESIAESIAESIAESIAESIAESIAEkkLgf4NAX3xYdAZbAAAAAElFTkSuQmCC", 62 | "detail": "auto", 63 | }, 64 | "type": "image_url", 65 | }, 66 | ], 67 | }, 68 | "count": 603, 69 | "count_4o_mini": 19842, 70 | } 71 | 72 | IMAGE_MESSAGE_COUNTS = [ 73 | text_and_tiny_image_message, 74 | text_and_tiny_image_message_nodetail, 75 | text_and_tiny_image_message_low, 76 | text_and_large_image_message, 77 | ] 78 | -------------------------------------------------------------------------------- /tests/messages.py: -------------------------------------------------------------------------------- 1 | system_message_short = { 2 | "message": { 3 | "role": "system", 4 | "content": "You are a bot.", 5 | }, 6 | "count": 12, 7 | "count_omni": 12, 8 | } 9 | 10 | system_message = { 11 | "message": { 12 | "role": "system", 13 | "content": "You are a helpful, pattern-following assistant that translates corporate jargon into plain English.", 14 | }, 15 | "count": 25, 16 | "count_omni": 24, 17 | } 18 | 19 | system_message_long = { 20 | "message": { 21 | "role": "system", 22 | "content": "Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.", 23 | }, 24 | "count": 31, 25 | "count_omni": 31, 26 | } 27 | 28 | system_message_unicode = { 29 | "message": { 30 | "role": "system", 31 | "content": "á", 32 | }, 33 | "count": 8, 34 | "count_omni": 8, 35 | } 36 | 37 | system_message_with_name = { 38 | "message": { 39 | "role": "system", 40 | "name": "example_user", 41 | "content": "New synergies will help drive top-line growth.", 42 | }, 43 | "count": 20, # Less tokens in older vision preview models 44 | "count_omni": 20, 45 | } 46 | 47 | user_message = { 48 | "message": { 49 | "role": "user", 50 | "content": "Hello, how are you?", 51 | }, 52 | "count": 13, 53 | "count_omni": 13, 54 | } 55 | 56 | user_message_unicode = { 57 | "message": { 58 | "role": "user", 59 | "content": "á", 60 | }, 61 | "count": 8, 62 | "count_omni": 8, 63 | } 64 | 65 | user_message_perf = { 66 | "message": { 67 | "role": "user", 68 | "content": "What happens in a performance review?", 69 | }, 70 | "count": 14, 71 | "count_omni": 14, 72 | } 73 | 74 | assistant_message_perf = { 75 | "message": { 76 | "role": "assistant", 77 | "content": "During the performance review at Contoso Electronics, the supervisor will discuss the employee's performance over the past year and provide feedback on areas for improvement. They will also provide an opportunity for the employee to discuss their goals and objectives for the upcoming year. The review is a two-way dialogue between managers and employees, and employees will receive a written summary of their performance review which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].", 78 | }, 79 | "count": 106, 80 | "count_omni": 106, 81 | } 82 | 83 | assistant_message_perf_short = { 84 | "message": { 85 | "role": "assistant", 86 | "content": "The supervisor will discuss the employee's performance and provide feedback on areas for improvement. They will also provide an opportunity for the employee to discuss their goals and objectives for the upcoming year. The review is a two-way dialogue between managers and employees, and employees will receive a written summary of their performance review which will include a rating of their performance, feedback, and goals for the upcoming year [employee_handbook-3.pdf].", 87 | }, 88 | "count": 91, 89 | "count_omni": 91, 90 | } 91 | 92 | user_message_dresscode = { 93 | "message": { 94 | "role": "user", 95 | "content": "Is there a dress code?", 96 | }, 97 | "count": 13, 98 | "count_omni": 13, 99 | } 100 | 101 | assistant_message_dresscode = { 102 | "message": { 103 | "role": "assistant", 104 | "content": "Yes, there is a dress code at Contoso Electronics. Look sharp! [employee_handbook-1.pdf]", 105 | }, 106 | "count": 30, 107 | "count_omni": 30, 108 | } 109 | user_message_pm = { 110 | "message": { 111 | "role": "user", 112 | "content": "What does a Product Manager do?", 113 | }, 114 | "count": 14, 115 | "count_omni": 14, 116 | } 117 | text_and_image_message = { 118 | "message": { 119 | "role": "user", 120 | "content": [ 121 | {"type": "text", "text": "Describe this picture:"}, 122 | { 123 | "type": "image_url", 124 | "image_url": { 125 | "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z/C/HgAGgwJ/lK3Q6wAAAABJRU5ErkJggg==", 126 | "detail": "auto", 127 | }, 128 | }, 129 | ], 130 | }, 131 | "count": 266, 132 | "count_omni": 266, 133 | } 134 | 135 | MESSAGE_COUNTS = [ 136 | system_message, 137 | system_message_short, 138 | system_message_long, 139 | system_message_unicode, 140 | system_message_with_name, 141 | user_message, 142 | user_message_unicode, 143 | user_message_perf, 144 | user_message_dresscode, 145 | user_message_pm, 146 | assistant_message_perf, 147 | assistant_message_perf_short, 148 | assistant_message_dresscode, 149 | ] 150 | -------------------------------------------------------------------------------- /tests/test_imageshelper.py: -------------------------------------------------------------------------------- 1 | import base64 2 | 3 | import pytest 4 | 5 | from openai_messages_token_helper import count_tokens_for_image 6 | 7 | 8 | @pytest.fixture 9 | def small_image(): 10 | return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z/C/HgAGgwJ/lK3Q6wAAAABJRU5ErkJggg==" 11 | 12 | 13 | @pytest.fixture 14 | def large_image(): 15 | large_image = open("tests/image_large.png", "rb").read() 16 | img = base64.b64encode(large_image).decode("utf-8") 17 | return f"data:image/png;base64,{img}" 18 | 19 | 20 | def test_count_tokens_for_image(small_image, large_image): 21 | assert count_tokens_for_image(small_image, "low") == 85 22 | assert count_tokens_for_image(small_image, "low", "gpt-4o-mini") == 2833 23 | assert count_tokens_for_image(small_image, "high") == 255 24 | assert count_tokens_for_image(small_image) == 255 25 | assert count_tokens_for_image(large_image, "low") == 85 26 | assert count_tokens_for_image(large_image, "high") == 1105 27 | with pytest.raises(ValueError, match="Invalid value for detail parameter."): 28 | assert count_tokens_for_image(large_image, "medium") 29 | with pytest.raises(ValueError, match="Image must be a base64 string."): 30 | assert count_tokens_for_image("http://domain.com/image.png") 31 | -------------------------------------------------------------------------------- /tests/test_messagebuilder.py: -------------------------------------------------------------------------------- 1 | import typing 2 | 3 | import pytest 4 | from openai.types.chat import ( 5 | ChatCompletionMessageParam, 6 | ChatCompletionToolChoiceOptionParam, 7 | ChatCompletionToolParam, 8 | ) 9 | 10 | from openai_messages_token_helper import build_messages, count_tokens_for_message 11 | 12 | from .functions import search_sources_toolchoice_auto 13 | from .image_messages import text_and_tiny_image_message 14 | from .messages import ( 15 | assistant_message_dresscode, 16 | assistant_message_perf, 17 | assistant_message_perf_short, 18 | system_message_long, 19 | system_message_short, 20 | system_message_unicode, 21 | user_message, 22 | user_message_dresscode, 23 | user_message_perf, 24 | user_message_pm, 25 | user_message_unicode, 26 | ) 27 | 28 | 29 | def test_messagebuilder(): 30 | messages = build_messages("gpt-35-turbo", system_message_short["message"]["content"]) 31 | assert messages == [system_message_short["message"]] 32 | assert count_tokens_for_message("gpt-35-turbo", messages[0]) == system_message_short["count"] 33 | 34 | 35 | def test_messagebuilder_imagemessage(): 36 | messages = build_messages( 37 | "gpt-35-turbo", 38 | system_message_short["message"]["content"], 39 | new_user_content=text_and_tiny_image_message["message"]["content"], 40 | ) 41 | assert messages == [system_message_short["message"], text_and_tiny_image_message["message"]] 42 | 43 | 44 | def test_messagebuilder_append(): 45 | messages = build_messages( 46 | "gpt-35-turbo", system_message_short["message"]["content"], new_user_content=user_message["message"]["content"] 47 | ) 48 | assert messages == [system_message_short["message"], user_message["message"]] 49 | assert count_tokens_for_message("gpt-35-turbo", messages[0]) == system_message_short["count"] 50 | assert count_tokens_for_message("gpt-35-turbo", messages[1]) == user_message["count"] 51 | 52 | 53 | def test_messagebuilder_unicode(): 54 | messages = build_messages("gpt-35-turbo", system_message_unicode["message"]["content"]) 55 | assert messages == [system_message_unicode["message"]] 56 | assert count_tokens_for_message("gpt-35-turbo", messages[0]) == system_message_unicode["count"] 57 | 58 | 59 | def test_messagebuilder_unicode_append(): 60 | messages = build_messages( 61 | "gpt-35-turbo", 62 | system_message_unicode["message"]["content"], 63 | new_user_content=user_message_unicode["message"]["content"], 64 | ) 65 | assert messages == [system_message_unicode["message"], user_message_unicode["message"]] 66 | assert count_tokens_for_message("gpt-35-turbo", messages[0]) == system_message_unicode["count"] 67 | assert count_tokens_for_message("gpt-35-turbo", messages[1]) == user_message_unicode["count"] 68 | 69 | 70 | def test_messagebuilder_model_error(): 71 | model = "phi-3" 72 | with pytest.raises(ValueError, match="Called with unknown model name: phi-3"): 73 | build_messages( 74 | model, system_message_short["message"]["content"], new_user_content=user_message["message"]["content"] 75 | ) 76 | 77 | 78 | def test_messagebuilder_model_fallback(): 79 | model = "phi-3" 80 | messages = build_messages( 81 | model, 82 | system_message_short["message"]["content"], 83 | new_user_content=user_message["message"]["content"], 84 | fallback_to_default=True, 85 | ) 86 | assert messages == [system_message_short["message"], user_message["message"]] 87 | assert count_tokens_for_message(model, messages[0], default_to_cl100k=True) == system_message_short["count"] 88 | assert count_tokens_for_message(model, messages[1], default_to_cl100k=True) == user_message["count"] 89 | 90 | 91 | def test_messagebuilder_pastmessages(): 92 | messages = build_messages( 93 | model="gpt-35-turbo", 94 | system_prompt=system_message_short["message"]["content"], # 12 tokens 95 | past_messages=[ 96 | user_message_perf["message"], # 14 tokens 97 | assistant_message_perf["message"], # 106 tokens 98 | ], 99 | new_user_content=user_message_pm["message"]["content"], # 14 tokens 100 | max_tokens=3000, 101 | ) 102 | assert messages == [ 103 | system_message_short["message"], 104 | user_message_perf["message"], 105 | assistant_message_perf["message"], 106 | user_message_pm["message"], 107 | ] 108 | 109 | 110 | def test_messagebuilder_pastmessages_truncated(): 111 | messages = build_messages( 112 | model="gpt-35-turbo", 113 | system_prompt=system_message_short["message"]["content"], # 12 tokens 114 | past_messages=[ 115 | user_message_perf["message"], # 14 tokens 116 | assistant_message_perf["message"], # 106 tokens 117 | ], 118 | new_user_content=user_message_pm["message"]["content"], # 14 tokens 119 | max_tokens=10, 120 | ) 121 | assert messages == [system_message_short["message"], user_message_pm["message"]] 122 | 123 | 124 | def test_messagebuilder_pastmessages_truncated_longer(): 125 | messages = build_messages( 126 | model="gpt-35-turbo", 127 | system_prompt=system_message_short["message"]["content"], # 12 tokens 128 | past_messages=[ 129 | user_message_perf["message"], # 14 tokens 130 | assistant_message_perf["message"], # 106 tokens 131 | user_message_dresscode["message"], # 13 tokens 132 | assistant_message_dresscode["message"], # 30 tokens 133 | ], 134 | new_user_content=user_message_pm["message"]["content"], # 14 tokens 135 | max_tokens=69, 136 | ) 137 | assert messages == [ 138 | system_message_short["message"], 139 | user_message_dresscode["message"], 140 | assistant_message_dresscode["message"], 141 | user_message_pm["message"], 142 | ] 143 | 144 | 145 | def test_messagebuilder_pastmessages_truncated_break_pair(): 146 | """Tests that the truncation breaks the pair of messages.""" 147 | messages = build_messages( 148 | model="gpt-35-turbo", 149 | system_prompt=system_message_short["message"]["content"], # 12 tokens 150 | past_messages=[ 151 | user_message_perf["message"], # 14 tokens 152 | assistant_message_perf_short["message"], # 91 tokens 153 | user_message_dresscode["message"], # 13 tokens 154 | assistant_message_dresscode["message"], # 30 tokens 155 | ], 156 | new_user_content=user_message_pm["message"]["content"], # 14 tokens 157 | max_tokens=160, 158 | ) 159 | assert messages == [ 160 | system_message_short["message"], 161 | assistant_message_perf_short["message"], 162 | user_message_dresscode["message"], 163 | assistant_message_dresscode["message"], 164 | user_message_pm["message"], 165 | ] 166 | 167 | 168 | def test_messagebuilder_system(): 169 | """Tests that the system message token count is considered.""" 170 | messages = build_messages( 171 | model="gpt-35-turbo", 172 | system_prompt=system_message_long["message"]["content"], # 31 tokens 173 | past_messages=[ 174 | user_message_perf["message"], # 14 tokens 175 | assistant_message_perf["message"], # 106 tokens 176 | user_message_dresscode["message"], # 13 tokens 177 | assistant_message_dresscode["message"], # 30 tokens 178 | ], 179 | new_user_content=user_message_pm["message"]["content"], # 14 tokens 180 | max_tokens=36, 181 | ) 182 | assert messages == [system_message_long["message"], user_message_pm["message"]] 183 | 184 | 185 | def test_messagebuilder_system_fewshots(): 186 | messages = build_messages( 187 | model="gpt-35-turbo", 188 | system_prompt=system_message_short["message"]["content"], 189 | new_user_content=user_message_pm["message"]["content"], 190 | past_messages=[], 191 | few_shots=[ 192 | {"role": "user", "content": "How did crypto do last year?"}, 193 | {"role": "assistant", "content": "Summarize Cryptocurrency Market Dynamics from last year"}, 194 | {"role": "user", "content": "What are my health plans?"}, 195 | {"role": "assistant", "content": "Show available health plans"}, 196 | ], 197 | ) 198 | # Make sure messages are in the right order 199 | assert messages[0]["role"] == "system" 200 | assert messages[1]["role"] == "user" 201 | assert messages[2]["role"] == "assistant" 202 | assert messages[3]["role"] == "user" 203 | assert messages[4]["role"] == "assistant" 204 | assert messages[5]["role"] == "user" 205 | assert messages[5]["content"] == user_message_pm["message"]["content"] 206 | 207 | 208 | def test_messagebuilder_system_fewshotstools(): 209 | messages = build_messages( 210 | model="gpt-35-turbo", 211 | system_prompt=system_message_short["message"]["content"], 212 | new_user_content=user_message_pm["message"]["content"], 213 | past_messages=[], 214 | few_shots=[ 215 | {"role": "user", "content": "good options for climbing gear that can be used outside?"}, 216 | { 217 | "role": "assistant", 218 | "tool_calls": [ 219 | { 220 | "id": "call_abc123", 221 | "type": "function", 222 | "function": { 223 | "arguments": '{"search_query":"climbing gear outside"}', 224 | "name": "search_database", 225 | }, 226 | } 227 | ], 228 | }, 229 | { 230 | "role": "tool", 231 | "tool_call_id": "call_abc123", 232 | "content": "Search results for climbing gear that can be used outside: ...", 233 | }, 234 | {"role": "user", "content": "are there any shoes less than $50?"}, 235 | { 236 | "role": "assistant", 237 | "tool_calls": [ 238 | { 239 | "id": "call_abc456", 240 | "type": "function", 241 | "function": { 242 | "arguments": '{"search_query":"shoes","price_filter":{"comparison_operator":"<","value":50}}', 243 | "name": "search_database", 244 | }, 245 | } 246 | ], 247 | }, 248 | {"role": "tool", "tool_call_id": "call_abc456", "content": "Search results for shoes cheaper than 50: ..."}, 249 | ], 250 | ) 251 | # Make sure messages are in the right order 252 | assert messages[0]["role"] == "system" 253 | assert messages[1]["role"] == "user" 254 | assert messages[2]["role"] == "assistant" 255 | assert messages[3]["role"] == "tool" 256 | assert messages[4]["role"] == "user" 257 | assert messages[5]["role"] == "assistant" 258 | assert messages[6]["role"] == "tool" 259 | assert messages[7]["role"] == "user" 260 | assert messages[7]["content"] == user_message_pm["message"]["content"] 261 | 262 | 263 | def test_messagebuilder_system_tools(): 264 | """Tests that the system message token count is considered.""" 265 | messages = build_messages( 266 | model="gpt-35-turbo", 267 | system_prompt=search_sources_toolchoice_auto["system_message"]["content"], 268 | tools=search_sources_toolchoice_auto["tools"], 269 | tool_choice=search_sources_toolchoice_auto["tool_choice"], 270 | # 66 tokens for system + tools + tool_choice ^ 271 | past_messages=[ 272 | user_message_perf["message"], # 14 tokens 273 | assistant_message_perf["message"], # 106 tokens 274 | ], 275 | new_user_content=user_message_pm["message"]["content"], # 14 tokens 276 | max_tokens=90, 277 | ) 278 | assert messages == [search_sources_toolchoice_auto["system_message"], user_message_pm["message"]] 279 | 280 | 281 | def test_messagebuilder_typing() -> None: 282 | tools: list[ChatCompletionToolParam] = [ 283 | { 284 | "type": "function", 285 | "function": { 286 | "name": "search_sources", 287 | "description": "Retrieve sources from the Azure AI Search index", 288 | "parameters": { 289 | "type": "object", 290 | "properties": { 291 | "search_query": { 292 | "type": "string", 293 | "description": "Query string to retrieve documents from azure search eg: 'Health care plan'", 294 | } 295 | }, 296 | "required": ["search_query"], 297 | }, 298 | }, 299 | } 300 | ] 301 | tool_choice: ChatCompletionToolChoiceOptionParam = { 302 | "type": "function", 303 | "function": {"name": "search_sources"}, 304 | } 305 | 306 | past_messages: list[ChatCompletionMessageParam] = [ 307 | {"role": "user", "content": "What are my health plans?"}, 308 | {"role": "assistant", "content": "Here are some tools you can use to search for sources."}, 309 | ] 310 | 311 | messages = build_messages( 312 | model="gpt-35-turbo", 313 | system_prompt="Here are some tools you can use to search for sources.", 314 | tools=tools, 315 | tool_choice=tool_choice, 316 | past_messages=past_messages, 317 | new_user_content="What are my health plans?", 318 | max_tokens=90, 319 | ) 320 | 321 | assert isinstance(messages, list) 322 | if hasattr(typing, "assert_type"): 323 | typing.assert_type(messages[0], ChatCompletionMessageParam) 324 | 325 | messages = build_messages( 326 | model="gpt-35-turbo", 327 | system_prompt="Here are some tools you can use to search for sources.", 328 | tools=tools, 329 | tool_choice="auto", 330 | past_messages=past_messages, 331 | new_user_content="What are my health plans?", 332 | max_tokens=90, 333 | ) 334 | 335 | assert isinstance(messages, list) 336 | if hasattr(typing, "assert_type"): 337 | typing.assert_type(messages[0], ChatCompletionMessageParam) 338 | -------------------------------------------------------------------------------- /tests/test_modelhelper.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from openai_messages_token_helper import count_tokens_for_message, count_tokens_for_system_and_tools, get_token_limit 4 | 5 | from .functions import FUNCTION_COUNTS, search_sources_toolchoice_auto 6 | from .image_messages import IMAGE_MESSAGE_COUNTS 7 | from .messages import system_message, system_message_with_name, user_message 8 | 9 | 10 | def test_get_token_limit(): 11 | assert get_token_limit("gpt-35-turbo") == 4000 12 | assert get_token_limit("gpt-3.5-turbo") == 4000 13 | assert get_token_limit("gpt-35-turbo-16k") == 16000 14 | assert get_token_limit("gpt-3.5-turbo-16k") == 16000 15 | assert get_token_limit("gpt-4") == 8100 16 | assert get_token_limit("gpt-4-32k") == 32000 17 | assert get_token_limit("gpt-4o") == 128000 18 | 19 | 20 | def test_get_token_limit_error(): 21 | with pytest.raises(ValueError, match="Called with unknown model name: gpt-3"): 22 | get_token_limit("gpt-3") 23 | 24 | 25 | def test_get_token_limit_default(caplog): 26 | with caplog.at_level("WARNING"): 27 | assert get_token_limit("gpt-3", default_to_minimum=True) == 4000 28 | assert "Model gpt-3 not found, defaulting to minimum token limit 4000" in caplog.text 29 | 30 | 31 | # parameterize the model and the expected number of tokens 32 | @pytest.mark.parametrize( 33 | "model, count_key", 34 | [ 35 | ("gpt-35-turbo", "count"), 36 | ("gpt-3.5-turbo", "count"), 37 | ("gpt-35-turbo-16k", "count"), 38 | ("gpt-3.5-turbo-16k", "count"), 39 | ("gpt-4", "count"), 40 | ("gpt-4-32k", "count"), 41 | ("gpt-4v", "count"), 42 | ("gpt-4o", "count_omni"), 43 | ], 44 | ) 45 | @pytest.mark.parametrize( 46 | "message", 47 | [ 48 | user_message, 49 | system_message, 50 | system_message_with_name, 51 | ], 52 | ) 53 | def test_count_tokens_for_message(model, count_key, message): 54 | assert count_tokens_for_message(model, message["message"]) == message[count_key] 55 | 56 | 57 | @pytest.mark.parametrize( 58 | "model, count_key", 59 | [ 60 | ("gpt-4", "count"), 61 | ("gpt-4o", "count"), 62 | ("gpt-4o-mini", "count_4o_mini"), 63 | ], 64 | ) 65 | def test_count_tokens_for_message_list(model, count_key): 66 | for message_count_pair in IMAGE_MESSAGE_COUNTS: 67 | assert count_tokens_for_message(model, message_count_pair["message"]) == message_count_pair[count_key] 68 | 69 | 70 | def test_count_tokens_for_message_error(): 71 | message = { 72 | "role": "user", 73 | "content": {"key": "value"}, 74 | } 75 | model = "gpt-35-turbo" 76 | with pytest.raises(ValueError, match="Could not encode unsupported message value type"): 77 | count_tokens_for_message(model, message) 78 | 79 | 80 | def test_count_tokens_for_message_model_error(): 81 | with pytest.raises(ValueError, match="Expected valid OpenAI GPT model name"): 82 | count_tokens_for_message("", user_message["message"]) 83 | with pytest.raises(ValueError, match="Expected valid OpenAI GPT model name"): 84 | count_tokens_for_message(None, user_message["message"]) 85 | with pytest.raises(ValueError, match="Expected valid OpenAI GPT model name"): 86 | count_tokens_for_message("gpt44", user_message["message"]) 87 | 88 | 89 | def test_count_tokens_for_message_model_default(caplog): 90 | model = "phi-3" 91 | with caplog.at_level("WARNING"): 92 | assert count_tokens_for_message(model, user_message["message"], default_to_cl100k=True) == user_message["count"] 93 | assert "Model phi-3 not found, defaulting to CL100k encoding" in caplog.text 94 | 95 | 96 | @pytest.mark.parametrize( 97 | "function_count_pair", 98 | FUNCTION_COUNTS, 99 | ) 100 | def test_count_tokens_for_system_and_tools(function_count_pair): 101 | counted_tokens = count_tokens_for_system_and_tools( 102 | "gpt-35-turbo", 103 | function_count_pair["system_message"], 104 | function_count_pair["tools"], 105 | function_count_pair["tool_choice"], 106 | ) 107 | expected_tokens = function_count_pair["count"] 108 | diff = counted_tokens - expected_tokens 109 | assert ( 110 | diff >= 0 and diff <= 3 111 | ), f"Expected {expected_tokens} tokens, got {counted_tokens}. Counted tokens is only allowed to be off by 3 in the over-counting direction." 112 | 113 | 114 | def test_count_tokens_for_system_and_tools_fallback(caplog): 115 | function_count_pair = search_sources_toolchoice_auto 116 | with caplog.at_level("WARNING"): 117 | counted_tokens = count_tokens_for_system_and_tools( 118 | "llama-3.1", 119 | function_count_pair["system_message"], 120 | function_count_pair["tools"], 121 | function_count_pair["tool_choice"], 122 | default_to_cl100k=True, 123 | ) 124 | assert counted_tokens == function_count_pair["count"] 125 | assert "Model llama-3.1 not found, defaulting to CL100k encoding" in caplog.text 126 | -------------------------------------------------------------------------------- /tests/verify_functions.py: -------------------------------------------------------------------------------- 1 | import os 2 | from typing import Union 3 | 4 | import azure.identity 5 | import openai 6 | from dotenv import load_dotenv 7 | from functions import FUNCTION_COUNTS # type: ignore[import-not-found] 8 | 9 | # Setup the OpenAI client to use either Azure OpenAI or OpenAI API 10 | load_dotenv() 11 | API_HOST = os.getenv("API_HOST") 12 | 13 | client: Union[openai.OpenAI, openai.AzureOpenAI] 14 | 15 | if API_HOST == "azure": 16 | 17 | if (azure_openai_version := os.getenv("AZURE_OPENAI_VERSION")) is None: 18 | raise ValueError("Missing Azure OpenAI version") 19 | if (azure_openai_endpoint := os.getenv("AZURE_OPENAI_ENDPOINT")) is None: 20 | raise ValueError("Missing Azure OpenAI endpoint") 21 | if (azure_openai_deployment := os.getenv("AZURE_OPENAI_DEPLOYMENT")) is None: 22 | raise ValueError("Missing Azure OpenAI deployment") 23 | 24 | token_provider = azure.identity.get_bearer_token_provider( 25 | azure.identity.DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default" 26 | ) 27 | client = openai.AzureOpenAI( 28 | api_version=azure_openai_version, 29 | azure_endpoint=azure_openai_endpoint, 30 | azure_ad_token_provider=token_provider, 31 | ) 32 | MODEL_NAME = azure_openai_deployment 33 | else: 34 | if (openai_key := os.getenv("OPENAI_KEY")) is None: 35 | raise ValueError("Missing OpenAI API key") 36 | if (openai_model := os.getenv("OPENAI_MODEL")) is None: 37 | raise ValueError("Missing OpenAI model") 38 | client = openai.OpenAI(api_key=openai_key) 39 | MODEL_NAME = openai_model 40 | 41 | 42 | # Test the token count for each message 43 | for function_count_pair in FUNCTION_COUNTS: 44 | response = client.chat.completions.create( # type: ignore[call-overload] 45 | model=MODEL_NAME, 46 | temperature=0.7, 47 | n=1, 48 | messages=[function_count_pair["system_message"]], 49 | tools=function_count_pair["tools"], 50 | tool_choice=function_count_pair["tool_choice"], 51 | ) 52 | 53 | print(function_count_pair["tools"]) 54 | assert response.usage is not None, "Expected usage to be present" 55 | assert ( 56 | response.usage.prompt_tokens == function_count_pair["count"] 57 | ), f"Expected {function_count_pair['count']} tokens, got {response.usage.prompt_tokens}" 58 | -------------------------------------------------------------------------------- /tests/verify_openai.py: -------------------------------------------------------------------------------- 1 | import os 2 | from typing import Union 3 | 4 | import azure.identity 5 | import openai 6 | from dotenv import load_dotenv 7 | from image_messages import IMAGE_MESSAGE_COUNTS # type: ignore[import-not-found] 8 | from messages import MESSAGE_COUNTS # type: ignore[import-not-found] 9 | 10 | # Setup the OpenAI client to use either Azure OpenAI or OpenAI API 11 | load_dotenv() 12 | API_HOST = os.getenv("API_HOST") 13 | 14 | client: Union[openai.OpenAI, openai.AzureOpenAI] 15 | 16 | if API_HOST == "azure": 17 | if (azure_openai_version := os.getenv("AZURE_OPENAI_VERSION")) is None: 18 | raise ValueError("Missing Azure OpenAI version") 19 | if (azure_openai_endpoint := os.getenv("AZURE_OPENAI_ENDPOINT")) is None: 20 | raise ValueError("Missing Azure OpenAI endpoint") 21 | if (azure_openai_deployment := os.getenv("AZURE_OPENAI_DEPLOYMENT")) is None: 22 | raise ValueError("Missing Azure OpenAI deployment") 23 | 24 | token_provider = azure.identity.get_bearer_token_provider( 25 | azure.identity.DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default" 26 | ) 27 | client = openai.AzureOpenAI( 28 | api_version=azure_openai_version, 29 | azure_endpoint=azure_openai_endpoint, 30 | azure_ad_token_provider=token_provider, 31 | ) 32 | MODEL_NAME = azure_openai_deployment 33 | else: 34 | if (openai_key := os.getenv("OPENAI_KEY")) is None: 35 | raise ValueError("Missing OpenAI API key") 36 | if (openai_model := os.getenv("OPENAI_MODEL")) is None: 37 | raise ValueError("Missing OpenAI model") 38 | client = openai.OpenAI(api_key=openai_key) 39 | MODEL_NAME = openai_model 40 | 41 | # Test the token count for each message 42 | 43 | for message_count_pair in MESSAGE_COUNTS: 44 | for model, expected_tokens in [("gpt-4o", message_count_pair["count_omni"])]: 45 | message = message_count_pair["message"] 46 | expected_tokens = message_count_pair["count"] 47 | response = client.chat.completions.create( 48 | model=MODEL_NAME, 49 | temperature=0.7, 50 | n=1, 51 | messages=[message], # type: ignore[list-item] 52 | ) 53 | 54 | print(message) 55 | assert response.usage is not None, "Expected usage to be present" 56 | assert ( 57 | response.usage.prompt_tokens == expected_tokens 58 | ), f"Expected {expected_tokens} tokens, got {response.usage.prompt_tokens} for model {MODEL_NAME}" 59 | 60 | 61 | for message_count_pair in IMAGE_MESSAGE_COUNTS: 62 | for model, expected_tokens in [ 63 | ("gpt-4o", message_count_pair["count"]), 64 | ("gpt-4o-mini", message_count_pair["count_4o_mini"]), 65 | ]: 66 | response = client.chat.completions.create( 67 | model=model, 68 | temperature=0.7, 69 | n=1, 70 | messages=[message_count_pair["message"]], # type: ignore[list-item] 71 | ) 72 | 73 | assert response.usage is not None, "Expected usage to be present" 74 | assert ( 75 | response.usage.prompt_tokens == expected_tokens 76 | ), f"Expected {expected_tokens} tokens, got {response.usage.prompt_tokens} for model {model}" 77 | --------------------------------------------------------------------------------