diff --git a/.gitignore b/.gitignore index 31b936a..6804070 100644 --- a/.gitignore +++ b/.gitignore @@ -216,4 +216,6 @@ pyrightconfig.json [Ll]ocal [Ss]cripts pyvenv.cfg -pip-selfcheck.json \ No newline at end of file +pip-selfcheck.json + +libs/redis/docs/.Trash* \ No newline at end of file diff --git a/libs/redis/docs/Dockerfile.jupyter b/libs/redis/docs/Dockerfile.jupyter index 259fa0f..29460ea 100644 --- a/libs/redis/docs/Dockerfile.jupyter +++ b/libs/redis/docs/Dockerfile.jupyter @@ -6,13 +6,10 @@ RUN useradd -m jupyter WORKDIR /home/jupyter/workspace # Copy the necessary files -COPY libs/partners/redis /home/jupyter/workspace/libs/partners/redis -COPY libs/core /home/jupyter/workspace/libs/core -COPY libs/langchain /home/jupyter/workspace/libs/langchain -COPY pyproject.toml /home/jupyter/workspace/ +COPY libs/redis /home/jupyter/workspace/libs/redis # Create necessary directories and set permissions -RUN mkdir -p /home/jupyter/workspace/libs/partners/redis/docs && \ +RUN mkdir -p /home/jupyter/workspace/libs/redis/docs && \ chown -R jupyter:jupyter /home/jupyter/workspace # Switch to non-root user @@ -24,13 +21,11 @@ ENV PATH="/home/jupyter/venv/bin:$PATH" # Install dependencies RUN pip install --no-cache-dir --upgrade pip && \ - pip install --no-cache-dir -e /home/jupyter/workspace/libs/core && \ - pip install --no-cache-dir -e /home/jupyter/workspace/libs/langchain && \ - pip install --no-cache-dir -e /home/jupyter/workspace/libs/partners/redis && \ - pip install --no-cache-dir jupyter redis sentence-transformers + pip install --no-cache-dir -e /home/jupyter/workspace/libs/redis && \ + pip install --no-cache-dir jupyter redis sentence-transformers langchain-core langchain # Set the working directory to the docs folder -WORKDIR /home/jupyter/workspace/libs/partners/redis/docs +WORKDIR /home/jupyter/workspace/libs/redis/docs # Expose Jupyter port EXPOSE 8888 diff --git a/libs/redis/docs/README.md b/libs/redis/docs/README.md index db08627..c68fede 100644 --- a/libs/redis/docs/README.md +++ b/libs/redis/docs/README.md @@ -7,7 +7,7 @@ This directory contains Jupyter notebooks demonstrating the usage of the Redis p To run these notebooks using the local development versions of LangChain and the Redis partner package: 1. Ensure you have Docker and Docker Compose installed on your system. -2. Navigate to this directory (`libs/partners/redis/docs`) in your terminal. +2. Navigate to this directory (`libs/redis/docs`) in your terminal. 3. Run the following command: ```bash docker compose up diff --git a/libs/redis/docs/cache.ipynb b/libs/redis/docs/cache.ipynb index 3dc0518..6fa237c 100644 --- a/libs/redis/docs/cache.ipynb +++ b/libs/redis/docs/cache.ipynb @@ -27,79 +27,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: langchain-core in /home/jupyter/venv/lib/python3.11/site-packages (0.2.11)\n", - "Requirement already satisfied: langchain-redis in /home/jupyter/venv/lib/python3.11/site-packages (0.0.1)\n", - "Collecting langchain-openai\n", - " Downloading langchain_openai-0.1.14-py3-none-any.whl.metadata (2.5 kB)\n", - "Requirement already satisfied: redis in /home/jupyter/venv/lib/python3.11/site-packages (5.0.7)\n", - "Requirement already satisfied: PyYAML>=5.3 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core) (6.0.1)\n", - "Requirement already satisfied: jsonpatch<2.0,>=1.33 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core) (1.33)\n", - "Requirement already satisfied: langsmith<0.2.0,>=0.1.75 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core) (0.1.83)\n", - "Requirement already satisfied: packaging<25,>=23.2 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core) (24.1)\n", - "Requirement already satisfied: pydantic<3,>=1 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core) (2.8.0)\n", - "Requirement already satisfied: tenacity!=8.4.0,<9.0.0,>=8.1.0 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core) (8.4.2)\n", - "Requirement already satisfied: numpy<2,>=1 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (1.26.4)\n", - "Requirement already satisfied: python-ulid<3.0.0,>=2.7.0 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (2.7.0)\n", - "Requirement already satisfied: redisvl<0.3.0,>=0.2.3 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (0.2.3)\n", - "Requirement already satisfied: sentence-transformers<4.0.0,>=3.0.1 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (3.0.1)\n", - "Collecting openai<2.0.0,>=1.32.0 (from langchain-openai)\n", - " Downloading openai-1.35.9-py3-none-any.whl.metadata (21 kB)\n", - "Collecting tiktoken<1,>=0.7 (from langchain-openai)\n", - " Downloading tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (6.6 kB)\n", - "Requirement already satisfied: jsonpointer>=1.9 in /home/jupyter/venv/lib/python3.11/site-packages (from jsonpatch<2.0,>=1.33->langchain-core) (3.0.0)\n", - "Requirement already satisfied: orjson<4.0.0,>=3.9.14 in /home/jupyter/venv/lib/python3.11/site-packages (from langsmith<0.2.0,>=0.1.75->langchain-core) (3.10.6)\n", - "Requirement already satisfied: requests<3,>=2 in /home/jupyter/venv/lib/python3.11/site-packages (from langsmith<0.2.0,>=0.1.75->langchain-core) (2.32.3)\n", - "Requirement already satisfied: anyio<5,>=3.5.0 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (4.4.0)\n", - "Collecting distro<2,>=1.7.0 (from openai<2.0.0,>=1.32.0->langchain-openai)\n", - " Downloading distro-1.9.0-py3-none-any.whl.metadata (6.8 kB)\n", - "Requirement already satisfied: httpx<1,>=0.23.0 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (0.27.0)\n", - "Requirement already satisfied: sniffio in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (1.3.1)\n", - "Requirement already satisfied: tqdm>4 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (4.66.4)\n", - "Requirement already satisfied: typing-extensions<5,>=4.7 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (4.12.2)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /home/jupyter/venv/lib/python3.11/site-packages (from pydantic<3,>=1->langchain-core) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.20.0 in /home/jupyter/venv/lib/python3.11/site-packages (from pydantic<3,>=1->langchain-core) (2.20.0)\n", - "Requirement already satisfied: coloredlogs in /home/jupyter/venv/lib/python3.11/site-packages (from redisvl<0.3.0,>=0.2.3->langchain-redis) (15.0.1)\n", - "Requirement already satisfied: tabulate<1,>=0.9.0 in /home/jupyter/venv/lib/python3.11/site-packages (from redisvl<0.3.0,>=0.2.3->langchain-redis) (0.9.0)\n", - "Requirement already satisfied: transformers<5.0.0,>=4.34.0 in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (4.42.3)\n", - "Requirement already satisfied: torch>=1.11.0 in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (2.3.1)\n", - "Requirement already satisfied: scikit-learn in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.5.1)\n", - "Requirement already satisfied: scipy in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.14.0)\n", - "Requirement already satisfied: huggingface-hub>=0.15.1 in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (0.23.4)\n", - "Requirement already satisfied: Pillow in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (10.4.0)\n", - "Requirement already satisfied: regex>=2022.1.18 in /home/jupyter/venv/lib/python3.11/site-packages (from tiktoken<1,>=0.7->langchain-openai) (2024.5.15)\n", - "Requirement already satisfied: idna>=2.8 in /home/jupyter/venv/lib/python3.11/site-packages (from anyio<5,>=3.5.0->openai<2.0.0,>=1.32.0->langchain-openai) (3.7)\n", - "Requirement already satisfied: certifi in /home/jupyter/venv/lib/python3.11/site-packages (from httpx<1,>=0.23.0->openai<2.0.0,>=1.32.0->langchain-openai) (2024.6.2)\n", - "Requirement already satisfied: httpcore==1.* in /home/jupyter/venv/lib/python3.11/site-packages (from httpx<1,>=0.23.0->openai<2.0.0,>=1.32.0->langchain-openai) (1.0.5)\n", - "Requirement already satisfied: h11<0.15,>=0.13 in /home/jupyter/venv/lib/python3.11/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai<2.0.0,>=1.32.0->langchain-openai) (0.14.0)\n", - "Requirement already satisfied: filelock in /home/jupyter/venv/lib/python3.11/site-packages (from huggingface-hub>=0.15.1->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (3.15.4)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in /home/jupyter/venv/lib/python3.11/site-packages (from huggingface-hub>=0.15.1->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (2024.6.1)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /home/jupyter/venv/lib/python3.11/site-packages (from requests<3,>=2->langsmith<0.2.0,>=0.1.75->langchain-core) (3.3.2)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/jupyter/venv/lib/python3.11/site-packages (from requests<3,>=2->langsmith<0.2.0,>=0.1.75->langchain-core) (2.2.2)\n", - "Requirement already satisfied: sympy in /home/jupyter/venv/lib/python3.11/site-packages (from torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.12.1)\n", - "Requirement already satisfied: networkx in /home/jupyter/venv/lib/python3.11/site-packages (from torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (3.3)\n", - "Requirement already satisfied: jinja2 in /home/jupyter/venv/lib/python3.11/site-packages (from torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (3.1.4)\n", - "Requirement already satisfied: safetensors>=0.4.1 in /home/jupyter/venv/lib/python3.11/site-packages (from transformers<5.0.0,>=4.34.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (0.4.3)\n", - "Requirement already satisfied: tokenizers<0.20,>=0.19 in /home/jupyter/venv/lib/python3.11/site-packages (from transformers<5.0.0,>=4.34.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (0.19.1)\n", - "Requirement already satisfied: humanfriendly>=9.1 in /home/jupyter/venv/lib/python3.11/site-packages (from coloredlogs->redisvl<0.3.0,>=0.2.3->langchain-redis) (10.0)\n", - "Requirement already satisfied: joblib>=1.2.0 in /home/jupyter/venv/lib/python3.11/site-packages (from scikit-learn->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.4.2)\n", - "Requirement already satisfied: threadpoolctl>=3.1.0 in /home/jupyter/venv/lib/python3.11/site-packages (from scikit-learn->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (3.5.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /home/jupyter/venv/lib/python3.11/site-packages (from jinja2->torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (2.1.5)\n", - "Requirement already satisfied: mpmath<1.4.0,>=1.1.0 in /home/jupyter/venv/lib/python3.11/site-packages (from sympy->torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.3.0)\n", - "Downloading langchain_openai-0.1.14-py3-none-any.whl (45 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m45.9/45.9 kB\u001b[0m \u001b[31m5.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hDownloading openai-1.35.9-py3-none-any.whl (328 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m328.3/328.3 kB\u001b[0m \u001b[31m10.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hDownloading tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m40.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hDownloading distro-1.9.0-py3-none-any.whl (20 kB)\n", - "Installing collected packages: distro, tiktoken, openai, langchain-openai\n", - "Successfully installed distro-1.9.0 langchain-openai-0.1.14 openai-1.35.9 tiktoken-0.7.0\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ - "%pip install -U langchain-core langchain-redis langchain-openai redis" + "%pip install -qU langchain-core langchain-redis langchain-openai redis" ] }, { @@ -188,12 +121,19 @@ ] }, { - "name": "stdout", + "name": "stdin", "output_type": "stream", "text": [ "Please enter your OpenAI API key: ········\n" ] }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OpenAI API key has been set for this session.\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -239,7 +179,7 @@ "Result: \n", "\n", "Caching is the process of storing frequently accessed data in a temporary storage location for faster retrieval. This helps to reduce the time and resources needed to access the data from its original source. Caching is commonly used in computer systems, web browsers, and databases to improve performance and efficiency.\n", - "Time: 1.16 seconds\n", + "Time: 1.57 seconds\n", "\n", "Second call (cached):\n", "Result: \n", @@ -247,7 +187,7 @@ "Caching is the process of storing frequently accessed data in a temporary storage location for faster retrieval. This helps to reduce the time and resources needed to access the data from its original source. Caching is commonly used in computer systems, web browsers, and databases to improve performance and efficiency.\n", "Time: 0.05 seconds\n", "\n", - "Speed improvement: 25.40x faster\n", + "Speed improvement: 34.59x faster\n", "Cache cleared\n" ] } @@ -308,16 +248,16 @@ "Result: \n", "\n", "The capital of France is Paris.\n", - "Time: 1.52 seconds\n", + "Time: 1.13 seconds\n", "\n", "Similar query:\n", "Prompt: Can you tell me the capital city of France?\n", "Result: \n", "\n", "The capital of France is Paris.\n", - "Time: 0.29 seconds\n", + "Time: 0.25 seconds\n", "\n", - "Speed improvement: 5.22x faster\n", + "Speed improvement: 4.52x faster\n", "Semantic cache cleared\n" ] } diff --git a/libs/redis/docs/chat_history.ipynb b/libs/redis/docs/chat_history.ipynb index 98aea16..78e3554 100644 --- a/libs/redis/docs/chat_history.ipynb +++ b/libs/redis/docs/chat_history.ipynb @@ -27,66 +27,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: langchain-redis in /home/jupyter/venv/lib/python3.11/site-packages (0.0.1)\n", - "Requirement already satisfied: langchain-openai in /home/jupyter/venv/lib/python3.11/site-packages (0.1.14)\n", - "Requirement already satisfied: redis in /home/jupyter/venv/lib/python3.11/site-packages (5.0.7)\n", - "Requirement already satisfied: langchain-core<0.3,>=0.1.52 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (0.2.11)\n", - "Requirement already satisfied: numpy<2,>=1 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (1.26.4)\n", - "Requirement already satisfied: python-ulid<3.0.0,>=2.7.0 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (2.7.0)\n", - "Requirement already satisfied: redisvl<0.3.0,>=0.2.3 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (0.2.3)\n", - "Requirement already satisfied: sentence-transformers<4.0.0,>=3.0.1 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (3.0.1)\n", - "Requirement already satisfied: openai<2.0.0,>=1.32.0 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-openai) (1.35.9)\n", - "Requirement already satisfied: tiktoken<1,>=0.7 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-openai) (0.7.0)\n", - "Requirement already satisfied: PyYAML>=5.3 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (6.0.1)\n", - "Requirement already satisfied: jsonpatch<2.0,>=1.33 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (1.33)\n", - "Requirement already satisfied: langsmith<0.2.0,>=0.1.75 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (0.1.83)\n", - "Requirement already satisfied: packaging<25,>=23.2 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (24.1)\n", - "Requirement already satisfied: pydantic<3,>=1 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (2.8.0)\n", - "Requirement already satisfied: tenacity!=8.4.0,<9.0.0,>=8.1.0 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (8.4.2)\n", - "Requirement already satisfied: anyio<5,>=3.5.0 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (4.4.0)\n", - "Requirement already satisfied: distro<2,>=1.7.0 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (1.9.0)\n", - "Requirement already satisfied: httpx<1,>=0.23.0 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (0.27.0)\n", - "Requirement already satisfied: sniffio in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (1.3.1)\n", - "Requirement already satisfied: tqdm>4 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (4.66.4)\n", - "Requirement already satisfied: typing-extensions<5,>=4.7 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (4.12.2)\n", - "Requirement already satisfied: coloredlogs in /home/jupyter/venv/lib/python3.11/site-packages (from redisvl<0.3.0,>=0.2.3->langchain-redis) (15.0.1)\n", - "Requirement already satisfied: tabulate<1,>=0.9.0 in /home/jupyter/venv/lib/python3.11/site-packages (from redisvl<0.3.0,>=0.2.3->langchain-redis) (0.9.0)\n", - "Requirement already satisfied: transformers<5.0.0,>=4.34.0 in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (4.42.3)\n", - "Requirement already satisfied: torch>=1.11.0 in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (2.3.1)\n", - "Requirement already satisfied: scikit-learn in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.5.1)\n", - "Requirement already satisfied: scipy in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.14.0)\n", - "Requirement already satisfied: huggingface-hub>=0.15.1 in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (0.23.4)\n", - "Requirement already satisfied: Pillow in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (10.4.0)\n", - "Requirement already satisfied: regex>=2022.1.18 in /home/jupyter/venv/lib/python3.11/site-packages (from tiktoken<1,>=0.7->langchain-openai) (2024.5.15)\n", - "Requirement already satisfied: requests>=2.26.0 in /home/jupyter/venv/lib/python3.11/site-packages (from tiktoken<1,>=0.7->langchain-openai) (2.32.3)\n", - "Requirement already satisfied: idna>=2.8 in /home/jupyter/venv/lib/python3.11/site-packages (from anyio<5,>=3.5.0->openai<2.0.0,>=1.32.0->langchain-openai) (3.7)\n", - "Requirement already satisfied: certifi in /home/jupyter/venv/lib/python3.11/site-packages (from httpx<1,>=0.23.0->openai<2.0.0,>=1.32.0->langchain-openai) (2024.6.2)\n", - "Requirement already satisfied: httpcore==1.* in /home/jupyter/venv/lib/python3.11/site-packages (from httpx<1,>=0.23.0->openai<2.0.0,>=1.32.0->langchain-openai) (1.0.5)\n", - "Requirement already satisfied: h11<0.15,>=0.13 in /home/jupyter/venv/lib/python3.11/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai<2.0.0,>=1.32.0->langchain-openai) (0.14.0)\n", - "Requirement already satisfied: filelock in /home/jupyter/venv/lib/python3.11/site-packages (from huggingface-hub>=0.15.1->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (3.15.4)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in /home/jupyter/venv/lib/python3.11/site-packages (from huggingface-hub>=0.15.1->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (2024.6.1)\n", - "Requirement already satisfied: jsonpointer>=1.9 in /home/jupyter/venv/lib/python3.11/site-packages (from jsonpatch<2.0,>=1.33->langchain-core<0.3,>=0.1.52->langchain-redis) (3.0.0)\n", - "Requirement already satisfied: orjson<4.0.0,>=3.9.14 in /home/jupyter/venv/lib/python3.11/site-packages (from langsmith<0.2.0,>=0.1.75->langchain-core<0.3,>=0.1.52->langchain-redis) (3.10.6)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /home/jupyter/venv/lib/python3.11/site-packages (from pydantic<3,>=1->langchain-core<0.3,>=0.1.52->langchain-redis) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.20.0 in /home/jupyter/venv/lib/python3.11/site-packages (from pydantic<3,>=1->langchain-core<0.3,>=0.1.52->langchain-redis) (2.20.0)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /home/jupyter/venv/lib/python3.11/site-packages (from requests>=2.26.0->tiktoken<1,>=0.7->langchain-openai) (3.3.2)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/jupyter/venv/lib/python3.11/site-packages (from requests>=2.26.0->tiktoken<1,>=0.7->langchain-openai) (2.2.2)\n", - "Requirement already satisfied: sympy in /home/jupyter/venv/lib/python3.11/site-packages (from torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.12.1)\n", - "Requirement already satisfied: networkx in /home/jupyter/venv/lib/python3.11/site-packages (from torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (3.3)\n", - "Requirement already satisfied: jinja2 in /home/jupyter/venv/lib/python3.11/site-packages (from torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (3.1.4)\n", - "Requirement already satisfied: safetensors>=0.4.1 in /home/jupyter/venv/lib/python3.11/site-packages (from transformers<5.0.0,>=4.34.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (0.4.3)\n", - "Requirement already satisfied: tokenizers<0.20,>=0.19 in /home/jupyter/venv/lib/python3.11/site-packages (from transformers<5.0.0,>=4.34.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (0.19.1)\n", - "Requirement already satisfied: humanfriendly>=9.1 in /home/jupyter/venv/lib/python3.11/site-packages (from coloredlogs->redisvl<0.3.0,>=0.2.3->langchain-redis) (10.0)\n", - "Requirement already satisfied: joblib>=1.2.0 in /home/jupyter/venv/lib/python3.11/site-packages (from scikit-learn->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.4.2)\n", - "Requirement already satisfied: threadpoolctl>=3.1.0 in /home/jupyter/venv/lib/python3.11/site-packages (from scikit-learn->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (3.5.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /home/jupyter/venv/lib/python3.11/site-packages (from jinja2->torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (2.1.5)\n", - "Requirement already satisfied: mpmath<1.4.0,>=1.1.0 in /home/jupyter/venv/lib/python3.11/site-packages (from sympy->torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.3.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ - "%pip install -U langchain-redis langchain-openai redis" + "%pip install -qU langchain-redis langchain-openai redis" ] }, { @@ -243,11 +189,21 @@ "execution_count": 6, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Error in RootListenersTracer.on_chain_end callback: ValueError()\n", + "Error in callback coroutine: ValueError()\n", + "Error in RootListenersTracer.on_chain_end callback: ValueError()\n", + "Error in callback coroutine: ValueError()\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "AI Response 1: Hello Alice! How can I assist you today?\n", + "AI Response 1: Hello, Alice! It's nice to meet you. How can I assist you today?\n", "AI Response 2: Your name is Alice.\n" ] } diff --git a/libs/redis/docs/docker-compose.yml b/libs/redis/docs/docker-compose.yml index 8e1775a..aeb49dd 100644 --- a/libs/redis/docs/docker-compose.yml +++ b/libs/redis/docs/docker-compose.yml @@ -2,16 +2,17 @@ name: langchain-redis-notebooks services: jupyter: build: - context: ../../../.. - dockerfile: libs/partners/redis/docs/Dockerfile.jupyter + context: ../../.. + dockerfile: libs/redis/docs/Dockerfile.jupyter ports: - "8888:8888" volumes: - - ./:/home/jupyter/workspace/libs/partners/redis/docs + - ./:/home/jupyter/workspace/libs/redis/docs environment: - REDIS_URL=redis://redis:6379 + - USER_AGENT=LangChainRedisJupyterNotebooks/0.0.2 user: jupyter - working_dir: /home/jupyter/workspace/libs/partners/redis/docs + working_dir: /home/jupyter/workspace/libs/redis/docs depends_on: - redis diff --git a/libs/redis/docs/kitchensink.ipynb b/libs/redis/docs/kitchensink.ipynb index 4c753f7..210a27a 100644 --- a/libs/redis/docs/kitchensink.ipynb +++ b/libs/redis/docs/kitchensink.ipynb @@ -25,69 +25,31 @@ "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: langchain-redis in /home/jupyter/venv/lib/python3.11/site-packages (0.0.1)\n", - "Requirement already satisfied: langchain-openai in /home/jupyter/venv/lib/python3.11/site-packages (0.1.14)\n", - "Requirement already satisfied: wikipedia in /home/jupyter/venv/lib/python3.11/site-packages (1.4.0)\n", - "Requirement already satisfied: langchain-core<0.3,>=0.1.52 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (0.2.11)\n", - "Requirement already satisfied: numpy<2,>=1 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (1.26.4)\n", - "Requirement already satisfied: python-ulid<3.0.0,>=2.7.0 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (2.7.0)\n", - "Requirement already satisfied: redisvl<0.3.0,>=0.2.3 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (0.2.3)\n", - "Requirement already satisfied: sentence-transformers<4.0.0,>=3.0.1 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (3.0.1)\n", - "Requirement already satisfied: openai<2.0.0,>=1.32.0 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-openai) (1.35.9)\n", - "Requirement already satisfied: tiktoken<1,>=0.7 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-openai) (0.7.0)\n", - "Requirement already satisfied: beautifulsoup4 in /home/jupyter/venv/lib/python3.11/site-packages (from wikipedia) (4.12.3)\n", - "Requirement already satisfied: requests<3.0.0,>=2.0.0 in /home/jupyter/venv/lib/python3.11/site-packages (from wikipedia) (2.32.3)\n", - "Requirement already satisfied: PyYAML>=5.3 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (6.0.1)\n", - "Requirement already satisfied: jsonpatch<2.0,>=1.33 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (1.33)\n", - "Requirement already satisfied: langsmith<0.2.0,>=0.1.75 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (0.1.83)\n", - "Requirement already satisfied: packaging<25,>=23.2 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (24.1)\n", - "Requirement already satisfied: pydantic<3,>=1 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (2.8.0)\n", - "Requirement already satisfied: tenacity!=8.4.0,<9.0.0,>=8.1.0 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (8.4.2)\n", - "Requirement already satisfied: anyio<5,>=3.5.0 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (4.4.0)\n", - "Requirement already satisfied: distro<2,>=1.7.0 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (1.9.0)\n", - "Requirement already satisfied: httpx<1,>=0.23.0 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (0.27.0)\n", - "Requirement already satisfied: sniffio in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (1.3.1)\n", - "Requirement already satisfied: tqdm>4 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (4.66.4)\n", - "Requirement already satisfied: typing-extensions<5,>=4.7 in /home/jupyter/venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.32.0->langchain-openai) (4.12.2)\n", - "Requirement already satisfied: coloredlogs in /home/jupyter/venv/lib/python3.11/site-packages (from redisvl<0.3.0,>=0.2.3->langchain-redis) (15.0.1)\n", - "Requirement already satisfied: redis>=5.0.0 in /home/jupyter/venv/lib/python3.11/site-packages (from redisvl<0.3.0,>=0.2.3->langchain-redis) (5.0.7)\n", - "Requirement already satisfied: tabulate<1,>=0.9.0 in /home/jupyter/venv/lib/python3.11/site-packages (from redisvl<0.3.0,>=0.2.3->langchain-redis) (0.9.0)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /home/jupyter/venv/lib/python3.11/site-packages (from requests<3.0.0,>=2.0.0->wikipedia) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /home/jupyter/venv/lib/python3.11/site-packages (from requests<3.0.0,>=2.0.0->wikipedia) (3.7)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/jupyter/venv/lib/python3.11/site-packages (from requests<3.0.0,>=2.0.0->wikipedia) (2.2.2)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /home/jupyter/venv/lib/python3.11/site-packages (from requests<3.0.0,>=2.0.0->wikipedia) (2024.6.2)\n", - "Requirement already satisfied: transformers<5.0.0,>=4.34.0 in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (4.42.3)\n", - "Requirement already satisfied: torch>=1.11.0 in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (2.3.1)\n", - "Requirement already satisfied: scikit-learn in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.5.1)\n", - "Requirement already satisfied: scipy in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.14.0)\n", - "Requirement already satisfied: huggingface-hub>=0.15.1 in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (0.23.4)\n", - "Requirement already satisfied: Pillow in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (10.4.0)\n", - "Requirement already satisfied: regex>=2022.1.18 in /home/jupyter/venv/lib/python3.11/site-packages (from tiktoken<1,>=0.7->langchain-openai) (2024.5.15)\n", - "Requirement already satisfied: soupsieve>1.2 in /home/jupyter/venv/lib/python3.11/site-packages (from beautifulsoup4->wikipedia) (2.5)\n", - "Requirement already satisfied: httpcore==1.* in /home/jupyter/venv/lib/python3.11/site-packages (from httpx<1,>=0.23.0->openai<2.0.0,>=1.32.0->langchain-openai) (1.0.5)\n", - "Requirement already satisfied: h11<0.15,>=0.13 in /home/jupyter/venv/lib/python3.11/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai<2.0.0,>=1.32.0->langchain-openai) (0.14.0)\n", - "Requirement already satisfied: filelock in /home/jupyter/venv/lib/python3.11/site-packages (from huggingface-hub>=0.15.1->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (3.15.4)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in /home/jupyter/venv/lib/python3.11/site-packages (from huggingface-hub>=0.15.1->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (2024.6.1)\n", - "Requirement already satisfied: jsonpointer>=1.9 in /home/jupyter/venv/lib/python3.11/site-packages (from jsonpatch<2.0,>=1.33->langchain-core<0.3,>=0.1.52->langchain-redis) (3.0.0)\n", - "Requirement already satisfied: orjson<4.0.0,>=3.9.14 in /home/jupyter/venv/lib/python3.11/site-packages (from langsmith<0.2.0,>=0.1.75->langchain-core<0.3,>=0.1.52->langchain-redis) (3.10.6)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /home/jupyter/venv/lib/python3.11/site-packages (from pydantic<3,>=1->langchain-core<0.3,>=0.1.52->langchain-redis) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.20.0 in /home/jupyter/venv/lib/python3.11/site-packages (from pydantic<3,>=1->langchain-core<0.3,>=0.1.52->langchain-redis) (2.20.0)\n", - "Requirement already satisfied: sympy in /home/jupyter/venv/lib/python3.11/site-packages (from torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.12.1)\n", - "Requirement already satisfied: networkx in /home/jupyter/venv/lib/python3.11/site-packages (from torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (3.3)\n", - "Requirement already satisfied: jinja2 in /home/jupyter/venv/lib/python3.11/site-packages (from torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (3.1.4)\n", - "Requirement already satisfied: safetensors>=0.4.1 in /home/jupyter/venv/lib/python3.11/site-packages (from transformers<5.0.0,>=4.34.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (0.4.3)\n", - "Requirement already satisfied: tokenizers<0.20,>=0.19 in /home/jupyter/venv/lib/python3.11/site-packages (from transformers<5.0.0,>=4.34.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (0.19.1)\n", - "Requirement already satisfied: humanfriendly>=9.1 in /home/jupyter/venv/lib/python3.11/site-packages (from coloredlogs->redisvl<0.3.0,>=0.2.3->langchain-redis) (10.0)\n", - "Requirement already satisfied: joblib>=1.2.0 in /home/jupyter/venv/lib/python3.11/site-packages (from scikit-learn->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.4.2)\n", - "Requirement already satisfied: threadpoolctl>=3.1.0 in /home/jupyter/venv/lib/python3.11/site-packages (from scikit-learn->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (3.5.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /home/jupyter/venv/lib/python3.11/site-packages (from jinja2->torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (2.1.5)\n", - "Requirement already satisfied: mpmath<1.4.0,>=1.1.0 in /home/jupyter/venv/lib/python3.11/site-packages (from sympy->torch>=1.11.0->sentence-transformers<4.0.0,>=3.0.1->langchain-redis) (1.3.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ - "%pip install -U langchain-redis langchain-openai wikipedia" + "%pip install -qU langchain-redis langchain-openai wikipedia" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "langchain-redis version: langchain-redis_v0.0.2\n" + ] + } + ], + "source": [ + "from langchain_redis.version import __lib_name__\n", + "\n", + "print(f\"langchain-redis version: {__lib_name__}\")" ] }, { @@ -105,7 +67,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -133,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -157,7 +119,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -215,7 +177,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -241,7 +203,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -250,7 +212,7 @@ " \"index\": {\n", " \"name\": \"kitchensink_docs\",\n", " \"storage_type\": \"hash\",\n", - " \"prefix\": \"wiki:\",\n", + " \"prefix\": \"wiki\",\n", " },\n", " \"fields\": [\n", " {\"name\": \"text\", \"type\": \"text\"},\n", @@ -281,7 +243,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -304,14 +266,14 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "23:12:08 redisvl.index.index INFO Index already exists, not overwriting.\n" + "17:58:35 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -334,17 +296,31 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# Initialize RedisCache\n", "redis_cache = RedisCache(redis_url=REDIS_URL)\n", - "set_llm_cache(redis_cache)\n", - "\n", + "set_llm_cache(redis_cache)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ "# Initialize ChatOpenAI with caching\n", - "llm = OpenAI(temperature=0)\n", - "\n", + "llm = OpenAI(temperature=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ "# Initialize RedisChatMessageHistory\n", "message_history = RedisChatMessageHistory(\"kitchensink_chat\", redis_url=REDIS_URL)" ] @@ -358,14 +334,14 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Added 439 document chunks to the vector store.\n" + "Added 448 document chunks to the vector store.\n" ] } ], @@ -427,7 +403,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -479,7 +455,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -501,14 +477,14 @@ "output_type": "stream", "text": [ "AI: \n", - "The core tenets of AI include reasoning, knowledge representation, planning, learning, natural language processing, perception, and support for robotics. These are the traditional goals of AI research and are essential for creating intelligent machines that can perform tasks on par with humans. Additionally, AI also draws upon various fields such as psychology, linguistics, philosophy, neuroscience, and others to further advance its capabilities.\n" + "The core tenets of AI include reasoning, knowledge representation, planning, learning, natural language processing, perception, and support for robotics. These are the traditional goals of AI research and are essential for the development and use of AI technology. Additionally, ethical considerations and the promotion of the wellbeing of individuals and communities are also important factors in the development and implementation of AI systems.\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ - "Human: How does AI influence robotics, and viceversa?\n" + "Human: How does AI influence Robotics and vice versa?\n" ] }, { @@ -516,7 +492,7 @@ "output_type": "stream", "text": [ "AI: \n", - "AI and robotics have a symbiotic relationship, as advancements in one field often lead to advancements in the other. AI influences robotics by providing the software and algorithms that enable robots to make decisions and learn from their environment. On the other hand, robotics influences AI by providing real-world data and challenges for AI systems to learn from and improve upon. Together, they are driving the development of advanced technologies that have the potential to greatly impact various industries and aspects of our daily lives.\n" + "AI and robotics have a symbiotic relationship, with advancements in one field often leading to advancements in the other. AI technology is used to enhance the capabilities of robots, allowing them to interact with their environment and make decisions based on their programming. On the other hand, robotics provides a physical platform for AI systems to operate in the real world. As AI continues to evolve, it will likely have a significant impact on the development and use of robotics, and vice versa.\n" ] }, { @@ -606,7 +582,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "metadata": {}, "outputs": [ { diff --git a/libs/redis/docs/langgraph_self_rag.ipynb b/libs/redis/docs/langgraph_self_rag.ipynb new file mode 100644 index 0000000..375638d --- /dev/null +++ b/libs/redis/docs/langgraph_self_rag.ipynb @@ -0,0 +1,854 @@ +{ + "cells": [ + { + "attachments": { + "15cba0ab-a549-4909-8373-fb761e384eff.png": { + "image/png": "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AAIIIIAAAggggAACCCBA4MR3AAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAIC4BAqe4+NgZAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECAwInvAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQFwCBE5x8bEzAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAgRPfAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgbgECJzi4mNnBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABAie+AwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAnEJEDjFxcfOCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACBE58BxBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBOISIHCKi4+dEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEECJz4DiCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCMQlQOAUFx87I4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIEDjxHUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEIhLgMApLj52RgABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQIHDiO4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIBCXAIFTXHzsjAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggQODEdwABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCAuAQKnuPjYGQEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAgMCJ7wACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEBcAgROcfGxMwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAIET3wEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIG4BAic4uJjZwQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQInvgMIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAJxCRA4xcXHzggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgROfAcQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQTiEiBwiouPnRFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBAic+A4ggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgjEJUDgFBcfOyOAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCBA48R1AAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBCIS4DAKS4+dkYAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEECBw4juAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCAQlwCBU1x87IwAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIEDgxHcAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgLgECp7j42BkBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQIDAie8AAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAXAIETnHxsTMCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggACBE98BBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBuAQInOLiY2cEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAECJ74DCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACcQkQOMXFx84IIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIETnwHEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEE4hIgcIqLj50RQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQInPgOIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIxCVA4BQXHzsjgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggQOPEdQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQiEuAwCkuPnZGAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBAgcOI7gAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggEJcAgVNcfOyMAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBA4MR3AAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAIC6BwnHtzc4IIIAAAggggAACCCCA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vRYuXGi7du2yihUrWq1atax27dqmqqb82gic8uud57oRQAABBBBAAAEEEEAAAQQQQAABBBBAIMcFVBHx+uuv27Rp09xn5ZexXHIclg9AAIGEEyBwSrhbwgkhgAACCCCAAAIIIIAAAggggAACCCCAQF4WWLFihQ0fPtzef/99mzNnTsSldO/e3e6///6IZcwggAACySCQfzoPTIa7xTUggAACCCCAAAIIIIAAAggggAACCCCAQMIKKGgaOnSoey1fvtydZ+XKlc2f1oIKFSok7PlzYggggEA8AgRO8eixLwIIIIAAAggggAACCCCAAAIIIIAAAgjke4HooKlAgQLWq1cvmzBhgv3www+BT48ePez6668P5plAAAEEkkmALvWS6W5yLQgggAACCCCAAAIIIIAAAggggAACCCCwTwWefPLJoKKpZMmSLmg699xz7aqrrrLJkycH59KwYUMbPXp0MM8EAgggkGwCBE7Jdke5HgQQQAABBBBAAAEEEEAAAQQQQAABBBDIUYGtW7fa4MGD7dVXX7Vly5ZZpUqVXNCk8ZnUunXrFhE2aZnGczryyCM1SUMAAQSSUoAu9ZLytnJRCCCAAAIIIIAAAggggAACCCCAAAIIIJATAm+//bYLm3799VcrX768PfbYY3bOOecEH3XdddelCptOPvlkwqZAiAkEEEhWAQKnZL2zXBcCCCCAAAIIIIAAAggggAACCCCAAAIIZJvAqFGjXNA0adIkK1y4sKto6t27d8TxH3roIfvwww8jlmnmrLPOSrWMBQgggECyCRA4Jdsd5XoQQAABBBBAAAEEEEAAAQQQQAABBBBAINsENA6Tus5T4KSm7vJuuukmq1y5csRnaJsXXnghWKZu9lasWGEtWrSwDh06BMuZQAABBJJVgMApWe8s14UAAggggAACCCCAAAIIIIAAAggggAACWRb46aefbMiQIaYu9NROOeUUu/jii12AFH3Q0aNH27333hssrlu3rv35559unuqmgIUJBBBIcgECpyS/wVweAggggAACCCCAAAIIIIAAAggggAACCGRcYOnSpfbSSy+5l/Y64YQT7Pzzz7f27dvHPMi0adOsR48ewbo6derYoYce6gKn+vXr29lnnx2sYwIBBBBIZgECp2S+u1wbAggggAACCCCAAAIIIIAAAggggAACCGRK4KKLLrLZs2dbq1atXEXTSSedlOb+M2fOjAiU1I1ev3797LLLLnP7KGwqVKhQmvuzAgEEEEgmAQKnZLqbXAsCCCCAAAIIIIAAAggggAACCCCAAAIIxCVw5ZVX2q5du+zcc89N9zhz5861k08+OdimVKlSNmjQIPvuu+9s06ZNbownqpsCHiYQQCAfCBA45YObzCUigAACCCCAAAIIIIAAAggggAACCCCAQMYEunbtutcNly9fbm3btg22K1iwoAubDj/8cHvwwQfdcoVNFSpUCLZhAgEEEEh2gYLJfoFcHwIIIIAAAggggAACCCCAAAIIIIAAAgggkF0CGzdutObNm0cc7sUXX7Sjjz7apk6d6l7FixeP6GovYmNmEEAAgSQVIHBK0hvLZSGAAAIIIIAAAggggAACCCCAAAIIIIBA9gqoq70mTZpEHPTpp5+2Dh06uGUjR45076puqlu3bsR2zCCAAALJLkDglOx3mOtDAAEEEEAAAQQQQAABBBBAAAEEEEAAgWwRqF+/fsRx+vXrZ6effrpbtnPnThs1apSb9pdFbMwMAgggkOQCBE5JfoO5PAQQQAABBBBAAAEEEEAAAQQQQAABBBCIX+Coo44yhUp+u/POO+3888/3Z+1///ufLVu2zI3tFN3lXrAREwgggEASCxA4JfHN5dIQQAABBBBAAAEEEEAAAQQQQAABBBBAIH6BE0880VasWBEc6IYbbrAePXoE85r46KOP3Pxpp50WsZwZBBBAIL8IEDjllzvNdSKAAAIIIIAAAggggAACCCCAAAIIIIBApgW6detms2bNCvZT0HT99dcH85qYP3++ffHFF27cJgKnCBpmEEAgHwkQOOWjm82lIoAAAggggAACCCCAAAIIIIAAAggggEDGBa666iqbPHlysMOFF15o6kovuvnVTRq7qUiRItGrmUcAAQTyhQCBU764zVwkAggggAACCCCAAAIIIIAAAggggAACCGRG4I477rBPP/002OXMM8+0Bx98MJgPT2j8ppSUFDv77LPDi5lGAAEE8pUAgVO+ut1cLAIIIIAAAggggAACCCCAAAIIIIAAAgjsTaB///725ptvBptpDKcnn3wymA9PjB071nW517VrV6tevXp4FdMIIIBAvhIgcMpXt5uLRQABBBBAAAEEEEAAAQQQQAABBBBAAIH0BAYNGmQDBgwINjnmmGNMy9JqP/74o1tFdVNaQixHAIH8IlBgt9fyy8VynQgggAACCCCAAAIIIIAAAggggAACCCCAQFoCw4YNs1tuuSVYfcQRR9gHH3wQzKc1MWnSJGvVqlVaq1mOAAII5AsBAqd8cZu5SAQQQAABBBBAAAEEEEAAAQQQQAABBBBIT2DUqFF25ZVXBpvUr1/fxowZE8wzgQACCCCQvgCBU/o+rEUAAQQQQAABBBBAAAEEEEAAAQQQQACBJBeYOHGinXfeecFVVqtWzbSMhgACCCCQcQECp4xbsSUCCCCAAAIIIIAAAggggAACCCCAAAIIJJnAL7/8YqecckpwVWXLlrUZM2YE80wggAACCGRMgMApY05shQACCCCAAAIIIIAAAggggAACCCCAAAJJJrBw4UJr3bp1cFVFihSxOXPmBPNMIIAAAghkXIDAKeNWbIkAAggggAACCCCAAAIIIIAAAggggAACSSKwfv16O+SQQyKuZv78+RHzzCCAAAIIZFyAwCnjVmyJAAIIIIAAAggggAACCCCAAAIIIIAAAkkiUKtWrYgrmTlzppUsWTJiGTMIIIAAAhkXKJjxTdkSAQQQQAABBBBAAAEEEEAAAQQQQAABBBDI+wL16tWLuIhp06YRNkWIMIMAAghkXoDAKfNm7IEAAggggAACCCCAAAIIIIAAAggggAACeVSgSZMmtnPnzuDsx48fb5UqVQrmmUAAAQQQyJoAgVPW3NgLAQQQQAABBBBAAAEEEEAAAQQQQAABBPKYQNOmTW3jxo3BWX/yySdWp06dYJ4JBBBAAIGsCxA4Zd2OPRFAAAEEEEAAAQQQQAABBBBAAAEEEEAgjwgcc8wxtnLlyuBshw8fbqp2oiGAAAIIZI8AgVP2OHIUBBBAAAEEEEAAAQQQQAABBBBAAAEEEEhQgfbt29uiRYuCsxs8eLC1aNEimGcCAQQQQCB+AQKn+A05AgIIIIAAAggggAACCCCAAAIIIIAAAggkqEDnzp1t9uzZwdk9++yz1q5du2CeCQQQQACB7BEgcMoeR46CAAIIIIAAAggggAACCCCAAAIIIIAAAgkmcPbZZ9tPP/0UnNWjjz5qCqBoCCCAAALZL0DglP2mHBEBBBBAAAEEEEAAAQQQQAABBBBAAAEEclmgZ8+eNm3atOAs+vTpY926dQvmmUAAAQQQyF4BAqfs9eRoCCCAAAIIIIAAAggggAACCCCAAAIIIJDLAg8//LCNHDkyOIvevXvbpZdeGswzgQACCCCQ/QIETtlvyhERQAABBBBAAAEEEEAAAQQQQAABBBBAIJcEhg4das8991zw6VdffbX16tUrmGcCAQQQQCBnBArs9lrOHJqjIoAAAggggAACCCCAAAIIIIAAAggggECyCyxatMgmT57sLrNly5ZWvXr1XLvkr7/+2i644ILg87t37273339/MM8EAggggEDOCRA45ZwtR0YAAQQQQAABBBBAAAEEEEAAAQQQQCBpBdavX29PPvmkvfzyyxHXeMMNN7ju61JSUiKW5/TMggUL7Nhjjw0+5uyzz7bHH388mGcCAQQQQCBnBQicctaXoyOAAAIIIIAAAggggAACCCCAAAIIIJB0AjNnzrQrrrjCVN0Uq6nKadCgQda4ceNYq3NkWa1atYLjnnzyyfb8888H80wggAACCOS8AIFTzhvzCQgggAACCCCAAAIIIIAAAggggAACCCSNwIgRI6xv376mCqfSJUvaHZdcYl3atbX1mzbZe+PG2zPDh9sGb1oVTsOGDdsnodNBBx1k27dvd8Zt2rSxN954I2m8uRAEEEAgrwgQOOWVO8V5IoAAAggggAACCCCAAAIIIIAAAgggkMsCCpt69+7tzqJ5k8b27K23WooXOoXbr/Pm2a0DnrFZ3vu+CJ2OPPJIW7VqlTuFpk2b2nvvvRc+HaYRQAABBPaRAIHTPoLmYxBAAAEEEEAAAQQQQAABBBBAAAEEEMjLAhqv6YknnnCX0L1TJ7vz0kvSvBxVO13zyCM29ZeZLnT65ptv3HuaO2RxxXHHHWfzvGBLrVGjRjZq1Cg3zQ8EEEAAgX0vQOC07835RAQQQAABBBBAAAEEEEAAAQQQQAABBPKUgKqaVN1Uar/9vKDpUteFXkYu4LZnnrH3vW72NJaTutdTxVN2tc6dO9tPP/3kDlejRg37+uuvs+vQHAcBBBBAIAsCBE5ZQGMXBBBAAAEEEEAAAQQQQAABBBBAAAEE8otAOGwacn9fa1S7dqYu3Q+dOnbsaP3798+W0Om8886ziRMnuvOoUKGCTZ8+PVPnxMYIIIAAAtkvUDj7D8kREUAAAQQQQAABBBBAAAEEEEAAAQQQQCAZBPywqYEXMg3pe1+q8Zoyco0PX3ut2+z90aNt4cKFcVc69ezZMwibihcvTtiUkZvANggggMA+ECi4Dz6Dj0AAAQQQQAABBBBAAAEEEEAAAQQQQACBPCaQHWGTf8kKnc5s19Zmzpxp3bp1s/Xr1/urMvV+55132siRI4N9Zs2aFUwzgQACCCCQuwIETrnrz6cjgAACCCCAAAIIIIAAAggggAACCCCQcALZGTb5Fxdv6KTu+IYMGeIfzn777bdgmgkEEEAAgdwXIHDK/XvAGSCAAAIIIIAAAggggAACCCCAAAIIIJAwAjkRNvkXl9XQ6Y033rABAwb4h3Hd6JUoUSKYZwIBBBBAIPcFCuz2Wu6fBmeAAAIIIIAAAggggAACCCCAAAIIIIAAArktkJNhU/jabnvmGXt/3Hhr3LjxXsd0+uKLL+ySSy4Jdp8wYYLVrFkzmGcCAQQQQCAxBAicEuM+cBYIIIAAAggggAACCOQZgb+9P1n77Idl9tP89fbbwg325+KNtnnrTiubUtQOrFbKGtZIsaMOLGct65fPM9eUrCe6Y9duW7tpe3B5+6cUC6aZQAABBBBAIFpgX4VN/udmJHTSeE09e/b0d7FRo0ZZo0aNgnkmEEAAAQQSR4DAKXHuBWeCAAIIIIAAAggggEDCCyxbu9Wue3GGzV+yca/nWr9Wig3ocZiVLVl0r9uyQc4IPPG/2fb22AXBwSf+93grVLBAMM8EAggggAACEli/fr317dvXRowYYQ1q17Yhfe+zlJIl9wlOZkKnd99915o1a7ZPzosPQQABBBDIvABjOGXejD0QQAABBBBAAAEEEMiXAqN/WG5d+k7MUNgkoN+9Cqgez3yfL60S5aK37vg7UU6F80AAAQQQSFABhU3dunVzYVPDfRw2iSQjYzp16tTJBg4cSNiUoN8hTgsBBBDwBQr7E7wjgAACCCCAAAIIIIAAAmkJLFq9xe4Z/HPEalXKdGxZ1Q6pmWK1K5W03xZvsLE/rLCf/1gbbHdMkwrBNBMIIIAAAgggkFgCftg0c+ZMa1Snjr1+3737rLIpLKHQSU1jOin8GjZsmKWkpIQ3MYVONAQQQACBxBYgcErs+8PZIYAAAggggAACCCCQEAKPvvd7xHlULFfMnru2qdWsUCJYfmTdsnb+sTVs4Kg/7bVRc+2CDrXsuk4HBuuZQAABBBBAAIHEEQiHTQ1zMWzyRTISOvnb8o4AAgggkJgCBE6JeV84KwQQQAABBBBAAAEEEkbg10UbbMrPK4PzKVWyiL17+9FWvGjsHrp7nlTXTjyssh1YNf2xHzZv2+WqonT8OUs3emM9FbEG1UpZ4xopVrPifsHnRU9ov8m/rwoWt25U0YoWLmhTZq+2b+esseVrt1nFlKLesUrb0Q0qWOkSGfvPnqyez2/e+S9ZsyU4H3/i8DplrXyporZ7t9nnPy43XefK9du9arD97OCaZaz5QeX8TSPeP/lumS1ft9UKFypoBQsUsP2KFbLKZYrZobXLWqnihSK2jZ75c9kmm/fXpmDx/OWbg2lNfPHTiphjOBUsWNBaN6pghdMZ32nn37ttjjd2169eJZuq2dQaHFDaGnr3rGH1FO9c3SJ+IIAAAgjkAYFw2NSobl17/d4+uVLZFE1F6BQtwjwCCCCQtwQy9l9eeeuaOFsEEEAAAQQQQAABBBDIRoFBY+ZGHO3KTnXTDJv8DfcWNn06fZndP2Sm7fJCjFit3ZGV7Z5ujVzYEr1+2ZqtdvvLPwWL37ilhfV//3ebMXtNsMyfKO6FNQ/83yF2bOP0u/aL53xe+OxPm/jjv4Gc/9m3dGtoHY+oYhc/Oc0WekFQdGtxcEV7tPshqSyf+nC2rfWCqVitfNlidsmJte3sVtVjBjzDJy6y979aFGtXt+yuVyO7RQxv+OTVR1irBuXDi4LpWYs32nUvfJ/medWoUtL+e8VhERVvwc5MIIAAAggklEA4bGrgjdmUKGGTj0To5EvwjgACCOQ9gdh/kpj3roMzRgABBBBAAAEEEEAAgRwSmLf037Bkv+KFrUvLanF90t1DZ9q9r/+SZtikg4+bvtxO7fuNbdiyc6+fNeizuTHDJu241auG6v3iD17VT2SlT/ig2X0+/rHnr9xsj7w3K2bYpG1UNfbmhAX+5sH7ho07gunoidVe9dbjw2fZOY9Mtu07/45eHdf8bpVixWjvT1li3R+bkmbYpF0UqJ374CT7Ye6/43fFOBSLEEAAAQRyWSA6bBrS976EqGyKZlHodGa7tqaxpTSmk86bhgACCCCQ+AKF7vVa4p8mZ4gAAggggAACCCCAAAK5JTDgwzn29z+VSAfXK2unNa+a5VOZ+NsqG+gdL9zKet3f1fe60Uvxup9bt2G764JO67fv+NvW79hlx3pd5oXbGi+Qeffrf6t4Fq3Y7PYp5PXpVtvr4k377YgKY/7wtul8VOrzzo7zUVd8G71XFW88q+WrtwanmlKqiH094y93bqpMatqwvK1Ys8127vo32Pl1wQa7uH3tYB91WzfG26eE13WeqrMKe10F7ty5OzDxN1zvGSzfuN3aNtnfX+TeFUKt9NbpXPTasn2Xbdv+bzCl+1e14p51/jb++wleN4jqijDc1m7abtcMmB7x+Tqv+rXKWEXvmtZ5n+V/N5RXfffnWju3TY3wIZhGAAEEEEgQgbwSNvlc7Zs3t8V/rbAJ06bZypUr7cQTT/RX8Y4AAgggkKACdKmXoDeG00IAAQQQQAABBBBAIBEEFKaEw5ua3vhDWW0KJB55Z1bE7r3PaWhdj/63YmrR6i129TPTbcU/wc0HXvdwlx5fyyqXLR6xX3hG3fKpe7qHLzrYdcGnz/n611Wussnf7scY3e1l1/mo4suv+urx7PSg2ur739e4Kq7Ox1Szu7s2dKeywwubLn36W/t9/p6/1N68dafJWOM0qWkMpeG3tnDT4R/rvUqv/01bas99NCe4H59MXGIXtalpdb3u7Px2/CGVTC+/9fMqrGTotxevOTLmGE7++uj3AZ/8GVGJ1rFFVbvLuxaNmaWmc79jyM826ac9XQou/WuLjfp+mZ3kdSVIQwABBBBIHIG8Fjb5cn73eiNGjHCL+vfv76/iHQEEEEAgAQXoUi8BbwqnhAACCCCAAAIIIIBAoggsXLkl4lSqeVUz0U1VNWm9FOr47ecF62xZ6HjnHF8zImzSdtXLl7DHLzvM38W9f/dH+t20FfHCD42F5Ic2BQqYG7OpXvXSwXEUSq32KoLCLafOx/8MdedXzQvo/LBJy4sUKmCnRFVaLV/7b1WUv2/0e0qJwnZBmxr2/HVNI1b96JnmZPt00pLg8LUOKGV9z2schE1aIfNHvTGy1NWi376eudqf5B0BBBBAIEEEevfu7bqn05hNidqNXlpUfvd6Cp10HTQEEPhXYOvWrfbmm2/aoEGDbN26nP3/hf9+KlMIpC3w738VpL0NaxBAAAEEEEAAAQQQQCCfCmzfuSvdK9cYS+1v/zLNbS45uY5d1bGuW/+n161duPnLw8s0Xb9aKau6fwlTtYyaxkJKr7U9orIVL5r6b+k6NqtiAxdtCHZd7o1/VN7rts9vOXU+/vH1flbr6uFZN93AC24U3qgV9NKx4kX3VDe5BXv5cXDNFCtVsoht3LRnnKdZizfuZY+sr/5r/baI6qaep+y5j9FHVLXTic2rBJVUC9IZLyt6X+YRQAABBHJeQCHN6NGjLS+GTb5OblY6KehSl35qderUsZNOOsk/Ld4RyBaBLVu22I4dO6xgwYJWqtSe/4+Y0QMPHz7c7r77brf58uXL7a677srorjm23ZIlS+zHH3+0H374wRYuXGhVq1a1I444wjp27Oh1F00ckWPwCXJg7nCC3AhOAwEEEEAAAQQQQACBRBSoWj6yK7slXpd3mWkKpPwWDiJUlfT5jyv8VaneN2wO7bci/c+ssX/kOfoHK7Nf5H/u7A6XW3kb5dT5+J+v9xMOjRxjScuOrFvWht/SQpNptvG/rLTR05fb4lVb7C+vAmqz51jKu54alUraNq9yym/L1qRv42+Xlfewj/Zf6J3Lh163frHanFDwtXQvAWGs/VmGAAIIIJD9AupGr2/fvqbAJC+HTb5MboROmzZtiqiqqlChgntoXkDl1DQEsknggQcesCFDhpi+X9OnT8/UUdeu/bcngPB0pg6STRv//fff9uyzz1paXV8efPDB7vfRfvtlvYvubDpVDpODApH/BZaDH8ShEUAAAQQQQAABBBBAIO8JVCxdLOKkl3ihQ1bbglCFk8aFeujNmRk61LpNkV3hRe+Ust+/VUvR69Kbz6nzCX9mxZRIv/C6WNM/zF1rt7/2s632qrGim7roW7km9fLo7bJrfkGo+0Md85n3Z2fo0Fu2/huIZWgHNkIAAQQQyHaB8JhNpbyHu8/ddqullPx3zL9s/8B9dECFTotW/OUeWusj03qwnV2nM2XKlIhDrVq1yn777Tdr1KhRxHJmEMgtgQsuuMBU2bR582a71vv3kZutV69e9vHHHwenoICpVq1aNn78eFN4+/PPP9vAgQMjQtxgYyaSRoDAKWluJReCAAIIIIAAAggggEDOCJRNKWpr1+8Jff5cEtmFW0lv7J7BvZtHfHAfL0iavzRyO22gCp2stOLeOEE50XL6fFTFVbhgxv8C+o9lm6zngOkR3djlxHVn9JilimfNXddNQwABBBDIPYFw2KSzUEhTbf/UFbe5d4bxffLAW2+xi+69z4VOCn4uu+yy+A6Yzt56UK7Wvn17mz9/vs2ePdu++uorAienwo9EEFBV1IMPPpgIp+K6m1TgdNhhh9nzzz9vBxxwgDuvFStW2FFHHeWmo0PchDhxTiJbBbL2X3zZegocDAEEEEAAAQQQQAABBBJZoHL5EkHgpAqbSbNWW6sG5d0pK09pVL10xOmXLBH7PzMOrBLZJ/0FHWpZiQyMX9SkRkrE8bNrJqfPp1gmg7LnR/0ZETa1O7KydfPGgKrhjWdVslhh27pjl6kq65ZXfwruR2Ytdv292wplMASL9jnCu+dNDyy7148sWzJrFWd7PTAbIJCHBXbu3OkGdNclaIwOPSAPj2Ohiolx48ZZ2bJl7bzzzsvDV5p4p96hQwdbt26dde7c2Y4//nhr3bp14p1kNp5RdNh0QvOjrEOLyD8MycaPy5VDqVLrjXv72EX3P+C6DKxevbrr5i4nTuazzz5zhz3uuONs8eLFLnD6/PPP7corr0z1cS+++KLNnTvXhVM1atSwkSNH2tdff20lSpSw5s2b2xVXXOGmo3fcsGGD+/c/YcIEN1aUqqi2b99u5cqVs/Lly9uNN95o9erVM43zo67X1G3ZxRdfbA0aNLD33nvPpk2bZjK45pprTL9r/PF8NF5O27Ztg4/T/m+++aYbW+ePP/5wYYAqUP7v//7P/e4JNvQmnnvuOVuwYEGw6KyzzrImTZrYF198YR9++KHpHA8//HBXUaPzDLdffvnFjRk2Z84ct53+/RUvXtx1F6dxfLKjCkfh31tvvWXff/+9u2Zdq85R5r/++qvzPvPMM4PT6tevn+nfhv79d+rUKVienpc2UnfM//vf/2zSpEmm60pJSXHu55xzjnsPDhSayOj9nDx5srPUrvr9rybX22+/3U2Hf9xzzz0R351BgwbZn3/+Gd7ETev33DHHHJNqub9A30+N+aRrUfd7uqfHHnusnXLKKf4mwbu+52PHjnXjlp199tn2/vvvu7B148aNbr+rrroqCJT8nU499VSrXLmyHXrooe6e+8v39wJvBWO6Pn1/acktEPu/BJP7mrk6BBBAAAEEEEAAAQQQyITAcYdUtFnz1gV7DPjfHC9wyvzDqwOrRnblc4AXZJ3dqlpw3H09kWjnM/XXVQFBK8/84e4HB/OaUDhXpnZR2xQa3ypigxgz5UsViVi60Osmr16VyPsQsUFopsb+kf3r7+dVPF3RoU5oCyYRQCCjArt27bKHH3442PzAAw+0E044IZjXA1KtL+k9SCdwCliyZUIPUr/88kt7+eWX3UsP2E888UT3SrZu0aLDJnWl5497lC2YCXQQhU4Db+5tp9/U23XPpYCncePG2XqGqmZaunTP2IUtW7a0ZcuWuaqNqVOnuhCzTJkyEZ+nIEZdhhUtWtQ9mA8HAgqTRo8e7QKGcNi8aNEiO+2009yD+IiDhWZuuOEGN6f9NM6PWqtWrVzgoc9UFZYe5itw0gP9oUOHum10zn6bN2+eXX755S4w85fpXBWovfbaa/bGG2+4EMFfp+Pq95LfVKkyZswYd/3+sm+//da++eYb+/TTT80f0+qxxx6zZ555xt8k1bt+x8XbvvvuO7voootcF23+sXQuM2fOtIULF5qmCxUqZOHASdenLt1Kly4dETjpd7PvVbt27VQB3X/+8x933/zP0bvu5UsvvWT//e9/XcgVXpeZ+/nTTz8Fnx0+hn8+4WW33XZbROCk4G/ixInhTdy0fqelFTjp+9ejR4+IfWbMmOHOQVbqnjL83ZSjzuWggw5y4aMM/aZ177zh1eGKAABAAElEQVTzjvtOVKsW+f/lFa5GN1U96buppqCSltwCBE7JfX+5OgQQQAABBBBAAAEE4ha46Lia9vpn80xjCKn9sWiD9R3+m91+VgMrUijjXcY1OCCywum/I2ZZY686qnEOVTDt7cIT7Xx8X513iaKx/1Ptq5krTeNfZbTVrhT5YOfjb5fafzofmKHd1R1glYolbNk/Yzl9M+MvGz5xkZ1zdPUM7c9GCCCQtsDrr78eETilvSVr4hXQw3q9VAWiB66jRo1yD4r1sFhVK6qAUgClv8rP6+2+++5zD931UF1VFgqbkmHcprTuSzUvZHmuTx+7sHdvu+mmm1zwkda2WVmurvPUFObooXv4wbqCllhVIdp+xIgRLtxo1qyZC3H0YN4fv0YVOKeffro2c03fTf9BvKp/FBao0lGVNXqtWbMmqCIpUqRIUCWyevVqt78faukYGsNn5cqV/xzZrGbNmsH0XXfdFYRNqoJRl2cKZ/S7SPuqquaDDz5wFZjaSVWYqoBR4KDPUEWUwint27RpU7dcgZxCKQVAulZV7Phhk4IlVRLVqVPHhT86d30nGzZsGJxTViZUHXPrrbcGYdMll1zijBWchAORrBw7eh+F1PqdoSYvVVGp8kzVRbqfqjxr06aNqXrHb5m5n+piTvdFTVVUuga56RjRTRVi4datW7egWnPbtm321FNPhVenmta9DB9X+1eqVMmFRgpVVb2kEFPLo5vus176Pul3pcIufSdkoPut6rH0mqrwwp+tSj9acgvE/q+Y5L5mrg4BBBBAAAEEEEAAAQQyIVDUG5Pnys717Kl3fw/2GjlxsU2fvdpuOKO+FxiVtv1Tirl16rItrUBEXa1d1LG2vTF6XrDt5U98a6e1rmbne6FWDa/iqcA/+dV2L1SZt3yzFS9W0GpWjKy0CU4izomEO5/QWFlffr/cFneqa9U8E7+N//kvu/WlH/1Z975q/Q5bsHKzVS1XImb4VzcqcBr6+XzvwU8BO9frqq9i6T33TNbL1m2zYt7yymUjH2jcfW4ju+aZ6cFnPj58ln09c5VX6VTbGlZPCT7Tu+22aPUWW79phx1cM2e6QAxOggkEkkBAFQnqrir8QDgJLiuhL0EPd/W6+eabXej0ySefuHdVP+mBqV/1pPfwX/kn9EVFnZyCDYUi6vqteZPGSdeVXtTlutmj6tS2LiefbO95VTZPPPFExIPtWNtnZpm6FFNTNaIqeBQGHH300a6yRF2gpRU46UH8wIEDg0qaCy64wH2/dKwff/wxCJxUXaNqKTUdV13E7a3pd4YCor/++st27PD+P0Co2ztV12i531T1paawVVU5aqqCuuWWW9y0fqgiRmGTwg51T6cwSa1r167uXVU0ChcUSKj60q/UVADTpUsXt43OQYGTKnb89uqrr1qLFi382Wx7VxeFCj/UentBY69evdy0zrd+/fpBd4JuYRw/dA9VraWmaxs2bFjwe0Ghm8b0UlO42LNnTzed2fupSh+/2kcVaLoHCpYyEsicccYZ7jP1Q5WNewucFCzqmtQeeeQRO/fcc920ulNU8K51Wq6uAv1qNbfBPz8U7KlbP3UJq++LuszTPvpupdf0/fHDJgW3CvGqVKmS3i6sSwIBAqckuIlcAgIIIIAAAggggAACOS1wzjHV7YOJS2z+0o3BRy39a4vdMmiGm9e4QMW8Lt82b90ZrI81cVXHujZyylJbvXabW62A6v2vFrmXFhT3xj3asePvYCyjNodXsscuPiTWobJlWbznM3vJRrvw0Skxz2WjF760uH5ssK6WV+E1/Ja0H74cXLeMff3DngdFcunSd6KleF3i7e+FQPO8z9EytTrVStvcxRvctLo67PrAJDd9/8VeN1GHR/6F/kHeZ9avlWK/z1/vttEPBX5+6Bcs9CaOb1rF+l3UJLzImh1Yzk5oVsXGfrssWD7l55Wml1oRL4xU80PGUiWL2NgH27hl/EAAgdgCemitB3UaR0MPTDPS9NBOlTkad0NhiLqFUzdceuhLy5xAsWLF3AN/VZlojBm5KnzSA3W99EBfD5MVMuTF8Z4UNqldG6NSIXNSeWfr7id2cIHTk08+6SpzNM5OvE3VOH6XZRrjxm96OK/lqlTSA3o9gI/VNF6Y3zTWkr5XCmb8Lvq0Tt2+qapJQY+O+cILL7jvncZrivXQX/soRNL2Cpb8e63u0PTdVcWSX/mkbStWrKi3iK7xzj//fLfM/6GA1R8zSKGHHzj568Pv6pLPb6pU8iu1VJGlpuv027PPPut+zynkVcVddjWNd+c3BXnhpjGc/PGrwsuzMh0O8tR9XziEVrWbXgq+/AozfUZW7mdWzi0r+6j7RDX974/GY/KbqrO6d+/uxuxSkKnvj4Kh6KZw1f+uy0LfOXXvuGTJkuhNg3mNGeZ/Z6pWrerCOT8EDTZiIikFYv9WTMpL5aIQQAABBBBAAAEEEEAgqwLqXu2tm5vbhSfWjnkIhSF7C5u0o44z6Lqm1qB25LgH/kHVrZwfrGjZ/BWb/VU58h7v+WzYS8AWPumde+kKz3VR+E+A4++3fuMO14Whb6IAqveZB/mrI9537Po7Yt6fedAbC0qB4N7aIq9SKla7q2tDO6XVAbFWuaDJD5u0gUK2nf8EYzF3YCECCARjNL3yyiuue6a9kTz66KNuH42zonEz1G2Vxg9R4KRltKwLaCyta71u5xQ4DR482HUnpa6ndG/0MFtdaOmlYEH2id4UHqg1qF3bWjSJ/AOCRD/3eM6vkRfm+M3vAs2fz+r7pEl7/phD+2tMGnXlppdftaPQWAFwrKaAqkSJfyuUtY0fgu3cGfmHOZdeemlwiIceesgFTk28e3fddde5f+vByn8m/G79FDipoknND7cUOC1fvtwtUyjtt/nz5/uTpt8nOrb/6tu3b7DOP16wIDShoEL/Xvym+aefftq9/M9Xd4B+1aYqB1UV44fjCqDWrVvn757ldz/gUChSvnz5iOPonPTKjhYOnBQu+l7+u38eYVt9bmbvZ3aca0aO4Qdj+m6FwzPtq8owv/khpj/vvysYDTc/RNS/g7SaAkx/vSrjCJvSkkq+5VQ4Jd895YoQQAABBBBAAAEEEMgRAYUWvU6pZ+0O3t+eGfmHzfWqndau3x7zs1Sp1KROGTuuyf6p1lf3uol7/fpmNmbGcnv24z9sxaqtESFTeIdNW3aEZ910saKRfzdXvEjkvL9D9PJiRQr5qyLe4z2fiIPFMaMu7obe3tL6v/97UEEUPpwqpPqe39gKF4p9veFtw9M1K5SwD/ocY/3e/c077qo0rVd63erFavt597JPt0Z2Xusa9tA7v9mchRuCiqZY26/esN0qlSkWaxXLEEDAE2jXrp2rjlClw5gxY4Jut2LhqOpBD2rV9CBVf2mvbrTULZGaujjSQ97wg2C3Yh/+UACW203VIPrre//lz0e/++v17q/zl6k6Q92L6SG5ukuTvR86qKpCXaSpGylVuOgBux6kh4+j4+V207g7GmeneqXU/9ub2+eWk5//q/dg22/Z9VBbgYnf/JDJn/fftc0hh6Suwt5vv4x3BazgWOes6qZPvW4B1fSQ/sMPP3QvfddefPFF0xhIagccsOcPQFasWBF0p6cu39Tmzp3rxn3StKqk/LZ161Z/0h0zmImaSO877H9u1C4Rs6rwUcWgxlJSF3R+yKGu4vTS7zKN+eMHVBE7Z3BGlWdqRYsWjbmHuqTzQ46YG0QtVDd4sZrGRfKb/k2l1fQ7INwyez/D++bk9MaNG93ho4NQLVTVp99UlRSr+d+/WOvSWha+Dwq6aPlHgMAp/9xrrhQBBBBAAAEEEEAAgWwR0Bg9z1+95y8dd+za7Y21tMlWeiGDAp5KZYu58Zw07tPeWofDKptean+t32bzvGqmbV53egq2SpcobDX3389SvPfopnGNpjx5QvTiVPMnHVHF9Mpoy8r5HFm3bIbOJaPnoHDo6csPsy3bd9milVts1cbtbpykGt44Vn6II/Nhd7Zy3urSrrgXpMm7iDcGU1pN+z5x6WHegyizP5Ztct4ajFzFSCW9QKlyueJWJWr8puhj1a9Wygb/Z89DrQ1bdtqf3n3f9E+Fl0Kpat65KzRLgGeu0afOPAIJJaC/Lte4GfqLb42r0alTpzTPLzwuxwcffBD8Jboe2PrdST3//PPWv3//NI+RkysUyPhjgeTk5yTKsTX+jl4DBgyIeUrR1Q4xN8rBhS1btrSGXrXC2KnTbMyUqfliDCdxPuSNF6Sm6h8ZxNv0v49++JPesTTGkyrk4m2qHtG/4+3bt7txkBTivv322y5Q+uKLL+yjjz4ydRenVrnynv/fpMDa/75pTBx1r6mKEj88qFu3bnBaderUCaY1Xlla4VHt2rWD7aInSpUqFb0o5ryC8auuusq9dI4a40dOCtAUQKgb0enT/x0bMuZB0lmortnUdOzsaGvWrIl5mLDFhRdeaB06dIi5nd+dYHhlZu6nv58f9qlbO1XBRVch+dtl9V1/lCAzVcFFN79aS8vT+m5E75OReY1P9d1337lNo6vRMrI/2+RdgdT/9ZZ3r4UzRwABBBBAAAEEEEAAgX0soJBD4wTF7uQt4yezf8qeoCrje+Tslrl9PiW88bDScpV5bS+My0pTGHRgVa9bHO8VT1MgeFga3SLGc1z2RSC/CGgMDQVOerCscYTSan71kLp1C3d7pLGFVGGjcTl++OGHtHbP8eV6kEzbI6CHq4nQLvWq4G65+2673asmaVy3jlXzxmhJ5qZgberPv7hL7NOnT7Zcqira9OBfTVWEjRs3jjjuhAkTXLWOxlLSdrHGvInYIYMzqtrRGEp6qZLOD6PDvyMULqnpc7VcVXmqstGYQt98841VqlTJra9Vq5Z7149wBeTXX3/tqvWClTk4oXBIFT96qXJGlUI6b1XbZDTAij49v0tBLVeYER5zSsGJf9+i9/Mrn/zfqf56BWKxWjhwGjt2rN15552Wmco1HTMj99P/bP++al7nmN3jx+l69L1V1Zm6gvQrjhSu6o8Z/OYHev58PO8KzRSk6T26Eiye47Jv4gsQOCX+PeIMEUAAAQQQQAABBBBAAAEEEEAgiQQ0ULsewqpyQZUM/sO/8CWGH5zGWq+H4AqcNHC9Hhr6fyEfPkZOTs+cOdONJZWTn5GRY+u6w13baTrWfHhZZvbROfjb6xiqQlm/fr0bj8bvMkrLs6PSJSPXu7dtunXvbu+8845N9bow6/nwI/bh47lT/ba388yO9Yu9cYwUrKlp7BwFs9nRvvrqq+AwquCLHhdIVSB+V5cKefRvOatNvwP0kF+/E/Q5qm5ZtmyZG2vJP6Zf1aT58LQqDE84YU/Ft6qYdN/13VTzx1LSdDig1nhEPXv2tLZt27rxqMqUKWMaD2rz5s2uSkrb6zu+evVqTQbHU1eeOi81BS/+mFRuwT8/FNRpHCiFQjquAhd1gTd16lQXNvnbRnv6yzPyHu6OT9VS6upS1/rrr7+6rgfTOoZ+Xypw8bv20zhb6hLxueeeC3ZRhZi6JVQ4o+u74oorbNCgQa4y6Pzzz3cB4NFHH23Vq1c3jfWmaqHoYCiz99P/8HAXiKpYVaWarktd/qn7RN1fmaopvAuPh+V3M6h1Oi//Pun3lv996datm+vqUNuoAk1jeak6S1W2+t8RNVXeZmdllbpXvPLKK92xhw4d6rp/dTP8SHoBAqekv8VcIAIIIIAAAggggAACCCCAAAIIJJqAusTTw0k9iLvjjjtSnV54DJFY45XoL/b9poeS2fmg0D9ueu96gKuwTGFL+BUOZ7R8b/Phbfxt/Xf/uNHz0fukd57ZsU4P3zXelio0/Kou3ZMuXbpY586dg4f+2fFZ2XGMxx9/3E45/XT7zXuA/uArr9qdl16SHYdNqGOs97pnU6C2wXs/8cQTLbuqm3SR/j1WuBArHFH1kEIidVGm8b6yGjgpsOzVq1e6rgodzjjjjGCbihUrBtPa3w8q/G7z/BA0PJaVfjcoxFC3fFqv0EmvcFOllAICNVVNdu3aNbzahRL+WFYKYu66666I9ZrR7zM/iEu18p8F999/f1zhuAKUq6++2gVFqtY56aST0vqoiOXdvSBWgZOawha91M477zx766233LR+F+ulMF33/YYbbrDx48e7UF/VbHpFN3Wx6QdBWbmf/vHUZZ+q1PQHBPocVcGGm8b48q/1448/dl0Thtf70/q3r5ff/G4XNdbYOeecY8OHD3ddNUZ3harrveaaa/zdsuVd3we/qYtKjTdIyx8CBE754z5zlQgggAACCCCAAAIIIIAAAgggkEACenircVb00FSVCdHN7xpLy2ONV6JKAjU9+N7XYZP7YO9Hq1at/Mmke1eQMHr0aHddevcrPvRgXiGTXqqESMRW03tw3f+xx+xKr5LldS9YaN+iubVo0iQRTzXL59TPG7dJgZruR/gBe5YP+M+OCg1UkaPWpk2bf5amflPI9dprrwXfkdRbxF5SpEiRYIUqi9JrCggUAoTHCdK/dT/s0r7+dzDchZ6Wq2Iq3OSk7vRk9f7777vgKbx+wYIFwWyhQoWC6VgTaf2+8f+NxNpHXYAq3NF4SPG2W2+91Zk8/fTTwXXIRN3eKXgMV4f6n6X71bdvX9dFor9M3RbefPPNLlSK9TtWIYyCksGDB9vLL78c8/ew9vMDp6zcT/9cZKrPeeCBB2KOHxYeZyktf/9Y/nt0WPrII4+4rlmfeOKJwE3btm/f3jS2V/h/c/xj7O09+jPC25/uhd5+sHnKKaeEVzGd5AIFvLJrb5hYGgIIIIAAAggggAACCCCAAAIIIIBATgioWskfg2nYsGHWsmVL9zF6YK0xYvymh3f663q/qdsnPQjWcv3Vu7pZUtMD1SOPPNJNa5shQ4a4aX7EJ6BuuRQuqdJD035ThZUfMvlVBv66RH7XQ3I9ZNc4Th94XeuleN+jZGi3P/OMvTduvAubVLERq3u3vHKd6kJPXaYp6Pr7779NgVS5cuXcNe0t+InnGtUlmz5XTYGJKqdUORhvU/duK1euNP3O0/lrrCYFZiVKlIj30Kn21yNtBT76HL/rOP1e1O/Hi7yxzBTeRDd5a5/SpUsHQd6aNWvctatqUf5pBTrqyk7d1anLQV2XPjN62+y4n7JbvHixqRtDnY/8ypcvH30pcc3r3ut61P1h9DXEdeConfU90+/PvPxvNOqSmM2AABVOGUBiEwQQQAABBBBAAAEEEEAAAQQQQCC7BfQX4OHAKfr4F198sQsM9DBa465cf/31boyX++67L9hUY4vQsi6gqgyFTHqpqslvDRs2DLqwUtik7q7yWrvssstcgKkKOo119Owtt+S1S0h1vskUNuni9LBfY0Lt66aQya/Myc7PVpCj175oCjIyayfvcHeDOk8FfBlpCs38rgvT2j477qf+sEDVrznZslLNlJXzyYnvWFbOg332rQCB07715tMQQAABBBBAAAEEEEAAAQQQQAABJ6C/XPfH1YhFonGeVL2kbvc0row/toy/bfPmzYNQxF/G+94FVEEwduzY4KUKBzU9UD755JPdS11wJUNTF2rr1693408prOl37bV59rKSLWzKszeCE0cAAQTSESBwSgeHVQgggAACCCCAAAIIIIAAAggggEC8Aul1VaUKJXULFqsVL17cNEC8KprUFZ/f1MWexkLp3bt3tnSD5R832d/Hjx/vQiYFd+ExUZo1a+aCO40zoi6mkq0pdFKwqW7oGtSuYxd37pTnLpGwKc/dMk4YAQTyqQBjOOXTG89lI4AAAggggAACCCCAAAIIIIBA3hHQ+C4ae0TdSFWtWtW9552zz90zfffdd03dyk2cODE4EY2p1bp1a1MlU6tWrYLlyTqhKieFThqbSlVOXdq1zTOX6odN6qpN42tVr149z5w7J7pvBdq1a2fLly+37t2722233bZvP5xPQwABJ0DgxBcBAQQQQAABBBBAAAEEEEAAAQQQQCApBbp162aTJ09219ayZUs75phj3Ktp06ZJeb3pXdSiRYtcJdeGDRvyTOgUDptUCdi4ceP0LpF1CCCAAAK5LEDglMs3gI9HAAEEEEAAAQQQQAABBBBAAAEEEMgZgREjRpiCljPOOMPq1KmTMx+Sh446c+ZMV+mk0On1vvdZiyZNEvLs12/aZLc/+6x9PmWqO79PP/2UsCkh7xQnhQACCEQKEDhFejCHAAIIIIAAAggggAACuSSwe7fZ93PX2pe//GXL12yzv9Zts3aH7m8XHlczl84o737shJmr7JXP51nZUoWtUtnidkSdMta2SSUrXrRg3r0ozhwBBBBAIFsEVPGlyq8Ur4u61+/tY41q186W42bXQRQ2XXRPH/tt3jx3yP79+1vXrl2z6/AcBwEEEEAgBwUInHIQl0MjgAACCCCAAAIIIIBAxgQ+/napPf7O77Z5686IHdo3q2IPXpiYf30dcaIJNjP2xxV2xys/pTqrLsfVsBtOPdCKFiZ4SoXDAgQQQCAfCajyq3fv3pZSqpS9ft+9CRM6ETbloy8hl4oAAkkpwH9lJOVt5aIQQAABBBBAAAEEEMgbAjv/3m3XvviD3T9kZqqwSVdQtULxvHEhGTjLlRu2Weve44LX0AkLM7BX1jY5oHyJmDu+9+VC63Tv17Z0zdaY61mIAAJ7F/j999/3vhFbIJDgAqoYuueee2z9xo3Wvc+99us/1US5edrRYdP1119PZVNu3hA+GwEEEMiCAIFTFtDYBQEEEEAAAQQQQAABBLJH4IaXZ9g0r/u36Faraik7o01163RklehVNur7ZXbJ098FrzuH/JJqG3/Bw+/NCrb7n1dFlZvt77/Nduz8O3ht3rYrx06ndqX97OKT69jB9cpakahqpvUbd1j3x6eaAjAaAghkTuCUU06xDh062MiRIzO3I1sjkIACl112mZ199tkudFIXdrkZOkWHTTqvG264IQHVOCUEEEAAgfQECqe3knUIIIAAAggggAACCCCAQE4JfPHTCpv6S2TY1Prw/e3hiw6xIoUKpPmx8//abDP/XBusn/mn2UVta1rD6qWDZf7E9Dlrbf6SjW728Lpl/MVJ/16iaCG7umNds457LvWdSYvtsWG/Bdet0OmJD+fQXWEgwgQC6Qt8/PHHrhpk1apVVrhwYevUqVP6O7AWgTwi8Pjjj1tKSoq98sorbtykN/ret8+714sVNum8aAgggAACeU+ACqe8d884YwQQQAABBBBAAAEEkkJg4EgvKQq104+tbo9ffGi6YVNo84jJ18cviJhnJlLg7FbVrN9lh0Qs/PzbZVQ5RYgwg0CkwPTp013IdPjhh9s111xjCpvUunXrFrkhcwjkcYE+ffpY//79bcOmTS502teVTtc8+qj99k+XfqpsImzK418oTh8BBPK1AIFTvr79XDwCCCCAAAIIIIAAArkjMG3OGlu4bFPw4c0albc7zmoQzGd2Yvz05ZaTXdRl9nwScfvjD6lkN3drGHFqL42ZFzHPDAIImH377bd2+eWX25lnnmmvvfaabfTGuFErUKCAVa5c2R566CGYEEg6AY3plBuh0+3PPGNTf97TNa7GbCJsSrqvFheEAAL5TIDAKZ/dcC4XAQQQQAABBBBAAIFEEHh25B8Rp3F5hzoR85md2fX3bnt/ypLM7pbvtj+9+QERYzp99PVi27g158aSynfAXHCeFli8eLH169fPzjrrLBszZoxVq1bNDjroINuxY4ftt99+tnv3brv66qvz9DVy8gikJ6DQ6cUXX1S66iqd3hs3Pr3N416nsMn/DIVd0WM2zZ49O+7P4AAIIIAAAvtWgDGc9q03n4YAAggggAACCCCAQL4XUCXSr3PXBQ6Vyhe3I+qWDeazOjF03Hy7oE2NrO5u67fstJkL19sv3mv+is1Wc/8S1rh6ijWuUdrKliyaoePu2LXbflu03mbMW2e/e2NHVS5bzE49qqrVrLhfhvYPb7TTC9HmeMf4dfEG+817qTU4oLQ1rFbKG68qxQqmPcxV+DAR0xob6/TW1eyd8QvdcgV1X/6ywjo1rRqxHTMI5CeBiRMn2kcffeRem7wuxZo0aWLdu3e3kSNH2ldffWUVKlSwtWvX2gEHHGBdunTJTzRcaz4U6Nixo9UYMcK6eeGTAiG1Lu3auvfs/BEdNinsCjd1YdmzZ0/r0aOHHXbYYVa/fv3waqYRQAABBBJUgMApQW8Mp4UAAggggAACCCCAQLIKLF61JeLSzmtXM2I+MzPlvUBn3frtpuBk5Zpt9sPctXZ4ncyHV299vciefGdWmh999ekH2sXtaqW5XisWeNd1xVPf2lrvfMLt9dHzrFql/ezJKw8PL053etbijXbdC9+nOpa/U40qJe2/VxxmNSuU8Bdl+P2itjWDwEk7LYq6Hxk+EBsikMcFPvnkExs2bJiNHz/eXUmLFi2sV69eduyxx9q5555rkyZNcmFTmzZt7P333zeNLVOmTJk8ftWcPgJ7F2jcuLEN80Knc3IodPLDppRSpdzn6POim7qwLFSokPXu3dvq1atnz3jhV6ztovdjHgEEEEAgdwXoUi93/fl0BBBAAAEEEEAAAQTyncDiNVsjrrlhtdIR85mZKVq4oHVs8W91zuvjF2Rmd7ftDa/MSDds0kbPfTjHrnrue69LrdiH/2n+Ojv3wUlpBkSLvYqptyfsqSqKfYR/l6prwO6PTUnzWNpS41/p8xSwZbZVKVvcCoXKoxavirwfmT0e2yOQ1wTeeecdO+ecc1z3eAqbDjnkEBswYIANHz7chU2XXHKJC5sULj388MM2ZcoUFzR169Ytr10q54tAlgUU7owaPdoaNWzoKp38aqcsH/CfHf2wqXQ6YZM2LV++vA0ePNhVFv7xxx921VVX2YwZM+L9ePZHAAEEEMhhAQKnHAbm8AgggAACCCCAAAIIIBApEF3hVKVc8cgNMjl34XH/Vkh9M+MvW7d5R4aP8MVPK2zijysjti9erJAdVDPF9B5u389abZ9MXxpeFEz3GzHLVVn5C4p4QVjzJhWsfbMqVtXrmk/tg68W+avTfF+7abs9Nuy3iPU6j8Zel4ON6pSJGH9JVV33Dp0ZsW1GZ0qXKhJsunhlZMVZsIIJBJJMYOjQoXbqqafaTTfd5EKkunXrujGbPv74YzvttNPc1arC6YsvvrCSJUu6EErjOi1ZssQFVNWrV08yES4HgfQF9J0f7lU6NWrUyI21FG/o5IdNCrEUZu2tYqlKlSo2btw4d5Lz5893odN3332X/kmzFgEEEEAgVwXoUi9X+flwBBBAAAEEEEAAAQTyn8Di1ZEBx/7/z96ZgEVVvX/8dUcERAFFFEXcNfcFtdzX1EwtzSxNy7IyS7NFSzNtMXMttZ9lmam5b/kvl8olzX3fd8UFQRFlEdzQ/uc9eC73DjMwwAzMDN/3eYZ777nnnuVzZwY43/u+r1eBTEEoJ8LLlQnwoAsi3xHbkm1h1L91kNxP7Qd7K01cfspQpUPjAPqkexXOly7tq+UnaYVOKJqy4jS1r+1v8BDifE1nLyflWOKLvISYM/e9BsSeRMqW7wijcQuNQpI6p99OXX3OIFyx99aI7pWJPbnYOP/VR/OO0PbDSSJZeORtWrs/Qo5J305a+35ibCr0X4TJ/UjrWpwHAWcjwEITvw4fPqwNnb0lBgwYIL0oVOGwYcNkHqf8+fNLsalZs2Y0YcIE4mN4NylK2OY0Al5eXtL7b/To0cTegfwLcuzAgenGoIlNQrxib0Ju1xpzc3MjFptq1aolxV/+7LJHYsOGDa25HHVAAARAAASymAA8nLIYOLoDARAAARAAARAAARAAgZxO4IouZxB7AuXL80jdyQSYPi2TvZwWWRlW71BotMz7pLr19y1Io3oki01cPqxbJSlmqTqxt+7T7jM31aHcLhb5n/Q26oVqBrGJz3VrWFJ6POnrmdtfs/2KVswi2pjnq2piE59wF95OX79Undzdkp8d/PfYDe0aa3f8vPNrVWPirPcI0y7CDgg4AYGVK1dSly5daPjw4ZrY1KZNG1q2bJks45Bdyj7//HNasGCBzBnDi9mtWrWiP/74gw4dOiTFpgoVKqiq2IJAjiPA4tDEiROpbdu2tHzDRvpyzhyrGcTGx1PvUaOkhxR7SqVHbNJ3cuDAAWKvxGvXrslwmFu2bNGfxj4IgAAIgICDEIDg5CA3AsMAARAAARAAARAAARAAgZxCgEPB2draCa8jFq/YWBTacSptEeZ8ZIJhGC+2LGM4Vge9dWIWl50X+Zj0dkkXko6FoMcr++hPa/tdQgK0fXM7kbF3Dd5Nb3YINldNClBtG/hr5y6azEM7kcpO3tzJ/wo+tMP9SKVrnAIBuxM4ffo0vfTSS/TOO+/Q/v37ZX9du3alX3/9lX788UeqV6+eYQyTJ0+mmTNnyjIWm9q3by/3V6xYIbfPPPOMoT4OQCCnEmDRiUWjX35bRdP/7//SxHA8NJR6fzKKdh05Sp6enhkWm1RHHF6vTp06dOPGDRleT4XbU+exBQEQAAEQyH4CyY/FZf9YMAIQAAEQAAEQAAEQAAEQAIEcQCDAJymnEU/1fuJDKbLkyZ05Lyf2kuokwuGp8HdzNlyghhWTvRfMYTUVaqoFepqrRo8FGsP+XLpuFJyu6kLSBZf00MLxmTYW6ONuWmQ4Nh3PJeEJ9ttu8zmjzoQlhQ/kBsJNxmNo1MLB1ei72pnCXsneTlohdkDAiQmcO3eONm3aRNWrV5ceTg0aNKAaNWqYnRGLTVOmTJHnvv32W+rYsaPcj4mJob/++os4rF7t2rXNXotCEMhpBFR4vR49etC3s3+hsMjr9OXL/cxiWL5xE335888UJzycbCE2qU5YCH7jjTdo9erVUnRikZg9r2AgAAIgAAKOQQCCk2PcB4wCBEAABEAABEAABEAABHIMgYCiyYITTzoq7h4VK5y5PE7czovNS2uC094TN+h6XLKowudN7bLOM4nPFfM2P4ZiulxMXO+SiUdRnPCoUlbU07J44y1yO6VmF03GM03ki7LGbt95YE01Q53I6DvacfEiybmmtELsgIATE2jXrh1t3ryZypQx77WopqYXmyZNmkRPP/20OkVz586V+x9++KFWhh0QAAGRp/BRTicWnZaJsJM79u2jr0ROpwZVKks8YZGRNGzaNOnVxAVKbKpatarN8P3vf/+jL774gn744QcpPrHo1KFDB5u1j4ZAAARAAAQyTiA5jkLG28CVIAACIAACIAACIAACIAACIGA1gYAiRmEn/Gay+GF1I2YqlhJCVqWgwtqZhSa5lbQTj3bc8ucxFN1PNB/q7+59o6Djls94naGRTBx4uGWsXRVKMD1d60WyEiYCYHraQV0QcFQC6RGbvv76azINmzdr1ixq0qQJVatWzVGniHGBQLYRUKITexaFhYdT7xEjqF6fl6jl62/IF4fQY6tSuTKtXbuWbCk2qUl//PHH9OWXX1JiYqIUnTjnGgwEQAAEQCD7CcDDKfvvAUYAAiAAAiAAAiAAAiAAAjmKQCmT0HIXRUi4mjqhKDMwercIpBE/x8gmlv1zmfxS8d4p7Wf0tIoQwlcJM/Wv6cLPccOlixlD43kKz6Xo2HuyzxvCWyujVt7fw3Bp7UpFqW55b0OZuQPvQpa9qszVj7udKEMZqnMlfeHhpFhgmzMI6D2beMH6ueeeM0x8/vz5FBUVRW3atDGU4wAEQCCZAItOnPtMfZ44dB6/lLEYxTmfuJ697IUXXqDg4GDq2bMnvfnmmzJHGz639qKNdkEABEDAOgIQnKzjhFogAAIgAAIgAAIgAAIgAAI2IlDCxMNpyb9h9FS9EjZpvWX1YuRWIA/dufuAEu4k0oXw5FxHph2U9jUKR5uPXafawSkFnn+ORRouDfQ1ClXFhYeQEpzOidxKD4WjlLmUVPcePDS0Y3oQ6Gccj7vweHq1TVnTapk+XrYjzNBGQBHjfAwncQACLkZALY7ztMaMGUO8YG1qCxYsoHz58lGrVq1MT+EYBEDAhMCQIUOIw1jyZ2v79u1UqlQpeuWVV6h79+4mNe1z2KhRI+lF1b59e+rfvz+NGzdOClD26Q2tggAIgAAIpEUAIfXSIoTzIAACIAACIAACIAACIAACNiXAHjnFiiZ71ZwMjaGLUbdt0kceofR0a1LKqrYqlvQ01Fu+5TLFC6FKb7fvPaCFGy7pi6hqSePT2kHFk4UiFrk2Hr5mqK8ODpyLVrtmt3nF2P11YtbWg5G0eNtls3UzU7hg40XD5Y0rFzUc4wAEXJWAXmwaOXIkvfTSSymmumzZMjp06BC1bt1aLpynqIACEACBFAQ4ZB57Ox05ckSKP1klNqmBVKlShTZu3CgPOe/aNJFDCgYCIAACIJA9BCA4ZQ939AoCIAACIAACIAACIAACOZrAgA7BhvnP22QUQQwn03nQq2mgVVcECY+iujqxhb2ieo7bQccuxVKicFM6KbyVXpiwS3pKqQarlC1MFUsaQ9/1blZanZbbkbOP0I5TN7Qy9njadCSSvlp4QiuztDOyZxXDqYmLT9LbPx6kwxdi6P4D0dAj4zZZpDtyMVYVWbXlcSlvLL6gcQ1f8vdOFv+sagSVQMAJCfz88880ZcoUOfKPPvpIekKYm8aSJUtkMbybzNFBGQg4LgEOrbd161Y5wPHjx9Po0aMdd7AYGQiAAAi4MAGE1HPhm4upgQAIgAAIgAAIgAAIgICjEniyjj9NXnGabsXfl0P8TXgXNaxYhDgkXmbNz6sA1RRtHTx1M82m3u9akXqO3aHVu3bjDvWbuFs7Nt358JlKpkVUIcCDON/S/pNJItMDoQa9891+ypc3N3F+pxiR34nL2PsqLatXvgi1qudP6/dEaFV3HrlO/GLjNtnuJyaF5/MolI/Wf9FUlqX144rIUTVyzhFDtTfblzMc4wAEXJHAihUr6NNPP5VTe//992nAgAFmp7l27VoZEqx48eLSw8lsJRSCAAg4LAEO57d7926qX78+zZo1S+Zi+/bbbx12vBgYCIAACLgiAXg4ueJdxZxAAARAAARAAARAAARAwMEJsPjycjtjfqLhPx2mlbuu2GTkfVqUsaqdssUL0fBeVawSg97tXomqlDKG4VOdfCI8k3xNclOxKHQj+q4Um7je4zX8rOpnRPfK1KFRgGrasOU2ldjEJ1iwY2+stOxsRDw9/9UOir2VJPBx/aoiXxWLZTAQcGUCGzZsoMGDB8spvvvuu/TWW29ZnO7ixYvluV69elGRIkUs1sMJEAABxyVQrFgxOnjwoBzgb7/9Rvx5hoEACIAACGQdAQhOWccaPYEACIAACIAACIAACIAACOgIdG9ckop6F9CVEI2df5xembqX/rfuHO05c5PuPfLkMVTSHRTIl0d3lLz7eGUfYu8fvRXIZ/7fny4NAujXYQ2pnAUxqYwQZeZ9EELPPW45N1RAETdaNrwxNa1VLIWo5O6Wl1rUKU6f9apGhdzTDjLhXiAPjXquCs19P4Q4hJ/yatLPRb9/I+6e/lDu/yc0qNNXbtH8LZfo3Z8PUe+vdxKHDNTb0C4V9IfYBwGXI7Bv3z7q16+fnNegQYPonXfesTjH0NBQWr9+PbF3ExaoLWLCCRBwCgLe3t50/PhxOVYOs9eiRQunGDcGCQIgAAKuQCDXf8JcYSKYAwiAAAiAAAiAAAiAAAiAgPMRiIy9K/Im7dRC65nO4NVO5ah/6yDTYrsds7PQhcgEuhp9h4qJ0HxBwgPKikh4KcbD+ZVuiLkVF/mRSggxSlm4CGvH3l0eQoQqmD8P5Uo7yp68NO52Ip27Gk/xdxLlMYtSJX0Kkq9nAbNtnHvk0aT6Nd1OeK0WNanqY1qMYxBwGQJnz56lli1byvm88cYbNGzYsFTnNnv2bBo1ahQNGTJE84hK9QKcBAEQcHgCiYmJVK5cUujYQoUK0ZEjRyh3bvMPnzj8ZDBAEAABEHASAhCcnORGYZggAAIgAAIgAAIgAAIg4KoEYhLu05jFx+nfA5EppthReEF90qNyinIUpE5g24koGjLjQIpK/r4F6au+1S2GBkxxAQpAwAkJREVFUZ06deTIX331VRoxYkSas3jppZekR8SmTZvI3d09zfqoAAIg4DwEKlWqRHfu3JED3r59OwUEmA9b6zwzwkhBAARAwHEJpB3PwXHHjpGBAAiAAAiAAAiAAAiAAAi4AIHC7vloYt8adDLsFv22+wptPXKdokTuI85VFB2fMlycC0zZ7lO4cSuJG3tTeXrkoxoiX1PH+iWoSRWfFCH/7D4YdAACWUjgwYMHmtjE4fSsEZtu375NkZGR9Pzzz0NsysJ7ha5AIKsInDx5kmrWrEnR0dHUqFEjWr58OdWtWzerukc/IAACIJCjCMDDKUfdbkwWBEAABEAABEAABEAABEAgpxDg4OnWhuzLKUwwT9cnUKZMGTnJPn360Geffeb6E8YMQQAErCbQoEEDunr1qqw/ffp06tSpk9XXoiIIgAAIgIB1BBC41DpOqAUCIAACIAACIAACIAACIAACTkUAYpNT3S4M1gYElNjEnkoQm2wAFE2AgIsR2LVrF6nviYEDB9LMmTNdbIaYDgiAAAhkPwF4OGX/PcAIQAAEQAAEQAAEQAAEQAAEQAAEQAAEMkFALSL36NGDxo8fn4mWcCkIgICrE2jbti1xmD221157jT7++GNXnzLmBwIgAAJZRgCCU5ahRkcgAAIgAAIgAAIgAAIgAAIgAAIgAAK2JqDEpq5du9KUKVNs3TzaAwEQcEECnTt3poMHD8qZ4bvDBW8wpgQCIJBtBCA4ZRt6dAwCIAACIAACIAACIAACIAACIAACIJAZAkpseuqpp2jatGmZaQrXggAI5DAC7BG5c+dOOesmTZrQvHnzchgBTBcEQAAEbE8AOZxszxQtggAIgAAIgAAIgAAIgAAIgAAIgAAI2JmAEpuefPJJiE12Zo3mQcAVCSxevJiaNm0qp7ZlyxZq164dRUVFueJUMScQAAEQyDICEJyyDDU6AgEQAAEQAAEQAAEQAAEQAAEQAAEQsAUBJTa1adMGYpMtgKINEMihBObOnUuc04ntxIkTxN8pR48ezaE0MG0QAAEQyDwBCE6ZZ4gWQAAEQAAEQAAEQAAEQAAEQAAEQAAEsoiAEptatGghxaa8efNmUc/oBgRAwBUJzJw5kzinExt7OHXo0IE2bNjgilPFnEAABEDA7gQgONkdMToAARAAARAAARAAARAAARAAARAAARCwBQElNnG+lenTp5Obm5stmkUbIAACOZzA1KlTiXM6KevXrx8tWLBAHWILAiAAAiBgJYE8nwqzsi6qgQAIgAAIgAAIgAAIgAAIgAAIgAAIgEC2EFBiU6NGjei7774jLy+vbBkHOgUBEHBNAhxa78aNG3Tw4EE5wb///pty5cpFDRs2dM0JY1YgAAIgYAcCuf4TZod20SQIgAAIgAAIgAAIgAAIgAAIgAAIgAAI2ISAEpvq169P33//Pfn4+NikXTQCAiAAAqYEPv/8c+Iwe8qef/55Gjt2rBSfVBm2IAACIAAC5gkgpJ55LigFARAAARAAARAAARAAARAAARAAARBwAAJKbKpVq5bM2QSxyQFuCoYAAi5MYMSIETRo0CBthhxa7+WXX6bw8HCtLK2dP/74g9588820quE8CIAACLgcAQhOLndLMSEQAAEQAAEQAAEQAAEQAAEQAAEQcA0CSmyqXr26DKPn7+/vGhPDLEAABByawHvvvUcffvihNsYNGzbQK6+8QgcOHNDKUtvheiw6TZs2LbVqOAcCIAACLkcAIfVc7pZiQiAAAiAAAiAAAiAAAiAAAiAAAiDg/ASU2FSlShWaMWMGBQUFOf+kMAMQAAGnIjBnzhwaOXKkNmb2sOTweu3atdPKLO2o77DFixdTSEiIpWooBwEQAAGXIgAPJ5e6nZgMCIAACIAACIAACIAACIAACIAACDg/AbVQW6FCBekhALHJ+e8pZgACzkigT58+9M0332hDj4qKotdee43mzp2rlVnaGTx4sDw1dOhQio6OtlQN5SAAAiDgUgTg4eRStxOTAQEQAAEQAAEQAAEQAAEQAAEQAAHnJqDEprJly0rPpsqVKzv3hDB6EAABpyewfv16mcdJP5G33nqL3n//fX2RYZ/FqTp16siyHj160Pjx4w3ncQACIAACrkggz6fCXHFimBMIgAAIgAAIgAAIgAAIgAAIgAAIgIBzEVBiU2BgoMzZVLVqVeeaAEYLAiDgkgSCg4OpcePGtGTJEm1+u3btorCwMGrZsiXlzp0yiJS7uzvdu3ePdu/eTUePHiUPDw+qW7eudj12QAAEQMAVCcDDyRXvKuYEAiAAAiAAAiAAAiAAAiAAAiAAAk5GQIlNJUqUkJ5NtWrVcrIZYLggAAKuTuD48ePUvn17wzSbNm1KEydOpGLFihnK+eD06dPUunVrrXzFihWa15NWiB0QAAEQcCECKeV3F5ocpgICIAACIAACIAACIAACIAACIAACIOD4BNh7gM3X11fmbILY5Pj3DCMEgZxIoEqVKvTvv/9qU58zZw5t3ryZXnjhBTp58qRWrnY4D13v3r3VIc2cOVPbxw4IgAAIuCIBCE6ueFcxJxAAARAAARAAARAAARAAARAAARBwEgKVKlWiBw8eUJEiRWj69OlUr149Jxk5hgkCIJATCXDIz4MHD8qp9+nThzZu3EinTp2i7t270/bt21Mg6devH3l5ecny1atX06pVq1LUQQEIgAAIuAoBCE6ucicxDxAAARAAARAAARAAARAAARAAARBIg8Dly5fpvffeo+eee46mTJlCsbGxaVxh39OPPfYY3blzR+Y2mTZtGjVs2NC+HaJ1EAABELABAW9vbzp79izlzZuXWrRoQfv27aOYmBjq2bMnrVmzxtBDuXLliEUnZT/++CMlJiaqQ2xBAARAwKUIQHByqduJyYAACIAACIAACIAACIAACIAACICAeQLr1q2jJ598Uia937FjB02ePJnat21Lh7dtNX+BnUvr1KlDcXFxVLBgQenZ9MQTT9i5RzQPAiAAArYjwGITi04sPvH32cqVK2Xjr7/+Ov3666+GjlhwCgoKkmXsHcWiEwwEQAAEXJEABCdXvKuYEwiAAAiAAAiAAAiAAAiAAAiAAAjoCCxZsoRee+016dHk6eFBXVs0ly9+Ir/T871o4qejdLXtvxsSEkJRUVHSO4A9m5o3b27/TtEDCIAACNiBAAtIHGavS5cu0nOUu/joo49o6tSpWm8cMlTv5cS5nC5evKidxw4IgAAIuAqBXP8Jc5XJYB4gAAIgAAIgAAIgAAIgAAIgAAIgAAJGAhxCjwUnttaNG9PY1weQV6FC8vh4aCi9+dU4uhIZSc8I76dJM2bIcnv+YE+mS5cuUa5cuWiG6K99+/b27A5tgwAIgECWEODvsuPHj9OQIUOkByl3yt5Ow4cP1/rv2rWrDL/HBZz/6bPPPtPOYQcEQAAEXIEABCdXuIuYAwiAAAiAAAiAAAiAAAiAAAiAAAiYIaAXm956vicNevbZFLVi4+PpxU9G0UkhPjUUYaFm/vKLluA+ReVMFnCuk3PnzslWpk+fTp06dcpki7gcBEAABLKGQJkyZcjHx0eGJm0rwpHWrVtX5p/T996jRw/auXMnHT16lB5//HGKjo42CEurVq2iQYMGyUs4JN/atWupQoUK+iawDwIgAAJOTSDPp8KcegYYPAiAAAiAAAiAAAiAAAiAAAiAAAiAQAoCerFp7FtvUd+OHVLU4YIC+fNTxycep837D9BB8XT+pg0bqPPTT1OBAgXM1s9oYbt27ej06dPy8m+++YY6d+6c0aZwHQiAAAhkCwEWzLds2UIrVqyg7777jvbs2SM9Nu/evStzNHXv3p0OHDhAH3zwAf3www9SeNogvlM5fB57QFWqVEmWcTsPHz4kd3d3atKkSbbMBZ2CAAiAgD0IwMPJHlTRJgiAAAiAAAiAAAiAAAiAAAiAAAhkIwElNnmIxcx5n42hKo+S1ac2JIOnU4MGtOhRGL7UrrH2HHsyHT58WFafOHEiPWvG08ratlAPBEAABLKLQLzwCGWx6Y8//qBt27YZhlG1alUpKrGwNGXKFFq9erUMr7dr1y7aunUrsejOIhTv9+rVS17r5+dHa9asId7CQAAEQMAVCMDDyRXuIuYAAiAAAiAAAiAAAiAAAiAAAiAAAo8IKLEpQCxg/vTJSKvEJr5UeTqdCwujLbt2y1wkzZo1y7SnE+csOXjwoBzduHHjiENOwUAABEDAGQnkFx6hNWrUkKJ506ZNZfjRa9euUWxsLEWKXHjbt2+nuXPnSm+nokWL0vLlyyk4OJhq164tRSr2iBo8eDBFRETQkSNHKCEhQYbpq1evnjPiwJhBAARAIAUBeDilQIICEAABEAABEAABEAABEAABEAABEHBOAkpsqiQ8muaNGU1ehQplaCLDpk2jFRs3ET+xv2jRogzndHruuedox44dcgyff/459e7dO0PjwUUgAAIg4KgEbt++Lb2U2KPpr7/+MgyTQ+axqMR5mjiHHXs48T7nsOvSpYs8V7FiRXk953SCgQAIgICzE4Dg5Ox3EOMHARAAARAAARAAARAAARCwC4HYhPu0ev9Vunz9NsUmJFLc7fsUJ8pK+bpTsSIFqYJ/QSrsnp/8i7hRad+CdhkDGgWB9BCwldik+uw89D06GRqaYdGpZ8+e8ml/bm/06NHUt29f1TS2IAACIOCSBI4dOyZD6XHIPc7TpDcPDw964YUX6Pvvv5eeo/369aMZM2bIKt9++y09LXLnwUAABEDA2QlAcHL2O4jxgwAIgAAIgICdCVyPu0tdRifHJ3/z6fLUq0mgnXtF8yAAAiCQPQTuJz6UItP6g9do55HrVg/CyyMfVSrtRRVKelG5AE+qUspLeJbkJz/3XFa3gYogkBkCSmxKT86mtPoLE+GhOr87lG6Jp/PT6+mkF5tGjBhBr776alrd4TwIgAAIuAyBBw8eaF5P7Pn033//ybnlypWLWrdurXlClShRgsLDw6l79+40YcIEl5k/JgICIJBzCUBwyrn3HjMHARCwIQH+2/FQaDRVEAtM7gXy2LBlNOWIBB6K+/3ngQg6fCGWTlyKo3NhtyjhTiJ5e+Wn8iU9qHKgF9UvX4QaVizqiMNP95iuxdylp0b9q133aqdy1L91kHaMHRAAARBwBQLhN+/Qzxsu0OZDkXRTfO9ZsscqlyBPISTp7frNBAq/Gku34pOvy507FxXz86TyQnh6oqInVRdiVPkSHvrLsA8CNiNgD7FJDe648HB6ceQn6RKd9GH0hg8fTq+//rpqDlsQAAEQyHEEzpw5I72e5s2bR1evXpXzLyTCncbHx2ssWHhS4Ue1QuyAAAiAgBMSgODkhDcNQwYBEHAsAuevxlP/b/eKRab7lEcsLn3QszJ1aRDgWIPEaGxGICL6Dr39w0G6cOVWmm1WLONFU1+rSd4mC5NpXuhgFSA4OdgNwXBAAARsTuCPveH0/epzdDXqDgULgSjhbiJFRCYY+ikZUJga1ypN5UtbfpjgRvRtunwtlq5cixOvWLoqtnor7JmPapTzpgl9a+iLsQ8CmSKgxCZuZOxbb1G3Fs0z1Z65i5eLXE7DRU4nNvZ0WrNmjblqsmzYsGG0YMECuc9jGzRokMW6OAECIAACOY3AqFGjaPbs2dq02eNJeT/xd2fjxo21c9gBARAAAWckAMHJGe8axgwCdiLw6+ZL9PeBaxZb9yiYh8oWL0RBxQpRs8d8ycfD+HSvxQttcCLh7gOKF4s/bHnz5KIiDrSA/8mCY7RuZ7g2Sw6p8+dnTUn83QhzMQLrDlyl0XOO0gN2cbLSyoinI1VJUgAAQABJREFU2Rd/GGJlbcesBsHJMe8LRgUCIJB5Ajfj79F0ITT939YwKurtRm0aBlFwUHHafzyctu67QHEipKi7yNFUq2oANatXJt0dXouKp6Nnr9GJs5EUHXNbu37qwDrUoEIR7Rg7IJBRAlkhNqmx6UWn7s88QxMmTVKntO327duJQ+lVrFiROnbsSIMHD9bOYQcEQAAEQCCJAIfYe/fdd+n27dtUvnx5Yg8oNng5JfHBTxAAAecmkNe5h4/RgwAI2JLAictxdOxcdKpN7joaJc9PEJ48fZ8sS/1aBlE+IQDZ214WHkTnw5KeEg70L0RLhzW0d5dWt38tOjl8Dl8UL5KKPxAx9vJCcbKaoTNUvHzjNn0y+4hhqOzR1q5hCRkmiYXYE+I9ul6ItkfOJn+OHq/mY7gGByAAAiAAAo5BYP2ha/SdEJsuR8RT9cr+1LJhMJ04f53+t3AXRQtPJRaaGtUtQ/WE2OSRwQddivkUomI+ZalFg7I0Z9UBCrsSIyc/aPo+6tGyNA3tXMExYGAUTkkgK8UmBqQ8p9jTacmyZfTw4UOaNGWKgV2jRo2kyNSpUyeqUAHvbwMcHIAACIDAIwIdOnQgT09PGjp0qBSbunbtKkPuxcQk/Z0AUCAAAiDgzAQgODnz3cPYQSAbCbCHx09/nKPzEQk0tnc1u4/kzr0k7ya7d5SBDvq0KE37T97QruzYOIDyCiEC5loEvl5+yjAh3yIF6H9v1aXSPgW18jrB3tSrSSB9t/Yc/bL2PL3Qpgy93bG8dh47IAACIAACjkFgu/i9PfKXI+RTtBANf70Z7T8RQfN/P0SR129R/vx5qEHt0lRfCE1engVsNuA+nWvRnqNXaNu+iyJnw11avOEinRY5AN99ugJVDEBuJ5uBziENZbXYpLDqRadlK1YQ/8U70UR0GjJkiKqOLQiAAAiAgAUCTZo0oe+//16KTtu2baNTp4z/b1q4DMUgAAIg4PAEIDg5/C3CAEEgewi4FchDnRol5yG6/+A/ihDJtI+ej5G5itSoNuyNoG31/alx5ZzrxcFzX/hRI1q3P4JqlClMjSrlXBbqfeFq2+PC+2/nkevatDwK5aNlwxuTW/7cWpl+5832wdS2ZnGRHL6Qvph2nLoh84IYCsVB88eKEWuUHDpyzb4IOiOetr+X+JDKCW++kApF5db0GuFER7M2hMq8YexpxS/PgnmlAFa1dOF0ex7yZ/zE5Vg6GBpDp0R+quLeBeip+iWotK+7addpHicKQfqMaOO48Phiry+2SgGeVLmkB1UWuVGgx6aJEBVAAATsSOBQaCyNEOFR8+XLS03qBtEvK/fTlYhYyi2+nOpULyk8mkqST5HkhwlsOZR61QKofGBR2iJEpyMnwuUDK72/3kkfv1CVOovvXBgIWENg9OjRtGTJElnVXjmbUhuHXnRaKkQnkXyEJn7zTWqX4BwIgAAIgIAZArVr16ZVq1YJz+rkCBlmqqEIBEAABJyKAAQnp7pdGCwIZB0Bb8/89H6Xiik65EXpMYuO05+7knMW/fRXaI4WnBhS2WLu9Hq74BS8UOAaBGb+dd4wkQEdgy2KTaqiqdjE5cNnHaaEOym99VaMepxuxN2jgSLE0h0hOplaf9Hfq23KGoo578gP/3fWUKY/KCOeln+va0WrcoRcjLpNr36zh6Jj7+mboDnrQqmkeG9PGVDLUJ7awUnxtP7b3+9P0Za6hkNiTnq1psEzTJ3DFgRAAATsTeCU8Mz+aN4x8fDMPapfK5CWrU0KlVqtkj81EGKTv6/9PY28vdzoqeYVqVxgEdq8O5RuRifQF78eo8VbLtO8d+vbGwHad3ICLDTNmjVLziI7xCaFj0UnT3d3GibC6y1duVIWQ3RSdLAFARAAAesJeHh4EL9gIAACIOAqBCA4ucqdxDxAIIsIcL6mT56rQjuOXafYW/dlr6HCGyM1Y68N9nJgL5Ez4bfIW3iHVBKeDlUDvSx6T+wTuaSixWKQsvjbyYv0kcLTasPha+pUim3L6sUMZbb0Krlz7yFtO5ns6WLo6NFBKR/3dIXGyYg3SKzgsedMchi/QNFnhVTC8QiHE9p0JJlZGb9CZr1meAoZGY85Dq5UFhqe/B53d8tL3RqWtOn0Qq/G0xdCyDUnNnFHP4rwlY8LTzr+zChjj8PU7ILwMOIcIZ0eL0kju1e2WPXwhRga8M1e4jCZ5izsWgIt3HLJ3KkUZSt2XqGvFhxPUa4vuCS+L3p+sZ2+G1SHapX11p/CPgiAAAjYlcAtIfiP/PW4CJsXTwH+XrT7wCXyEwJTIxE+r1o5P7v2ba7xqqLPwh5uNP//DlCi8Go9fTGWWn30D63/spm56igDAenVxKH02LJTbFK3ok1IAypVfAy9OPITiE4KCrYgAAIgAAIgAAIgkMMJQHDK4W8ATB8EMkKARad6Imwch9NjuxV/n9jzictNjcODfSaeJLa0mN2iTnEpYLmLEH56+3zhceKFbnPGi/LDfzps7pQs2z65lSFkly29SqJu3U21bx5Ay7r+Vue1yqg3yL1EIwN/34L024jGFpnsFuKUnlnTWsVofN/qKepndDwpGnKxgms3ksWdSmW8Mpyjq20Dfzr/SLw6ePqmRmnt/qt0/eZdecyeSf5F3Qwh/PjET+tDaWLfGto1/Jlib6H7YpGSw+/du//QEO5SVfx9axg1rFiE2ogQf+Zs7JKThs9nvry5qXalIuRVMB8dFWJUeORtWrn5srlLDWUsEI9fdMJQxqE5g0t6ikg7IsTepTg5Vq7AY/90/jFa+bHl96yhIRyAAAiAgA0IfDDnGIVeSgpZwyH0QoTQ9ESd0pQ/n/FvEBt0ZXUTJYt7UocWlWnVX8fkNbcSEumlKXvol8H1rG4DFXMGAfZsciSxSVGvEhRE8z5LFp0a1K1Lz/Xpo05jCwIgAAIgAAIgAAIgkMMImE8+kcMgYLogAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIZJwAPp4yzw5UgkKMJeLqn/fUxUngw6HM9mQO2cd9V2n3yBq0U3jmeBdNu01wbGS3LSBizjPZl7rrMhB/z9SxAVcoWpuPnY2TTEddvU9iN21SyqPkk52sFZ711a5QyJFxmxqNv29X2OSQkexEpKy1yGmXUhnerpF3a+N0NmmfRPweSwh2O6fsYtauV5InEHkOdRm3V+j51MU67lneqlylMS4c1NJTxAb8PFog8IEs2XtTOfT7/uFkPp4OhMXRWhLpU5uWRj+a+14D8vd1UES3fEUbjFho9l7STup2pq89p8+HidiElaIQI5ZdfeEyxMceP5h2h7YeTQlKy59Ta/RHUvra/PI8fIAACIGBPAqv2RNDeY5GyC09PN2r3RHmqUMbHnl1a3TaH84uJC6Z/dpyT15wQ380jRU6nz16oanUbqOjaBBzVu0lR13s5fTByJO3au5eQz0nRwRYEQAAEQAAEQAAEchYBeDjlrPuN2YKAzQgceSR0cIMcgss0nN62E1EpxCZvr/xUo3wRqlDai/LkTg6/xyH5pq05axhbaxFqr2aFItpLX5/39edM95NbTmqSw5ipOvpOTMOYhTzmqz8t9zmMmd4K5MtNlYIKp3jp61izbyn8WNVgbykkMVNlKvyYOlbbro2NotHqRyEO1Xn9dtP+5PxNHOYspGJR/WmZL8tcOLT0jMfQoAsdXBJint5K+qQU9WRIOxXazmQrosmlaRwmsmvTUprYxBd4F8pPdSon36ebsffSbIcrsOj43tMV6NVOwVp9bj8yNilkn1Yodhb/awyVN+qFagaxietyvqoG1dJelF2z/YrWNIcFHPN8VU1s4hMcNvPrl6oT58BS9u+x5DxkqgxbEAABELAHgZlrz8tmywQWobdeCHEYsUnNtXGtQKpZLUAd0p+7w+nHv0O1Y+zkXAJKbPIsVIimffABdWvR3CFhsOi0ccb/xN/IQTKf09AhQxxynBgUCIAACIAACIAACICAfQkkr/rYtx+0DgIg4EIEfhOLIHqviLIlPQyz4wX2cUtPGsre61GZuusEksvCC+ONaftI5cbhHDEvtyxDxR95VrzZPnmxnBvq8sU2mUuG9wOEh8kPA+vwrlVmS68S9iyaYyavgt5bxZpB2cIbpJ3IyTNuwXHNq2TN7gh6tU3ZFN0fEUnIE0SidGWtRI4pnd4ni20xHtW+q205X1ZqFnc7kVoP/8dilX5PlqXX2xnfz+Yq92hcKkVxfSG6RjzKH+UtvI/SYx3rlqCZvyc9Lc/Xnbh8i/yqFjA0oRfTWAh6vLJ5YalLSADtOhpluFZ/wGKWPk/bmx3Mz5e9nVgAVjmhLkaaz9Ombxv7IAACIJBZAoNnHaJr1xOovhB1Wjc0//2U2T5scX2HJhXEOG9R+NVY2dzM389ShRIe1KxaygdibNEf2nB8Akps8nB3p7ljRhOLOo5sXkIUmyfG+eIno2jp8uWUK3dumjBxoiMPOc2x/fXXX3T//n1Dvbx581Lbtm0NZfqDjFyjvz4r969du0aLFi2iwMBA6tSpE/HcnNnWr19PBw4coGeeeYaCHPzz4sycMXYQAAEQAAEQSI2Ac/81kdrMcA4EQCBTBG6JRXS9x8x/9B+F37xLu0T4u4Onbxra7tUs0HB85GIMcYg3ZT1aljaITVxeSnhhTHylJvUev1NVo71no6mDEEOyylLzKtl5JCnsl7VeJekdszlvEH0byhuk3YgtmljE3iD68GNu+XNToxq+9O+BpBBBYdcSKCL6TgoPldX7IvRNC4+V5Ceo1QlbjEe15WrbEkWTw8vx3K4IsTQ9xoJUWuZRKB8F+xdKUa13s9LEL0vGnlVLt4fRnjM3KSLqDkWK+5+Y+B8VEd6EpUxC//F7w9Su6uYSLITjXLlMayQdB/qkHkbQVDi6FHWbWJg2Z2fCbmnF4WIBGAYCIAAC9iQwS3gqbz8USX6+Hg4tNikGDWsG0oo/j6pD+mNPOAQnjYblncmTJ9POnTupY8eO1KRJE5dYaJ4yZQrxvAL8/Oi7YR86vNik7o5edFqydCnxHxcTJkxQp222vXXrFs2dO1e29+yzz5Kf4KS3EydO0MaNG6lAgQL08ssv60+la/+dd96h+Ph4wzWFhLB27NgxQ5n+ICPX6K/Pyv0RI0bQunXrZJc8rzZt2mRl9yn6evjwIfG9ZStYsCDly2f9A1fHjx/X7jWLfmvXrk3RvrMUxMTE0OHDh6V4xvPy8fGh8uXLU7du3cjDw/iwp7PMCeMEARAAARDIOQQgOOWce42ZgkC6CHCYu9Fzkxc8LF1cv6oPtTPJwXJOCB96s+TdUVEscJfwK6h5Ll3IhsVnW3uV6Odtad+W3iDPiHBnSnDi/v4QYfVeaRVk6Hq9Ln8T5+h5TIQ01Jstx6Nv11X22atNb1eEmGJr8/Ey9mFN+4u2XqapK05rOZ7017BHGwuQaVncreQndot65rdYPS3vqos6gZkbmSbGZY3dvpO695g1baAOCIAACKRGYN3epByGTeqVSa2aw5yrHOxLVSsWp2Onksb9jwiJe7xVHFUp5ekwY3TEgeQSosbly5eJF8/ZQkJCqHHjxtS5c2cKDnZcrzZLLN977z1i7yYOT8ceQyziOJMp0WnguHFyHjx2W4tOLEp89dVXEkvt2rVTCE68SK/O9+3bl3ILb6uMWOvWrSkyMunhroMHD6YQn8y1mZFrzLWTFWUsbCiLjo5Wu9m2vXr1KjVs2FD2P2nSJOmpZO1g9HNhzy0WrzJ6363t0x71NmzYQG+99ZbZ9xq/p1euXEkVK1a0R9doEwRAAARAAARsQgCCk00wohEQyJkEXukYTK+ZCeGm93bgXER/H0rOH2RKKi4h2fvj4jXbL+Sb9qc/zqhXib6NjOzr+fD1mfEGaVjJhzgnE3trsXFYPb3gdC4inqJ1uX86hJSQ9fQ/bDkefbuutM/5xxTHc1eSPXR4joVEKLrZ7zUwTHeUSPZ+IdxYz1DB5KCoaD89tnLXFZq0xBi2Mj3X27quh1ueDDWpz1WWoQZwEQiAAAikQmDD4WsUKr6zi/l5ioV731RqOtYp9nI6ff66COOV9Lv9d+HlBMEp9Xs0ePBgeuONN6RHw+rVq+WWPZ6+/fZbGSbslVdeoZo1a6beiIOcXbp4sVOLTQoji05zx4yhYdOm2U10Un3Zc8vvIWWff/45zZw5Ux1a3GbkGouN2fnEJ598QtOnT6eAgAD5WbFzd3ZtvkGDBjR06FBiYZC92pxRbGKvPSWcM6zSpUtTrVq1aPfu3RQeHi5FqA9ELjcWnWAgAAIgAAIg4KgEIDg56p3BuEDAAQiwkKE3JWpwGXsmmROb+NxFnWfFfRHy60ux+G6NxcTfs6aazepkxKvEFp3b0huEczG1FyKSyolzSQhM12LuUrHCSR4za/Ybw+l1FR5RpmbL8Zi27SrHxUUISCU4XRehJbeL0JKNKhWV0+N7YLoQWKhg+n69eqajPudIm/rbGQPaPu2CqI3I6VXcuwDly5Ob4u8m0mmxyDpkxgFDPdMDT+HxpuZ1Iy7jn7/y/sbQHrUFm7rlvU27S3HsXSh9QluKBlAAAiAAAqkQWLYtTJ6tUs4YaiuVSxziVHGfQlRfiE7b9oTK8fwlvLTefLIcFTL5u8whButAg+DQaU8//bR8nTx5klatWkW//fab9mrUqJFchE4t9052T2ebCAE39P33iXM2OaNnkzl+H/XrR8fOhzq16GRuXq5SVq1aNfruu+9cYjosML399ttOPRf27uLQhmyzZ88mFtHY/hP/ADz55JPEnnv79++nO3fukJubMey3rIgfIAACIAACIOAABNK3IuYAA8YQQAAEsoaAv29B+m1EY0Nnr0zdS0dEniW28MjbIufSTapbroihDh94uGfsq8VU4ErRsI0L0utVYqvube0N8kxISU1w4jFyzqa+LZJCB/35KJQQl/M9DfJLmYvH1uPhvlzNmlX3pZOhySFHpv7fGSE4Gb2asmrOoZEJxCEvlb3bvRI993gpdSi3nAPsRlxyHcNJ3YFeSDsncis9FGIWC2imdu/BQ9Miw3GgyfvKXXg8vWrG+9FwEQ5AAARAwI4EzkUk0J7jNyhv3jxULdi5BCfG8ngt4eUUep0ir9+iGPFAAOfHDKmQ9KCDHbG5TNOVKlWi94VwM3DgQCk8sfi0detW2r59OxUuXJheeukl6tKlC5UrV85h5nxYjO01MV62eZ+NcbowepZAsqfTuEFv0YsjP5Gi06VLl2jRokWWqtu9PDExkdjjLW/evJQnTx7y9vamxx57jFiQrFChgt37t9TB3r17aSnnvBLGXkecv0jZn3/+KfNR8fHYsWNVsWHLdXbs2EGnTp2i2NhY4jCD/GrevLmco6rMYeY+/vhjdWjYDho0SHo6GQrFwd9//03r16+nsmXLEufLWrFiBW3evFnmWmLB6vXXX09xXXo5f/bZZ5SQkGAII7dw4ULas2ePYThPPPGEzNWmCnlcPD5Tq1KlCvXp08e0WDtmDsuWLZO531jE8ff3J57LCy+8QMWLF9fq8c65c+fksfJuGyM899jDiL9TTp8+LcPb8XX16tUzXKcOrly5Qnx/9u3bRzdu3KDr16/L9x7nZSpatChNnDhRHnN9fg/y9xWLTiVKJEem4LChHEaPx8rGAhQMBPQE+DOn3qMsvqrvOVVH5bXj77znn39eFWMLAiAAAnYhkLFVYbsMBY2CAAg4OoFBncrRgG/2asOcKPK0zDcJJcYnTb0dXmhThgrmN3pLaY3odqoFGnML6U4ZdhPTWPw2VE7lID1eJak0k+5Tpnwy6w3CubB8ixQg9rxhWy3C6rHgFBF9hyJ0uXU6NwowO1Zbj8dsJ05e2LtZaZrzZ6gWuvDs5Tgas/gEDX+mkvAoMqPQ2HG+0beMnkhuFj5by3cmPdmf2lCCirtrQhrnfdoowk+1qlEsxSUHziUJzSlOPCrIK1QqFjTV+23rwUhavO0ymcuRZqkNlIMACICALQms2R8um6skvJsKeznfU+B5RUjiCiIMIAtObEcvxUJwkiTS98NdeAr17NlTvnjhet26dbR8+XIZao/DnrVs2VKGEWvfvr3mVZC+HmxT++bFC/TesGEUFx9Pw4VHUJWgINs07CCt8Hy+Ejlp3vr6aymKjB49mkaNGpUto4uKiqJNmzYZ+lYCGAuRn376abaEYjt69CjNnz9fjmuYeC/oBadjx45p50wFp5s3bxLn/DIVXTisHHvIsPCyYMECKlIk6SFBFipUPwYI4oAFGg6tZ2r82eFrWAy5ePEicdg3ZXyOhbK//vqLSpZMjqSQXs4//vijalLb7tq1i/ilN09PT4PgxAKMufm0a9fOouDE+b/efPNN+ueff7Smjxw5IhnyOH7++WeZB06dDA0NlbuqHxa09e9fvpa/V3ix39SDkt9r/L6yZCwssfCpt/Lly+sP5T6LXuoe833Qvz9SVEZBjiTw4MEDLW8dA+D3UatWrTQW/FnhHGD8noPgpGHBDgiAgJ0IQHCyE1g0CwKuSKBWWW8qW9KTzofFyenxovuu0zepQQWjl1P5EklhABSDABGO7NlGyf+AqPL0bL098kuvKr5GCSvpud6R6trDG6RL45L04x9JT99dEKHUrsfdpbX7kxKOq7l3rp/8lJwq4609xqNv3xX284uFvwFCcP1m2SltOn+IUE37Tt+gIV0qUtVAT/LzSgpj+EC4CXEoSXtZoAhnqbe56y9Qq+rFSHmq3X/wH81Yd87g9cb1L15PoKtChPQr7KZ5MbGQtm5n0qIs1xk5+wgVer0WNayY9BQ9ezxtPhpJXy08wadTtZE9q9DAafu0OhMXn6R/j0UJT6cgqlzKSxPmuM3LN25TrPDSeqy0dSKz1ih2QAAEQMBKAqGPwvtWCXae3E2mU6tc1lcLq3fofLKXrWk9HFtHgL0P+MXeHbwAzyLDhg0b5IsX4Vh0atOmDTVt2tS6Bm1U66FY/B4jPFpOiEXtVg3qU99OHW3UsmM10yakAXVt0ZxWbNxEs2bNoqpVq1L37t2zfJC8uM9h1+7duyc9dDjXF3upsP3yyy/S6y01gSDLB5xGh1988YUmRLBHTOfOnenu3bua9w0vMnOOM54bG3vKcA4gZWfOnJFiiTpObcuc+MV5hVhY4c8PCyHxQiidJnJ16cWw9HIeOXKk9Nph758ZM2bIYXTq1EnmL9KPib3R9BYSEmKYz08//UQsdqVmLCopsYnFm44dOxJz+P333+Vc3nnnHenBlT+/+dDPXwvhlBftu3XrRmfPnqVt27bJ7tgzTS84sbClfy+xCMbj9/LykveBz1vqQz9+vofPPPOM5v01fPhw/Wnsg4BZAnPmzDEITmYroRAEQAAE7EQAgpOdwKJZEHBVAm8/Vc6QF2bCilO0+IMQw3QrBRjzuUxacpKqlvIUi/IZX1wuU6wQHX+02MKL+eaELsMgHPjAHt4gXUICNMGJp75m31VauydZcKogFvaVIGKKxh7jMe3DFY57iLB1K7ddoQvhSU+b85w4tOQHMw/K6eURXj4FhLcRewqZs183X6JvlycLVvo6mw9co5DB67Wi7i1K03tPmw/r4utZgNzd8mr9cN6uVsM2SQ+jfEIY42NlZcRnkQVItsUbLsoX76/9ogkVEfmTKojz7GG3X+SkYmOx7J3v9hO3w/mdYmLvyTKeW1pWr3wRalXPn9bvSc4btvPIdeIXG7fJpsQ4j0L5aP0XWbuoJweAHyAAAjmCwF7xvVZAhBetUMbHaefLuZxKBhSmsCsxdPBM6p6m9pwkh6HjRdF8+fLJl9rnkGRqn8/xPpc5unEoLV685XxPG0XOJA6NxeGueHGOX8HBwTK8GudO4ZB7HKaIXxyKj0Na2drWLFtKy4UIE+DnJ72AbN2+I7XH+Zx2HjlKVyIjaYzwcuIwdqVKGcMCZ2S87K3C90dvV68m/x2sL/f19aWhQ4fqi2SYs9atW0uhgsUIvUhgqOhgB+wVtWTJEjkqFlP5/ctCCBu/Z9nzib1z9EIQh9riUJPKWDRi7xxrrZ+4hyyscDssfNSoUUMKIbt37zY0kV7O/fv3l9eHh4drghN7IPJnNTWrX78+8UvZ6tWrUxWcWBybPHmyrM6fdf78e3gk/e/Kn/dvvvmGeAyc/82SIMqhBdmrS3kZMU8Wq/g6DpnHYfLYWMRSxveCQxam1/h9zOH6eNxs48aNg4iQXog5tD5717FHIgvEMBAAARDIagKO/x9BVhNBfyAAAqkSaFzZxxA6ixezd5y6oXlE8MXeYiG7d7sgmrsuVLbFi9j9J++hzk+UpF7CoyJQeDyJh+uk3RPiUejVBHIrkJtK+6bML5RUiyjYxGvq/R8P0rvPVjJ4dsTffUBXom5TCdG+8vZQ1zva1tbeICwmsah0+mKsnOrCTRcNnmBPN0wZHkPPxNbj0bftKvsszC14vwF9t/YczRPh9UyN3+eWxCauezP+nuklFo+5rdRs7MvVpTCkr6PC2amyx2v6USURbnHWI8FJlfNW3/wnwjPp1W/3GN4vLArdiL6rXfJ4DT/aeihSik9aoZmdEd0rU4F8uWn19ispziqhSZ3gPFSJYiDMFQYCIAACtiSwT+SYjE9IJN+ilv+usGV/9myrSnAxKTgl3E6kE8KzvLJ4gCcrjcUmDklnrbH3hBKm9Fu9MKXKLYlT3AZ7n9y/fz/FS5XzYrrat3Zs1tZjjw1+/frrrykuYa+ohg0bpijPaEGMWJz+cNzX8vKvRJ4jznfkysbz43n2+WQUxcbFyYV/zl+TWWOPlrS8Wiz1cfv2belxwl5PHCaNF2h5cV8JN5auc4RyDpun7KOPPjKMmT9fzJZD6Fn6rKlr07Pt0KGDFnKQ2+3atSvNmzePOE9RauYonFV4PB4ri2dKbOLjl19+WQpOvM9eRZaMvSGV2MR12HOJBSc2FoiU4MTClLLFixfLcIWPP/64zBelytPacnhF9d5mL7XmIicXDATSIsDfX/w9xu87FjutMfbUW7t2LbGQzZ9t9sZjj8maNWtacznqgAAIgICBAAQnAw4cgAAIWENgoAgtxqG3lE0SuZwWf2j0cnq9XTD9IUJ1qUVrXkBfsfmyfPF1buKp4/v3H2oL2E1rFaPxfaurJlNsuwkPnpm/n9W8I+4IcenLX4/Rl3SM2PtCv0A/4sWq9FS9ErINW3mVcGPcR7MPNmljSDHIRwUb9kZQiHjp7cW2QTSoQzmtyB7eIN1EWL1xjwQn07CDT9bx1/o2t2OP8Zjrx9nL+L3G97HFY3407Y+zdF54O0ULLyBzxu/xamULU7NqfuZOZ6qMQ959O7A2jRch/vQeTarRRtV9adRzVWjV7uRweeqc6TagiBstG96YRs4/mkJUYk+qkKo+9GlP8Zk68y/F3rpvernh2F3Mmft9/olA+nLpCTpzKS7Vz8uNuHtUrHABQxs4AAEQAIHMEtghwv2yeRRy/u+X2pX96e9/k8J9XYpKyHLBiT1QWGR57rnnrLotvLjNQhC/zBmH2XJzc5OLtbxgyy/Os8RbDgOmRCbVBh8rYUmdN9duVpQ1a9bMpmITj/kn4U3DeZs41FxItWpZMY1s74Pn2aBaVdp19Jj0EmGRh0OMZcZeffVVma9E3wbnFlLeP/pyFj64nN/XnHtHmV5gio2NNYg3qo6jbVkYVcYhCk3NNDeQ6fmMHNeuXdtwGedUYlMeOOqko3K+fPmyGqLMSaUdiB1vb2/y8fGRAs+FCxf0pwz7/L2oN71opS9nr7sXX3xRCnIsZL777rvyNHuccG6dvn37UlBQkP6SFPsc8pGNvfggNqXAgwILBDhHE3trcvhSFtP5oY/UjMNETp8+3VBlx44dso0xY8Y4jdenYQI4AAEQyFYCEJyyFT86BwHnJNCmZnGa6HVKW2jnEGPbTkQRez8pY6+FmW/XpY/mHKWToSnzDrBgpLcLj3It6Mv0+54F89Lw5yvTmLnH9MVyXy82ccHFyAStji29StgrxNRLQ+sojZ2HfLGJ2dobpH3t4jRuYcqn8ThkmjUeX7Yej8l0XeqQcw/NeCPpH27OmRR6NV7kzbpHbsK7p5h3ARm+kPM+6e2tJ8sRv2xlIRWK0tJhDSlaeE5djrpDceLpd/6clPZzJy+xZesaUpKaCXGsQJ5clF+MrUDePHJr6lXklj+3JvheFF6CN2LvUnFvNyohxChlc4Y2kOKuhxChCorQgalZReFZNfuderIKj+uc4BP/KNQgi1IlfQoShwYUD7HDQAAEbEjg/Pnz8ulUbpIXsyyF/9q/fz/xQgIbh+rJ7GKvbMiBfmw/HiVHU8jd+QWnvOJ3SVDpohR68QZFWnjAwd7o2aMntcVXe/dv2r4SoZQQpbZKkErPeXUtX8PX84sXhnlROiIiQhPOeOGe87rY2paJsF1sg6wU9Gzdf3a116djJyk4cf/Hjh3LtJDH4fBMPc8KFChgVnBiTyBzIeRMBZPsYmOuX/boM2cs6ijjEHdZYeyhaI05Kuc7d+5owze3CM/CI3sUcX4lS6YXJy3VUeW8WM/vzdmzZxOLoGz8HfPzzz/LF4tQlr5bOPynel/Cy0QRxdYaAi1atKA//vhDhnn866+/ZJ4yS9exZ5MSm/i93bt3b/nwB+dDY+MQmuyZV758eUtNoBwEQAAEUhCA4JQCCQpAAASYQIF8lheUeZF4gPDy0IsbP6w7bxCcuI1SIrTdnMH16K+DV2m68E66JhbFTcUhrscWfzt1zwmu07FuCdnmOOHVcVaElbFkETeTQ4FZqpPV5RxmzNRs7Q3C7YU85qvlzFH9dWmY5O2lji1tbT0eS/24Wnk+IeZwLiTzGZfsP1sOYckvc8ZCo4dbQXOnLJaVFmIQv0xNLz6ZnkvtmEWwmkGFU6uCcyAAAjYiULx4cZo5c6ZcLONQaJzPw9R4Aev999+Xid85Wfprr71mWsWpj/nvjFMXksLLenkki+bOPKmihd0plITgFON4f99kB1cVki89i75pjXPz5s20fv162rp1K126dElW5/aHDBlCHEIsLS+EtNq3dJ6FrSric1hS5G/KSVY1uGy2TJdzmiixib1LOBwcfw+ycc4ezkmUmilRR4kAqdVV5zJyjbpWba9fT8qHqY7VVv++ZG+nKlWqqFPZus0MZw6pqezmzSRvVXVsi23JkiW1ZlhU1hsLeywGsZUpU0Z/KsP7LFY/9dRT8sWec/v27aN///2X5s+fL8WkSZMmyXxy+nupOuP3zt69e+Uhe1/BQMBaAhwSj3PRffXVV/JvwY4dO1q8lPOWKeOcZuphJc6hxg8lsc2YMYMmTJigqmELAiAAAmkSgOCUJiJUAIGcQ+CzXlWJX9ZYN5ETiF/WGHtE8YstUnhOhApvprsinB6HJzP1yEirvZplvWn+ew2IvUpOhsUJ7477JJoRnhK5pBdPiaJu0nNCtWNLrxIWFnZOaaWattnWlt4g3/avmelx2XI8mR4MGgABEAABELCaAIcmGzx4MI0cOZL++ecf4vwepk9F85Oup08nhWj78MMPyR4hl6wesB0qJug8qG/GJj/9b4eusqzJot5JDwFczyYPpyybaBZ3xJ5+f//9t3ydOHFC671evXrE4YieffZZrcyeO8fF53HnqdMUUjG7Hl2x5+zMt73zyFF5wkuEYzP1TDJ/hW1KlWcnt8YeOOwFpcxUfFDl+q3KzcNl7AXD4dfSMmuv0Ydl4+/upk2byqYfPHgghVBz/ZQrV04rnjp1Kn333XfacXbuZIazr6+vNvQ1a9ZQ//79tWNb7JQqVUprhkVG/UI8C8/KbCU4qfZ4y97EHBaPXwEBATR69Gh5mvNKmROc+CS/L26IXG+2zMMlO8UPlyfAv8NYcOLP45kzZyzOV31eOReZEpu48hNPPCHzOHHo0QMHDli8HidAAARAwBwBCE7mqKAMBEDAbgT8vJLCjWW2AxZ/OKyZq5mjeYM42nhc7X5jPiAAAiBgawKca2fKlClyMXTatGnS40n1wfl1Jk+eLA9ZiOIwVK5m8XeTQ0/djEkOsevM8/QpnCQ4wcMp83eRxVYlMqnwVtwqL/byInD79u3JND9L5nu13ELbtm3pzz//pI+EWLDiq7HkJbyqXN1iRc6qL0U4MbaXX3klS6erF3/4fcALrBxOce3ataR/yp8XV7k8MDBQPtSmBskigTIOM/XGG2/IvD8nT56UwkBISIg6rW2tvUYvcLAnAXvbsIcLh15TXjfcKAulHNqKcyexKMUeWvy+5vBZ/fr1owEDBmjeOTExMTI0JIfDUqHwuEwfik/vRRQZGUlFihSRY2cxTu1rk7FyJzOcWVgJDg4m9tjizyjnoOHwYCy88Ng57GW1R/nOmJGp9xefZ+OtXkRkIYvb9vf3l7/7+P6vW7dOem2wBxJ7Gw4aNEibIXu/ZdZYlOTFfH4fMRPOX8ch/Xjxn38/K/Oz4OHI3pb8HmWPuvfee88wPnUttiBgiQC/rzp37kyrVq2ihQsXap8bfX1+jypTnyt1zFvODceCE3/H8N+Qeg9EfT3sgwAIgIApAQhOpkRwDAIgAAIgAAIgAAIgAAJOSoAXCYcNGybD5vFC9vHjx7UwSxs3bpTHPDVevDK3cMDhe1avXi3zqvCiJIdoatOmDXFoFXMWFxdH3O6WLVvkwh8vXnBeHF6o5AU2zk+hfwrfXBu2LEu481BrLjrGNTycfEVIPbaCInQuLP0E2HuAQ3zx+5S3ypTIxIvZLDZlh40aNYo4/OXlK1do0OQp9MuIj7NjGFna50CRnD5OLKDzdwuHLMxKY4Hmiy++kF2++eabhq5Z/OPvP/4Oe/311+U5zi+lD93IufH4mAWA33//Xb5UI926dSNzgpO119SqVUvzJmAPJxaPlHForF9++UUedunShQYOHEgffPCBFFDGjx9PXMa2YcMG+ZIHuh/83mcRh+2zzz4zm9uKz3HuFmUsdPzwww/qMF3bzHLm30/q/rAXkPIE4kHwPHg+bCwSNWvWTO6b/uDPuv5+sKioQg4yOxac2NgzjF96Y09hvVCoP5ee/cOHD2vzsHQde1ipcZnW4Tmo8I2LFy+G4GQKCMdpEuCQeCw4cQhH9uo0NSXQcrm5nGYskipjb0t42ika2IIACKRFIHdaFXAeBEAABEAABEAABEAABEDAeQjwwmfp0qXlgPULaez5xNagQQMtXJMsePSD6/K1P/74I3ESaX6SnhcpeOHz449TLoSrxT5+KpwXw3ixkxdKWeTi63lBlp+IzUqLv3tf6+6u8Ha6rfN40k442Y57wXxyxN4ukpMqK/CzyDR79myZw4IXpFnY4cVbFpk4dw8v3nPYSV7Izi6xiTlweK+JEydKJDvE5234999nBZ5s62O48OrYdeSo9M7h75nMWEbCgVauXJl++ukn7fuR+2cB6cknn5RCjF5cMjc2Ps8eNyVKlEhxWuVqMj1h7TU8n//973/y+1m1wSH7xo4dS3Xq1FFFKba1a9emnTt3yjxAlsav92KwNE7ThpVHlGm5pWN935nlzCIM/75Sv8f0fbLnk7L0LH7r512pUiX5+TcN58i8OadSZoRQfT967zE1ZrXlvlg4ZMFQf406z1sWwxXXnj176k9hHwSsIsCiK4u0LFwuXbo0xTXFihXTysLDw7V9tcN/57Hxd156Pm/qemxBAARyLoFc4p/ArP0vMOeyxsxBAARAAARAAARAAARAIEsI8BOtKjwQP8l99epVLfnzkiVLDIuaPKDdu3drOWt4IYyfqOcFUBaNWEBi40V6/eJ89+7dadeuXfIcL3py2CZObM7/XvCLF9vefvtt4txSWWWHL8RQ/8l7tO76dK1DJYt7asfOuHM1Kp5mLdlDfZ8sR2+0C3LGKWTJmM15MvECGedkql+/vnxZ8obIkgGm0gl/Jtmrg61b61Y0VoRqczVjsWn5xk1SbGKBmkM1ZZfx9xOLMLGxsVLUUAup/J3Fi//8pD8LLqrc3Dj5O5WvZw8ADtdWsGBS6EtzdVWZtddw6DgeCwsuPB72QuAFY/Zg5XHxy5yHKvfDYfHUPFis4LBaqc1Djc0eW1tw5nnznJgBz6d48eJaeEBbjJk9csPCwuTvroyGEExtHCq0H2+ZB79PuB8OEWjpHurb4+v4/aAXBvTnsQ8CigC/V1QOpkWLFmn58fhvNw4Bqow/R+y9qaxJkyYybCeX84NGKrcdf0cqsZvrzJs3T12CLQiAAAikSQCCU5qIUAEEQAAEQAAEQAAEQAAEnIsAhz7hkEgcd5+9lvgpVRaHeMF9zpw5KSbz/PPPS68kPrFv3z5i0YmNF+P4KXBeeNAvOHD7KkRT48aNacGCBbJ+dv9IuPuAWny4SRtGx5aVqUbF4tqxM+4cPn2Nfl9/nD56oSo9XT+lZ4UzzsnWY+bwW5zDho0Xcjk8Gr/XOR8TL1A7g7HoxB5XHKayW4vmNPatt5xh2FaN0ZHEJqsGjEogAAIg4GQELAlO0dHRxHk7lZkKTuz1OWbMGHmac3tySEnOj8a/j1iAYmPvyw4dOsh9/AABEAABawggpJ41lFAHBEAABEAABEAABEAABJyIAHsnvf/++3LEy5cv1zyRhg4danYWHAKPjYUnJTbxMT/pr/KD6J+I5fbZq4mNr/1ehALjROj8BHd2mrvIc+TvW5AqBhWRw7gZeyc7h2OTvq9G3ZLtlPBOzqVgk4ZdrJGnnnqKZs6cSXv27KHJkyfL962ziE18K9hjkD1/SpYsKT2BWKRxBVNiE+epyW7PJlfgiTmAAAiAQHoIsOd5jx49LF7CeZ7UA0TsEd+pUyf5+1OJTRyGuX379havxwkQAAEQMEcAHk7mqKAMBEAABEAABEAABEAABJycwMOHD4kX4Y8cOSJnYikJvD5sCj8Fy3lu9MZCE3tKsbGopHJ76MP2qfr85Cw/IdurVy8tnIs6l1XbwT8dpMPnYuhW/H0qWsSdBjxXP6u6tks/3y/eQ7Ext2nrxBZ2aR+NOhYBDtPGi4McytKZPZ1iRSi0sT//LMUzJTZ5eXk5FmyMBgRAAARchMD9+/epfPnycjb6kHpcwOKRenjI1MOJz3PoSvZo4uuUcb0XX3xRhnvlh49gIAACIJAeAhCc0kMLdUEABEAABEAABEAABEDAiQisXbuWBgwYIEf822+/Ua1atVKMnhNFmyZPT1HpUcHZs2cN+UB4EYO9m9asWZPikpYtW9IPP/ygCVQpKtipYMrvp2nB3xepe4fqtGT1Yerfoz75Fc26PFK2nFZ45C2avWwvFfMtRP83oqEtm0ZbDkxAik7C4+n4iRNOKTqx2NT7k1F0IjSUqlSuTItFuECITQ78hsPQQAAEQEAQ4AeV+G9Czi9WokQJq/KMARwIgAAImCOQ11whykAABEAABEAABEAABEAABJyfACezV6bfV2W81Ycd4zB5HL/fkpkmn+f6M2bMkLmeDh8+TDt27KCFCxfKBNQbNmwg9oJ65plnLDVnl/IyfoVku4Xdk/7VOXYukpoVLWOXvuzd6JlLN2QX5Up62rsrtO9ABFicYZGmh8i/tnzjJjkyZ8nppBebKleoALHJgd5XGAoIgAAIpEYgd+7cMqxranVwDgRAAASsIQDByRpKqAMCIAACIJBjCXA6kv3no+mfo5F09eZdioy5Sy1q+NGLzUrnWCYZnfiWY1E06+9Q8vbIS8VELpLaZQtT82rFyC0/UkpmlCmuAwFbEOAFBg6ld/DgQRl2hQUoDoGVHuNwK3Xr1pWvZs2aUceOHeXlHIIvq61igIfs8lpUrNyGht2kZvWcU3C6IMbO1q52MbnFj5xDgEWnSd9+Sz2efdZpRKfjwqNp4FfjKCwykqqw2CTyx8GzKee8ZzFTEAABEAABEAABEGACEJzwPgABEAABEAABCwR+3xNOE5eeooQ7iYYa/kWQuN0AxMqDe4kP6Ni5aK32ys2Xxf5R6tYskIY8VZ7y54XwpMHBDghkMYFBgwZR//79Za/9+vWj7iKcV+PGjalq1ap0+/ZtunTpElWsWJEKFy6sjYy9lzjkip+fH3Gs/8TERIqIiKCvv/5aq6P3ntIK7bxTLdCL2tYvQas2nqUnm1eiNZtOUtTN2+RTpKCde7Zt85cjYulSWLTMQ/VkLT/bNo7WnIIAf/4W/vILPdenj8OLTiw2cRi9OBFOz1N8H7BYBrHJKd5mGCQIgAAIgAAIgAAI2JQABCeb4kRjIAAC1hCAx4g1lKyrA48R6zilt1biw/9o8I8HabfwyDFnJXxcR3Bauz+CPv/1uDbNWe/WJ+UdoBXaaCegqPnF3uX/XKK/90bQnKENqATEPBvRRjMgkD4Cbdq0oR49etDixYtl/P5vxWIxv/Q2a9YsatWqlSziBNMsUqVmpUuX1pJUp1bPHue6NgqgP3eHUym/JG+ng6ciqGVIWXt0Zbc2dxxiUZ6obUgpu/WBhh2fwGP169P86dOp18CBDis6mYpNi5culWK149PFCEEABEAABEAABEAABGxNAIKTrYmiPRAAgVQJwGMkVTzpPgmPkXQjs+qCIT+ZF5vKlPCg2hW8qWMd/xTtsHCzaEuYVh5Q1I2+eLGadqzf+Wr5STp5+ZYs6tY4gJ6qV0J/Okv379x/SPcTH2p9Jj5I3tcKbbQTVMyd+j5ZlvacukknL8Qa+o29dZ/6TNxFCz4MIV/PAjbqEc2AAAjoCeTJk0d/mGJ//Pjx1K5dO5owYQIdP54sRKuKV69eVbsUKUJmpWYsXg0UC+Te3t6pVbPbuTrB3tS0VjGauWSv7GPfkTCqXqE4+RV1t1uftmz48OlrdFrknvLwKEDPNcq+3xG2nBPayjiBmi1b0vzJk6nXkCEOJzpBbMr4fcWVIAACIAACIAACIOCKBCA4ueJdxZxAwAEJ5CSPketxd6nL6G3aXXjz6fLUq0mgdmzLHXiM2JJmUlsbDl+jXUeNnk1PiFBGX/WuTvny5LLY4YXIBEO4uGPniHo3L02VS3mmuGbfmWi6cCVJcKoVnByeKkVFFysomD8PvdEuWCQjSZrY0u1hNH7RCW2WLDpN/u2MRaFOq4gdEAABqwnUq1ePLly4YHX91q1bE784PN6VK1fozp07xPmZODRewYLJXopBQUF09uxZunbtGrG308OHDylfvnxUpEgRGUYrLXHL6gFlomK3RiVp84FrsoX79x/QzsNh1KlZhUy0mDWXPhRetrsOXZKdtW0YSAGF8S9b1pB37F5qtm9P/4jPYa/Bg6XoFJuQQGOFqOslwtdll8WKzz7nbOIwemwThSjGYQBhIAACIAACIAACIAACOZcA/nvJufceMweBLCWQkzxGxJqbwXMj4e4Du7GGx4jt0X73h1CKdPZ0k1L00TOVdCXW787ZdJG+tODlZH0rrlvzWbEYXNQjHw3/6bA2yb/3RNAQIdLCy0lDgh0QyBYCefPmJQ6Jl5pxnYCAgNSqZOu5RpWKUshjPrTzSNJDBIePXxFeTsWoTIBjC/3bDl6ia5G3KMDfiwa0Tv0eZCtgdJ7lBHxr16b5EydSr6FD6e+du+jy1Ws0d8zobBGdWGzinE1hj7wd2TOSPSRhIAACIAACIAACIAACOZsAsnPn7PuP2YNAlhCw5DHy78SWtFiEzxrerRKVLZ7y6UzlMXLsXLT0HOGF6BOX48yOmT1GVL1zEUlPWZqt6GKFymPkp0F16d8JLej95yobZqg8RgyFOLBIYPeZm3RJ9/6pV6VohsUm7mTTvqtkT8HR4kSc6ETL6sVSvG9//CvUiWaAoYIACDgygVfblCUP9+Rn7HYJLydHttMXomjLzvNyiJ0fDyRvN8uetY48D4zNfgR8hdfifCHuVBJehidCQ6Xow+JPVpoSm7h/NhabunfvLvfxAwRAAARAAARAAARAIGcTgOCUs+8/Zg8CWULAnMfIxL41Ug1PZmlg7DECs0yAPUbGvlLdUIGFOg7zB0ubwPQ/zhoq9RcLlZmxByIs0oqdVzLTRI649ukGAZQvb/KfJKv+DaNbd+znGZgjoGKSIAACkkD1MoVp6DMVNRpnzkfSpt2h2rEj7YRdjaOla47IIdWsUpz6NUmZL9CRxouxZB8B3/r16VcRvi47RCeITdl339EzCIAACIAACIAACDgDgeTVHWcYLcYIAiDgdATgMZL1twweIxljzp5Ix8/HaBcXK+pGtUXS+cza/I0XMtVE7O1E2nHqBv20PpQ+WXCMfvz7PG07EUXR8fesbpfFm+0nb9CMdefo43lHaf6WS3QzHdfrO+J8bOxpyELa2OUn5Wv5jit07FIsiVMZMs6N9fQTJbVrWaj752hS3hWtEDsgAAIgkEECHeqWoFc6BmtXb997weFEp5sxd2jOin1yjO7u+WlA2zLaeLEDAuYI+NWpQ6uXLqGuLZpLT6eWb7xJxx95HJmrb4sya8WmHTt22KI7tAECIAACIAACIAACIOCEBJLjSzjh4DFkEAABxydgL4+RF5oGOv7ks3GE7DEyZdkpLZcUe4y81aE8ebjlycZROXbXYVG3DQN8vkXG82YU9S5AMbH3iIWT6zfv0oHz0VSrbPrFqwX/XqYpS08axqU/eEPkOurbIvVFyX+OXhc5kg7Jsahr2evtG/H+aBdSguqUs35cJ8Nu0dvf76doMTdzFuhfiCa9WpNK+xQ0dzrVst7NS9PSTZe0OpdN7od2AjsgAAIgkAECrwmP1WvRd+n/tiaF1GPRia15/SC5zc4fd+8l0owFO7UhvNyhHNUt66kdYwcELBHI61eMJk2dSv8NGkQrN26S4fU4p1MVEW7PHjZ8+nQpbnHblsLoTRaeV1OmTKGBAwfSBx98YI9hoE0QAAEQAAEQAAEQAAEHJgAPJwe+ORgaCDg7AVf2GLn/4D86fCGG5v1zUXqdTF9zli5eT8jQLYPHSIaw2fyisJt3DG1WLpnxxb78IjwciznKMhIKcsisg6mKTdz2/347Q6//bz/9Z8GziAWrD2YeNIhNaky8XbcznFhEssbYo6nP+J0WxSZug/Nf9fxiuxTYrGlTX8ff243y5M6lFYVFGe+HdgI7IAACIJBBAiO6V6ZG1X21qx3B0yk+4T5NmrVVG1OHJ4Ko9xMB2jF2QCAtArk9vWjK9z9Q1zZtKE7kcur9ySi7eDoNnzaN/t65Sw7HktjEJ3PlykWBgYE0XYhTI0eOTGv4OA8CIAACIAACIAACIOBiBODh5GI3FNMBAUci4KoeIxeF58Wr3+xJsfA+Z10olSzmTlMG1LL6NsBjxGpUdq9o+n71L+KWqT5fbFaaVm9Pyt+09WAkxYhFxcLu+axqc8Pha7Tt0HVDXbcCeSiweCG6dDWe7ojwf8r2i1B5q/eFU0cRMkpv8aLO1OWn9EXk5ZGP6lXyoXsPHtCB09F0K/4+/bblsqGOuQMO3zd+0QnDKR5PsBDl/hNq15lLcZo3HXt1fTr/GK38uLGhvjUHnmJ8ynsq7LrR48ya61EHBEAABNIiMOWVmvTpwuO0RoQCZWPR6VpUPDWtF0T+voXSutym53ccukwbt53V2qz/WHEa9Ww57Rg7IGAtgVwFCtCUmTMp1xtv0PI1a6TotOF/35FXIdu8p1lsWi48qNhSE5s4lB57OLG5u7vTnDlzKF6IYJMmTZJl+AECIAACIOBYBE6dOkUVKybnunSs0WE0IAACzkoAHk7OeucwbhBwAgKu6DHCXk3swaEWxU1vQ9i1BFoo8uNYY/AYsYZS1tUJu2EUOPy8CmSq83IivFyZAA+tjSXbksI4aQUWdthbaaKJUNShcQBt+qo5zXu3Pv0zrjl1bVrKcPWUFadTeDHN3XTBUFajfBFaPboJje1djSb2rUFrxzSh1vX8DXUMjeoOpq4+Z6jH3lt/fdGUfn67Ls1+px79KdbTT3YAAEAASURBVPb1XgPhkbdp7f4IXQvW7foJLydlESb3Q5VjCwI5hUB0dDTxC2Z7Ap/2rEKTX09+OORs6HX6ddUB2ikEoKyyJeuOGcSmKuV8aFr/x7Kqe/TjigSEZ9HkGTPomaee0jydOOdSZs1asYn7adiwIX366aeyy4SEJM//ZcuW0YABA2QZfoAACIAACDgOgZ9++onaCO/Ynj17Os6gMBIQAAGXIADBySVuIyYBAo5JwB4eI2qmymNEHae1teQxUqG0F7Gnht6Ux4i+TO2PXXLSsPCeT4ROa1DNRy7cl/BLyluzcnPaC1aWPEaqBntTlbKFidtVpjxG1HF6tuwxogweI4qE+e0VXc4g5p8vT3J4N/NXpF3ap2VyHqhFmy6mfYGocSg0WuZ9UpX9fQvSqB5VRIgaVUI0rFslg5gVe+s+7T5zM7mC2FvxKE+JKpz0Sg3DnHh+nz5fldzd8qoqFrdrHnlqcQUW0caI6zhsoDJ38Rn6+qXqhrb+PXZDnbZ66+edX6sbE3df28cOCOQ0AitXrqQmTZrQs88+S/zkKcz2BBpX9qEVox6nho8lhdi7J/IobRDeRgvXHKFToVG27/BRi6FhMfTD4j105nyk1sfTzYNp9qBkAUw7gR0QyACBScIb6dlu3WSuJc65lBnRaeqiRdKzydPTkxaJ/e7du6c5on79+tHPP/9MQbo8UmvXrqVevXqleS0qgAAIgAAIZB2B2P9n7zzApCi6LnwlhwWWvLDknDOSJakgSUEUfgQEEfwEEUVAECUpggpiwIyAgEiUIBkRlAyCknMOy5JzBv8+tVTT0zubZ2YnnPs8s52qq6venp3pqVP33suX1cXWrl3ruYvySiRAAgFB4OFoUUB0l50kARLwJAF/8xjZcviSHDh+xUSI8GQz3q0mX3YuJ0PbllQhxN5uXcxBkDIL21boMWID4gWbEPZcbQ3Kh5jiIUShdXtjFmEOnXHMBda2Xl6nzWpnEbNQ4JDhXWc1qxde9TJZJF3qyMISRKd6FbNbT4u0fubyLYf3dNdGBSKVwQ4IUE8+GmIeO2rrh3kgmpVkSR4+ltx3w/2I5tI8RAKJTuD06dPyzTffSP369aVHjx6CQYCMGTMyzIkb70xOI3Tq5y+XlVb180iyByL6oSPnZOai7S4Xns5duCF/rD8k0xdulXPnH3qddG9ZXN55Jr8be8mqA5HASCOsHQRr5FxCTqf4iE4IoTd62nQpXry4rFmzRnkvxZZlvXr1ZPz48Q7nrF69Wlq1ahXbKliOBEiABEjAzQTu37+vroDcezQSIAEScCWBhyM7rqyVdZEACZCAQcDfPEamrXL0XBr4QkkJsYQAw01vUTVUeTzF9Aagx0hMhDx/PGfmCA81XPnO3fsOIkt8WwNBp4kRDk/bhD+O6NUol3ahpmTudE7Llsqd3mH/sbMPBafzV287HCtpePJFZbkND6rozN6eY4Yn2JyNYU5f+09cNasKs7TH3BnDSvjFW2aJDOkfejuZO7lCAn5IAELTZ599Jk2aNJHhw4fL/v37VS+DgoIEoU5o7ifQs2lhmdTnUWnXIJ9keZC/zyo8/bv7lFy4dDNeDTkadlnm/blXfpzxt6z/56jcNb5fYPlzpZfBL5aUtjUffkfE6wI8iQSiIDBy5EglOu0+fFie6dVbdhnL2NruY8cEofRCQ0Nl2rRpkj591M8RUdWZP39+GTt2rIPohBxPzz//fFSncD8JkAAJkIAHCSAXL40ESIAE3EEg8nRnd1yFdZIACQQkAXd5jAyfslsJAtpjpGqRTNHyjYvHyAeTdpp1wWPEWvexsw9z/CAMWQ0jHI8ze6ZKTtmwI+pwPHH1GNEh+uwD/86ubd9HjxE7kai3c2ZyFF7OXbkt2TKkjPqEWB5pWyePzHoQZnHT7vNy9spDUcVZFcct7zMczxbsvA3ZbGLnMYtH0cnzjgOjmYKc14H6g9M+DLuIbbsdtbVntJEvKjZ24+a92BRzKHPm4sN2Z38w6OtQgBsk4EcEIDRNnjxZvcLDw1XPIDJdvRoh3Pbs2TNeg7x+hMijXcmfLa289lRB6VQ/v8zeECbzNpyS/UcvCoQnvGBZMqeVPDkzGqFFM0jGdKklKE1ySZvGURy/eu22nLl4Tc5cuC6HT1yUA4fOOvSjZMGM0rxaDmlaKYfDfm6QgDsIQHSCzZgxQ3k6TRwyWIpbQt05u+buM2dVWYTRGzNmTII+h9KmTatC8cGzCWITbP369dKgQQNZvHixs8tzHwmQAAmQgIcJ0MPJw8B5ORIIAAIUnALgJrOLJJBYBJx5jCRNkjB3be0xogfw4TFiFYWc9dUu1MTHYwT1hp9/KDgVCA1yyKljvW7uzGmsm5HW7e3RHiORCho76DHijIp79uXM6CjKhF246RLBKZchZBXNl0H2GCEZYVNsnnL23qRK4ZhT7M5d5zPPbt1xFHRSJXc8z15vfLeDUsWvXmsesthe+4oRdlBbDpsAqPdzSQK+TsCZ0NSwYUPZs2ePHDp0SHUva9as8swzz/h6V32y/alTJJH/qxmqXmv3nJP9p67JzuNX5Uj4DTl19pps3nZcvaydC86QSjIbr9Pnr8sVm4cpygUbHptFDG/Vp40JKY+XyWY9lesk4HYCAwcOlB07dsiuXbvkmbd6ybDXXpMWdes4ve5eQ/Bu16ePCum5cOFCKVGihNNycd2J/E9t27aVlStXqlN3796tPJ+0CBXX+lieBEiABEgg4QS0hxMFp4SzZA0kQAKOBCg4OfLgFgmQgAsJ+JPHCLBYB8MzpXOc0WzFFmzkdorO6DESHZ3EO5bLJhQeNULClTWEIldYu7q55d1xEYLTzD+PS9ZovHfyZHX0tDplCF85nJQ/bQk/hzbmyfZQ6MyZKZVDs+0h9hwOxrBRKCTIoUT5opmkYqFgh33ONoLTRv0/4qz8lRt3leeiPhaaxbEPej+XJOCrBODFpD2aIDplyJBBOnXqJLVq1RJ4IUBsypkzp5w8eVKFnMqc2bkXra/23xfbXa1oZsHLaluNyQOrdp2V8Iu35bQRZu/0hVtyDstzdyV39rSSNCSNZAxKIQVzpJXCOYOkcI4gyZPl4eeztS6uk4AnCCAc3qJFi+Stt95Snk4Ilbdx9y7p1769pDc8kGBJjDJ/Hz0qr7zZU4lNEIhcJTbpPk6aNEn+97//CYQsWFhYmMoPBSGMRgIkQAIk4HkCWnDy/JV5RRIgAX8nQMHJ3+8w+0cCiUiAHiPO4dNjxDmXxN6bw+bhNH3VCZeFPKpXOpukSplUbt66J9dv3pUjYQ9zHdn7bR+Y/GvnWSlfILLA8+fOMw6nWnMxZTIGO62GAdKoLCoPKl0+d1bHgdI0hsdT5yfy68MuW85cd8KhrpwZHYU3h4PcIAEfIzBq1CglNkFoyps3rxr4bdmypSBZ86uvvirbtm2TihUryqZNmyR16tQq74qPdTFgmlvGmIiAF40EfI0AhG2IT8ir9Ovvy2TDzl3So0tneeLxJ+SnmTMFn1MIozdixAiHvEuu7Oe3334rvXr1kunTp6tqr1+/rj4Tt2/frq7tymuxLhIgARIggegJaMGJHk7Rc+JREiCBuBOg4BR3ZjyDBEgglgT8yWMEXU5neC5dvHxb9f68kd8nvkaPkfiSc+958MjJZngGnX6Q/wgh8I6euyF5Midc+EAoyRa1csnk34/E2Ikioekcyvy68ri8bAg8aQ3BStuN2/dkyh/H9KZalgh1TOidxRDQzhoz72Hrt58VeDnZhSgc++fgRSyitGRG20OypDZCSUWElFy95YxMW3Ncnq+eK8pz4nPgl+VHHU6rXiz63GwOhblBAl5KAAO4X375pdy7d0/Kli0rrxmhrCA0Ia8JPJm6desmW7dulZo1a0qWLFmU4PTcc89JgQIFvLRHbBYJkIAvE0B4PeRPQo644ydOSO9Bg0XwMgxi07Rp01zu2WTnBUEL+erGjRtnHipVqpSsXr1acuVy7bOFeQGukAAJkAAJRCKAiU8wLTxFKsAdJEACJBBPAhSc4gmOp5EACcRMwJ88RtDb7EZOGS04HTxxVe4bqXWcpaS6fS/iwS0qQvQYiYpM4u9/pVEBeX/STrMhk1YclXeeLWpuJ2SlzWO5YyU45TM8iioaYsum3efV5eAV1fqjdfJRx9ICMepA2DXp99M25Sml21M8fwbjmGPouzZ188oXv+7VRaTdyA0y5vVKZng+JVqtOibL/j5llolq5b3WxaXb6M3m4ZHT9siqnecMT6d8UixXekFuNRj+J44buc4uX7sjpfI4CmDmyU5W1u09b/5v4XD1MlkkJJgh9Zyg4i4fIQChacyYMXLVyIeC0HnvvvuuCpOnmw+xCZ5N//77rxKiMONf52yCIEUjARIgAXcRqFq1qgqxBy+jJUuWqMtgH0J8wgPKEzZo0CAlOkGQ11ajRg1ZsGCBlCxZUu/ikgRIgARIwI0EtNBEDyc3QmbVJBCgBCg4BeiNZ7dJwBME/M1jJF/2NAKvFxjCoi3fdlrqO0n+/S89Rjzx9nLLNZ6qECKjZu2Tq4ZgAptjeBdVLZJREBIvoZY1fUopa9S1Ze+FGKvq3byItB62ziwHr6uOIzea2/aVt52IYs/XyCXfzz+gwvihPLydnhm8WtKkSibJkj0il69G9NFel7PtSoUySv1KIQ7iFLym8IIlT5ZELe/cjRBbg9Iml2VDH1P7Yvpz0shR9d6E7Q7FujYs6LDNDRLwFQKjjdwoP/30kyB0HqxDhw4yeHCE94Duw6lTp5RnE8QmhNebO3eu9O3bVx2G5wE8oWgkQAIk4E4CEJYgMOGVWAahHd6ew4cPN5vQqFEjmTJlilSrVs3cxxUSIAESIAH3ENCCk3tqZ60kQAKBTCBihCiQCbDvJEACbiUAjxGrwWPEVQaPkdiY9hjRZbXHyM5jl+Wu4ZKxx/BWemHEhhg9RtrVzqOrUMv3xm8XeGZog3fHiu1nZPiU3XpXlEt4jFgNHiOvj9ki245ckjv3jIoeGOpEWLftRy/rXbFa0mMkVpgiFULou5ca5HfY3+/HbTJ7w0mHffHdaG94HcXG8huJ5/u1KS5oT0zW87miUjyXYxg+nAOvo+EvlYlUB8RSq9j0bJ3Y/R+9+1wxaVQtp9PmQGjSYhMKQLDD/1ZMduDUNfm/4esc2lPCyFdVOKejt1ZM9fA4CSQ2gR9//FFq164tn3zyiRKbmjZtqmbq28Wm8PBw6dq1q2zevFmCg4Plr7/+kiNHjsisWbNUF5o1a5bYXeH1SYAESMBjBODpOWTIEIfrtW7dWlasWOGwjxskQAIkQAKuJ6AFJ3o4uZ4taySBQCdAD6dAfwew/yTgZgL+5DGCQfDyRTPJP3siRKZ7xoB6j6//Ud4dyO90ycjvhH2xEQnoMeLmN14Cqn+ueqhM+uOInL8Ykf8IVQ2bvEt+Wx8mlQwPpcoFM6qE8SkeePU4u1TK5Emd7ZYaxTILvH+0BxUKpUzufO7HM4/mlLL5gqW/4f1z4PiVSPXlNd6PQ9uWjFacqWa8X6e/W016j90WqY5MwSmldZ080rhidpm54lik+u070hg5pAa2Ki7/VzO3fDhjt+w/dsVBZLKXR56zbBlSOuz+z9Cg9oddlY0HLsjf+y/Ium1n1f+MtdBbzxS2bnKdBLyawPz58wVeTTt3RoTihGDUvHlzqVevXqR2nzlzRnk2bdq0SR3bsmWLWv72229y8+ZNKV68uDRp0iTSedxBAiRAAv5M4MUXX5Q0adIIPJ60Yd8PP/wgTz75pN7FJQmQAAmQgJsIUHByE1hWSwIBTOARQ9GOeQpyAANi10mABBJO4Oe/jjnkkkGN8N7AgHp09t2SgzJ2wSFVJCRLapnzbvVIxVftOidvffevw/42j+eVHk0KOezDBrxUPja8jyAKRWfwGGllhCNzZgj/1fmLv1V4MmfHse+xctlk9dYz5nU6NykoLz+eL1Lx60Zunk9m75UFa2PnPbP603qSLAaPF3iMvDRqoxlGDReFx8i41ytGuj53RE3gzOVbRt6k9Q7CkLV0VPfUWsaV63jLHjlzXcIv3pRsRmi+fIYHVAxvhUiXh8fR/pNXDQ+6+5I3W1pJnzpizgmeAo6duy4QlIJSJpdUKZwLYJEqNHZcuXFXDoZfk2uG1xQMdYRmTi1Z0qWUR5w4Zx184NGkCjv5M6JLOalVIrOTI9xFAt5JoFWrVrJ//34lMkFoiir3yNmzZ5Vn0/r161VH9uzZI6lSReQpa9iwoezatUuF1cNsfxoJkAAJBCIBCPjwALUaBH14jNJIgARIgARcTwAepvDST5Eihezbt8/1F2CNJEACAUuAHk4Be+vZcRLwHAF/8hjJmTGVzOxXXd6bvMNBVAJN5MapYgyWD2pdQpruX+UQJswZbXqMOKPiHfuQb+nX/tVkyLRdsurfM5EaddLIqeRJg7iUP1sa9YrvdSFWFnMSeg/CUJ4saeJVbTpDtCqbL0Oszz1lCGbODILy8A6lnYYGdFae+0jAWwi8//77EhoaqvKQRNWmc+fOKc8mLTZt2LDBFJvmzZunxKYMGTLI008/HVUV3E8CJEACfk+gcePGMn78eJX7Tnf2tddek9u3b8uzzz6rd3FJAiRAAiTgIgLa/4AeTi4CympIgARMAvRwMlFwhQRIwJ0E/NFjBLyQX+m84Q2TPTiV5DDEKG1hhicUQusFGSJU6hRJnXp76LLWJT1GrDS8Yx05vuZsPCmrt5+Vc0aYPeQqqlE2q3zasYx3NNCHWjHv7zB5f9JO9b+BMJRlDO+7xpVzSK3imWMVitKHusqmkoAicOHCBYHX0tq1a9X2kiVLpGjRoiadV155RRYtWiQdO3aUQYMGmfu5QgIkQAKBSmDjxo3SsmVLh+4PGzZM2rRp47CPGyRAAiRAAgkjgGfPcePGScqUKWXv3r0Jq4xnkwAJkICFAD2cLDC4SgIk4D4C/ugxAlp5jPBheNnNKj7Zj0W3TY+R6OgkzrGioUHSJ7SIyDPGi5YgAk0q5TByRuWItQCboIvxZBJIZAIXL15U4aG02DRt2jQHsWnHjh1KbEIzW7Rokcit5eVJgARIwDsIVK5cWVavXi01atQwG9SvXz/l6dShQwdzH1dIgARIgAQSRoAeTgnjx7NJgASiJkDBKWo2PEICJOBiAhnSJJeRHcqIM4+Ri9duu/hqgVHd+asR3OBNRY+RwLjnvt5LZ7mdfL1PbD8J2AlcvnxZhdFbs2aNOjRx4kSpUqWKQ7G5c+eqbeQnKVOGHpMOcLhBAiQQ0ARy5colBw4cUHnxbt6MCMc7cOBAJTp16dIloNmw8yRAAiTgKgIUnFxFkvWQAAnYCVBwshPhNgmQgNsJ0GPEdYjpMeI6lqyJBEiABFxB4MqVK8qzadWqVaq6MWPGyGOPPeZQNXKSLFiwQO2jd5MDGm6QAAmQgCKQLFky2bNnj9SpU0cOHTqk9g0dOlRu3bol3bt3JyUSIAESIIEEErh//34Ca+DpJEACJOCcQBLnu7mXBEiABEjAVwjQY8RX7hTbSQIk4O8Erl27pjybVq5cqbr69ddfyxNPPBGp24sXL5ajR49KtWrVpF69epGOcwcJkAAJkEAEgRUrVqjPSs1jxIgRgheNBEiABEjANQQe4YCCa0CyFhIgAZMABScTBVdIgARIgARIgARIgARIIH4EIDa9+uqr8ueff6oKPvvsM2ncuLHTyiA4wZo3b+70OHf6NoH33nvPtzvA1pOAlxGYMmWKQ667L7/8UoYNG+ZlrWRzSIAESMC3COiQer7VaraWBEjAFwhQcPKFu8Q2kgAJkAAJkAAJkAAJeC2BGzduKM8mLTZ99NFHUYpJ8GyC4JQvXz555plnvLZPbFj8CLzxxhsyYcIE9X6IXw08iwRIwBmBUaNGOfxfffvttzJ48GBnRbmPBEiABEggFgS04EQPp1jAYhESIIE4EaDgFCdcLEwCJEACJEACJEACJEACDwkgoX23bt1k+fLlauf7778vrVu3fljAtvbrr7+qxPfNmjWTlClT2o5y01cJhIWFSd68eWX//v2qC7t37/bVrrDdJOC1BPr06SMDBw402zd27Fjp37+/uc0VEiABEiCB2BOg4BR7VixJAiQQNwIUnOLGi6VJgARIgARIgARIgARIQBG4ffu2EpuWLVumtjHw2b59+2jpTJ48WZImTSoQnGj+Q+DIkSOqM7t27VJLCE/z58/3nw6yJyTgJQReeukl+eKLL8zWTJo0SSBE0UiABEiABOJGQAtOehm3s1maBEiABKImQMEpajY8QgIkQAIkQAIkQAIkQAJOCdy5c0eJTb///rs63rt3b+nSpYvTsnrnL7/8IuHh4dK0aVMpXLiw3s2lHxG4e/eu2Zvp06eb61whARJwHYGnn35aIN5rmzp1qvTo0UNvckkCJEACJBALAvfv31elGFIvFrBYhARIIE4EKDjFCRcLkwAJkAAJkAAJkAAJBDoBiAoIo7dkyRKFAgOdr732WoxYTp06pcpgsJTm3wQyZsyowiz+9ddf/t1R9o4EEolAjRo1zM9gNGH27Nny6quvJlJreFkSIAES8D0C9GzyvXvGFpOArxCg4OQrd4rtJAESIAESIAESIAESSHQC9+7dU2LT4sWLVVswwNmzZ89YtevNN98UhF6rV69erMqzkO8QOHv2rGps6tSp1bJcuXJqOWPGDN/pBFtKAj5GoGjRorJ582az1QsWLJCXX37Z3OYKCZAACZBAzATo4RQzI5YgARKIGwEKTnHjxdIkQAIkQAIkQAIkQAIBSgAzQeHZtGjRIkUAA5t9+/YNUBrstpXA1q1b1WahQoUclnPmzJF///3XWpTrJEACLiSQOXNmJeSnSZNG1bp06dIYc+m58PKsigRIgAR8lgA9nHz21rHhJOD1BCg4ef0tYgNJgARIgARIgARIgAS8gQDEpoULF6qmtG/fXt577z1vaBbb4AUEtOAEjwsYhKfy5curdXo5KQz8QwJuJbBr1y7JnTu3usaff/4prVu3duv1WDkJkAAJ+DoBLTjRw8nX7yTbTwLeR4CCk/fdE7aIBEiABEiABEiABEjAywhAbJo/f75qFQYy33//fS9rIZuTWAQuXLggdsHpzp070rhxY9UkvG/OnTuXWM3jdUkgYAisWrVKdDjLtWvXSps2bQKm7+woCZAACcSVwP3799UpFJziSo7lSYAEYiJAwSkmQjxOAiRAAiRAAiRAAiQQ0AS6d+8u8+bNUwyeffZZ+eijjwKaBzvvSOCPP/6Qa9euqZ0hISFqeffuXWnatKmkT59ezp8/b4qVjmdyiwRIwNUEEMayVq1aqtrVq1fHOrxe165d5YknnhCdj83V7WJ9JEACJOBtBLSHk7e1i+0hARLwfQIUnHz/HrIHJEACJEACJEACJEACbiLw+uuvy9y5c1XtEBA+/fRTN12J1foqgWXLlplNT5EihVqH4ATxqUmTJmpbe8eZBblCAiTgNgKTJk1S4hEugPB6HTt2jPFaBQsWlL1798qvv/4aY1kWIAESIAF/IKAFJ3o4+cPdZB9IwLsIUHDyrvvB1pAACZAACZAACZAACXgJgR49eghmy8MaNmwoo0eP9pKWsRneQiAsLEysglOyZMlU0xBSD6YFp3Xr1glCfNFIgAQ8Q2DMmDHm/x+8ELt06RLthfVxCk7RYuJBEiABPyKgBSc/6hK7QgIk4CUEKDh5yY1gM0iABEiABEiABEiABLyHwJtvvimzZ89WDapbt65899133tM4tsRrCEBsunnzphQoUEC1KXny5GqpBacaNWpI1apV1T56OXnNbWNDAoTAV199JS1btlS9Xbx4sbz66qtR9jxdunTyyiuvyK5du+THH3+MshwPkAAJkIC/EaCHk7/dUfaHBBKfAAWnxL8HbAEJkAAJkAAJkAAJkIAXEejZs6cZVqlmzZoyfvx4L2odm+JNBOA5AXv00UfVUofU04ITdjZu3Fgdg+B04cIFtc4/JEACniEwcuRIadu2rbrYggULBDn5orIXXnhBHYLgdPr06aiKcT8JkAAJ+AUB7eFEwckvbic7QQJeRYCCk1fdDjaGBEiABEiABEiABEggMQn06tVLZs6cqZpQrVo1+fnnnxOzOby2FxM4cOCACqeXNGlSQX4vmA6phxxO2p588klJmzatnD9/3iH8nj7OJQmQgHsJDB06VDp16qQugpx8b7zxhtML5s2bV9q3by8nTpygl5NTQtxJAiTgTwTu37/vT91hX0iABLyIAAUnL7oZbAoJkAAJkAAJkAAJkEDiEejdu7dMnz5dNQBi05QpUxKvMbyy1xNYsmSJamOrVq1MoUmH1LMKTiEhISoHGApb8z15fQfZQBLwIwIDBgyQbt26qR7NmjVLMLnAmT377LNqN7yctm/f7qwI95EACZCAXxCgh5Nf3EZ2ggS8kgAFJ6+8LWwUCZAACZAACZAACZCAJwn06dNHpk2bpi5JscmT5H33Wlpwevnll81OaMHJGlIPB+HlBIPgdPLkSbXOPyRAAp4lgM/5t99+W10Ukwv0urUV5cqVkyZNmgj+hydOnGg9xHUSIAES8CsCWnDSS7/qHDtDAiSQqAQoOCUqfl6cBEiABEiABEiABEggsQlg0HHq1KmqGVWrVqVnU2LfEB+4/vr162Xz5s2CwemCBQuaLdaCk9XDCQcbNmwohQoVklu3bsnvv/9ulucKCZCAZwl07dpVvvzyS3VReLH27ds3UgO0lxOO4/+cRgIkQAL+SEALTczh5I93l30igcQlQMEpcfnz6iRAAiRAAiRAAiRAAolIoF+/fqbABM8mLTwlYpN4aR8goL2bmjdv7tBancPJ7uGEQhCdYAyrpzDwDwkkGoFmzZoJwurBfvnlF0E4VavVq1dP6tSpo3ZNmjTJeojrJEACJOA3BCg4+c2tZEdIwOsIUHDyulvCBpEACZAACZAACZAACXiCQP/+/WXy5MnqUgyj5wni/nGNq1evyvz581Vn9KC07lmKFCnUqjPBqVGjRurYhg0b5Pr16/oULkmABBKBQIUKFQT/izCEU33rrbccWoHcbLCZM2fKunXrHI5xgwRIgAT8gYAWnPyhL+wDCZCAdxGg4ORd94OtIQESIAESIAESIAES8ACBd999V/TMdYpNHgDuR5eASBkWFibPPfec5MuXz6FnUYXUQ6GSJUsqrwmITRs3bnQ4jxskQAKeJ5A9e3Y5cuSIZM6cWWbMmCFvvPGG2QgIxPhugP3888/mfq6QAAmQgL8Q0IITQ+r5yx1lP0jAewhQcPKee8GWkAAJkAAJkAAJkIDfEcAgXq9evWTs2LFy/Phxr+jfe++9ZyaDp9jkFbfEpxqB9zTsxRdfjNTu6ELqoXCNGjXUORScIqHjDhJwOYFRo0apz/qdO3dGWzfyNJUpU0aF2Xv99dfNss8//7xanzt3rqxcudLczxUSIAES8AcCWnDyh76wDyRAAt5FIJl3NYetIQESIAESIAESIAES8AcCCEH01ptvyvGTJ83ujPr0UxkxcqQ0aNDA3OfplQEDBsiECRPUZSk2eZq+719v7dq1smfPHmnatKmULl06Uod0SL27d+9GOoYd1atXV/spODnFw50k4DIC+A767LPPzPpy5sypBN/GjRtL3bp1zf165bffflMi8pw5c+T+/fsyevRoadGihfq++Oeff5RwVatWLV2cSxIgARLweQJacKKHk8/fSnaABLyOAD2cvO6WsEEkQAIkQAIkQAIk4NsEehphiZD/wio2oUeXr1yRLl26yPTp0xOlg4MGDZKffvpJXbtq1aoyZcqURGkHL+q7BHLnzi0YsIbXnjOLycOpVKlSKmzXm4YYSyMBEnAfAXzGI9dau3btBELwSWPyA757OnToIM2aNZPvvvsuktctvh+6desmEJ86deqkGqdzOS1evFj++OMP9zWYNZMACZCAhwlowcnDl+XlSIAEAoDAI8YHzH8B0E92kQRIgARIgARIgARIwM0EEDKvszFIt3P3bnWl5nXrSHdDeArNmlV2HT4sHxph9TbsiAhtNGLECJUDx81NMqsfPHiwCuuHHRiInDp1qnmMKySQUALwpsDA9IEDB6RgwYJSs2ZN5n1JKFSeTwIuIrBv3z41wQCTDK5evWrWmiZNGiUgN2nSROVX0we+/PJLwXdUkSJFZOnSpdK6dWuBd2O9evVk3LhxuhiXJEACJODTBDp27KiEdOSz27Bhg0/3hY0nARLwLgL0cPKu+8HWkAAJkAAJkAAJkIBPEkCOjKcaNlRiU9F8+WT2yBEy/LXXlNiEDhU39k0cMkT6GT9uYfAQ8ZSn0/vvv2+KTQijR7FJ3QL+cQMB7eGEkFw0EiAB7yBQuHBhQe6+BQsWSNeuXSVz5syqYdevX1ffQ8jH1rx5c/nxxx/l9OnT0r17d3nnnXdk7969UrRoUXn55ZdVeXg4LVy40Ds6xVaQAAmQQAIJ6GcVhtRLIEieTgIkEIkABadISLiDBEiABEiABEiABEggLgQgHD311FMqZF57I9zYXENsgsDkzDo0aSzDDCEKNsQQoGJK5u6sjrjs++CDD2TMmDHqFMxOZxi9uNBj2fgSSJkyZXxP5XkkQAJuIpA3b155++23Vag9hLXMZ/me2rx5s/pOeuKJJ6R///5SpkwZGThwoNy8eVOF10MYPtikSZPc1DpWSwIkQAIkQAIkQAL+QYCCk3/cR/aCBEjARQSu3XFRRayGBEiABAKEAMQmeCsFGaGJICT1fynCgym67rcwQu2h7OXLl6Vz585qGV35+B4bOnSo/PDDD+p05N1hKKT4kuR5cSVAwSmuxFieBDxHIEeOHCqX2qJFi2TYsGHy6KOPmhe/ePGiEpUQRm/VqlXywgsvqGNz584VhODDviVLlpjluUICJEACvkpAZ1ihh5Ov3kG2mwS8l0Ay720aW0YCJEACniVw8Px9OXvukmzYf15u3L5vvO7J9Rt35eade3Lj1j3JFpxKqhTNJGXzZZDcmVN7tnG8GglEQeCfgxdl7d5zUqNoZikYmkEu3hS5fe8/yR6URNImj+Ik7iYBFxHQYfFyGjmavu77dpReTc4uB9HpxOlwGT1tuhKdXB3m7sMPP5Tvv/9eXfq5555T+TictYP7SMAdBCg4uYMq6yQB1xJInTq1tGnTRr1+//13mTVrlsybN8+8yLJly9R6sWLFZLeRmxAh+GD4bnnyySfVOv+QAAmQgK8S0IKTr7af7SYBEvBeAhScvPfesGUkQAIeIvDrxjMyf2OYHDx+0fghGb2L05INYapVuULSSpkCGaR0nvRSvVhmCTHEKBoJuJvA7bv35cS5G3L4zHXZsO+CrNlxVk6dvaEuu2L7Rbl7/z9JlzaVZEyfSjJlSC01C6eVinnTSoY0VJ7cfW8CrX7lmWTktFi3fr0gX9OkIYMlfdq0ccbQvVUrOXHmjMxavkKF5IPolD59+jjXYz9h+PDh8t1336nd7du3F+RwopGAJwmkSsXnAk/y5rVIIKEEHn/8ccHrlVdeUXma4P108OBBVS3EJqtt3LhRVq5cKbVq1bLu5joJkAAJ+BQBLTjRw8mnbhsbSwI+QYCCk0/cJjaSBEjAHQTmbDwl3y04KOcuRAzYW6+RKlVyCUqbwnillAxBKSVL+hRy8eotuWy8Lly+qQb5j5+6JgvWnJQ0qZNJg8oh0qRSDillCFA0EnA1gXV7z8u01cdl9ZYzUVZ9xBBMI+ySWWb+HxGr2bKklaqlQ+SpijkkT6YUEpzqEUnGoLomJ67EjQByLnU2xKbjJ04kSGzSVx1uhNbbffiIyuXUyhCgEio6ffzxx/LNN9+o6rt06aJycehrcUkCniJADydPkeZ1SMC1BJC7CS948C5evFggPOF169Ythwu99dZbsmHDBod93CABEiABXyJw//591VwKTr5019hWEvANAhScfOM+sZUkQAIuIjB++RH5Zs5+admgqKzZEmaKTUGGqBQaEiz5Q4OlaP7MksYQnGKyA8fOy64Dp2Xb7nCZ9ddx9apZLps0q5xDapfMEtPpPE4C0RIIu3BTlvwbbnjfnZIjJ686lM2eLUhKF8khuw6elgzpUktmw5vpyrXbcvX6bSP84205c/aa3L591zzntLE9d/kB9cLOiqVzylOGQFq3eAYJSvGIWY4rJBATAQy+9TIG2S5fueISsUlf76u3+8gzvXonWHT65JNP5KuvvlLV9ujRQ3r27KkvwSUJeJQABSeP4ubFSMDlBJImTSqNGjVSr2PHjqm8TQixt3r1anWt8PBwadiwoRKjXH5xVkgCJEACHiCgPZz00gOX5CVIgAQChAAFpwC50ewmCZCAyOq9l5TYBBYzFu8xkRQtlE1aPF7c3I7tSsHcmQSv2pXyy05j4H/X/nBZ9e9p9WpZN4/0bFpIkibhYH5sebLcQwKf/rZPCZi370TMOsORZMmSStGCWaVU4WxSIFdGVbhyqZwPT7KtXbh0U8LOXpFT565K+Nmrctp4XTcEKdimbSfVa2xIeqlZJrs0q5hVCmdnXjIbQm7aCHz22WcyatQotTchYfRs1arNUCMH1Iddu8prhncSPKji4+k0YsQIGT16tKrvzTffVAnhnV3LF/ZdunRJJk+ebDYVM09DQkKkQIECkj9/fkmXLp15jCveSYCCk3feF7aKBOJDIHfu3NKpUyf1OnnypIwdO1bGjx8v9erVi091PIcESIAEvIKAFpro4eQVt4ONIAG/IvCI8QHzn1/1iJ0hARIgARsBfMh9tfS4TJz/UGRCkaxZgqRq2dxqAN92Srw2r9+8I3+sPyzbdp1U5xfKGyy9nyko5fIHx6s+nhSYBHqM2SLrtp81O4/3aQlDFC1VMJukT5fS3B+flfMXb8g+wzPvyImLcuzkRdMLKnnypPJY+RCpXzqT8coWn6p5jh8TQL6mIUOGyPTp01UvXS02WdENHTtOJsyfr3YhlxPC65UoUcJaxOn6yJEj5YsvvlDHfF1sQicOHz4stWvXdtpX7Hz11VeVoMY8QVEi8viBdevWKaH0yJEjkjdvXundu7e8ZoSLpJEACZAACZAACZCANxLABC88v4SGhsqaNWu8sYlsEwmQgI8SoIeTj944NpsESCB2BO7cExk0Y7/8vvaIwwnVKuaVmuXzGF4jrktkgzB8TWoXllzZ08mfGw7J/iMXpdtX/0ibJwtItyfzOlyfGyRgJ3Dp+h3p+PkmORF+TR1Ka+QPq1Q6VKqWySVJXOQplyk4tVQJDpUqRr2wdVuOy5bdYXL+wnVZtuGEepUoECxNHw2RFlUjyqiC/BOwBCA24ccovI5g7hSbUH//lzrKlevXZNbyFaKvHZPoBK8rfxKbwMFqhQsXNr6rksmuXbvM3chRhfCGM2fOlEyZMpn7ueI9BOjh5D33gi0hARIgARIgARKImgA9nKJmwyMkQALxI+C6kdb4XZ9nkQAJkIDbCNwwUti8N91RbMqSOa20fKqU1Kmcz6Vik7UT5YqFSJsmZaVgvixy9+59mbBgvwyettdahOsk4EBg74mr0rD/X0psSpo0iVQyPO86Ni8v1cvldpnY5HDBBxtVy+aSV1pVljpVC5iHdx68KB9N2S1fLTxg7uNKYBKAyPTUU095TGzSlIcbXiEQtmBadNKCl9pp+bN27VpBqD+YP3g2WbpmriIvFRLWw+sJ+UMqVaqkjh08eFC+/fZbsxxXvIsABSfvuh9sDQmQAAmQAAmQgCMBHfCKgpMjF26RAAkknAA9nBLOkDWQAAl4IYETV/6TT+cekFUbH3o2lSqeQ+pXyS/wRHK3Zc2URlo+WUImL9gmx45fkAVrjkn4xVvydZfS7r406/cxAgdOXZN2n6xXrUY+sWqG2JQja5BHe1HNELZCjNB9y9YdlDNGrifYhMWHBRnIuj5VUG3zT2AR0HmUIPjAcho5liYNGSzp06b1CAhcq+2AgbLHEFm06OTM0+nQoUOqPf4qNllhYzCgUKFCKsxgy5Yt5Z9//pHvvvtOOnToIDlzPszndv/+feX5tH79euUVhdxPJUuWlBdeeEGyZ89urdJhfcmSJSqsyt69exXz8uXLC1516tSR4ODIoWGRxwTnbN68Wc6fPy9nz56VpEmTSubMmZXXFcIcYjtQjYJToN559psESIAESIAEfIMAnhlpJEACJOAOAhSc3EGVdZIACSQqAYhNn8w+KGs3RYhNqQyBqfaj+aVCiRwebRfCoD1Tt5hMWbhNDeJv2nla2n++WSb0qODRdvBi3k2gzfB1kjFDSqlRqYCULpx4+ZPy58oobZuWlSVrDsiOPacUtMWbT1Nw8u63j1tah1xNvXr1MusOSpNGvu77tsfEJlwYwlZMohO8m/r16+e3nk3mDbCtILxez549pV27durI6tWr5bnnnlPrV69ela5du8qff/5pnrV9+3b5/fffZcyYMTJu3DipUqWKeQwrFy5cUPcbZay2ZcsWGT9+vBQvXlx++eUXyZgxo3l4xYoV8uKLL5rb9pW0xv0LZLEJPJhfy/6u4DYJkAAJkAAJkIA3EaCHkzfdDbaFBPyLAAUn/7qf7A0JBDyBh2LTYcUiNGcGebJ6YcN7wzOz8u03IChtCmlmiE7TFm2XK1duyp5DF6T9Z5tkwhsV7UW5HYAE2n66UfW6wWNFJX/ow8HcxEKRKmUy4/1aVLIb3k5/rN4vp85cl8lrw6VNtai9IhKrrbyuewg4E5smvT9EiufL554LRlNrTKJTtWrVZMqUKYJloFnNmjXNLsPTSBtEJS02IfdT48aNZf/+/TJv3jy5du2a9OjRQ/766y9JkSKFPkWGDh2qBCnsyJEjhzRr1kxu3bolELL27dunvKTeeOMN+emnn9Q5ELWsYlODBg2kVKlSkj59eoEXFo5b6zcvFGAr9HAKsBvO7pIACZAACZCAjxHQgpOPNZvNJQES8AECFJy8/CZdv35d0hgzi2kkQAIxE4DYNHIuPJsOq8LFC2eXJrWLuC1XU8wtiiiRzcgb1aROMZm5eJvcvn3PCBF1UUbNPyhvNn6YNye2dbGc/xAYOmO37Dt6WWoY+cS8QWyykq1SOlQuGQLppq3H5fOp2yVftiCpXjBxRFtru7juXgLr1q2L5NmUWGKT7mlsRCddNpCWSZIkkTx58sjRo0fVC32HoDRq1CiFoUCBAjJ79mwJCooIz1mwYEH5/PPPJSwsTObMmWN6RO3YsUMgMsKQG2rChAkC7yTY3bt31fsBuaOGDRum9uEPBCxt8ITr3r273uTSQoCCkwUGV0mABJwSQFhY5OiD1a9fX4oUKeK0HEKo4jsahvCoEPhpJEACJJBQAlpwYg6nhJLk+SRAAnYCSew73Ll948YNQXiOWbNmyW+//Sbh4eHuvJxP1418BY8//rgKY4IBAhoJkED0BC7c+E++WnxUVm88rAqWLxUqz9Qvluhik251vtAM8lTtonpTpiw9JEu3nDa3uRJYBMb+cVjmrjoh+fJkkscq5vXKzj9ZvaA0eCxi4OPj6Tsl/Oo9r2wnG+UaAsjZ1LlzZ7MyhNFLbLFJN0aLTkUfeFnpnE5ocyBbtmwRITjPnDmjMEAY0taxY0dTbMK+l156SR9SHkt6A8/l2t555x1TbMI+hO5DHqYZM2Y45IjKnz+/PkWmTZum8kWdOhURhtM8EMArCPUIo+AUwG8Cdp0EYkkAefV++OEHGT58uHzwwQdOz0KOld69e6syM2fOdPicdnoCd5IACZBALAlowSmWxVmMBEiABGJNwGOC065du+TJJ59UYToQluO1116TRx99VPr3769mW8a6xQFSEMmXEcYE9umnnxqhuK4ESM/ZTRKIH4HJa07JslURs66rV8onDWsWil9FbjyrRMGsUrFMLvMK747bJlsPXzK3uRIYBGauPSHfzT0gqVMnl3pVvNvLDXnPKpTOJWGnLkvfn3bIXeaV9cs3qRZwsIR5k9ikgUN0mjtyhDSvW0ftQlvfeust0W3W5QJpeeLECdXdkJAQtTx+/LjZfYTTs1pwcLBkzpxZ7Tpy5Ih56ODBg+Z6iRIlzHW9gjxMEJ6sliFDBmnbtq3aBQ8r5JNCXqhatWrJoEGDxCp8Wc8LlPXWrVurrlJwCpQ7zn6SQPwJIJIJxkZgCIdqnQSga126dKk5LvD2228HfH48zYVLEiCBhBPQghM9nBLOkjWQAAk4EvCI4AQX8IYNG5ohP6xNmDRpknIf167k1mOBvH7vnuNMcmv4kthwwWxXxN+nkUAgEPh9x3n5ZdEe1dUyJXJK7Ure6TGCBtZ9NJ9kz5bOvC1Dp+8117ni/wRWbD8jH0/drTr6WOX8kt0It+jt1qBGQcmfN7Ps3HdGuv+w1duby/bFgwA8m7Rw441ik7VLw40JS1p0godTq1atzLZby/n7OqIGIDweLG/eiO+8mzdvmt12lkNJh8pDjiVtqEcbwvTF1oYMGSKjR49WYfj0ORCfxo0bJ7Vr11bh+/T+QF2mSpUqULvOfpMACcSBAL7H9IQAfK5aDYPBOlRq2bJlVQQU63GukwAJkEBCCFBwSgg9nksCJBAdgdj/soyulhiODRw4MNoSiDn/yiuvyIABA8T6Yznak/z8oF1wii0XlPu///s/NQCAJNrr16/3c1LsXqATuHv/Pxk9d5/cuXNPqlTII40fc5zV7W18kidLKo8ZHljaDp+4LEv+ZXhRzcPfl9NWRXgg5A4NFngP+YqVLZpdNXXzrjOybu95X2k22xkLAsjfo/NCpDO8iLwljF50TYfoNMx4wQJVdJo6daqJCLmcYKGhoeY+e4g75GOCIATTAhXW8z0IU4h1q7cTtqMzeD41bdpUhdPbtm2b/PTTTyokoxa14J0f6J5O9HCK7h3EYyRAApoAPiv69u2rNpcsWeIQ9nT58uXmNnLmOfNC2LRpk7z//vtqDOCZZ56Rfv36yR9//KGrj7RE5JS5c+eqMH0Iv9qsWTM1ORhjCN26dZMDBw5EOoc7SIAE/JOAFpz8s3fsFQmQQGIScLvgBO8mu2s4fhgjmbHd8GMVD0kXLlywHwq4bbvgpOPzAwREJYRNOXbsmCD0nlWMQujCNWvWKF7nzp0TPERaQ6wEHEh22O8JjFt+TMLCr0rOHBmk3qMP80p4c8cLGXl7qhrimLZf1zH3hWbhz8uFm0/Jpt0RYk3JwhECjq/0t3iBrOp/DO2dsfakrzSb7YyBALya4KkCSx8UJBOHDJbiFgEihtMT9XALI7TeBKO98MiC6ISBuEAxDC5+/PHHqruYFY+cn7BcuR6GbJ0zZ47ap//89ddfetVBcCpYsKC5/8svvzTX47KC5PV16tSRd9991+E+UHBKGReMLEsCJBDABFq0aCF68oD1s/izzz5TVJCK4LHHHotECGVx7pgxY9QYAMZeJk+erMYAkLrAbhgXgBdq9+7dVQ4+CFMYq9FjCPPmzRMOQNupcZsE/JeA/n93Jmb7b6/ZMxIgAU8QcAzK7uIr4uGlU6dODrXiBynCbSBsB0K+/fLLL2L1gMLDzv/+9z9BqL3kyZM7nBtIG3bBCTHxJ06cKDt27BB4hNkN3mFgbQ+HgrIdOnSQX3/9VTAgQCOB+BKYP3++TJgwQZ544gmB91zJkiXjW5XLzrt4/Y7MWnVM1Ve51MOZ3S67gBsrqlM5nxwNuyQnjdc/u8/KlkMXpWz+YDdekVUnNoEZqyPyrQRnSC1lCmdL7ObE+fpli4ao9+vKf8Jlz+P5pGhoUJzr4AneRQBiE0Sn4ka+n2H/e8VnxCZNsYrxPTT305Hy6vCPZPHixUrsGDFihD7sN0s8T1+6dEl5KG3dulXglaYNz3+pU6dWm8jlBPHp999/VzzAAl5IGGDE4KK25s2b61U1gIl8T8gbiu95TFRC1AHtBYXrwluqRo0a5nM5JjTBKy537tySKVMmQeg4TH5C+GdrOKisWbOa1wnEFXo4BeJdZ59JIH4EkCuvd+/e6rMan8X4TA4PDzcn7uKY3TZu3Cj6Ow+TD1588UWV3wmiEcZUMJ6C320Yf9H25ptvCj7DYeXLl1ef7cjxh0FnvDDxN2fOnLo4lyRAAn5OQAtOeunn3WX3SIAEPEjAbYITZla+/vrrkbqCH59aFMEPMYgheNiBC7cWUvAj9uuvv5YePXpEOt8fdyCEycmTJ5W3EryWdu/eLXiAtBoeDPXDoXW/XodXEwQnxHZ+7733lFu9PoYH1oULF6o8B3oflyQQVwJ4H+F/U4deKlSokMq/1rhxY/W+i2t9rij/859H5dyFm1LY8L4oUdC3BrYwi6hiyZxqAB8s5m8Op+AUyzfF2rVrpWLFiuIsR0ksq/B4sdkbTsr2AxfVdUsYYlPSpEk83oaEXrBcsRBZ+fdhuXr1lszZeFL6hBZJaJU+dT4+AzGIg4EbPLf4ukG0wKuo4dE04b13Jb0RTs8XLdR4rpxkeDp1++gjU4jRA3C+2B9nbbZOzLIeh0cRQiFZrU+fPkpwwj7MfLfOlMc+JKe3DiZikPOTTz5REQZwHLPdnYViQlgnHZ0AIfS6du2K4lEang2KFy8e5fFAOMAcToFwl9lHEnAdAXxufvHFF0pswliIjlICjyR4ONkNoUu1LV261MwD1aVLF6lataoaO4DnkxacMKF1w4YN6pTq1aurib/6fC5JgAQCk4AWmujhFJj3n70mAXcScMuI1+zZs52KTfXq1XOYYak7BpFk7NixelMt8QAVncDiUNgLN27fvi34QQ4WI0eOFHgo/fjjj3L69GmH1k6ZMkXq1q0rL7zwgmKDECmIqawTQTsUdrIB1/unnnrKIYTJyy+/LJgBi1mvmOmKB8rs2X0rfJOTrnJXIhPAIBUGoRAjPF26dGom83fffacGuyAcY+Dy+vXrHm3lzqNX1PUe9THvJg2phCGUZUgfMTN96d+nJMwQz2jRE4DY1Lp1a8GM/KFDh6rQotGf4R1HZ6yK8G6C0FSqkO9+HoeGZFBAF204JeGXbnkHXA+1AmITQtsg9C9eGMjfs2ePh67u2stob6Cc2bIpscZXxSZNBe3/6u23lXiG7yJ/CK8HIchuOXLkUAOHnTt3lpUrV6qcSXoSly5btGhR+fPPP9Vgo96HJWa/49kas9vtBgEVOT+ffvpp0TmY7GWsz+TRhb7GdZADBCKWvW32Ov19mx5O/n6H2T8ScC0B5MbTnkyITqLFobfeesvphXQYfUzcxWevNkzIwnMKDCFntaF+PWEG5+J3HDxT9YCzLsclCZBA4BC4f/++6iwFp8C55+wpCXiKwCPGA8Z/rrwYBjEwq8ZqlSpVknfeeUfNSLfut69/++23MmzYMHM3Hrhee5AU2tzpoRUMnCOECFzMES4kNgaRCTHyFy1aJAsWLDA9tqznQlyDoKStRIkSTsvp49YlHiQR0qRy5cpSrlw5waACf8xaCXHdkwQQsgezyBGyQRvyR0AAbdSokVSoUEHvdsty9a5z0vO7f6VooWzS4nHfnUW9dO1B+XtLRFjAge1LSqMKIW7h5U+VIkQIwjvqwf5WrVrJ888/L/iu8UbbH3ZVXvhovWpawXxZ5PmGJb2xmbFq04btJ2TZqv2qbI9ni0ibWrljdZ6/FMIzzvjx481ciegXJo1gVjJeaYx8Qt5uGHzC/4wxwiQTBg30uTB60fHddfiwtH1vgFw1nuEwScKZuBLd+f52DM+lJ06cUM+yGTNmjHX3kDcUohIEIwhQiE5gF8AQFhvPyVjipwTC+uEaQUYusEAdtIAHOP63MMkLobCmTp2qmGsecV3qGxbX8+zlY1sPytnP1duxrUOXj2rpinrwfrPXH13b7WWx7awOZ+Viqjc29eg+c0kCsSGAwV+EQt2+fbsq3qBBA/n+++8jnYpJAPq3FsZIW8F/AABAAElEQVQX8tnyL+K7Hp7ZMIhKOlUBxiGsIVZxHJ/zmKTapk2bSJMVcJxGAiTgvwQaNmyoxnOQ09OZh7v/9pw9IwEScDcBlwpO+OEJLyYdGg+NxwPQtGnTVHz3mDqDBywMGOpZlKVKlVLx5GM6z5XHkYj5ww8/lL///tusFn3AgBJmDyE+vt2QnBNu7BiEsvbdXg7beKCzzjTSMfKdlbXuw8wmZyEKrWXis44fSugr2o9BiatXr6qBhdDQUBXzGfcgPoZ6kJ8L9xLM2rZtG2mwIj718hzvIwDhCclply1b5tA4iKNafLLOunMolICNbxYdlPGLDknDOkWlvBHqy1ft+KkrMnH2ZtX8dg3yyWtPFfTVrni03Tdu3FCiEz53EZIUhjj1yE2CgX9vssX/hsuA8REDB1XK55F6VfJ7U/Pi1JZTZ6/JuBkR349VS2WRz18uG6fz/aUwnmsgfCK3jjYI7lp4wnODNxryNeFzGWF6vjbCsdUvX84bm5mgNv26fIX0Gz1a1YFJEc8991yC6uPJJBBbAvi/glcBJqrpCRGxPZfl/JdAVEIWeuwq8UvTi+pasd0fUz26zdEtY6rDVW2JTT34nRtdW2NbR2zKxXSdKlWqxHoSBCavIpceDGkKMNHUboiGgrB5sbEDBw44/A7H2AW8mxBy324Yy4HApQUq+3FukwAJ+BcBiNpI6YF0CfbxHP/qKXtDAiTgaQKR43UkoAV2wQWDzHhgiW0Mc8ykbNKkifz000+qFZjZgxB02YyQL9o+//xz9YCUP39+lRgTs9pjsvPnz6tZx9G1A2IZQtBh9rLdMKCEF2YqIgSedQYRkiMjbEhsDTNurYbwPHofYuMjFn+tWrWUMIXZBtqyZMmiV122RPgU5AWweqhYK0fbELaqXbt2ahA3ffr01sNKTEJ4Frjn46EYIhXsypUrKkSgdSAOX2LDhw93OJ8b/kEAM+J0knKr8LR69WrBCyElMcCJ9zNikLvKthy6pKoqGBr7WduuurYr68kVkk5yhQbL8RMX5VD4NVdW7dd1YTY9PneeffZZFc4RMzYhnONVpkwZNUEguvBQnoQDDydtWTN5vweMbquzZUiWtIZnbTLDq+GubN5zXu7e/0+SJXnEWVG/3odnD7zwfvvtt99UbicMNmMABy9v9XpCKDa0s4PhheGPYhPedC3q1pENO7bLLEN4Qmi93Llzx3pQzq/ftOyc2wkgDyu8w/CikYAmoEUPvdT7uQwsApiUEluz/u63rlvPt4bLR5g8PZ5gLaPX7R6qKI/IMjoFALwzMcZx9OhR5eGAZ2o8X9NIgAT8nwC/m/z/HrOHJJBYBFzq4WQPD4f8RTpOcGw7CFX9pZdeMouvWLFCIC7BID4hnJw2CDRIYhydwXsHD0zwLJo5c6bTBMaoF2XwkBWTWb2uLl68qDy4nJ2D2c3Iy4SBTzxgIswOhBlnhsEfzCKyPjiiHIQn3SbkzWnfvr2z06Pchy8PPSPLWgheRx988IEgNnRsDawhKFo9siZOnChIWA2DkIAQV/BS69ixo+C+2Q3iI2ZQ0PybAARMCLeYnWcXM/F/Ub9+feUJWbp06XiDuHrzntTvu0JCsqaVjs9Winc93nLi6n+OyV/rD0rukLQyo2/sZit6S9u9qR14v+Fz6eeff1bNgnflk08+qcROeNwllvUav1VW/hsxANmxZSWBaOPL9vO8rXL0+AXVhU+6lJPHSjzMG+DL/UpI2zF7GMITvvswc1ibN3k9jRo1SuWgKlG8uMwa9qGIkTzcX+3ytWvy9Fu95KQx8I/JMpj8YJ804699Z78SlwD+z7TpQRz7Mqbj9vJRbbuiHvxOsNePeu37ott2Vkd05aOq3xX1uKIOV3C11gEWzl6ag7Njel9syug+63Psy9jU4YoyzurAvkC3atWqKTEnLhz0+AXOwfdXVGIVJqrqCZ743VXc+H6Pr2Gir44Q0LVrV3nbyItIIwES8H8CiBCyd+9eNdEckWtoJEACJOAqAi7zcIJoYw0n169fvxjFJggYEIwg9uCBCZYhQwaHvlkHCHQsY10gKgFHH8dSDzyibQh/gyTzVoP4gnjrWtjRxzBLqGLFioIQez/88IPZN7QBAhEe/C5divCw0OfoZVwf0qJ6iLT2HbHg42KYmdS3b18l0IEzfozA4GnUokULsz/2OvGgCXEOM52sTA4ePKi8VDCYCy4wa/4ozOqEff31107FJhxDOyg4gYR/G37s4IX/Ifx/Q3zCC56G2lsQnnEILYGwDXgVKVIkTlC2HLqoyidNmiRO53lr4eD0qVTTThgeTvcMj5GkAegx4op7g/cdQqL26NFDhXnE5xWEcLwQjkSLT4hR7Uk7FHbdvFw2H/dwQkfSpU1p9mfL4QsUnAwaeE/hMw8vCE5//vmnKT5pryd81rVs2dIc0DEhemAFzy3wWoZ9ZOTH9GexCX1MbzzHDO/+mrQfMFAQRnDw4MHK2xbHaCTgTgKBnjfMnWxZt+8RiI/45c0CWnz74647h1xML7/8sqoeEz4RQrZ69eqCScAIPY3f5/iNZR1fwRhBjhw5VAh9/Oa/e/euysf38ccfm820T4I1D3CFBEjA7whgwjhMjxf6XQfZIRIggUQj4DLBCckorYaBvegMAzII5wbDjGCIRxA7rPmNcAwPQtrOnj2rV9VSz8Jx2GnbsIbIgyhmN4RbgZiiLU+ePGqGvA6b99hjj6mBJGtyTQyaQySCtw9CNiG2stUguuzYsUPNDCpZsqT1UJzWrYITwtTFxTDTGiIb2G7btk15WuF8zJiyCoO6Tngw/fjjj4KlNtzTL774wuwfzoNYtWDBAkG/goODdVH1sIpB3ejCC65Zs0YloY5L4mrzAlyJRED/6NEPCXobS+zT2zjRvk8fc7bU5+rznJ2LY7qcvQ5re5BoHJ5++F9du3atEjIxgwbvZ4R0xGvYsGHKUxA/fjAwGxtbt++8Knbrjn/M0M+cISLMmqE1GWH1rkuhHA8/92LDg2UcCeCHMgb9kPx4/vz5KjzIypUr5d9//xX8oK5Tp44KeYal/qx3rMG1W8cfhErMlDGNJPEDMTEoTQoT0PVbET9SzB3xWMFng9UQLjFdunTq+18vrce9fR2e3Tq8jVV8QiJevJDkG+ITQpEmZDZyXDhAcIF1NDyliwQbE3se5LWISx2+VraK8ZzS3Aivh9B6M2bMoODkazeQ7SUBEvB5AhjA5CCm+24jPBMQ3hd5JZHTCb/b8bLa2LFjVXQJ7MNveeuYhrWcXsdYCHLR0UiABAKDAMZyaCRAAiTgDgIuE5xOnDjh0D7EBI7O7Ml0exszbiFgWPP8VKpUySH/E0LWWA15YaIzhFeyiit2L4pVq1apwR9rHcjjpHMRYT8GKDFj3mp4ENMGTw20W+ed0vsxuxkvJLDv2bOnWM/RZWJa6oH7mMrFdPzIkSOm4IS8WnZDwtExY8aoAT7rMSQOxEMrZmQjj5M2DNiivwgpqA3eUO+9957eVEuE0IMXGO6tto0bNyovA73tziW8tLTIYRVFrEIJru9MULGWt6/r+2Ldb60T+2H2fdgf07k4T9drP99eJ7b9xbTnE8KeIXRETLbneIQAe+dOwge7Y7qWJ45nzZjavMyN23fNdU+u4P/FFYaBBXg/IkxoihQp1Avr2GfdRs4+dxuEJ4RoxWvfvn0q3w4G/CHE4wXzhPiUKmVSuXnrnsp9pC7q43+sgtMNo18JMXxGt27dOt5V6PcWcjTiPaZf2MbL+p7T69b3IvZB4MLkFr3EOsq4yvAdixcmceCZAp7TI0aMUC+E3cUxhBqFIWxvUFCQqy5t1rNkyRK1Xv9RIyxxAP2w7G54sENwgsHTyTqRR+3kHxIgARIgARLwYgIxRXTBZE9EEMFzhT2UObpljZISU345iFfdunVzmFTqxWjYNBIgARcQ0GNXnBzgApisggRIwIGAywQnu+v1oUOHpFixYg4Xs27YH54gDGE2utVefPFF66byorHu0LmdrPv0OgbrdX4hvc+a/BLu44MGDdKHzCXc0jHYhLpv3bqlBinNg8YKvDCKFi1q7kISziFDhihPJ8Q6xqCm1WbNmiV4oS9dunSJMgaz9Ry9jjZquxfHXAvWASsd7g512cP3QQgbN26cyjGlr2VfwssL4fm0GIiBWrjpIxxhVAZPFTz84j7gPF3W+tAb1bmu2I/7gFCJNN8iYA35EF3LU6VIqg7fvp2wwe7oruHJYwgNmN4Iq3f58k0JDkrhyUurayV00D8+DcZnpxYAIBpo4UCv62OoG58jUb20kIvj+Jy0but17MdxvY3Pxzt37qgXPs/wgukHbZSDUO8q04LT3bv+IZCmS/vwPXr91sPvqfjwQm4DeKNZ857EpR59H69evRqX07ym7NatWwUvTNCAxSfXQ2w6A08xeJZeDjuFB5nYnOIXZdIZ+TPTG//vl433B8Umv7il7AQJkAAJ+D0BTLqNy3MoPKbxwtjByZMn5ebNm+oZG+MzmEyjDV79mMCrUyHg2RjP3Yg+gu9I+/iMPo9LEiABEiABEiABEogrAZcJTvawRJ9//rnAzRuDis4M+TSiM3ji2PP96MFAfR4ekqKy2bNnq/Bx1uNWUQwJ8ezikC4L8cueL0ofw+whDITaDXmNFi5cKEjYOd7IVYTQdVaDRxBeEEGQ48nOy1pWr1tFJohfzgzhonBNxGyGMKQtW7ZselXlbTI3bCsdOnSIVmzSxe0eWvBu0iKSLqOXH3zwgTRs2FBtwosB93Hy5Mlq2x4WUZ/j6mXhwoXVIKYeZMYAMkwPOGNpfeGYtaz1mH6f2ffpbV0vtu116GP2/fpcZ0tdVp+ry+j92Lb/L6CsNxv+py5cuKBe9oFhCLwQQjNlyhRrT8DUWnDyk5B6uHcpU0R8VganTe7xW4lBbuSe0TlePNEA/CjG6/r1h/mN9HXxGWsVoOzb8D7Bj2L8oMZnI0QHLPHS+6yCva43piX+t2C5c+eOqWicjkNwgt3xk/erfq+iTzdcIPrCi1azR53eYPi8xXsTn11Y6he8t/He0ku89/R72dk+6/d4bPplDWsbm/KxLdOpUyf1/z1+zmypX6F8bE/z+XL9vvpKiU0Q3GgkQAIkQAIk4M8EMO5i/81u7y/K5MyZ076b2yRAAgFKQP8G87XxpQC9Xew2CfgUAedqUDy6gDB0eMBBaDUYXLqRM6BPnz6RQrXhOAQBhJpDSDpn9r///S9SSJuQkBCHogiN5CyPE4Qku3cTTrTO2kHCTG0Y8J45c6Zqiw47o4/pJcpgBnLNmjX1rkhLDJA2bdpUvdD/X375JVKovalTpwpenTt3ln79+jm0yV6htb8YrLcb9kG8gkEgW758uVkkS5Ys5jrEtahECrvHk3mSZQXnIi+V1dA2ZzmxcD+s4fdwDkIEabPn+tL73bHEADot8QjgXuN/FC/M4Lcb8jsh1Jl+D9uPR7etBad79+7LpSu3JEM614W/iu667jqG/7Fz564ZnwdJJF0ql30sx6m58DKB8ISHTQjF+hXVtnW/dR3n2bft+3DcXsa6HaeGR1EYA/0Qn7QAZV9HuM8NGzbI5s2bBXl2YBCyMMMzISHenDUnKBVExBtyx088nG5Zwj4mNKQeeOF7CO8/fzQIUlq0Qhjfv/76S+VVPHz4sEN3MUkEzxDx+Tx0qCiKDQhO06dPlw3bd8j4efOlQ5PGUZT0n92/GqH0fl+/QXXIPoHJF3q5dOlSJaZb24qBwphypFrLc50ESIAESIAESIAESIAEoiKASXY0EiABEnAHAZeNbELMef3116VXr15mOydMmKCEnHfeeUd53+gZN5gNjJwtzgah9cn/93//p1fNZenSpc11rCBnEBJzW2fpYEAH7cAAj93gQl7SSCINs+YrQag7JO7+4YcflFAGgUbnf4IwhmsgvwLyQcTWUB9C7UE4g1CFsHVWw7WQ3BNhhJx5TKGstV/OYi7v2LHDrPLgwYPmOlasghNYIMQhZk6nMcLLWG39+vWRPMmsx5HzYODAgQ4eXxCUMDhsz9uFcIM67J61DuuMbXtyeGs5rvs+AXiwLViwQPA/hBxmURkGP1955RWxeh1GVdbZ/tQPPEZw7EjYRSmTLruzYj6z70T4FblviE6JJTZpUMgl4y+G7yRMFMDLasuWLVPvTywR4hM5+JAcuW7dulKnTh23xK3PGpxC9h8TwxPGP0JA3rR4NeXO5vidYmXNdVHfk4sXL1Ye0FrYBBcImxB4q1SpopYlSpRwKy5cD7kakftymPE8Ujx/Pqny4HnIrRdOpMp3GYLehw+eu+DdhOcYX7MePXpEepbF59nOnTt9rSsJbi88ozEgAlHWGh4quooRVgq/M5A3DaGl8YyK53mIj1FFX4iuPh4jARIgARIgARIgAX8jQA8nf7uj7A8JeA8BlwlO6BIG7eAJYxU/IHb0799f9Rg/lCHaRBWKzYoFPy7tIVAwMIMBUS0WoZ4mTZpIvXr1lDizceNGWbNmjbUah3WEdRs6dKgKf2Ntg1XwgVCEV1wMnkYYGMDgEULbWcUeiEaDBg2SV199VbFBuD1t8+bNUzxGjhypdzksrYPxEOgwUxo/trUhRJ+2Rx99VK+qJbxHrIbZ/LCCBQtK2bJlleCH7R9//FGQN6d9+/YqfjP2wSDOwdsLwpiVFQQ4fT8hYlkNAzoY1LKbNZcX6sLM7nxGDGma/xDArH2ElMTLmTceeoowmpiZjXCLeB8mxFKnSGKefjTskpQp4tuC08kzV1R/0idC/iYTpB+vYMAR7018punvpxo1akj37t2lUaNGghCu7rSKBTPK2m1nje8e/5hBZvVwypuVgpP9vYOQs8gLBuEd7zsd3hHfexA1q1evrp4XnH1f2uty5TZErU8+/FB6G5OAun30sUwcMliK++F38WXjubPdgIFy5cHEIwhtnmbtivuGfBx6shGeAZ1NpHLFdXyhDgiliKCAZ2yEto7OIEx9ZYRSjKocvO7h7WefgBVdnTxGAiRAAiRAAiRAAv5IgIKTP95V9okEvIOASwUniCEQMCACOfthjH3O9jtDARHG2Y9FiDfPPvusWQ8EDPxwdGYIWwcvIC1CTZo0SeUpsQpCOA+h7yAIwWsnPoZBTHhz4PXll18K2o6BdWsIP4hHCDHYsWNHGTBggOn9MWPGDHnttdckf/78kS5tzcOEg2hnmzZt1I9ucLaG/8N+q1nFKuyHqKQNniXWsD0Ia4gXBl2RRwezQp3dJwhVuK6eXYoQVdogeGFAwJkhESmEKp0zC+IEBSdnpHxrH2YMYzAVHk3WmfvWXiD0ohaZMMDvKisY8tBr5bghOPm6nT4fkccomIKTy24lvhvmzJkjyHOnc+phAgC86yAyISGzp6xyoYzqUggBecvwDkr5IAeZp67v6uugD9ooOEWQuHHjhmjvOYS3hegEQ7hACAfagy6idOL9ff6FF5QQM8SYfNP3y9FKdEpv8wJMvNa55spWsQnPkb7qufnFF1+YQJAbExOAaDETwEQCTOjSBoEpb968SgTGsy1CUGNynDUigy7LJQmQAAmQAAmQAAkEEgEtOOllIPWdfSUBEnAvAZcKTmgqwqchbNonn3wiEydOjFXr4V1Tq1YtJQZpoQMiEgZo7Dma4H2EWcMQk/Cj0ZnBk2rYsGHy9NNPq7ZowQllESrvscceU4ONehASsyZHjx6tZrs7qy+mffA80ob2I4wewgd26NBBDTYhZBPEJyQdR3gPe7uPHDniVHCyizIIIYiX3cAcuaOsZk96b53BD6bPP/+8TJs2zXqK8mSyejPpgzgXQtnLL79sik04hh/sL774oiqGsInRGc7XZTBTl+a7BOChBoFy0aJFcuvWLacdgReTFprsIc2cnhDHnVWKZDLPuHDxupy9cEOyZExt7vO1lfCzER5OdUpn8bWme1V7d+/eLStXrlQva0hHfJdAZMJnnzvejzFBKJYrnWTMkFIuXLolx8MvScHcD9+/MZ3rjcf3HDpjNit/9ofir7kzgFa0JxPEJkzWgOH7Hp+BCN2Fpbd5UnQywgjvNP5XZhi5KyHOzBkZvceIL93Ofsaz3G7jO0qH0YNHDC2wCOB/DoITJkl9++23Znhq5B2tXLmygoFw0jQSIAESIAESIAESCHQCWmiK7+T7QOfH/pMACURNwOWCEy4FbxrMxnzBmEmLPE4Idae9WyBeII46PF4Q3gVh+LQnz88//6y2dXPhhYMZ6gjFZTXMUodnEAQtiCaoG4OIEJKeeOIJNbCovXAQ5g7l4JmzZ88eM4dTv379lKeUrhezYNFunZ9I73e2RO4lDCwhTB2uiRA56JdVrIGIhRxOsTG7x5U+B7HmreHv9H7rEv3GrFd7PHqELuzWrZsKKwKRzurhhPM//vhjNfgKfhgw00KftW6E/Wnbtq0SDqyh/HQZ9Hv27NlqcK1MmTJ6t9MlcnLNnTtXhUP0xeTdTjsVYDsh9CI0kT0PF7zicP+RYw3vV6zbPexcjSpLupRGDpIMsutQhHfTsVOXfFZw2nXwjJx+EFKvbmnHUJiu5uZv9cGrBO9HTCqA0ATBSRs+Z1q2bKkGGOFlmdhWpkCw/PlPuJw4fcWnBafT564b33XXTJz5AjCk3oYNG0xvpv3795ssMJgNoR3PIc68ls2CXrAy0pg0YLh1q2cpiDTDDE9rXzf049flK5TYhGcbd+XFwjPn2LFjTVwQtzChZu/evcqjEh5u8O6FN76z551NmzYpz2DkYsJnGJ7R8J5BeGhXGQYPfvvtN/X5CE9/hBQsWrSommyEpTaIMMglCoMnHvKV2u3XX39Vz/HYj2dnHZ5w1qxZ6rkOz58ITY2JVnhex7NhypQp7dWYufPwv4HPZpwPj3eE0EZ+VUzWsuYuRRjsbdu2qXrwTA2DUIQ2WA2sEdZaGyZg4RkEzyLW3KsINa2f1ZkgW9PikgRIgARIgARIgARIgARIgARcT+AR40fpf66vNv41IvyRNdwbfhxC1MAPWVcbwmnYw/EhzNJbb72lfqgGBQWpS+oQHPhhjOTfWjzDQXhSIZzdiRMn5PPPP5epU6fGqZkI5de3b98oz8HAlrMZuhCaII6BlV1MslYG7ynMrrbndLKWwVsAAho8sO7du6d+oOPHuhbtrGUTsg5PMPzIdzYQkZB6ea5nCGBQ6rPPPlNejFpYwoAOXtY8aJ5pjcjohQdk4uLD6nKFC2SVlk+W8NSlXXqd6Yt3yn7DYyRfaHqZ2jti9rVLL+CHlSE8KoSm1atXO+QMQ+is5s2bS+vWrb2u19PXnJAR03ZLvjyZ5P8alfa69sW2Qav+OSor10fk76tQLJN887/ysT3V58vh8w9iAnKCacOkFnho44XPQl8zeIsjPG+LunV8WnTSYhPEG4hNWhRxx/1YunSp8vi21o1nNXsuTRz//vvvHUQnhF12Fi4aZTHBB3lGnZkOqYdnPwhV0RlELAgweF51ZvBQhhgGQ34xvG/xnIvn35mG15vV8HyI9zgmWmGiGCaeaIPHPSaV2Q2Tyr777js1AcV6bPjw4fLNN9+oevBZbY+CgL6BbWhoqDoNnvF//PGHtQqn67jn8LiOySDAIYQ1DB77ziIGxFQHj5MACZAACZAACZCAPxHAMxme8zD5B6kSaCRAAiTgKgJu8XBKSOMQ8qhPnz7KAwf1wGtIh39zteg0cOBANVhp/QGNMHvwxoFB7IJZPZfUDsuf27dvqy38QIbXELyKEMIDg1L44HZm+FGNGaDIJVKxYkVnRcx9GMD46aef1I/3Q4cOqfLNmjVT4QZjM8iPuPUxGdxn9Q/8mMom5LgzL6mE1MdzPUvgzTffFLy8xcrnDxYdtHOf4SUUduaq5MgaIRJ7SxtjasdJw9sFYhOsdumIz5uYzgn041r4BAd41yF8Eh6UMTvfHkrUm1jVLJ5ZvkqVTE4Z9xyDuL4atmD/4XMm1mrFAus9qz1B4ImCF/LSIaStLxtyTuIZC55BMF/0dPKk2ARGhQoVknfffVeOHz8u48ePxy71jIZnRgh4p06dMvdDVNFeTvD212ITyiIkMcIvIvwbwj1DSIenE54PE2Lw6NdiEyaH4Pp4VoU3PISlnj17Ku98TESCdxImTeEYnn/Dw8MdPJThNaqfZfE+sRqeTzExC3XDAwkTAFA/yiNXKIRMZ8IfJm3hhWd6eARCVDp48KA6F+GtMZELhuvB0x4GwQ2GfEyIjGA1fA/EZPDSsj6/4D7RSIAESIAESIAESCDQCWj/A1/9bRro94/9JwFvJuB1ghNgQbSBxw1+fMPw4xU/MDE70ZXCCMKgYPYpZnviR67dohOaULZFixbqB7H1PAg8+scyPIbgYYTQexCZ8MMb3khYJkmSxHpatOsYfEjoAES0F+BBEvBBAjWMwe5HS2aRDTvOqtbvOHDa5wSnbftOm+RrGYIELWYCGDTEA3GFChVUuDxXe2LG3IL4lciRMZXULZ9dFqw9ISfCr0iukPTxqygRz0K7w8Ivmy2oXjTmgV6zsB+sIIwaQt3GZoDbV7qL5xF4BGFg3xdFp/Hz5qt2lzC8XKa62bNJ31OEhINgAU83LThNmTJFhdPToRQPHDigwnxavZHwrKkNnjx6UlMXI6cWRHM8cyJsbUKe9yD4IIcqDB5L8LrXIZebNGmihHkcg3e/jiaAfKcQnGAQieA9rw3t1GbPqYrQddb8ofCQx/8IxCE8tyNcMyZIOTN4Lw0YMEA9CyNEnvaygiin7amnntKrypMKoha8meIqFiHkqhabwByCHMLw0UiABEiABEiABEgg0AlowSnQObD/JEACricQe9XD9deOtsbBgwerGZK6EH6IW8PY6P0JXWJ2ae/evVWYEMzyjM7wQxXh7TDLGT9gsYwuGTiO4ccxBhKQ3wZiVHBwcJzEpujaw2MkEOgEnq0eEXoHHHbvPy2379zzGSQXL92UXfvDVXsL5E4vpfNm8Jm2J3ZD33jjDTVD31fEJs2raeWIQc6NO07qXT61XLvlmNneInnTS6EcvuVRaDY+nivIb+NPYpPGoEUnTMKB6ASPIV+wn+YvkGHjxklxIyeRp8SmqLjAw1KLTSiDkHUQcmrXrm2egudGGLzotdiEbXira68dq0CFY3E1nesI50E40mITthESDy8YPIq04flUe+rB28pqyL0JgzdTdBO+EJoPnk4IC4gJVjDktIrKGjVqZD4Lo40IhQrDZDNXGsILInweDKH+kBcWojGNBEiABEiABEiABEhAVOQNcKCHE98NJEACribglR5O6CR+gCIJM3JxIEY8kgojlIa7DD/C4ZmEmZYIXQfPpPPnz6s8RgjThFeuXLn4QeyuG8B6SSAeBOoYHk7ay+nK1VsCj6GKJXLEoybPn7JswyEjYfwddeF2dXN7vgG8oscJVCgQLJWKZ5K/d4XL7vxZpFiBLB5vQ3wvuHlXmCB0pbYXavM9q1n4w7JEiRLK00mH17tseGgPM7zN0z8QD7ytjzqMXjEjvN20GTOchm7zZJurVKnicDkIKFpEwQGrxzxEpddff92hvBaaUA75LuMbgtgqOCEnqj0HkhZ08IxrNdx35Fhat26dnD59WrJlyyaHDx82c5bCo99uO3bsUJ5RyG+q+wexCV5WsAsXLthPMbftog/ETpg+1yyYwBX0QdeJ/nlz2NUEdpWnkwAJkAAJkAAJkECcCdDDKc7IeAIJkEAsCXit4KTbj1mXgwYN0ptuX2KmL2Le40UjARLwfgLwctJh9XYaYfV8QXBau+W47DXaCqtRNps0qsDwPt7/TnNNCxtVCjEEp/OyfusxnxGcIOau2XzUBFCvYog05HvW5OEvKxCdkNMJId5+X79BjoeflolDBnud6GSKTcbz4XQjNw+e2xLbsmSJXjzW+T7Rzi1btqhXVG1OyAzTW7dumdUiPF5UZg/rjNB4EGRgyGsKj39rOD2dh0rXB+8leCnZTYs79v327fgKavZ6Ytq2tgfJsGkkQAIkQAIkQAIkQAIPCdy/f19tJOT582FtXCMBEiCBhwS8XnB62FSukQAJkEBkAvByqlshuyzfHC7HT1yUrXvDpUyR7JELesmeo2GXZaXh3QRLmjSJdKyXx0taxmZ4gkDjijlk2soTsvvwJUN0Oi5VyuTyxGUTdI2/DLHpypWbqo40qZNJp8fzJag+nuy9BCAsjBgxQnr16mW8Rw9LuwEDvUp0MsWmfPlk6uTJkt7Ii+kNpsPIRdWW7NkffifBuwdhQaMyaxg8XUYLRFYBRR+zLvMZXLQhvN0TTzyhNx2WCO9sNXjwI/wzPJyQLxWCEzykYAgXaA0liZmweH/AEBrwo48+Eog5EN0QGQAhA60h+1RBF/2JzmvK2SXKlSsnmzZtUoesfXBWlvtIgARIgARIgARIINAIaA8nCk6BdufZXxJwPwEKTu5nzCuQAAm4mcBL9fPJ2h3n5Oatu8oTo1CeTJImVXI3XzXu1d+7d1+Wrz8gWMJaGaH0mLsp7hx9/Yx2hsjYf+w22WDkRCqUO7Nkzpjaa7u048AZ2brzYV6Vto/nNXI3ReRo8dpGs2EJIoBclTBvE5202FTUEFWmjB8nwUZOHl8xCEbwnId30z///CMQoJDjM7ZmFUsQvs6aA8pah1VwWrZsmfTv3z/aXKPWc5F3CoITck1t375dtRPHdX4pXfbKlSumhxbyI1lFraCgILeITRDEEC4Q3lcIsY3rxMYg3mEABUst2sXmPJYhARIgARIgARIgARIgARIgARKIP4Ek8T+VZ5IACZCAdxAoEhokbR+P8BS6cPG6rNz0MPyXd7QwohXL1h+Sk6cuq42c2dJIh3p5val5bIuHCDxeJpvUN0LrXb12W+b9uVtu3r7roSvH7TIQm+Yu3WmeVKtcVulkiLs0/ycA0QmeTjDt6XT5QW4eT/ce1203cKD8unyFQGz65dtvJWP+Ap5uhnk9CD6nTp1SL73Tuk+HJtHH9LJ79+56VTp27KjCF65du1YuXbqk6tq4caNaNwtZVnLmzGluDRgwQAlCx48fF4hK69evN48hvGDnzp3VdlhYmPJU+uGHHwT5lnAd5G5atWqVWd66Yg2bpz2YcLx+/frWYg4C1vLlyyU8PFwdR92dOnUyy6J9u3btUgKRuTOeK0WKFDHPHDx4sKr3zJkzKs8UuOnZuWahByuLFi2SChUqSJkyZWT16tX2w9wmARIgARIgARIggYAmoJ+h6OEU0G8Ddp4E3ELgEeMD5j+31MxKSYAESMCDBO7d/086frFJ9hihymDPNSot8HTyFlux8bCs3XTEbM6QDqWkQbmHYZbMA1wJCAJ7T16Vzp//bXjl3ZOC+bPI8w28K7+IM7FpRIcyAXFv2MmHBKZPn26GTytmiD2ezumkxCYjrB9ELyU2ffmlZDbEg8Q0hIyDF1BU9u+//0rGjBmdHu7du7dMmzbN6THsHDt2bCSBB/sRSq9y5cpqiW2rtWjRQkaNGmXuQtmnn35a9u3bZ+6zr2zdulUyOAlH2K1bN5k3b55Z3F63PvD666/LnDlz9KbDslWrVjJ16lRzH+rs06ePyhH1zTffqP0Qp6yG/FFRHUM5eDfVqlXLeorDOsLmOcuj1bVrVzM0YLt27eSDDz5wOI8bJEACJEACJEACJBDIBOCBf/HiRUEY4qie7QKZD/tOAiQQfwL0cIo/O55JAiTgRQSSJnlEOtR/mA9p9T/e4+VEscmL3ihe0pQiOYOkdd2I9+uBQ2cNT6eoB4c93WSKTZ4m7r3Xg6fT999/L+nSpfO4p5NdbJpsiCqJLTbhTiVPHn241qRJk0Z5Qz/55BP58ccfowynp72F7BUgRxTEqBxOwgjaQ8Wh7MKFC+Xdd991Wh51w/vJmSGsntUgXDkzCDfPP/+8wyGECPzwww+ldu3aDvvjshFVLqw8efIIxE8MijgzeJw5M2v7GzVq5KwI95EACZAACZAACZBAwBLQ/gf0cArYtwA7TgJuI0APJ7ehZcUkQAKJQWDxv+EyYPx2dek8uTLK03WLSdD/s3cf8FWV9+PHv4TshBCyyGCFPWWLuABRwYFaF1Tr1tpq7U+qP/vTVltrrdZd1791YMWFSAHrAgVUVIaiguwZEhJIyIDsDf/znHBOzk3uzb1J7k3u+Dy+wj3nPM95xvvcILnfPM8TFdoZXdHbJNjUafQ+0fBT/90t765qCI6eOqGfTJnQucssEmzyibdNh3dy27ZteoBB7d/TETOdmgab3nnxRYkfYX8W4K5du8S65FqH47Sxwbq6Ojl48KBUVVVJaGiovq9TRESE09pUUKqkpETCw8P1WT3O7qmsrNSX7KupqdH3PlL7R6k9jdyRVN2qP2pPJWOGUXV1tT4TKywsTA/OqQCdOz/EUEsDHj58WF9GT7klJiaKo0CVGqMqr9pXyw2SEEAAAQQQQAABBBoFRo4cKerf92PHjpWlS5c2ZnCEAAIItFOAgFM7AbkdAQS8T8AadIqPj5ILpwyV1CTXNhl352gINrlT03/r+tt/dsr7X2XrA0xL7S5njk+XfmndO3zAX27IlDUb9uvtap/Pymxtj7G5swZ2eD9o0DsFOiro1DTYtECbYRU3ZIhdlGeeeUZfTk7tj2Tdd8huYS4igAACCCCAAAIIIICAKTBC+4WusrIyAk6mCAcIIOAuAZbUc5ck9SCAgNcIqL2R1B5JEeFdpbCwXN775CfZtb+wQ/tnDTZFRYbo/WHPpg59BD7T2H2XDZFzJqbo/c05WCzvfLBRVPCno1JOXqm89eFPZrBp/LAE+df/TCDY1FEPwEfaGT58uL7/kLG83r0vvOD2nrcm2KQaV30ZMGCAPKft7fTII4+4vT9UiAACCCCAAAIIIICAvwqwpJ6/PlnGhUDnCzDDqfOfAT1AAAEPCWzJKpEXPt4rP+wo0luYODpNJo7oLd1jwjzUorY3Rn6ZfP5thmQeaGhzytgkueWcdBmk7dlDQqAlgQfe2SbL1zfurdIzqZuMH5Eqo4ckt3Rbm/Iqq+tk+9582ZGRr71Xj+h1JCdGyXVn95VLJzUEv9pUMTf5vUB2drbcfPPNsn37drl02lR55De/cduYL77rbn2vqKHp6fLOvFclrv8Ah3WrGVfnnXeepGtl1T5Ge/fulZtuukkeeOABh/eQgQACCCCAAAIIIIAAAg0C6hfKysvLZdy4cbJkyRJYEEAAAbcJEHByGyUVIYCAtwr8v+X75N+fZOjdU/s5jR/VS07RvoK6auuGuTF98+MBWb1+n15jz/gIueHcfvKzSalubIGq/F3g8y358vrKTNmeUWwOta+2F9mYYSkyfECiea0tB0dLquRAXolk55bILi3QVFFRo1cTFhYsMyf3krnnp0tEKBOf22IbaPeoPYSuvPJKtwad7n3+eVn8+RcybNAgWfDuuxIbH++UVc1seuKJJ6Rv3776vkQq6HTttdfKQw895PReCiCAAAIIIIAAAgggEMgCw4YN034mrJDx48fL4sWLA5mCsSOAgJsFCDi5GZTqEEDAOwW+2V4oL2qznfYcKNU7mJYcLQP6xEvf1HjpldytXZ3+ftshWftjprbhZrVez0Wn95JfasGmRA/OpGpXh7nZ6wXmrdwvb6/KktLyWrOvg9LjpF+veBk9uKeEhHQ1r9s7qKs7JoXFldqMu1LJPFQsuYdLpOhIRbOiowYnyMO/GCY9Y0Kb5XEBgZYEVNDplltukXXr1rV7ppMZbNL2alq4aJHExMS01LRN3kvaHk8PP/ywpKWlSXh4uD7Tac6cOfL3v//dphwnCCCAAAIIIIAAAggg0CgwRPu3d1VVFQGnRhKOEEDATQIEnNwESTUIIOD9AmVV9bJ4XY6s3lIgm/c0LCOmep2UECWD+iXIwD4JkhgXKSHB9md51Ncfk4rKWinTvgqLK2Tr7jzZl9mwdF6P7mFy0WRt+bO+3eW0Yc5/M9/7tehhZwtkHK6Q99Zky5b9JbJzf+OMp3BtRlKyttxecHBXCQsNllAt+KRey7QZS0dKKuRocZW2NEJD8NPRGFSg6bzxSXIZy+c5IuK6iwJ33XWXLNKCRNNPmSSP3nabxERFuXhnQzEz2KT9huXChQtbFWwyGnr99df1pfSSk5P1fZ12794tl112mTz11FNGEV4RQAABBBBAAAEEEEDAIjB48GCprq6WCRMmyH/+8x9LDocIIIBA+wQIOLXPj7sRQMBHBfYcKpPlm/Lki435kpVbbjOKiPAQUcuMhYU1zCKpqqrTA021tfU25dTJySPiZfLQeLnqjN7N8riAgLsE8oqrZWPGUfl29xHZsLNIcgsqW1212rvsgslpctG4npLeM7LV93MDAo4EjKDT8IED5fUH7nc56OSOYJPRpwULFsjvf/97SUxMlHhtOb4dO3bIRRddJGrZPRICCCCAAAIIIIAAAgjYCgzSlrKuqamRiRMn6r9AZpvLGQIIINB2AQJObbfjTgQQ8BMBFXzan18hhaU12le1bM0sle2ZxVJeUWd3hKMH9ZCZ43vKaVqgqWdsuN0yXETAkwJHymtkxaZ82XWwVPKOVsvhI9VScLRKKrVZfJGRIdI9OkRio0MlQVsqT31NHNhDpoxI8GSXqDvABcygk/abknrQKSKiRREj2DRcm9n0bhtnNjVtQG12fOedd0pcXJyo2U7btm2TGTNmiFp2j4QAAggggAACCCCAAAKNAgO1Xxarra0l4NRIwhECCLhJgICTmyCpBgEE/E8gS5tFckQLQEVqs52iI4IlSpvxFKXNfupqf8U9/wNgRAgggEArBMyg09Ch8sYjj0j0seazQkvKy+WaB/4kO/bvl2Ft2LPJWXc++ugjuU0t7aftA9W3b1/ZvHmznHXWWfLaa685u5V8BBBAAAEEEEAAAQQCRmDAgAFSV1cnJ598srz33nsBM24GigACnhfgY1PPG9MCAgj4qECfhAgZnR4rg1KjJaVHuMRoM0cINvnow6TbCCDgcYEnn3xSLr/8ctmmLWc37brrZFdZmUhIiNnudi3IdMldd+vBpqHab1Qu1PZ+UoEhd6YLLrhAXn31VSkpKZF9+/bJmDFjZNWqVfKLX/zCnc1QFwIIIIAAAggggAACCCCAAAII2BEg4GQHhUsIIIAAAggggAACrRdQQacHHnhAD/jMuu56eWzJUvk+L08eeecdPdiUk5+vz2x6T1v+zt3BJqO3Z599trz55ptSrs2mUns5jRs3Tr766iuZPXu2UYRXBBBAAAEEEEAAAQQCWuDYsWP6+Lt06RLQDgweAQTcL8CSeu43pUYEEEAAAQQQQCCgBdatWye/+93vJCcnx8bhxhtvlD/96U821zx1ovqggkzBwcEyduxY+e677/Tgk9rriYQAAggggAACCCCAQCAL9OvXT44fPy6nnHKKvPvuu4FMwdgRQMDNAgSc3AxKdQgggAACCCCAAAINAsuXLxcV+FFL3F1xxRX6D7QdaWMEnYKCgvT16dX5qFGj5MMPP+zIbtAWAggggAACCCCAAAJeJaD2O1WJgJNXPRY6g4BfCBBw8ovHyCAQQAABBBBAAAEE7AkYQSeVd+qpp8qaNWtk6NChsmzZMmEJEXtiXEMAAQQQQAABBBDwZwE1s0nNcFKJgJPOwB8IIOBGAfZwciMmVSGAAAIIIIAAAgh4l4D6IXrRokV6p1Sw6YwzztD3dpo2bZrU1tZ6V2fpDQIIIIAAAggggAACHSjAL2B1IDZNIRAgAgScAuRBM0wEEEAAAQQQQCBQBSZOnCjvv/++PvyvvvpKpk6dKhkZGfprZWVloLIwbgQQQAABBBBAAIEAFFAznIxEwMmQ4BUBBNwlQMDJXZLUgwACCCCAAAIIIOC1AmPGjNGX0VMd/OKLL2T69OmSnZ0tU6ZMkdLSUq/tNx1DAAEEEEAAAQQQQMBTAgScPCVLvQgErgABp8B99owcAQQQQAABBBAIKIFhw4bJypUr9TGr13PPPVfy8vLkzDPPlKKiooCyYLAIIIAAAggggAACgSnADKfAfO6MGoGOEiDg1FHStIMAAggggAACCCDQ6QIDBw6U1atX6/349NNPZebMmXqwSe3tlJ+f3+n9owMIIIAAAggggAACCHhSwBpwCgrio2FPWlM3AoEowN8qgfjUGTMCCCCAAAIIIBDAAn379pV169bpAsuWLZPzzz9fysrK5LTTTpODBw8GsAxDRwABBBBAAAEEEAgkAZbUC6SnzVgR6BgBAk4d40wrCCCAAAIIIIAAAl4kkJKSIj/88IPeo48//lhmzZol1dXVetDpwIEDXtRTuoIAAggggAACCCCAgGcECDh5xpVaEQhkAQJOgfz0GTsCCCCAAAIIIBDAAvHx8bJ582Zd4IMPPpCLL75Yjh07Jqeffrrs27cvgGUYOgIIIIAAAggggAACCCCAAAKtFyDg1Hoz7kAAAQQQQAABBBDwE4GYmBjZuXOnPpr3339fLr30Uv142rRpsnv3bj8ZJcNAAAEEEEAAAQQQQKBBwLqHEzOceFcggIC7BQg4uVuU+hBAAAEEEEAAAQR8SiA8PNyc0bR48WK54oor9P6fffbZsn37dp8aC51FAAEEEEAAAQQQQKAlAWvAKSiIj4ZbsiIPAQRaL8DfKq034w4EEEAAAQQQQAABPxPo2rWrZGZmSmhoqLz33ntyxx136COcOXOm/PTTT342WoaDAAIIIIAAAggggIAIM5x4FyCAgLsFCDi5W5T6EEAAAQQQQAABBHxWQC2jFx0dLc8995w8+uij+jhmzZolP/74o8+OiY4jgAACCCCAAAIIIGAIWGc4EXAyVHhFAAF3CRBwcpck9SCAAAIIIIAAAgj4hcDWrVslPj5e/u///k/eeOMNfUyXXHKJfPvtt34xPgaBAAIIIIAAAggggIASIODE+wABBNwtQMDJ3aLUhwACCCCAAAIIIODzAj/88IOkpqbKNddcI59//rk+HrW309q1a31+bAwAAQQQQAABBBBAIHAFmOEUuM+ekSPQEQIEnDpCmTYQQAABBBBAAAEEfE5ABZf69esn06ZNk127dun9nzNnjqxevdrnxkKHEUAAAQQQQAABBBBAAAEEEPC0AAEnTwtTPwIIIIAAAggggIDPCnz55ZcyePBg/WvlypX6ONSsp1WrVvnsmOg4AggggAACCCCAQOAKWGc4BQXx0XDgvhMYOQKeEeBvFc+4UisCCCCAAAIIIICAnwh89tlnMnLkSJk+fbo8+eST+qhuuOEG+fTTT/1khAwDAQQQQAABBBBAIFAErAEn9nAKlKfOOBHoOAECTh1nTUsIIIAAAggggAACPirw0Ucfybhx4+Suu+6S3/zmN/oobrnlFvn44499dER0GwEEEEAAAQQQQCDQBQg4Bfo7gPEj4H4BAk7uN6VGBBBAAAEEEEAAAT8UWLJkiUyePFmef/55ufvuu/UR/vrXv5b//ve/fjhahoQAAggggAACCCDgjwLMcPLHp8qYEPAeAQJO3vMs6AkCCPiIQEZGho/0lG4igAACCLhbYMGCBTJ16lR54okn5P7779erv+OOO2Tx4sVOm3r66aelpKTEaTkKIIAAAggggAACCCDQEQLMcOoIZdpAILAECDgF1vNmtAgg0A6B7OxsOe200/QPGttRDbcigAACCPi4wOuvvy4zZsyQhx56SP72t7/po5k7d668++67Dke2du1aeeaZZ+Sll15yWIYMBBBAAAEEEEAAAQQ6UoCAU0dq0xYCgSFAwCkwnjOjRAABNwj89a9/FRV0IiGAAAIIIKACRxdffLHcd999omYuqXTPPffI22+/bRdHLcU3atQoee2112TPnj12y3ARAQQQQAABBBBAAAFPC7CknqeFqR+BwBYg4BTYz5/RI4CAiwJlZWWyefNmF0tTDAEEEEAgEASeffZZufLKK0XNbnrxxRf1Id97770yf/58u8O/6qqrRP3/5N///rfdfC4igAACCCCAAAIIINCRAsxw6kht2kIgMAQIOAXGc2aUCCDQToGXX37ZZnbTmjVr2lkjtyOAAAII+IPA448/Ltdcc43cdtttZtBJ7e00b968ZsNTASc1y0nNgtqxY0ezfC4ggAACCCCAAAIIIOBpAWY4eVqY+hEIbAECToH9/Bk9Agi4IFBfXy8ffPCBTclly5bZnHOCAAIIIBC4AmrJ1Ztvvtkm6PTggw/a3a9pzpw5ov6/smjRosAFY+QIIIAAAggggAACXiHADCeveAx0AgG/EiDg5FePk8EggIAnBD788EPZu3evjBs3zqx+5cqV5jEHCCCAAAIIqFlNt99+ux50MjQefvhheeGFF4xT/fWyyy6Tfv36ycKFCyUnJ8cmjxMEEEAAAQQQQAABBDwtwAwnTwtTPwKBLUDAKbCfP6NHAAEXBIzZTRMmTDBLZ2dny2effWaec4AAAggggMA999wjd911lw3EY489JmqvJyNFRESICjoVFxfLe++9Z1zmFQEEEEAAAQQQQACBDhEg4NQhzDSCQMAKEHAK2EfPwBFAwBWBTZs26YGlqKgomxlO6t5PP/3UlSoogwACCCAQQAK//e1v5Q9/+IPNiJ988klRX0ZSAaeYmBh9L6fDhw8bl3lFAAEEEEAAAQQQQKBDBYKC+Gi4Q8FpDIEAEOBvlQB4yAwRAQTaLvD111/rN0+fPl169OhhVqSW11uxYoV5zgECCCCAAAKGwC9/+Ut56KGHjFP9Vc1yUrOdVEpLS5NLL71U8vLy9KCTfpE/EEAAAQQQQAABBBDoAAHrDKcOaI4mEEAgwAQIOAXYA2e4CCDQOoF169bpN5x11lk2N/7sZz+ToqIiWbZsmc11ThBAAAEEEFAC1157rTz++OM2GGo/J7Wvk0qXX365qN8offvtt4VZTjZMnCCAAAIIIIAAAgh0kECXLl06qCWaQQCBQBEg4BQoT5pxIoBAqwUOHToka9askejoaDnzzDMlPDzcrGPWrFmSmJiob/puXuQAAQQQQAABi8CVV14pzz33nOWKyEsvvSQPPvigjBo1Sq655hpmOdnocIIAAggggAACCCDgaQHrDCcCTp7Wpn4EAk+AgFPgPXNGjAACLgqsXbtW6urq5IwzzpD4+HiJjIw071TL66mg08qVK+Wnn34yr3OAAAIIIBA4Aur/E9nZ2S0O+KKLLpKXX37Zpsy8efPk/vvv1wNO6v8tzHKy4eEEAQQQQAABBBBAwIMCBJw8iEvVCCAgBJx4EyCAAAIOBNQHiSqp2U0qRURE6K/GHxdeeKF+uHjxYuMSrwgggAACASQwZ84cOe200+Suu+6SHTt2OBz5ueeeK2+88YZN/vz580UFnpjlZMPCCQIIIIAAAggggEAHCqglnkkIIICAOwX4W8WdmtSFAAJ+JaCW0+vatavDgNP48eNl6tSpsmjRIjl48KBfjZ3BIIAAAgg4F1iyZImcffbZ+v8HZsyYIbNnz5aPPvrI7o3qlxfef/99mzw1s0nNkIqLi2OWk40MJwgggAACCCCAAAKeEmCGk6dkqRcBBJQAASfeBwgggIAdgXXr1ukfAqrl9Hr16qWXaDrDSV1Us5xKS0sdfsBop2ouIYAAAgj4icC4cePk1Vdf1WcvqcCT+n/Hbbfdps96evrpp2XXrl02Ix0zZox8/fXXNtdUgKpnz57s5WSjwgkCCCCAAAIIIICApwSs+zZZjz3VHvUigEBgCRBwCqznzWgRQMBFgW+//VYvaSynp07Cw8Ob3a325khOTpbly5c3y+MCAggggEBgCKj/V6jA04IFC+SKK66QQ4cOyTPPPCPnnHOO3HnnnfLll1+aEL1795bt27eb5+pAncfExOiBK2d7QtncyAkCCCCAAAIIIIAAAq0UYIZTK8EojgACrRIg4NQqLgojgECgCKjfUlfJGnBSy+uFhITYEISF7iQougAAQABJREFUhcmsWbPku+++k5UrV9rkcYIAAgggEFgCkydPlieeeEI++eQTufXWWyUhIUHUsnvXXnutXHXVVfLee+9JXV2dREZGSmZmpsTHx5tAJSUlUlBQIP/+97/NaxwggAACCCCAAAIIIIAAAggg4EsCBJx86WnRVwQQ6BCB3NxcfVkk9cHhoEGDbNpUAaam6eqrr9Yvqb04SAgggAACCAwZMkTuu+8++fTTT+XPf/6zjB07Vr755hu5++67ZebMmfLCCy/oe//98MMPospa0yuvvCJbtmyxXuIYAQQQQAABBBBAAAG3CTDDyW2UVIQAAnYECDjZQeESAggEtoBaTq++vl7U/k1Nk72AU3p6ur6E0ooVK2TTpk1Nb+EcAQQQQCBABdQMphtuuEGWLl0q8+bNk4svvlj27t0rjz32mJx33nnyl7/8RdReT5MmTTKF1AcAanYUCQEEEEAAAQQQQAABTwhYA05BQXw07Alj6kQgkAX4WyWQnz5jRwABuwL2ltMzCtoLOKm8Cy64QC+iNn8nIYAAAggg0FRg+vTp8uyzz+qznu644w6JjY3V9306//zzJSUlRfr372/eovZxUntBkRBAAAEEEEAAAQQQ8KRAly5dPFk9dSOAQAAKEHAKwIfOkBFAoGWBr7/+Wl/+aNSoUc0KhoeHN7umLkybNk1Gjx4tKuBUUVFhtwwXEUAAAQQQUEu1qqX11HJ7aqbTaaedps+A2rdvn8TExJhAarbtnDlzzHMOEEAAAQQQQAABBBBwh4B1hhMBJ3eIUgcCCFgFCDhZNThGAIGAF1DL4qmN3KdMmWLXwtEMJ1VYzXJSv5W+bNkyu/dyEQEEEEAAAUNA/f9k9uzZovb/e+utt+TKK6+UqqoqI1t/Xbt2rSxevNjmGicIIIAAAggggAACCLhLgICTuySpBwEEDAECToYErwgggIAmoH7jXKWpU6fqr03/aCngpPbjCA4ONutoei/nCCCAAAII2BM4/fTT5fHHH5fly5fLnXfeKSEhIXqxfv36yaWXXmrvFq4hgAACCCCAAAIIINAmAWY4tYmNmxBAwEUBAk4uQlEMAQQCQ0DNcBo7dqz+ZW/ELQWc+vTpI+ecc4589tlnUldXZ+92riGAAAIIIOBQQO3jNHfuXNm6dauMGDFC7rvvPodlyUAAAQQQQAABBBBAoC0C1oBTW+7nHgQQQKAlAQJOLemQhwACASWwbt06KSwsdLicnsJwNt383HPP1YNN3333XUDZMVgEEEAAAfcJqF9u+Pjjj2XGjBnuq5SaEEAAAQQQQAABBBBoIhAUxEfDTUg4RQCBdgoEt/N+bkcAAQT8RiAuLk4mT57scDk9Vwaqlj5KSUnR63GlPGUQQAABBBBAAAEEEEAAAQQQQACBjhKwznBy9ku1HdUn2kEAAf8RIODkP8+SkSCAQDsFBg8eLAsWLGhnLUKwqd2CVIAAAggggAACCCCAAAIIIIAAAp4WIODkaWHqRyDwBJg3GXjPnBEjgEA7BPjHWDvwuBUBBBBAAAEEEEAAAQQQQAABBDpVgBlOncpP4wj4vQABJ79/xAwQAQQ8IVBfX++JaqkTAQQQQAABBBBAAAEEEEAAAQQQ8JgAASeP0VIxAghoAgSceBsggAACbRAoKytrw13cggACCCCAAAIIIIAAAggggAACCHSegHXllqAgPhruvCdBywj4pwB7OPnnc2VUCCDgYYHy8nLp3r27h1uhegQQQAABBNwnUFdXJy+//LJeofpw4aabbpLg4MYfB3bs2CGff/65xMbGys9//nP3NUxNCCCAAAIIIIAAAl4jYJ3h5DWdoiMIIOA3Ao0/YfrNkBgIAggg4HmB0tJSzzdCCwgggAACCLhRQC0H++ijj5o1Dhw4UKZPn26eb9++Xc+Piooi4GSqcIAAAggggAACCPivgHW2k/+OkpEhgEBHCjBvsiO1aQsBBPxGQM1wIiGAAAIIIODLAvPnz/fl7tN3BBBAAAEEEEAAgTYIWGc4EXBqAyC3IIBAiwIEnFrkIRMBBBCwL1BZWWk/g6sIIIAAAgj4iMAXX3whWVlZPtJbuokAAggggAACCCDgDgECTu5QpA4EEHAkwJJ6jmS4jgACCLQgoPbBICGAAAIIIOCrAmrZPDVbd+HChXL33Xe7NIw1a9bIsmXLZOvWrfreTyNHjpSLLrpIRo8e7dL9FEIAAQQQQAABBBDwLgFmOHnX86A3CPiDADOc/OEpMgYEEOhwgZqamg5vkwYRQAABBBBwl8DPf/5zvap58+aJK/9Pe+yxx/R9nV5//XXZsGGDrFu3Tl555RU94KSukRBAAAEEEEAAAQR8Q8A6wykoiI+GfeOp0UsEfEeAv1V851nRUwQQ8CKB2tpaL+oNXUEAAQQQQKB1AtOmTZOUlBR9ltNnn33W4s1qZtMLL7ygl1Ezo371q1/JTTfdZN7zwAMPyJ49e8xzDhBAAAEEEEAAAQR8Q4AZTr7xnOglAr4kQMDJl54WfUUAAa8RIODkNY+CjiCAAAIItEEgODhYrrvuOv3O+fPnt1jDP/7xDzN/6dKlcu+994oKMr311lvm9X/+85/mMQcIIIAAAggggAAC3itgneHkvb2kZwgg4KsCBJx89cnRbwQQ6FQBV5Yf6tQO0jgCCCCAAAJOBC6//HK9hFoer6UZSipfpRkzZsjgwYP1Y/XH6aefLmofJ5U2btyov/IHAggggAACCCCAgO8IMMPJd54VPUXAVwQIOPnKk6KfCCDgVQJ1dXVe1R86gwACCCCAQGsFEhMT9T2Y1H0LFiywe3thYaF5fcSIEeaxcTB8+HD9cPfu3cJvyxoqvCKAAAIIIIAAAt4rYP03GwEn731O9AwBXxUg4OSrT45+I4BApwgY/zBjSb1O4adRBBBAAAE3C1x99dV6jW+//ba+n1PT6qurq81LoaGh5rFxEB4ebhxKfX29ecwBAggggAACCCCAgHcKGJ9rqN4RcPLOZ0SvEPBlAQJOvvz06DsCCHSaAEvqdRo9DSOAAAIIuFFg0qRJ0r9/fz3YtGjRomY1JyUlmdcOHTpkHhsH2dnZ+mFKSoqofaFICCCAAAIIIIAAAr4jEBTER8O+87ToKQK+IcDfKr7xnOglAgh4mQAznLzsgdAdBBBAAIE2Cajfar3++uv1e3/88cdmdaggUp8+ffTrKiBlnfGklttbtWqVnjdw4MBm93IBAQQQQAABBBBAwPsEmOHkfc+EHiHgTwIEnPzpaTIWBBDoMAECTh1GTUMIIIAAAh4WuPjii1tswQhIlZeXy2233SabN28WFZy66aabzPuuuuoq85gDBBBAAAEEEEAAAe8VsC6jZz323h7TMwQQ8CUBAk6+9LToKwIIeI2A9Te8vaZTdAQBBBBAAIE2CMTGxsqVV17p8E61z5Nadk+lFStWyIUXXiiXXHKJHnRS104++WSZOXOmOiQhgAACCCCAAAIIeLkAM5y8/AHRPQR8XICAk48/QLqPAAKdI1BZWdk5DdMqAggggAACbRRoaY3+lmYohYeHy4cffiizZ8+2aTkqKkpuvfVWeeutt6Slum1u4gQBBBBAAAEEEECgUwWsAadO7QiNI4CAXwqws69fPlYGhQACnhYg4ORpYepHAAEEEHC3QEhIiGRmZtqtduzYsQ7z1A0quPTYY4/Jo48+KocOHRK1/EpKSor+ardCLiKAAAIIIIAAAgh4vQBL6nn9I6KDCPicAAEnn3tkdBgBBLxBgICTNzwF+oAAAggg0NECaiZTWlpaRzdLewgggAACCCCAAAJuErDOcGKWuptQqQYBBEwBAk4mBQcIIICA6wIEnFy3oiQCCCCAAAL+LFBQWiMrfjosRaXVNsMckBwtyd3DJDkuQnpqryQEEEAAAQQQQMDbBJjh5G1PhP4g4PsCBJx8/xkyAgQQ6AQBAk6dgE6TCCCAAAIIeIlAVkGFrN1ZJF9tLZDvthW61KvoqDCJ6RYmXbsGSZC2JKE2WUz6JYXLvZcOku6RIS7VQSEEEEAAAQQQQKC9AtYZTgSc2qvJ/Qgg0FSAgFNTEc4RQAABFwQIOLmARBEEEEAAAQT8TCC/pFr+vSpTFn1xQB9ZWGhXmTVtkAQFh0hEWLCEaz9dHcivkF37C+RAzlGb0ZeVV4v6sqaMLJHDJfVy48yBMiotXLqHdbFmc4wAAggggAACCLhdgICT20mpEAEELAIEnCwYHCKAAAKuChBwclWKcggggAACCPiHwFurD8jbn2dKwZFqOWVUkpw6po/kaMd5hRWyPydX8gvLpLy8xhxsZGSoJMRFSaL2laR9xXaLkB0Z+bI3q1BKSqrMclt3HZY/Hjgi40akyWWnpsqkfhESrM1+IiGAAAIIIIAAAp4WYIaTp4WpH4HAEyDgFHjPnBEjgIAbBAg4uQGRKhBAAAEEEPABgc+35Msb2qymrfuKJaFHmMw5J12+2VIgT72xwex9dHSYJCV0k7QRMdK7Z3dJio+UyPDmy+T1S+uu3TNQcvJKZbcWeMrMOSIHc0uksrJWvtmwX9b9mCWD0+Mlr6BEbrtwgMyakGK2wQECCCCAAAIIIOAOAWY4uUOROhBAwJEAASdHMlxHAAEEWhAg4NQCDlkIIIAAAgj4icDTH+yWBSu1de+0lN4rRjKyS2TBZxnSvXuEjB2ZJqlJ3SQ1sZsWiIps1YjTemrBKe1LJvaTwiOVsk8LPO3RAlD7s4pk+558va6/vrlNfswoltvP6y/x0aGtqp/CCCCAAAIIIICAKwLMcHJFiTIIINAaAQJOrdGiLAIIIHBCgIATbwUEEEAAAQT8W+Dm57+XzXsa92EqKq3Vg0wD+8SJ+nJXiu8RIepr4shUyS+qkK17D2szoEokK/uIfPRNjmzae1R+fX5/OfukJHc1ST0IIIAAAgggEMACzHAK4IfP0BHoAAECTh2ATBMIIOB/AgSc/O+ZMiIEEEAAAQSUwK6DZXLjU99Jbd0xHSQpMVrGDEuV8cM9v7xdYlykTI3rp7e7+vtM+ea7/ZKdWy5/mLdZMi7oL7doy/mREEAAAQQQQACB9ggQcGqPHvcigIAzAQJOzoTIRwABBOwIEHCyg8IlBBBAAAEEfFzgQGGlXPPYen0UoSFdZerkAR0SaLLHdub4vtI3JVa+3JAhOQeL5ZWP9klsVKhccWqaveJcQwABBBBAAAEEWi3AknqtJuMGBBBwIhDkJJ9sBBBAAAEHAtXV1Q5yuIwAAggggAACviZQWFYjc/62Vu92j+7h8rMZIzot2GTY9U3tLtdeNEbS+8brl55YuEM+3ZhnZPOKAAIIIIAAAgi0WoAZTq0m4wYEEGiFAAGnVmBRFAEEELAKVFVVWU85RgABBBBAAAEfFaiuPSb3vr5F6uqPS++UaLn03JHSv1cPrxnNpWcPk15psXp/Hnp7m6zbVeQ1faMjCCCAAAIIIOBbAtZZTUFBfDTsW0+P3iLg/QL8reL9z4geIoCAlwoww8lLHwzdQgABBBBAoJUC9721RTbtPiIjB8bJz845SZLio1pZg2eLq+X9fnbWMEnu2U1qao7JQ+9slx3ZpZ5tlNoRQAABBBBAwC8FrDOc/HKADAoBBDpVgIBTp/LTOAII+LIAM5x8+enRdwQQQAABBBoE1Gyhrzfmy4gBsTL7vJMkKjLEK2mitf2bLtaCTvFaMKzgSJW8uGyfV/aTTiGAAAIIIICAdwtYA07W2U7e3Wt6hwACviJAwMlXnhT9RAABrxNghpPXPRI6hAACCCCAQKsFnlqyW79n2sR+UlF7vNX3d+QNcd0j5KxJ/fUm128pkDU7CjuyedpCAAEEEEAAAT8TIODkZw+U4SDgBQIEnLzgIdAFBBDwTQFmOPnmc6PXCCCAAAIIGAKvrNgvmYfK5LKz0qVbbHfjsle/DuwTJ8MHJ+t9XLIux6v7SucQQAABBBBAwPsEmOHkfc+EHiHgTwIEnPzpaTIWBBDoUAFmOHUoN40hgAACCCDgVoENe47Iyx/uldhuoTIovSGA49YGPFjZyaPSpGvXIFmtLQWoxkFCAAEEEEAAAQTaIsAMp7aocQ8CCLQkQMCpJR3yEEAAgRYEamtrW8glCwEEEEAAAQS8WeA/aw/q3Zt0Uqp0CQn15q4261tKYrSMHZmmX1+6/lCzfC4ggAACCCCAAAKOBKwznIKC+GjYkRPXEUCgbQL8rdI2N+5CAAEEEEAAAQQQQAABHxWoqqmX9dsL9N73Tkv0yVGcos1yCgsLls++OyRbskp8cgx0GgEEEEAAAQQ6V4AZTp3rT+sI+KMAASd/fKqMCQEEEEAAAQQQQAABBBwKfL4lX8or6iSuR4QkxkU6LOfNGd2iw6RPWg+9ix9sYJaTNz8r+oYAAggggIA3CVhnOHlTv+gLAgj4hwABJ/94jowCAQQQQAABBBBAAAEEXBRYvbVQL5mS1N3FO7yzWN/UWL1j67Y1zNbyzl7SKwQQQAABBBDwJgFrwIkZTt70ZOgLAv4hQMDJP54jo0AAAQQQQAABBBBAAAEXBYzl9NJ6xrh4h3cW639ihlNuQZWs2dEQRPPOntIrBBBAAAEEEPBGAQJO3vhU6BMCvi1AwMm3nx+9RwABBBBAAAEEEEAAgVYIqMCMWk5Ppd49fXuGU7y2JGCP2IYlAb9kllMr3gUURQABBBBAIHAFrDOcgoL4aDhw3wmMHAHPCPC3imdcqRUBBAJAoL6+PgBGyRARQAABBBDwL4Hv9x01B5QU75v7N5kD0A769WrYx4ll9awqHCOAAAIIIICAKwLMcHJFiTIIINAaAQJOrdGiLAIIIGARKC0ttZxxiAACCCCAAAK+IHC0vNYXuulyH6OjQvWyalm97dn828RlOAoigAACCCAQoALWGU4EnAL0TcCwEfCgAAEnD+JSNQII+LdASUmJfw+Q0SGAAAIIIOCHAsXlNX41qpDgruZ4Pt9y2DzmAAEEEEAAAQQQcCZAwMmZEPkIINBaAQJOrRWjPAIIIHBCgBlOvBUQQAABBBDwPYGS8ob9m3yv5/Z7HBLc+CNdZc0x+4W4igACCCCAAAII2BEg4GQHhUsIINAugcafTtpVDTcjgAACgSdAwCnwnjkjRgABBBDwfQF/W1LPOsOpqpaAk++/QxkBAggggAACnhWwLqnn2ZaoHQEEAlGAgFMgPnXGjAACCCCAAAIIIIBAgAqU+tmSeqGWGU5V1fUB+lQZNgIIIIAAAgi0RSAoiI+G2+LGPQgg4FiAv1Uc25CDAAIIIIAAAggggAACfiZQVuFfS+oFW/Zwqqol4ORnb1eGgwACCCCAgNsFrDOcWFLP7bxUiEDACxBwCvi3AAAIIIAAAggggAACCASOQFho449A+UUVPj/wqprGAFolM5x8/nkyAAQQQAABBDwtQMDJ08LUj0BgCzT+tBXYDoweAQQQcEkgKipKTjnlFPnmm29k7ty5Lt1DIQQQQAABBBDwHoHePaPMzhw+Um4e++pBwZHGoFk1ezj56mOk3wgggAACCHSKADOcOoWdRhHwa4Fgvx4dg0MAAQTcLDBv3jw310h1CCCAAAIIINCRAv2So2TbvmK9yfwiLeA0ILEjm3d7W/oYTtTaJynS7fVTIQIIIIAAAgj4lwAznPzreTIaBLxNgBlO3vZE6A8CCCCAAAIIIIAAAgh4TKC/ZYaTdXaQxxr0cMWFlllaI/vEeLg1qkcAAQQQQAABfxJghpM/PU3GgoB3CDDDyTueA71AAAE/ErD+tpCjYTkr4yxf1euojPEPRkf51j45K9Pe/Jb6afTDWRvuqMNow7Ax2ra+GmWs16zHzvJVWWdl2pvvjjZaqsPwcdbPlupQeSo5q8NZvrfUYe2n4aMP0PKHtYzlsnnoLF8VdFamvfnuaKOlOgwbZ/1sqQ6Vp5KzOpzle0sdRj8NG31wTf4wyjS5bJ46y1cFnZVpb7472mipDsPHWT9bqkPlqeSsDiO/rri24QbtT2uwxrzoQwdq/6Yiy5J69UczZN26LB8aAV1FAAEEEEAAgY4W2L59u9mk8W8x8wIHCCCAQDsFCDi1E5DbEUAgcAXWrVsnL730kqxcuTJwERg5AggggAACPibQJTJOes54Qu+1CtaoWU4JPXxzKbr8wsb9m45Vl8hdv7zRx54G3UUAAQQQQACBzhQg4NSZ+rSNgH8KEHDyz+fKqBBAwMMCKtg0e/ZsD7dC9QgggAACCCDgboHjFUVSXbBDwhKG6lVvzyiQM3r0cXczHVLfjv0FZjvVR/ebxxwggAACCCCAAAKuCBBwckWJMggg0BoBAk6t0aIsAgggcELglFNOkTvvvNOph7F8j6OCzvLVfc7KGPkt/UPRKNMR/ejMNlryMnycWbRUhzE2Z3U4y3dHG+6uw/Axxmi8OhuLs3x399PoV9NXT/bDsPFkG9bxOGvHWb47zFvThuFjHYMrfXClTGv60bR949xZHc7y29tPw8dZO87y29sPV+53pYw7+2nYqHabJmftOMtX9bVUpii8UApPNLorI1/OGOd7AafqmnrZsfewSZcYWStDJ00yz60HLVmocs7yXSnT0XU4ev8464ezfG8cq+qTveRoLIaNo3xrXc7KOMtXdTkr4yzfHXW0pg3Dx+rgSh9cKdOafjRt3zh3Voez/Pb20/Bx1o6z/Pb2w5X7XSnjjn5a2zF81LWmyVlbzvJVfc7KtDffHW20VIfh46yfLdWh8lRyVoezfG+sw/DRB2j5w9lYnOW3Z6yO+mTpHocIIIBAqwQIOLWKi8IIIIBAo8DcuXMbTzhCAAEEEEAAAZ8RKK+ulysfXactp1clh/PLZE9WkQzsE+cz/Vcd3brnsJSVVet9Tk4Il/l/myvdI0N8agx0FgEEEEAAAQQ6XsC6YgsBp473p0UE/F0gyN8HyPgQQAABBBBAAAEEEEAAAatAVFhXOXtcT/PSDm1ZPV9L2yyzm648sw/BJl97gPQXAQQQQACBThKIj483WybgZFJwgAACbhIg4OQmSKpBAAEEEEAAAQQQQAAB3xE4b2xjwGm3FnA6UlzlM53PPFgsB3KO6v0d3DdGrj6zt8/0nY4igAACCCCAQOcKDBo0SBYsWKB3IiiIj4Y792nQOgL+J8DfKv73TBkRAggggAACCCCAAAIIOBEY2qubnD4mUS9VVVUrq77NcHKH92T/sP2Q2ZnZZ/QyjzlAAAEEEEAAAQRcEVAzm9Te1CNHjnSlOGUQQAABlwW6aBvPHXe5NAURQAABBBBAAAEEEEAAAT8R2JJVIr958QeprKrXRzTllP5y6hjvni305YZMWbNhv97fCcPi5YVbx/jJ02AYCCCAAAIIIIAAAggg4OsCzHDy9SdI/xFAAAEEEEAAAQQQQKBNAiP7xMj9Vw837129PkMyco6Y5952sD+n2Aw2RUUGy23n9/e2LtIfBBBAAAEEEEAAAQQQCGABAk4B/PAZOgIIIIAAAggggAACgS4wfVSS/PbSwTqDWvzhcy3oVFPbMOPJ22zeX7nN7NL9Vw2XEb1jzHMOEEAAAQQQQAABBBBAAIHOFiDg1NlPgPYRQAABBBBAAAEEEECgUwWuPrO3nDwiXu9D3uFS+e/nOzu1P/YaX7hsq1RU1OhZc68YItNGNuw/Za8s1xBAAAEEEEAAAQQQQACBzhAg4NQZ6rSJAAIIIIAAAggggAACXiXw3C2NeyHt3pcviz5tnE3U2R1duS5D9u4v0Ltx1vhkmXNar87uEu0jgAACCCCAAAIIIIAAAs0ECDg1I+ECAggggAACCCCAAAIIBKLA+memy5B+3fWhe0vQ6aPVu+XbjVl6n9S+TY9cMyIQHw1jRgABBBBAAAEEEEAAAR8Q6KKtU37cB/pJFxFAAAEEEEAAAQQQQACBDhF4bOku+c8XB/S2BqQnyPRJ/SU+NqJD2jYaUftIffjlLtm557B+KTkhXN7/42lGNq8IIIAAAggggAACCCCAgNcJEHDyukdChxBAAAEEEEAAAQQQQKCzBZZvzJMXP9orufmVEh0dJlO1oNOoQUkd0q2Dh8vks7V75OChYr29M8YkyhPXn9QhbdMIAggggAACCCCAAAIIINBWAQJObZXjPgQQQAABBBBAAAEEEPBrgbziavnn8n3y8ZqD+jhHDk2RMUOSpXdKjEfGnXmwWDbuzJVt2peRbrmwv9x8drpxyisCCCCAAAIIIIAAAggg4LUCBJy89tHQMQQQQAABBBBAAAEEEPAGga0HSmTBV9ny6beH9O4MHpAko4f0lIF94tzSvT1ZRbJpZ57s2tuwfJ6qtG9KtNwxa4CcMTzBLW1QCQIIIIAAAggggAACCCDgaQECTp4Wpn4EEEAAAQQQQAABBBDwC4El6w/KW59nyYHccn08cT0iJSUpRlKTukl6ag+J7+HaPk9HS6rkQF6J5BWWSV5BmWRlH7HxOX9yqtx+fn9J6BZmc50TBBBAAAEEEEAAAQQQQMCbBQg4efPToW8IIIAAAggggAACCCDgVQJVNcfkzdVZ8t7qA3K0pMamb926hWvL7cVKbEy4zXXjJL+oXNsTqkRKS6uNSzavZ41Pljmnp8no9Fib65wggAACCCCAAAIIIIAAAr4gQMDJF54SfUQAAQQQQAABBBBAAAGvEjh0pEre0oJOS7Svuvrj7erb6WMS5YpTe8kpg92zRF+7OsPNCCCAAAIIIIAAAggggEAbBQg4tRGO2xBAAAEEEEAAAQQQQACBbdr+Tut2FcmG3Ufk+x1FLoMM7B0jg3tHy9QRiTJlBPs0uQxHQQQQQAABBBBAAAEEEPBaAQJOXvto6BgCCCCAAAIIIIAAAgj4ksDR8hpZu7NIdh8qk4rqeqmsPqa91kllTb1UaV+j+3eXMf1iZVjvbuzP5EsPlr4igAACCCCAAAIIIICASwIEnFxiohACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggIAjgSBHGVxHAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwBUBAk6uKFEGAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDAoQABJ4c0ZCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCLgiQMDJFSXKIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIOBQg4OSQhgwEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAFXBAg4uaJEGQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAYcCBJwc0pCBAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCDgigABJ1eUKIMAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIOBQgICTQxoyEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEXBEg4OSKEmUQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQcChBwckhDBgIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAgCsCBJxcUaIMAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIICAQwECTg5pyEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEHBFgICTK0qUQQABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQcChAwMkhDRkIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAKuCBBwckWJMggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAg4FCDg5pCEDAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDAFQECTq4oUQYBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMChAAEnhzRkIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIuCJAwMkVJcoggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgg4FCDg5JCGDAQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAVcECDi5okQZBBBAAAEEEEAAAQQQ8JjA8eMimzKOSkV1vcfaoGIEXBHYc6hcDhdXu1KUMggggAACCCCAAAIIINBEILjJOacIIIAAAggggAACCCCAQIcJZOSVy83Pfi9l5bXSNaiL3DNnqFxycmqHtU9DCCiBumPH5RdPficZOaU6yMxJqfLgz4eBgwACCCCAAAIIIIAAAq0QIODUCiyKIoAAAggggAACCPifwFurD8iKjYcdDiw6oquk94ySfklRMmVkgsRHhzosS0brBV5blakHm9Sd9dqH/i/8d49cPDFVunRxXldt/XE5Wl5jFkyMCTOPOfBvgfySxllIsVGhEtLVhTdMCyQrNuWZwSZVbNn6g/KrmemS0iO8hbvIQgABBBBAAAEEEEAAAasAASerBscIIIAAAggggAACASewI7tUtu072uK4v91aqOc/oc3Auf68dLnhrH7t/oC7xQYDKPPw0cbAgRp2eUWd1Gtr7AW7EHF6/uM9smBllqm15qmz9FlS5gUO/FJg/e4i+e0LP5pje/pXY+TUofHmeVsODhc3Bi6N+wtLawg4GRi8IoAAAggggAACCCDgggB7OLmARBEEEEAAAQQQQAABBJSAmoHz6kf75IG3twHiJoFrp/WxqemCU1MlWAvsuZKqao+5UowyfiZQVeP+536JtoSeWtLRSMkJETKyT4xxyisCCCCAAAIIIIAAAgi4IMAMJxeQKIIAAggggAACCCAQGALhYV3lwsmN+wepJdtyj1TJ1oxic9k3JbHq+1xZMzG53bMqAkO15VGqmSkL7pssy3/MlZP6dpfJQ9o3U6Xl1shFwL5ATESwfPzQ6fLhhlyJDAuWCyck2y/IVQQQQAABBBBAAAEEEHAoQMDJIQ0ZCCCAAAIIIIAAAoEmENstVP73ksHNhq0CT395d7t8+u0hM+/Vz/YTcDI12neQnhQpv5rRv32VcDcC7RRQe0H9YortjLt2VsntCCCAAAIIIIAAAggElAABp4B63AwWAQQQQAABBBBAoC0CIV27yAOzh8m6bQVSUlarV7E/t7zFqiqq62VHTqls1/aI2nOoTGKjQmRIWrQM7x0jfRIiW7y3vZlqX6qDRyr1auKiQ2VMeqx+XFhWI5syGvermjYySYytktbtKpKK6jq93MDUbtInPkI/ttalXzjxh6pT1a1ttyQrfsrTx1lQUiP9tODRyD7d5eRBPazF9WO1FNqanQXNrlsv9IqPlMGp0dZL5vE+zXx/fqN7Zl6FmacOVm0+bLMsmpEZFBQkpw+Lb3GpvjptucQ9B8tku/bM1HNTaYjmMFR7ZkN7xYhltTWjWo+9KqetB4pl0/5i2ZdbIenJkXLh+GTpGRuut/nVtkKpra/X+tRFD3qGBjeulK6Co19tyzf7Nq5/rPbeCzXPjYOD2sy9Hdklxqk+sywitKt53vTAnT5bskpkT26ZHNHej0e07yf1FaKNITYqWHpo7yn1vTJ1RKJ002YdqVSkldtoed+q+63pS+37sqq23nrJPE7vGS0qoNk0Wd/vTfPUeVR4sEwaFGcvy+417e2jPaty2aqZbj9QItqpDOvVTYZr752BKdEtvn+2aeVzj1bp9faK097/2nuuuKJWPtJmUmbmV0iNtnSkqmN0v+4s82dXn4sIIIAAAggggAAC3iJAwMlbngT9QAABBBBAAAEEEPBqARV0mqAt96aW01OprLxW+9D/uKjrTdMnP+TKQ29u0/d8apqnzqeN66kHsCK1Jfw8kd5afcCcjZXQI0w++tPpejMrfzosTy7caTa59E+nSUqPhiDG7/650eyv6t+j147Uy/3r032y5qfmQaJ7Zg+VGWOT5fpnvpMDdoJvk0YmyGPXjpLw0MZgSGFZtdz76mazfXsHZ2mBlUeuGWEvSxauyZYlq7Pt5qmLf3xti8O8Z349Vguq2A8g7Mwpk9/+60c5qgXM7KXeyVHy1C2jzSCcvTLuuqaCKbe/8INUaQFLa3rpg71y0sAe8q/bx8ndL200sx68boTM1J6DkUoqa22Mbzgv3e7ssc8358uzi3cZt8l7f5zsMBDqDh/1vfLUf3fLp9qSdep7x1kaqS2zaASclElL75ul2ntCfdlLV2h7hN198aBmWffO2ywVVQ0B1maZ2oWY6BD57K9n2stqdu1wcbX89qVNknEiUGkUWHriIE0LeD2vvf9ST3yvGfnG6wsf75UN24v00wnD4uTas/rK3P/X+P1olFOvZ45Jkj//fLhEeejvDmtbHCOAAAIIIIAAAggg0FqBxp/+Wnsn5RFAAAEEEEAAAQQQCDCBbpHOf1/r/re3yZ/nbzWDN/aIPv8hT2b95RsprXT8gbe9+1y9lhrfEERS5csqGtvYf9h2RpBxXlN3zKa//Xo2nxHStO3Mggr5++KddoNNquz6LQXy1ldZTW/rtPPjaiqWnbRk/UG59vH1DoNN6hYVUJvz8FqbWTZ2qmr3pS+2FshNT33XLNhkVPzTniOyeF2Ocdohr+7wUfRzX90ki7884FKwSQ0sLa7xPdwhA21jI2rG4KUPrWkWbLJWl6N9312ulVm/uyGoZM1repxfXCP/pwVl69WUKTtp9cbD8sA7W+3kcAkBBBBAAAEEEEAAgc4XcP4Tc+f3kR4ggAACCCCAAAIIIOAVAlsyis1+qCXAms5uWrOj0JxZZBSMjQmVPklRUllTL/u0pe6MD5LVLI/nP9kr9146xCjqtldj1pKqUM2UUR/4q6XzMvMal6NTeRmHy/VZP7naDA1rUsviGemM4QlSXtkw22bT7iPGZcnSPkT/dmuhfh4XGybD+8XoszSsM3Pe/CxTbprez7wnLCRIhmjLgjVNO7Wl41xJapm+fYcax5ChLVVoLHGo7h85INbuknoqL75bmHqxSUfLa+Txd3fYXAvXZo70T+ummWlL7B0olVotGKeSem5/1oKJS/9wqk15d52o+MLD72yzqU715WRtKcCu2np+m/YdlaKj1fLMfxpnJdkU9sCJu3zmrdov32nLADZNauZPD23ftMjwhpl+1dpSgkfV7CfNwrpMYH9thtloyxKNBdr7VQVxjKRmoMVp9dhLA1Oi7F2WsUN6SIEW3LEmV9+H1nseeGub+R4xrqckRujLHVr7qL9/tLJqtmFLyzNma8FN4+8INTsxKiJEMrWlHq3p64352nKIpdpSj92slzlGAAEEEEAAAQQQQKDTBQg4dfojoAMIIIAAAggggAACviDw/neHZK/2Ia+R0rV9VqxJBXX+vqhxuTqVd/eVQ+WKU9PMYtlFlfLr53+Qw0UN+7WoZcBu1JbPMvbmUcuOvactG2d84Gze6OLBedpSeAlaYCUtrmH/JeO24ooafR+f7PyGfZ2M62p/GJXyT+wfY1xPT2oc26WnpIn6UumX2lJvRtDpx11H9H5eeFqa3H/FUD1f9f/GZzfIrsyGPXbUkmVqLytj6UDVt/l3TtDLWv849XerXBrzWaOSRH0Z6RFthpV1KbWXtOXmVHDG1fTcx/ts2p0xKUX+qI3FCHaovt/35hZZu7lhScFDmt+yH3NtlrBztS1n5ZZr9VqDZypo8cbvTjaXlVPvrxeX7ZX5y/c7q8pt+e7yWXdiuTijYzdf0F9u0AKRwS4+q17a+1k9WyN9qc0Eu+flTcap/O6SQfpeVuYFFw6euuGkZqVuePZ72aYF9lxN6r2QW9D4PaUChC//zwRzD7IMLcB749MbzKX7VMBwqTaj7tJTUh02ob731Xv4iV+ONsdUUFot92mzJo3vPXXz1zsKCDg5VCQDAQQQQAABBBBAoLMECDh1ljztIoAAAggggAACCHidQJm2xN3HJ/ZoUp07rv136Ei1fLuzyObDXpV31ZTe6sVMW7KKbT58vvKsPjbBJlVQfXD+5E2j5RptCTcjfb/3qJyv7VukUoY2u+Ef7ZjBclKfGD3glNpkObKCklo94JR/ItClZl2p/Yoy8xoCTnnaB+HW1EcLdjhLaiaTmqFiBJtUeTXj6/yJKWbASV3L04JZ6T3tzzJR+Z2ZPll70Gy+b2q0/EXbG8eaVKDssetGyYw/fmUGDb7eVuSRgNO7X2Vbm5anbx5tBptUhpqhdvt5A+TzTfkOlzG0qcANJ+7yydaWX7Smq8/s43KwyXqftx2//aXtM3tQ23tssPY+MpJ63z9y4yj5nxd/NC7JAm1/tZYCTqrgTVpA7tSh8eY9KlB7y4x0+Y1lhuH+vMZAl1mQAwQQQAABBBBAAAEEOlmAgFMnPwCaRwABBBBAAAEEEPAeAbXM3YNvON8fZeLweJkxtiFIZPR+n2WJL3XtVzP6G1k2r4O1mVFq9oqaLaOS2gvJ3Smpu+3+N2qGREJMiDmbZ8roJHlfC3Ac0JbUUynXMsNJzdKICG1Y4sxZvy47vVezIkO0D9xV8EalIC1KEu5iXc0q8vCF/JJq00M1ddv59p+Xmu107snJ5kyqrBOzwtzdvUOFjQGEvinRDoN0s7TZMS8u3e3u5pvV506fxNhwfTlAo5Hr/7FBrtECslNGJEpMhO/+SHrI8r0bGR6sj8cYo/F6yuA4MQK86lqe5TkbZZq+/mxS8xlQEwb0ELWMp7HEY96RhlmSTe/lHAEEEEAAAQQQQACBzhTw3X/dd6YabSOAAAIIIIAAAggErICaffDLc9Kbjd8aiFAfDK/46XCzMsaF0oo641DbC6kx0BCu7WWTru0f1NYUre33opKaaaQCR8Z+Sip4EKHtn2SkM4Yl6AGnIyf2sMmz7OHUM9757CajnuknJRqH5uu4/rGy8J5J5rm3Hlifl+rjAS0QoJZNtJf25DTuoWMNMtgr29ZrpWXa3kUn0tA+jt8DveNtg4nGPe5+dafPzPE9xbo/ktqT6K9vbpO/ap1W+xRNGBwvU0bGyxnDE5vti+bucbmrPrXnlnUJxP5aIFnNQrOXBml7LRl7WKnvSbX0ZNP936z3xUU3349K1R2mfU8bAadjao1FEgIIIIAAAggggAACXiZAwMnLHgjdQQABBBBAAAEEEOhcARWosSYjaKOuqZlJ9oJNKi/LMsNJfSj8t7e2qctOU3F5jVmmjxbsWfC/J5vn7TmI7RYqudUNwawCy2yemOgQbdmvhiXu1H4xavbTYcsMp77aMnmupoSYMFeLel25LMveO6pzzy9xbdZQZVW928dSoi3laN23K157do5SbJTjPEf3tOW6O32uOqO3HNSWc3zv86xmXSnQlqxcpu1rpL7ULKHbLhqoLznXmr24mlXaARfU95Q1JWmzuBylpnk52l5u/RLtf581/fvHUZ1cRwABBBBAAAEEEEDAGwUIOHnjU6FPCCCAAAIIIIAAAp0ikJwQIe//8VSbtm967nvZou2zpJJaBu/7vUdkvLa8VdMUHdm2f1p76gPmnto+Trkngir52n5NJSdmVfVKihLrkntZ2pjyjzYGvfr1tP9BeNPxqllcwUEOpnQ0LeyF59HabLK2JDVuT6eOmL1SXdty4MzdPndfPEiu15bRe3VFpqz6MU/fQ6ypY0VVnTyxcIf8Vws+zb9zosMZQ03v64zz0GDb935d/TGH3aiptc0Lt8w2dHgTGQgggAACCCCAAAII+KBA234q9sGB0mUEEEAAAQQQQAABBNoicMeFA+TWf3xv3vqkNhPm7bubz0IamNywb5FR8Opz+rq0F9KI3jHGLW59TdNmS22SI3qd+Uerpe5Yw4fe/VOi9A/y1VJmanbJfm0fp3zLDKd0LSDlSlLLe3lbUrOEXJ0Z0/R5jR0SJ+MHxjodkidmGKl9jFS/jVlORyzL6zntUBsLHLYso2ivCk/4JHQLk9//bLD+pdr/ZkehrNleKN9qX9aZhLsyS2T5xlyZ2WSfNHv9VNdqtCXqOjqp94H1meW2sKeSdQah6mfPJnusdXTfaQ8BBBBAAAEEEEAAAU8JEHDylCz1IoAAAggggAACCPiFwJj0WH1fpYycUn08e7NL5dvdR+TkQbaznAZqgRxrSo2LkMsnp1kvdehxqjbDyUgF2gyn0oqGPYL692zoZ28tsNQQcKoQ6/5B6SfyjXu9+TVOWx7Qmg5oM7oGJNs+B2u+9bh3kyXNIrUZT7fY2ZvLeo8nj7tpYzmqPSeVtmQUO2yqRluusaWkbd9lk9RSdvbS/rwKe5fNa572SeoeJj+blKp/1WmBwn98uEcWrmpccm+jZuAo4NT0uWcXtDwWc1BuPujRPVT/HlLV7j1QKhXa/kyRTQKx6nkZMyRVObWkpaO9nlQ+CQEEEEAAAQQQQAABXxbw/HoQvqxD3xFAAAEEEEAAAQQQ0AR+O2uAjcMTS3bZnKuTIam2M5yeem+nbDtQ0qxcR12wBpyOaPs0GcvrGQGn9BOBmR1aAM2YWaP61rdJIKaj+tuWdvo1mY314YZDLlejlgNUSyga6ZtN+bJwTbZx2uGvfSxjydH2A1PPxV7amNGwvKO9PHXNmHlj5K/6Pk+b3WY7Ayhf23/ox51FRhG7rx3po9o6d3SSTT+Ky+tszq0nfS1W6vrH3+VaszvseFCvbmZb6nvordWNATMjY+E32TbfX+lN/p4wyvGKAAIIIIAAAggggIA/CBBw8oenyBgQQAABBBBAAAEEPCpw6tB4m+BE5sEyWbfL9gN79UH/NTP6mf1QH0Df/PQGeXTxTskqrJTjls/81ayHXTllkuXBmRmpPRqDKWomU+2JmTH9T+zRZMwE2ravcTaN2p+o6QwNc0BeeNC/SeDhbW1/oOc/2SsFWoDNSMpa+edZlg008u6fM8w41F+fXLhTfvvKJtmcWSy1lmXaVLxG1bEly3MBxGu0/Y2s6dfP/yA7tfeIkVR/ln57UF77JMO45PBVzbwxknruv5+/Wd97TNWxSQtYXfvUd0a2+brnUJlU1tju6+Quny+25MvqbQX6+73pDK2SyjpZ+dNhuee1zWZf1EF6suO9xNQShNa9tNSsw9+99pNk5JWbwR31/ZerPfN9ueU29brz5LaZtoHoVz7aJ6+s2C9HymukWJtROP+LLHlOW4LTmm4/3/Yeax7HCCCAAAIIIIAAAgj4ugBL6vn6E6T/CCCAAAIIIIAAAh0icLu2l9P9/95itvWU9kHywt9PMs/Vwa9m9JeP1h+SIm3PJJXUh95LVmfrX+o8XFtuq7b2mPmh+JljkuTx60epLLcn6wwnI9ikGkk6sX+MMdPJmmed8aPK7tYCa794bL06bJbKymtl0p0rzet9tZkbC++x9TAztQNlMeWeL8zAlzXPerzq+1yZpH1Z0y/O7Sd32PmgfpDW5uC+MaL2/DHSG8v3i/pqms4anyyPXDPC5vKEgT1k+oRkWbmhsb31WwpEfalkBDUMo+ioEFn58Jk2dbjr5MzhCXpQ05iJVlFVJ9c+vl5/z6j3jVr2UBm6ki6anCrzPm4MTH29MV/UlzUN7x8r2/Y1zpa699WGgM9frh8pM8b01Iu6y+eRhTvM5QKNPlj3PzKuGa8qb+a4ZOPU7utVZ/eV15c1jlHNUFNfKlnrVkvYffZX22d203Pf2yxzZ6+BEs3b+v5WZdR77Y25E83ig9OiZfKoBFm7ueH9ojJe/nCv/mUWshyM1pbhHN2vu+UKhwgggAACCCCAAAII+JcAM5z863kyGgQQQAABBBBAAAEPCZwzuqfExjTOHMnUZoSs2VFo05paGuzl346XIQ4+VK7S9nixBg0ytaXTPJUSYsKaVZ3QI8zcPyb9xEwna6E+Ta6VakEPV1PdiRlUjsqrWIkRuHFUxtH1Yy0EWh6+dqQeYHB0r3Hd0T4/f7xiqJyvBWjsJdVfa59VkK3p8nT27mvrtcduOEkiw21/J1C9Z9TeTsb7ZvRg273D7LV14/R0fa8ge3nqWkpihPxyRrrd7Lr6YzbX3eFj7E1lrdgYj/Wacfz3m0dLn/jGGXrGdeur2m9LvZ/tJWvdKnBknV2oyh8pbdgry969LV2rrWse8Htg9jA9ENXSfSpPBWQfbhLwdHYP+QgggAACCCCAAAII+JoAASdfe2L0FwEEEEAAAQQQQMBjAmEhXR3W3aWLyK1NZtm8tLxxhoVxY6+4CJl/5wT56w0j9Q/21WwLR6m8stZRVruvq3abBi96W5ag66EtAdi0b+k9o9rdricqCAtx/GOLCkws/dNpcupJCc3GY+1LQXHjMnvW62oJwT9pQYM3/neSDEvvbs5qspaxHhe1MVhhrcPR8RBtxsyS+yeLCio1fTZqps7lU3vLr2b2d3S7eT2kaxdZ/IdT5bTRieY140AFaR67/iSJi24Mnhp59l7b61NWVd9sLPbaUbPJzpmYIq/MnSBnDI+3V8TmmhrjEm2MV2pLETZ9n9sU1E6KtCXu3JFC7bwPleP8OyfK9eel2+2H6puajbVAe38l2gkCq36FhTb+vROsOThK9tp3VJbrCCCAAAIIIIAAAgh0hkCX41rqjIZpEwEEEEAAAQQQQACBQBHIL6mW/dpspmptOT0VSOim7UHTJzFS1F40JPcJqJ9s9mp79ihv9WOOmhgVpQWUevYIl+TYcGkh9mfTiVJtX6F92n5A5SdmeKmgS5oW2Ero1jhDzOYGD5yovqs9idR+VGq/LdW2Sj9oy+D9+tnvzRYfvG6EzBzrePk5tWeSMlF7CqmAhwoqKge1n1NOUaWEa0EUFewJ14KtodqrCuQ4S23xKSyrkeyCSn2fKPV9oNpR7cZrAZu4biHSPTLUnH3nrH17+Wq/pqz8SlEztNQstAgtiKPq7pUQoY/L3j2euKYCbLsOlopSHJASzfe4J5CpEwEEEEAAAQQQQMBrBQg4ee2joWMIIIAAAggggAACCCCAgK1AawNOtndzhgACCCCAAAIIIIAAAgh4TsDxfH3PtUnNCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACfiRAwMmPHiZDQQABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQ6Q4CAU2eo0yYCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg4EcCBJz86GEyFAQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECgMwSCO6NR2kQAAQQQQAABBBBAAAEEEGi9QI+oEAkJbvy9wVDLcetr4w4EEEAAAQQQQAABBBBAwH0CXY5ryX3VURMCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggECgCTT+alygjZzxIoAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIuEWAgJNbGKkEAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEAhcAQJOgfvsGTkCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg4BYBAk5uYaQSBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBwBYIDd+iMHAEEEEAAAQQQQAABBHxNYH9+hXy2MU+y8islv7ha4rqFyt9+McLXhtHp/f1qW6HMW7FfYqODJSk2XMamd5epI5IkPJTfSez0h0MHEEAAAQQQQAABBBDwUQECTj764Og2AggggAACCCCAAAKBJLAlq0QeeHOr5ByusBl2bEyozTknrgnU1NXLtn1HzcJLV2drx1vl0im9Ze6sgRIaTODJxOEAAQQQQAABBBBAAAEEXBIg4OQSE4UQQAABBBBAAAEEEECgswTmrdwv//pgr93mE7XZOf6SCkqr5ZIH15jDue3igXLVGb3Nc3cepMZF2K1u8ZcHZMX3uTL/rpMlpYf/2NodLBcRQAABBBBAAAEEEEDArQIEnNzKSWUIIIAAAggggAACCCDgToG3vzpgN9iU0CNMxgzoIRdMSG7WnFp278F3tttc/8ctoyUmovmPP0u/PSjvrzuklx3Wp5vcc8lgm/s68uTYMZHaOu2PE6miut44dPtrvw6MeG0AABDHSURBVKRIuf68dNmw64jszCyxabekrFauffJbeef3kyShW5jb26ZCBBBAAAEEEEAAAQQQ8E+B5j9x+ec4GRUCCCCAAAIIIIAAAgj4mEBRWY384z+7bHqdFBcur82d0GIgpLSi1ma5OFXBojXZcuP0fjZ1qZN9ueVm2UoPBniaNdzJFyJCu8qvZ/QXmdHQkUVrc+Txd3eYvVJBp6ff3yMPsz+WacIBAggggAACCCCAAAIItCzAwtwt+5CLAAIIIIAAAggggAACnSTw6or9Ni2np3WTBb8/pcVgk80NlpN3taXiSI4FLp+cJo/cNMqmwIoNuaKW+SMhgAACCCCAAAIIIIAAAq4IEHByRYkyCCCAAAIIIIAAAggg0KEC5dpsoyWrs802I8ODZb42sykqrKt5rTUHR0tqZP3uotbcEnBlzxqVJP87e6jNuF/5bL/NOScIIIAAAggggAACCCCAgCMBAk6OZLiOAAIIIIAAAggggAACnSbw5peZUn/suNn+5VN6SWhw+358eePzLLM+DuwLXHxyqoRYnP/7dY6UVXluLyn7veAqAggggAACCCCAAAII+KIAezj54lOjzwgggAACCCCAAAII+LnAx9/m2ozw52f0tjlvy8l32wqlUNsXKj46tC23S03dMdmZUypbDpTKroOlEhsZIsN7d5MRfbpLao9wl+qsrT8uO7JLZNP+Yq2OMukZGyazJqZIn4RIl+63FqrTAnJ7tDq2a33aoX2pNCS1mwxNi5ahvWIkqIu1tGvHIV27yMWnp8miLxqWIFRBvy+3HpYLxqe4VgGlEEAAAQQQQAABBBBAIGAFCDgF7KNn4AgggAACCCCAAAIIeK9A4dHGvYNOHhEvcW0MEqkR9k2JlsxDZfpg3/06W26b2b/VA/9h31G566VNUlFVZ/feM8ckyUNXjZDwUMezsLIKK+WWf2wQtbyfNc1fvl/SkiLlmVvHWC+3eLwzp0x++68fm9Vl3NQ7OUqeumW09ImPMC65/HrN1D5mwEndlK31m4QAAggggAACCCCAAAIIOBNw/NOQszvJRwABBBBAAAEEEEAAAQQ8IFBVc0xqtdlERhrSq5tx2KbXq6Y1zo76z1fZcrxxpT6X6ntr9QH59bPfOww2qUpWbzwsF//1G8kvaQyUWSvfnFkscx5e6zBAlHO4QhZ81TCryHqfveMl6w/KtY+vd1iXuudAbrne3saMo/aqaPFacmy4dLVMj8oprGqxPJkIIIAAAggggAACCCCAgBIg4MT7AAEEEEAAAQQQQAABBLxK4NAR2xk1KVoApD3pnNE9JTysq15FWXmtfLmtwOXqCkqr5dnFu2zKq2BMelo3iY2xXZpPzVx65r97bMoaJ4+8t9NmTyq1T5KauXX2hGRJSWyYhbR0dbZR3OHr0fIaefzdHTb5amzD+8fKsPTuNvsvqeXw/vz2Npuyrp50iw4xi+YU2D4PM4MDBBBAAAEEEEAAAQQQQMAiwJJ6FgwOEUAAAQQQQAABBBBAoPMFcopsZ9T0bGfAqWuXhn2J3l2ZpQ/ujVWZMnVEgksDffbDvTbl+qZGy6t3jJduEQ0/Sn26MU/u//cWs8yKDbly63n9bZayU/s17c1u2GNJFYzRgjlv3H2yqJlERlq8Lkf+vsA2kGTkWV+f+3ifTeBqxqQU+eMVQyVUC2CpVFFdL/e9uUXWbm4Iqh3Kr5RlP+bKzLHJ1mqcHidqfTOW/sstIuDkFIwCCCCAAAIIIIAAAgggwAwn3gMIIIAAAggggAACCCDgXQI5TQIc1sBMW3t69RmNy+pt2XtUco/aBrXs1auW3lu+/pBN1ku3jzWDTSrj3DE9Zfb0PjZlFn1jO1NpobZvlDX96eoRNsEmlXfpKWn6jCdrOXvHn6w9aF5Wwa+//Hy4GWxSGZHabKfHrhslkeGNv1v49bYi8x5XDxJjG2dvFZfWunob5RBAAAEEEEAAAQQQQCCABVhSL4AfPkNHAAEEEEAAAQQQQMAbBdRScNbU1Q0/tahZUqMH9TCrfVvbl8lZUsvpWdOpJyVIbFRjIMbIu2aKbcBpv7YfkzUdsCxJpwJBpw2Nt2abx5dMSjWP7R2o/aGsNred399eMT0Ade7JjTOasvJt+2P3piYXg4Ma0Y81eR5NinKKAAIIIIAAAggggAACCOgCjb/2BggCCCCAAAIIIIAAAggg4AUCqXENexoZXckrrpb0/9/evcZYddQBAB+6LCywW3Zh6QLLo1BIWUCktqKAgMRYFY1p0rQWU5ImKr5ijTZ+IJGaaJqQxiaaGG2iDY1tqiFpFPxQ00rRNCW0ECmFalsQCi3vZ2FhKU/PLHvv3nP3sLssbHov/U0C58ycOXPn/IYv5J//TMOgXLXH1/vnjwmbth5tfX/ly7vDg1+Z0OlYO4sCR1PGDM7sP+zG/q1nJ509d6H1+Z6CAFNs2F+QsTW+sTokO/xlltFDB2a25xqLA0fvHm4JK9enM7Byfbftbs7dhr2HrjzgtP9Ye7BtcNFZVfmB3RAgQIAAAQIECBAgQKBAQMCpAMMtAQIECBAgQIAAAQIfvsDIuvazjeJsurP9XXdmPaepPlQPqgzNJ8+G08lZR//YtL/T194rCBTFjg21/S/bvy4JyhxoO3vq4NH0dn0nmtu3pBtS0zFDKjdobXK2U2dlV1Eg6zd/2dpZ9/yzltPn8/fdvTlYsOVgQ9F6dHcM/QgQIECAAAECBAgQ+GgJtO+T8NH6bl9LgAABAgQIECBAgECJCjQOTWc47SsK4PR02jGz6J65o/KvP72m8231qirT/13KZTDlByi4OdOW3RSb+vZNv1fQ7apuq6sqevR+ZQ/mUxgkG1GUcdajSXiJAAECBAgQIECAAIHrXkCG03W/xD6QAAECBAgQIECAQHkJDOpfESpu6JM/r2jngZZr9gH3zh4Vlj+3o3W8rbuOh7qay2cVjSra4m5vJ4GvVICmKGBWk2QuHTt+pvU3j5y4dO3JB00YXp167bZbh4TbJ9Sm2rIqWedOZfXLtZ1oORcKg2uN9emMs1w/VwIECBAgQIAAAQIECBQKCDgVargnQIAAAQIECBAgQKAkBOK5QUfazhH618b94czCptCvB5k6xR8zpLpfmDFlaHj1jcOtj3LX4n6xPnZY+kyll7YcDt//0i0dum7e+X4+OBYfjqpPZ2g1JBlCuYDT9uRspQsXQ0jiaR3KmfOXzoDq8KCtYXTRfAYmGU/f+vy4y3Xvcfuz63an3h1Zl/6e1EMVAgQIECBAgAABAgQItAn0zl4PeAkQIECAAAECBAgQIHAVAjMn1+ffPp9EaFat35uvX+3Nos+O7dYQNQP6hqok2ypXduw+EbYkWVHF5fG/b081TRpdk6rf3NAeuDp1+lxYs/lA6nmu8tr2Y7nbzGvfJEo1vCCY9fKmg2HF2vcy+15N45/W7Eq9PmvSkFRdhQABAgQIECBAgAABAlkCAk5ZKtoIECBAgAABAgQIEPhQBRbfeXPq959avTNVv5rKjIl1oTbJoOpO+eaC8alui3+1IbyYBIxOn7kQ9iRb7C156o2w4b9H8n3ieUn3zmo/Jyo+WDRvTP55vFn65Jaw7u32d2LG0z+3HAzL/vxmql9WZel9Tanmx1a8FR78w6YQs6zOnk8GaitxzF2HWzIDZLk+Wdc4r1w2Vnw+a1p9GF5rS70sK20ECBAgQIAAAQIECKQFbKmX9lAjQIAAAQIECBAgQKAEBGKQY/bHh4WYxRPLvkMt4bFVW8NDX514TWa3cP6Y8LuV27oc677PjA5PPv9OaD55trVvzLZa8sTmy773jQXjwsCCrKjYceLI6hDPW9r41qUgUxzjh7/dGGJwKp7v9H5yvlNsi+dWdVXumFAXPnfH8LB6w75811e2HArxTyxxzFhyZzBVD6oMqx+Z29rW1V8xgLb0j1tS3b73xY5bCKY6qBAgQIAAAQIECBAgQKBNQIaTfwoECBAgQIAAAQIECJSkQHGwY8WLu8LSZ/4TLrYn8vR43nd/urFb71ZW9Am//vb0EAM3XZU7Z4wI988bm9nt4SQzqb6uf+pZDArFc6pisCmW2dOGdSvo9NN7JoUFM0emxspV4pi5YFNsi4Gyc23j5/pkXf+372RYuGxdON58KbAW+0weX9saLMvqr40AAQIECBAgQIAAAQLFAgJOxSLqBAgQIECAAAECBAiUhMCEEYPCvNtuSs3l+Vf3hrseWRse/evbrdvQHW85l3qeValIgkbFJZ7PNHd6eux+ldn/PZo65saw6uHZrf1zGUSF48Xt+X7+wNTwi69PDjFAlVVG1lWFZ5fMah2jOJNpYFXfMP8TDcn7U8KggV1vQhEzqH72tabw1E8+FZrGDc5nNWX9bmw7cuJMh0cxaLd1T3N45qV3w4+Xvx4WPfpKOP3B+VS/h+66NtlkqUFVCBAgQIAAAQIECBC4bgX6XEzKdft1PowAAQIECBAgQIAAgbIWiNk53022n3t929HM75h6S2144ge3Zz7rrcaDxz8I7xw4FaqSANWtjTWhX9s2dlfye/F8pSPJOA3J1oEjkmBUruxNtrWLAanqJAg1oF9F6JMdv8p1z19PJIG37ftPhpOnLwXgYlCqceiAUF/TP3OM7W0ZTfkBim5+uXh6mDN5aFGrKgECBAgQIECAAAECBC4vIOB0eRtPCBAgQIAAAQIECBAoAYG45dzvX9gRlj+3o8NsbhpSFf6WZB8pVyaw9s3D4UePv9bhpeH1A8KyBz4WmkbVdHimgQABAgQIECBAgAABAp0JdL1fQ2dve0aAAAECBAgQIECAAIFeFogZP9/5wvhw98zGsGr93vDCvw+E/UmG0Kkkm6f5VNdb6vXy9Mpy+CPNl7bZi7Y11ZVhWnJe05c/OSLMaRrarXOkyvKjTZoAAQIECBAgQIAAgV4VkOHUq7wGJ0CAAAECBAgQIECgNwXiBuHd3XauN+dRjmOzK8dVM2cCBAgQIECAAAECpSsg4FS6a2NmBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGyELihLGZpkgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAiUrIOBUsktjYgQIECBAgAABAgQIECBAgAABAgQIECBAgACB8hAQcCqPdTJLAgQIECBAgAABAgQIECBAgAABAgQIECBAgEDJCgg4lezSmBgBAgQIECBAgAABAgQIECBAgAABAgQIECBAoDwEBJzKY53MkgABAgQIECBAgAABAgQIECBAgAABAgQIECBQsgICTiW7NCZGgAABAgQIECBAgAABAgQIECBAgAABAgQIECgPAQGn8lgnsyRAgAABAgQIECBAgAABAgQIECBAgAABAgQIlKyAgFPJLo2JESBAgAABAgQIECBAgAABAgQIECBAgAABAgTKQ0DAqTzWySwJECBAgAABAgQIECBAgAABAgQIECBAgAABAiUrIOBUsktjYgQIECBAgAABAgQIECBAgAABAgQIECBAgACB8hAQcCqPdTJLAgQIECBAgAABAgQIECBAgAABAgQIECBAgEDJCgg4lezSmBgBAgQIECBAgAABAgQIECBAgAABAgQIECBAoDwEBJzKY53MkgABAgQIECBAgAABAgQIECBAgAABAgQIECBQsgICTiW7NCZGgAABAgQIECBAgAABAgQIECBAgAABAgQIECgPAQGn8lgnsyRAgAABAgQIECBAgAABAgQIECBAgAABAgQIlKzA/wHZpDlUM4Q3oAAAAABJRU5ErkJggg==" + } + }, + "cell_type": "markdown", + "id": "919fe33c-0149-4f7d-b200-544a18986c9a", + "metadata": {}, + "source": [ + "# Self-RAG with Redis VectorStore\n", + "\n", + "Port of [Langchain Self-RAG Notebook](https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_self_rag.ipynb)\n", + "\n", + "Self-RAG is a strategy for RAG that incorporates self-reflection / self-grading on retrieved documents and generations. \n", + "\n", + "In the [paper](https://arxiv.org/abs/2310.11511), a few decisions are made:\n", + "\n", + "1. Should I retrieve from retriever, `R` -\n", + "\n", + "* Input: `x (question)` OR `x (question)`, `y (generation)`\n", + "* Decides when to retrieve `D` chunks with `R`\n", + "* Output: `yes, no, continue`\n", + "\n", + "2. Are the retrieved passages `D` relevant to the question `x` -\n", + "\n", + "* * Input: (`x (question)`, `d (chunk)`) for `d` in `D`\n", + "* `d` provides useful information to solve `x`\n", + "* Output: `relevant, irrelevant`\n", + "\n", + "3. Are the LLM generation from each chunk in `D` is relevant to the chunk (hallucinations, etc) -\n", + "\n", + "* Input: `x (question)`, `d (chunk)`, `y (generation)` for `d` in `D`\n", + "* All of the verification-worthy statements in `y (generation)` are supported by `d`\n", + "* Output: `{fully supported, partially supported, no support`\n", + "\n", + "4. The LLM generation from each chunk in `D` is a useful response to `x (question)` -\n", + "\n", + "* Input: `x (question)`, `y (generation)` for `d` in `D`\n", + "* `y (generation)` is a useful response to `x (question)`.\n", + "* Output: `{5, 4, 3, 2, 1}`\n", + "\n", + "We will implement some of these ideas from scratch using [LangGraph](https://langchain-ai.github.io/langgraph/).\n", + "\n", + "![Screenshot 2024-04-01 at 12.41.50 PM.png](attachment:15cba0ab-a549-4909-8373-fb761e384eff.png)" + ] + }, + { + "cell_type": "markdown", + "id": "72f3ee57-68ab-4040-bd36-4014e2a23d96", + "metadata": {}, + "source": [ + "# Environment " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a384cc48-0425-4e8f-aafc-cfb8e56025c9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install -qU langchain-redis langchain_community tiktoken langchain-openai langchain langgraph langsmith" + ] + }, + { + "cell_type": "markdown", + "id": "9a905a49-fe8e-4c38-b9a1-fda5f985da45", + "metadata": {}, + "source": [ + "## Setting up Redis Connection\n", + "To use RedisVectorStore, you need a running Redis instance. For this example, we assume a local Redis instance running on the default port. Modify the URL if your setup differs:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5510ad39-8a53-4390-8829-52a9b8b75e92", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Connecting to Redis at: redis://redis:6379\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "# Use the environment variable if set, otherwise default to localhost\n", + "REDIS_URL = os.getenv(\"REDIS_URL\", \"redis://localhost:6379\")\n", + "print(f\"Connecting to Redis at: {REDIS_URL}\")" + ] + }, + { + "cell_type": "markdown", + "id": "15569b93-3c68-4aac-838c-37112d33987a", + "metadata": {}, + "source": [ + "### LLMs" + ] + }, + { + "cell_type": "markdown", + "id": "601cd71d-5e17-4e7c-ba15-f577abefc02f", + "metadata": {}, + "source": [ + "### Set OpenAI API key" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f18b63c7-d0d3-41c1-ae6b-5a0f1b8ccf0f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OpenAI API key not found in environment variables.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Please enter your OpenAI API key: ········\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OpenAI API key has been set for this session.\n" + ] + } + ], + "source": [ + "from getpass import getpass\n", + "\n", + "# Check if OPENAI_API_KEY is already set in the environment\n", + "openai_api_key = os.getenv(\"OPENAI_API_KEY\")\n", + "\n", + "if not openai_api_key:\n", + " print(\"OpenAI API key not found in environment variables.\")\n", + " openai_api_key = getpass(\"Please enter your OpenAI API key: \")\n", + "\n", + " # Set the API key for the current session\n", + " os.environ[\"OPENAI_API_KEY\"] = openai_api_key\n", + " print(\"OpenAI API key has been set for this session.\")\n", + "else:\n", + " print(\"OpenAI API key found in environment variables.\")" + ] + }, + { + "cell_type": "markdown", + "id": "c27bebdc-be71-4130-ab9d-42f09f87658b", + "metadata": {}, + "source": [ + "## Retriever\n", + " \n", + "Let's index 3 blog posts." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "565a6d44-2c9f-4fff-b1ec-eea05df9350d", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", + "from langchain_community.document_loaders import WebBaseLoader\n", + "from langchain_redis import RedisVectorStore\n", + "from langchain_openai import OpenAIEmbeddings\n", + "\n", + "urls = [\n", + " \"https://lilianweng.github.io/posts/2023-06-23-agent/\",\n", + " \"https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/\",\n", + " \"https://lilianweng.github.io/posts/2023-10-25-adv-attack-llm/\",\n", + "]\n", + "\n", + "docs = [WebBaseLoader(url).load() for url in urls]\n", + "docs_list = [item for sublist in docs for item in sublist]\n", + "\n", + "text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(\n", + " chunk_size=250, chunk_overlap=0\n", + ")\n", + "doc_splits = text_splitter.split_documents(docs_list)\n", + "\n", + "# Add to vectorDB\n", + "vectorstore = RedisVectorStore.from_documents(\n", + " doc_splits,\n", + " OpenAIEmbeddings(),\n", + " redis_url=REDIS_URL,\n", + " index_name=\"rag-redis\"\n", + ")\n", + "\n", + "retriever = vectorstore.as_retriever()" + ] + }, + { + "cell_type": "markdown", + "id": "29c12f74-53e2-43cc-896f-875d1c5d9d93", + "metadata": {}, + "source": [ + "## LLMs" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1fafad21-60cc-483e-92a3-6a7edb1838e3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "binary_score='yes'\n" + ] + } + ], + "source": [ + "### Retrieval Grader\n", + "\n", + "\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.pydantic_v1 import BaseModel, Field\n", + "from langchain_openai import ChatOpenAI\n", + "\n", + "\n", + "# Data model\n", + "class GradeDocuments(BaseModel):\n", + " \"\"\"Binary score for relevance check on retrieved documents.\"\"\"\n", + "\n", + " binary_score: str = Field(\n", + " description=\"Documents are relevant to the question, 'yes' or 'no'\"\n", + " )\n", + "\n", + "\n", + "# LLM with function call\n", + "llm = ChatOpenAI(model=\"gpt-3.5-turbo-0125\", temperature=0)\n", + "structured_llm_grader = llm.with_structured_output(GradeDocuments)\n", + "\n", + "# Prompt\n", + "system = \"\"\"You are a grader assessing relevance of a retrieved document to a user question. \\n \n", + " It does not need to be a stringent test. The goal is to filter out erroneous retrievals. \\n\n", + " If the document contains keyword(s) or semantic meaning related to the user question, grade it as relevant. \\n\n", + " Give a binary score 'yes' or 'no' score to indicate whether the document is relevant to the question.\"\"\"\n", + "grade_prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\"system\", system),\n", + " (\"human\", \"Retrieved document: \\n\\n {document} \\n\\n User question: {question}\"),\n", + " ]\n", + ")\n", + "\n", + "retrieval_grader = grade_prompt | structured_llm_grader\n", + "question = \"agent memory\"\n", + "docs = retriever.invoke(question)\n", + "doc_txt = docs[1].page_content\n", + "print(retrieval_grader.invoke({\"question\": question, \"document\": doc_txt}))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "dcd77cc1-4587-40ec-b633-5364eab9e1ec", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The agent system overview includes memory as a key component for agents to behave based on past experiences and interact with other agents. Long-term memory allows agents to retain and recall information over extended periods, enhancing their problem-solving capabilities. The agent can utilize external resources like internet access and external APIs to supplement its memory and decision-making processes.\n" + ] + } + ], + "source": [ + "### Generate\n", + "\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.output_parsers import StrOutputParser\n", + "\n", + "# Prompt\n", + "prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\n", + " \"human\",\n", + " \"\"\"You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.\n", + "Question: {question} \n", + "Context: {context} \n", + "Answer:\"\"\",\n", + " ),\n", + " ]\n", + ")\n", + "\n", + "# LLM\n", + "llm = ChatOpenAI(model_name=\"gpt-3.5-turbo\", temperature=0)\n", + "\n", + "\n", + "# Post-processing\n", + "def format_docs(docs):\n", + " return \"\\n\\n\".join(doc.page_content for doc in docs)\n", + "\n", + "\n", + "# Chain\n", + "rag_chain = prompt | llm | StrOutputParser()\n", + "\n", + "# Run\n", + "generation = rag_chain.invoke({\"context\": docs, \"question\": question})\n", + "print(generation)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e78931ec-940c-46ad-a0b2-f43f953f1fd7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "GradeHallucinations(binary_score='yes')" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "### Hallucination Grader\n", + "\n", + "\n", + "# Data model\n", + "class GradeHallucinations(BaseModel):\n", + " \"\"\"Binary score for hallucination present in generation answer.\"\"\"\n", + "\n", + " binary_score: str = Field(\n", + " description=\"Answer is grounded in the facts, 'yes' or 'no'\"\n", + " )\n", + "\n", + "\n", + "# LLM with function call\n", + "llm = ChatOpenAI(model=\"gpt-3.5-turbo-0125\", temperature=0)\n", + "structured_llm_grader = llm.with_structured_output(GradeHallucinations)\n", + "\n", + "# Prompt\n", + "system = \"\"\"You are a grader assessing whether an LLM generation is grounded in / supported by a set of retrieved facts. \\n \n", + " Give a binary score 'yes' or 'no'. 'Yes' means that the answer is grounded in / supported by the set of facts.\"\"\"\n", + "hallucination_prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\"system\", system),\n", + " (\"human\", \"Set of facts: \\n\\n {documents} \\n\\n LLM generation: {generation}\"),\n", + " ]\n", + ")\n", + "\n", + "hallucination_grader = hallucination_prompt | structured_llm_grader\n", + "hallucination_grader.invoke({\"documents\": docs, \"generation\": generation})" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "bd62276f-bf26-40d0-8cff-e07b10e00321", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "GradeAnswer(binary_score='yes')" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "### Answer Grader\n", + "\n", + "\n", + "# Data model\n", + "class GradeAnswer(BaseModel):\n", + " \"\"\"Binary score to assess answer addresses question.\"\"\"\n", + "\n", + " binary_score: str = Field(\n", + " description=\"Answer addresses the question, 'yes' or 'no'\"\n", + " )\n", + "\n", + "\n", + "# LLM with function call\n", + "llm = ChatOpenAI(model=\"gpt-3.5-turbo-0125\", temperature=0)\n", + "structured_llm_grader = llm.with_structured_output(GradeAnswer)\n", + "\n", + "# Prompt\n", + "system = \"\"\"You are a grader assessing whether an answer addresses / resolves a question \\n \n", + " Give a binary score 'yes' or 'no'. Yes' means that the answer resolves the question.\"\"\"\n", + "answer_prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\"system\", system),\n", + " (\"human\", \"User question: \\n\\n {question} \\n\\n LLM generation: {generation}\"),\n", + " ]\n", + ")\n", + "\n", + "answer_grader = answer_prompt | structured_llm_grader\n", + "answer_grader.invoke({\"question\": question, \"generation\": generation})" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "c6f4c70e-1660-4149-82c0-837f19fc9fb5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"What is the role of memory in an agent's functioning?\"" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "### Question Re-writer\n", + "\n", + "# LLM\n", + "llm = ChatOpenAI(model=\"gpt-3.5-turbo-0125\", temperature=0)\n", + "\n", + "# Prompt\n", + "system = \"\"\"You a question re-writer that converts an input question to a better version that is optimized \\n \n", + " for vectorstore retrieval. Look at the input and try to reason about the underlying semantic intent / meaning.\"\"\"\n", + "re_write_prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\"system\", system),\n", + " (\n", + " \"human\",\n", + " \"Here is the initial question: \\n\\n {question} \\n Formulate an improved question.\",\n", + " ),\n", + " ]\n", + ")\n", + "\n", + "question_rewriter = re_write_prompt | llm | StrOutputParser()\n", + "question_rewriter.invoke({\"question\": question})" + ] + }, + { + "cell_type": "markdown", + "id": "276001c5-c079-4e5b-9f42-81a06704d200", + "metadata": {}, + "source": [ + "# Graph \n", + "\n", + "Capture the flow in as a graph.\n", + "\n", + "## Graph state" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f1617e9e-66a8-4c1a-a1fe-cc936284c085", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List\n", + "\n", + "from typing_extensions import TypedDict\n", + "\n", + "\n", + "class GraphState(TypedDict):\n", + " \"\"\"\n", + " Represents the state of our graph.\n", + "\n", + " Attributes:\n", + " question: question\n", + " generation: LLM generation\n", + " documents: list of documents\n", + " \"\"\"\n", + "\n", + " question: str\n", + " generation: str\n", + " documents: List[str]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "add509d8-6682-4127-8d95-13dd37d79702", + "metadata": {}, + "outputs": [], + "source": [ + "### Nodes\n", + "\n", + "\n", + "def retrieve(state):\n", + " \"\"\"\n", + " Retrieve documents\n", + "\n", + " Args:\n", + " state (dict): The current graph state\n", + "\n", + " Returns:\n", + " state (dict): New key added to state, documents, that contains retrieved documents\n", + " \"\"\"\n", + " print(\"---RETRIEVE---\")\n", + " question = state[\"question\"]\n", + "\n", + " # Retrieval\n", + " documents = retriever.invoke(question)\n", + " return {\"documents\": documents, \"question\": question}\n", + "\n", + "\n", + "def generate(state):\n", + " \"\"\"\n", + " Generate answer\n", + "\n", + " Args:\n", + " state (dict): The current graph state\n", + "\n", + " Returns:\n", + " state (dict): New key added to state, generation, that contains LLM generation\n", + " \"\"\"\n", + " print(\"---GENERATE---\")\n", + " question = state[\"question\"]\n", + " documents = state[\"documents\"]\n", + "\n", + " # RAG generation\n", + " generation = rag_chain.invoke({\"context\": documents, \"question\": question})\n", + " return {\"documents\": documents, \"question\": question, \"generation\": generation}\n", + "\n", + "\n", + "def grade_documents(state):\n", + " \"\"\"\n", + " Determines whether the retrieved documents are relevant to the question.\n", + "\n", + " Args:\n", + " state (dict): The current graph state\n", + "\n", + " Returns:\n", + " state (dict): Updates documents key with only filtered relevant documents\n", + " \"\"\"\n", + "\n", + " print(\"---CHECK DOCUMENT RELEVANCE TO QUESTION---\")\n", + " question = state[\"question\"]\n", + " documents = state[\"documents\"]\n", + "\n", + " # Score each doc\n", + " filtered_docs = []\n", + " for d in documents:\n", + " score = retrieval_grader.invoke(\n", + " {\"question\": question, \"document\": d.page_content}\n", + " )\n", + " grade = score.binary_score\n", + " if grade == \"yes\":\n", + " print(\"---GRADE: DOCUMENT RELEVANT---\")\n", + " filtered_docs.append(d)\n", + " else:\n", + " print(\"---GRADE: DOCUMENT NOT RELEVANT---\")\n", + " continue\n", + " return {\"documents\": filtered_docs, \"question\": question}\n", + "\n", + "\n", + "def transform_query(state):\n", + " \"\"\"\n", + " Transform the query to produce a better question.\n", + "\n", + " Args:\n", + " state (dict): The current graph state\n", + "\n", + " Returns:\n", + " state (dict): Updates question key with a re-phrased question\n", + " \"\"\"\n", + "\n", + " print(\"---TRANSFORM QUERY---\")\n", + " question = state[\"question\"]\n", + " documents = state[\"documents\"]\n", + "\n", + " # Re-write question\n", + " better_question = question_rewriter.invoke({\"question\": question})\n", + " return {\"documents\": documents, \"question\": better_question}\n", + "\n", + "\n", + "### Edges\n", + "\n", + "\n", + "def decide_to_generate(state):\n", + " \"\"\"\n", + " Determines whether to generate an answer, or re-generate a question.\n", + "\n", + " Args:\n", + " state (dict): The current graph state\n", + "\n", + " Returns:\n", + " str: Binary decision for next node to call\n", + " \"\"\"\n", + "\n", + " print(\"---ASSESS GRADED DOCUMENTS---\")\n", + " state[\"question\"]\n", + " filtered_documents = state[\"documents\"]\n", + "\n", + " if not filtered_documents:\n", + " # All documents have been filtered check_relevance\n", + " # We will re-generate a new query\n", + " print(\n", + " \"---DECISION: ALL DOCUMENTS ARE NOT RELEVANT TO QUESTION, TRANSFORM QUERY---\"\n", + " )\n", + " return \"transform_query\"\n", + " else:\n", + " # We have relevant documents, so generate answer\n", + " print(\"---DECISION: GENERATE---\")\n", + " return \"generate\"\n", + "\n", + "\n", + "def grade_generation_v_documents_and_question(state):\n", + " \"\"\"\n", + " Determines whether the generation is grounded in the document and answers question.\n", + "\n", + " Args:\n", + " state (dict): The current graph state\n", + "\n", + " Returns:\n", + " str: Decision for next node to call\n", + " \"\"\"\n", + "\n", + " print(\"---CHECK HALLUCINATIONS---\")\n", + " question = state[\"question\"]\n", + " documents = state[\"documents\"]\n", + " generation = state[\"generation\"]\n", + "\n", + " score = hallucination_grader.invoke(\n", + " {\"documents\": documents, \"generation\": generation}\n", + " )\n", + " grade = score.binary_score\n", + "\n", + " # Check hallucination\n", + " if grade == \"yes\":\n", + " print(\"---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\")\n", + " # Check question-answering\n", + " print(\"---GRADE GENERATION vs QUESTION---\")\n", + " score = answer_grader.invoke({\"question\": question, \"generation\": generation})\n", + " grade = score.binary_score\n", + " if grade == \"yes\":\n", + " print(\"---DECISION: GENERATION ADDRESSES QUESTION---\")\n", + " return \"useful\"\n", + " else:\n", + " print(\"---DECISION: GENERATION DOES NOT ADDRESS QUESTION---\")\n", + " return \"not useful\"\n", + " else:\n", + " pprint(\"---DECISION: GENERATION IS NOT GROUNDED IN DOCUMENTS, RE-TRY---\")\n", + " return \"not supported\"" + ] + }, + { + "cell_type": "markdown", + "id": "61cd5797-1782-4d78-a277-8196d13f3e1b", + "metadata": {}, + "source": [ + "## Build Graph\n", + "\n", + "The just follows the flow we outlined in the figure above." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "0e09ca9f-e36d-4ef4-a0d5-79fdbada9fe0", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.graph import END, StateGraph, START\n", + "\n", + "workflow = StateGraph(GraphState)\n", + "\n", + "# Define the nodes\n", + "workflow.add_node(\"retrieve\", retrieve) # retrieve\n", + "workflow.add_node(\"grade_documents\", grade_documents) # grade documents\n", + "workflow.add_node(\"generate\", generate) # generatae\n", + "workflow.add_node(\"transform_query\", transform_query) # transform_query\n", + "\n", + "# Build graph\n", + "workflow.add_edge(START, \"retrieve\")\n", + "workflow.add_edge(\"retrieve\", \"grade_documents\")\n", + "workflow.add_conditional_edges(\n", + " \"grade_documents\",\n", + " decide_to_generate,\n", + " {\n", + " \"transform_query\": \"transform_query\",\n", + " \"generate\": \"generate\",\n", + " },\n", + ")\n", + "workflow.add_edge(\"transform_query\", \"retrieve\")\n", + "workflow.add_conditional_edges(\n", + " \"generate\",\n", + " grade_generation_v_documents_and_question,\n", + " {\n", + " \"not supported\": \"generate\",\n", + " \"useful\": END,\n", + " \"not useful\": \"transform_query\",\n", + " },\n", + ")\n", + "\n", + "# Compile\n", + "app = workflow.compile()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "fb69dbb9-91ee-4868-8c3c-93af3cd885be", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---RETRIEVE---\n", + "\"Node 'retrieve':\"\n", + "'\\n---\\n'\n", + "---CHECK DOCUMENT RELEVANCE TO QUESTION---\n", + "---GRADE: DOCUMENT RELEVANT---\n", + "---GRADE: DOCUMENT RELEVANT---\n", + "---GRADE: DOCUMENT NOT RELEVANT---\n", + "---GRADE: DOCUMENT RELEVANT---\n", + "---ASSESS GRADED DOCUMENTS---\n", + "---DECISION: GENERATE---\n", + "\"Node 'grade_documents':\"\n", + "'\\n---\\n'\n", + "---GENERATE---\n", + "---CHECK HALLUCINATIONS---\n", + "---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n", + "---GRADE GENERATION vs QUESTION---\n", + "---DECISION: GENERATION ADDRESSES QUESTION---\n", + "\"Node 'generate':\"\n", + "'\\n---\\n'\n", + "('Short-term memory stores information needed for immediate cognitive tasks '\n", + " 'and has a limited capacity of about 7 items, lasting for 20-30 seconds. '\n", + " 'Long-term memory can store information for extended periods with essentially '\n", + " 'unlimited capacity, including explicit (facts and events) and implicit '\n", + " '(skills and routines) memory. Agents can also utilize external tools like '\n", + " 'APIs to access additional information beyond what is stored in memory.')\n" + ] + } + ], + "source": [ + "from pprint import pprint\n", + "\n", + "# Run\n", + "inputs = {\"question\": \"Explain how the different types of agent memory work?\"}\n", + "for output in app.stream(inputs):\n", + " for key, value in output.items():\n", + " # Node\n", + " pprint(f\"Node '{key}':\")\n", + " # Optional: print full state at each node\n", + " # pprint.pprint(value[\"keys\"], indent=2, width=80, depth=None)\n", + " pprint(\"\\n---\\n\")\n", + "\n", + "# Final generation\n", + "pprint(value[\"generation\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "4138bc51-8c84-4b8a-8d24-f7f470721f6f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---RETRIEVE---\n", + "\"Node 'retrieve':\"\n", + "'\\n---\\n'\n", + "---CHECK DOCUMENT RELEVANCE TO QUESTION---\n", + "---GRADE: DOCUMENT RELEVANT---\n", + "---GRADE: DOCUMENT RELEVANT---\n", + "---GRADE: DOCUMENT RELEVANT---\n", + "---GRADE: DOCUMENT RELEVANT---\n", + "---ASSESS GRADED DOCUMENTS---\n", + "---DECISION: GENERATE---\n", + "\"Node 'grade_documents':\"\n", + "'\\n---\\n'\n", + "---GENERATE---\n", + "---CHECK HALLUCINATIONS---\n", + "---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n", + "---GRADE GENERATION vs QUESTION---\n", + "---DECISION: GENERATION ADDRESSES QUESTION---\n", + "\"Node 'generate':\"\n", + "'\\n---\\n'\n", + "('Chain of thought prompting works by providing the model with a few '\n", + " 'demonstrations containing high-quality reasoning chains to prompt its '\n", + " 'thought process. Methods like Self-Ask, IRCoT, and ReAct combine iterative '\n", + " 'prompting with queries to external sources like Wikipedia to enhance the '\n", + " \"model's understanding and reasoning capabilities. Tree of Thoughts extends \"\n", + " 'the concept by exploring multiple reasoning possibilities at each step, '\n", + " 'creating a tree structure to evaluate different states.')\n" + ] + } + ], + "source": [ + "inputs = {\"question\": \"Explain how chain of thought prompting works?\"}\n", + "for output in app.stream(inputs):\n", + " for key, value in output.items():\n", + " # Node\n", + " pprint(f\"Node '{key}':\")\n", + " # Optional: print full state at each node\n", + " # pprint.pprint(value[\"keys\"], indent=2, width=80, depth=None)\n", + " pprint(\"\\n---\\n\")\n", + "\n", + "# Final generation\n", + "pprint(value[\"generation\"])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/libs/redis/docs/vectorstores.ipynb b/libs/redis/docs/vectorstores.ipynb index ee731b4..4d691d6 100644 --- a/libs/redis/docs/vectorstores.ipynb +++ b/libs/redis/docs/vectorstores.ipynb @@ -27,62 +27,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: langchain-redis in /home/jupyter/venv/lib/python3.11/site-packages (0.0.1)\n", - "Collecting langchain-huggingface\n", - " Downloading langchain_huggingface-0.0.3-py3-none-any.whl.metadata (1.2 kB)\n", - "Requirement already satisfied: sentence-transformers in /home/jupyter/venv/lib/python3.11/site-packages (3.0.1)\n", - "Requirement already satisfied: scikit-learn in /home/jupyter/venv/lib/python3.11/site-packages (1.5.1)\n", - "Requirement already satisfied: langchain-core<0.3,>=0.1.52 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (0.2.11)\n", - "Requirement already satisfied: numpy<2,>=1 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (1.26.4)\n", - "Requirement already satisfied: python-ulid<3.0.0,>=2.7.0 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (2.7.0)\n", - "Requirement already satisfied: redisvl<0.3.0,>=0.2.3 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-redis) (0.2.3)\n", - "Requirement already satisfied: huggingface-hub>=0.23.0 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-huggingface) (0.23.4)\n", - "Requirement already satisfied: tokenizers>=0.19.1 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-huggingface) (0.19.1)\n", - "Requirement already satisfied: transformers>=4.39.0 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-huggingface) (4.42.3)\n", - "Requirement already satisfied: tqdm in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers) (4.66.4)\n", - "Requirement already satisfied: torch>=1.11.0 in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers) (2.3.1)\n", - "Requirement already satisfied: scipy in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers) (1.14.0)\n", - "Requirement already satisfied: Pillow in /home/jupyter/venv/lib/python3.11/site-packages (from sentence-transformers) (10.4.0)\n", - "Requirement already satisfied: joblib>=1.2.0 in /home/jupyter/venv/lib/python3.11/site-packages (from scikit-learn) (1.4.2)\n", - "Requirement already satisfied: threadpoolctl>=3.1.0 in /home/jupyter/venv/lib/python3.11/site-packages (from scikit-learn) (3.5.0)\n", - "Requirement already satisfied: filelock in /home/jupyter/venv/lib/python3.11/site-packages (from huggingface-hub>=0.23.0->langchain-huggingface) (3.15.4)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in /home/jupyter/venv/lib/python3.11/site-packages (from huggingface-hub>=0.23.0->langchain-huggingface) (2024.6.1)\n", - "Requirement already satisfied: packaging>=20.9 in /home/jupyter/venv/lib/python3.11/site-packages (from huggingface-hub>=0.23.0->langchain-huggingface) (24.1)\n", - "Requirement already satisfied: pyyaml>=5.1 in /home/jupyter/venv/lib/python3.11/site-packages (from huggingface-hub>=0.23.0->langchain-huggingface) (6.0.1)\n", - "Requirement already satisfied: requests in /home/jupyter/venv/lib/python3.11/site-packages (from huggingface-hub>=0.23.0->langchain-huggingface) (2.32.3)\n", - "Requirement already satisfied: typing-extensions>=3.7.4.3 in /home/jupyter/venv/lib/python3.11/site-packages (from huggingface-hub>=0.23.0->langchain-huggingface) (4.12.2)\n", - "Requirement already satisfied: jsonpatch<2.0,>=1.33 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (1.33)\n", - "Requirement already satisfied: langsmith<0.2.0,>=0.1.75 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (0.1.83)\n", - "Requirement already satisfied: pydantic<3,>=1 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (2.8.0)\n", - "Requirement already satisfied: tenacity!=8.4.0,<9.0.0,>=8.1.0 in /home/jupyter/venv/lib/python3.11/site-packages (from langchain-core<0.3,>=0.1.52->langchain-redis) (8.4.2)\n", - "Requirement already satisfied: coloredlogs in /home/jupyter/venv/lib/python3.11/site-packages (from redisvl<0.3.0,>=0.2.3->langchain-redis) (15.0.1)\n", - "Requirement already satisfied: redis>=5.0.0 in /home/jupyter/venv/lib/python3.11/site-packages (from redisvl<0.3.0,>=0.2.3->langchain-redis) (5.0.7)\n", - "Requirement already satisfied: tabulate<1,>=0.9.0 in /home/jupyter/venv/lib/python3.11/site-packages (from redisvl<0.3.0,>=0.2.3->langchain-redis) (0.9.0)\n", - "Requirement already satisfied: sympy in /home/jupyter/venv/lib/python3.11/site-packages (from torch>=1.11.0->sentence-transformers) (1.12.1)\n", - "Requirement already satisfied: networkx in /home/jupyter/venv/lib/python3.11/site-packages (from torch>=1.11.0->sentence-transformers) (3.3)\n", - "Requirement already satisfied: jinja2 in /home/jupyter/venv/lib/python3.11/site-packages (from torch>=1.11.0->sentence-transformers) (3.1.4)\n", - "Requirement already satisfied: regex!=2019.12.17 in /home/jupyter/venv/lib/python3.11/site-packages (from transformers>=4.39.0->langchain-huggingface) (2024.5.15)\n", - "Requirement already satisfied: safetensors>=0.4.1 in /home/jupyter/venv/lib/python3.11/site-packages (from transformers>=4.39.0->langchain-huggingface) (0.4.3)\n", - "Requirement already satisfied: jsonpointer>=1.9 in /home/jupyter/venv/lib/python3.11/site-packages (from jsonpatch<2.0,>=1.33->langchain-core<0.3,>=0.1.52->langchain-redis) (3.0.0)\n", - "Requirement already satisfied: orjson<4.0.0,>=3.9.14 in /home/jupyter/venv/lib/python3.11/site-packages (from langsmith<0.2.0,>=0.1.75->langchain-core<0.3,>=0.1.52->langchain-redis) (3.10.6)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /home/jupyter/venv/lib/python3.11/site-packages (from pydantic<3,>=1->langchain-core<0.3,>=0.1.52->langchain-redis) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.20.0 in /home/jupyter/venv/lib/python3.11/site-packages (from pydantic<3,>=1->langchain-core<0.3,>=0.1.52->langchain-redis) (2.20.0)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /home/jupyter/venv/lib/python3.11/site-packages (from requests->huggingface-hub>=0.23.0->langchain-huggingface) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /home/jupyter/venv/lib/python3.11/site-packages (from requests->huggingface-hub>=0.23.0->langchain-huggingface) (3.7)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/jupyter/venv/lib/python3.11/site-packages (from requests->huggingface-hub>=0.23.0->langchain-huggingface) (2.2.2)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /home/jupyter/venv/lib/python3.11/site-packages (from requests->huggingface-hub>=0.23.0->langchain-huggingface) (2024.6.2)\n", - "Requirement already satisfied: humanfriendly>=9.1 in /home/jupyter/venv/lib/python3.11/site-packages (from coloredlogs->redisvl<0.3.0,>=0.2.3->langchain-redis) (10.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /home/jupyter/venv/lib/python3.11/site-packages (from jinja2->torch>=1.11.0->sentence-transformers) (2.1.5)\n", - "Requirement already satisfied: mpmath<1.4.0,>=1.1.0 in /home/jupyter/venv/lib/python3.11/site-packages (from sympy->torch>=1.11.0->sentence-transformers) (1.3.0)\n", - "Downloading langchain_huggingface-0.0.3-py3-none-any.whl (17 kB)\n", - "Installing collected packages: langchain-huggingface\n", - "Successfully installed langchain-huggingface-0.0.3\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ - "%pip install -U langchain-redis langchain-huggingface sentence-transformers scikit-learn" + "%pip install -qU langchain-redis langchain-huggingface sentence-transformers scikit-learn" ] }, { @@ -257,7 +207,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "f8f05e1d9ee24be0a3314b21516fd0fa", + "model_id": "bb9808d9a483435db845c0c344dd397e", "version_major": 2, "version_minor": 0 }, @@ -271,7 +221,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a579747a73ec4ea7b6ef404af2855f79", + "model_id": "72a304d22c044bc9a3d435d03cce0517", "version_major": 2, "version_minor": 0 }, @@ -285,7 +235,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e921782f9e924c8f821cb04260ab80b8", + "model_id": "bda6d78c2e614d3a9577f5d0a85781c9", "version_major": 2, "version_minor": 0 }, @@ -299,7 +249,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "88df7211ebff425aaea406be0404f03f", + "model_id": "ce77d1ed6ca948abac49117c4faee84f", "version_major": 2, "version_minor": 0 }, @@ -313,7 +263,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "6d25e33415df4601945264eb230d05a0", + "model_id": "679c66002046426494eb72dd53a26ac3", "version_major": 2, "version_minor": 0 }, @@ -327,7 +277,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d84a93395d714a45b4140bbed3d972c3", + "model_id": "fae3fbe3a2204432b4cc839df8fac550", "version_major": 2, "version_minor": 0 }, @@ -341,7 +291,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "7c2f2b8514f54c13867a9df43f7d1895", + "model_id": "a67aa7349a7546d396c235d0e40b9a44", "version_major": 2, "version_minor": 0 }, @@ -355,7 +305,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "550a363df9c14c7f8fc99696ae70879b", + "model_id": "af86c3b9a4b94be8b1f746dc55e462a7", "version_major": 2, "version_minor": 0 }, @@ -369,7 +319,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "2311124f92eb4c4181fc9804eeb34228", + "model_id": "3228def50c92404abea598d7df475d27", "version_major": 2, "version_minor": 0 }, @@ -383,7 +333,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d445534f58ef4b6fbec2328b683c9ee1", + "model_id": "edc71682b68d4db8b17c1fca31b33309", "version_major": 2, "version_minor": 0 }, @@ -394,10 +344,18 @@ "metadata": {}, "output_type": "display_data" }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/jupyter/venv/lib/python3.11/site-packages/transformers/tokenization_utils_base.py:1601: FutureWarning: `clean_up_tokenization_spaces` was not set. It will be set to `True` by default. This behavior will be depracted in transformers v4.45, and will be then set to `False` by default. For more details check this issue: https://github.com/huggingface/transformers/issues/31884\n", + " warnings.warn(\n" + ] + }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d74b00ee78364c2a9175e559bd26aaa9", + "model_id": "2f1e77fc9c0e4180a1aaf0612978a7b8", "version_major": 2, "version_minor": 0 }, @@ -614,7 +572,7 @@ "Subject: A flawed propulsion system: Space Shuttle\n", "X-Ad...\n", "Metadata: {'category': 'sci.space'}\n", - "Score: 0.569670796394\n", + "Score: 0.569670975208\n", "\n", "Content: From: nsmca@aurora.alaska.edu\n", "Subject: Space Design Movies?\n", diff --git a/libs/redis/langchain_redis/cache.py b/libs/redis/langchain_redis/cache.py index 95f3473..4359c4b 100644 --- a/libs/redis/langchain_redis/cache.py +++ b/libs/redis/langchain_redis/cache.py @@ -15,11 +15,14 @@ from pydantic.v1 import Field from redis import Redis from redis.commands.json.path import Path +from redis.exceptions import ResponseError from redisvl.extensions.llmcache import ( # type: ignore[import] SemanticCache as RedisVLSemanticCache, ) from redisvl.utils.vectorize import BaseVectorizer # type: ignore[import] +from langchain_redis.version import __full_lib_name__ + class EmbeddingsVectorizer(BaseVectorizer): embeddings: Embeddings = Field(...) @@ -61,6 +64,11 @@ def __init__( redis: Optional[Redis] = None, ): self.redis = redis or Redis.from_url(redis_url) + try: + self.redis.client_setinfo("LIB-NAME", __full_lib_name__) # type: ignore + except ResponseError: + # Fall back to a simple log echo + self.redis.echo(__full_lib_name__) self.ttl = ttl self.prefix = prefix @@ -118,7 +126,7 @@ def __init__( self.cache = RedisVLSemanticCache( vectorizer=vectorizer, - redis_url=redis_url, + redis_client=self.redis, distance_threshold=distance_threshold, ttl=ttl, name=name, diff --git a/libs/redis/langchain_redis/chat_message_history.py b/libs/redis/langchain_redis/chat_message_history.py index a32fe4a..545e48f 100644 --- a/libs/redis/langchain_redis/chat_message_history.py +++ b/libs/redis/langchain_redis/chat_message_history.py @@ -11,6 +11,8 @@ from redis.commands.search.indexDefinition import IndexDefinition, IndexType from redis.commands.search.query import Query +from langchain_redis.version import __full_lib_name__ + class RedisChatMessageHistory(BaseChatMessageHistory): def __init__( @@ -20,9 +22,15 @@ def __init__( key_prefix: str = "chat:", ttl: Optional[int] = None, index_name: str = "idx:chat_history", + redis: Optional[Redis] = None, **kwargs: Any, ): - self.redis_client = Redis.from_url(redis_url, **kwargs) + self.redis_client = redis or Redis.from_url(redis_url, **kwargs) + try: + self.redis_client.client_setinfo("LIB-NAME", __full_lib_name__) # type: ignore + except ResponseError: + # Fall back to a simple log echo + self.redis_client.echo(__full_lib_name__) self.session_id = session_id self.key_prefix = key_prefix self.ttl = ttl diff --git a/libs/redis/langchain_redis/version.py b/libs/redis/langchain_redis/version.py index 0cc0eb3..92f9bee 100644 --- a/libs/redis/langchain_redis/version.py +++ b/libs/redis/langchain_redis/version.py @@ -1,2 +1,5 @@ -__version__ = "0.0.1" +from redisvl.version import __version__ as __redisvl_version__ # type: ignore + +__version__ = "0.0.2" __lib_name__ = f"langchain-redis_v{__version__}" +__full_lib_name__ = f"redis-py(redisvl_v{__redisvl_version__};{__lib_name__})" diff --git a/libs/redis/poetry.lock b/libs/redis/poetry.lock index 78971aa..a5f8483 100644 --- a/libs/redis/poetry.lock +++ b/libs/redis/poetry.lock @@ -234,13 +234,13 @@ websockets = ["websocket-client (>=1.3.0)"] [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -359,13 +359,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.23.4" +version = "0.24.5" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.23.4-py3-none-any.whl", hash = "sha256:3a0b957aa87150addf0cc7bd71b4d954b78e749850e1e7fb29ebbd2db64ca037"}, - {file = "huggingface_hub-0.23.4.tar.gz", hash = "sha256:35d99016433900e44ae7efe1c209164a5a81dbbcd53a52f99c281dcd7ce22431"}, + {file = "huggingface_hub-0.24.5-py3-none-any.whl", hash = "sha256:d93fb63b1f1a919a22ce91a14518974e81fc4610bf344dfe7572343ce8d3aced"}, + {file = "huggingface_hub-0.24.5.tar.gz", hash = "sha256:7b45d6744dd53ce9cbf9880957de00e9d10a9ae837f1c9b7255fc8fa4e8264f3"}, ] [package.dependencies] @@ -378,17 +378,17 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] hf-transfer = ["hf-transfer (>=0.1.4)"] inference = ["aiohttp", "minijinja (>=1.0)"] -quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.5.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] tensorflow-testing = ["keras (<3.0)", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] -torch = ["safetensors", "torch"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors[torch]", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] [[package]] @@ -427,20 +427,6 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "intel-openmp" -version = "2021.4.0" -description = "Intel OpenMP* Runtime Library" -optional = false -python-versions = "*" -files = [ - {file = "intel_openmp-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:41c01e266a7fdb631a7609191709322da2bbf24b252ba763f125dd651bcc7675"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:3b921236a38384e2016f0f3d65af6732cf2c12918087128a9163225451e776f2"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:e2240ab8d01472fed04f3544a878cda5da16c26232b7ea1b59132dbfb48b186e"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:6e863d8fd3d7e8ef389d52cf97a50fe2afe1a19247e8c0d168ce021546f96fc9"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f"}, -] - [[package]] name = "jinja2" version = "3.1.4" @@ -458,6 +444,76 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jiter" +version = "0.5.0" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jiter-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f"}, + {file = "jiter-0.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a063f71c4b06225543dddadbe09d203dc0c95ba352d8b85f1221173480a71d5"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc0d5b8b3dd12e91dd184b87273f864b363dfabc90ef29a1092d269f18c7e28"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c22541f0b672f4d741382a97c65609332a783501551445ab2df137ada01e019e"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63314832e302cc10d8dfbda0333a384bf4bcfce80d65fe99b0f3c0da8945a91a"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a25fbd8a5a58061e433d6fae6d5298777c0814a8bcefa1e5ecfff20c594bd749"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:503b2c27d87dfff5ab717a8200fbbcf4714516c9d85558048b1fc14d2de7d8dc"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d1f3d27cce923713933a844872d213d244e09b53ec99b7a7fdf73d543529d6d"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c95980207b3998f2c3b3098f357994d3fd7661121f30669ca7cb945f09510a87"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afa66939d834b0ce063f57d9895e8036ffc41c4bd90e4a99631e5f261d9b518e"}, + {file = "jiter-0.5.0-cp310-none-win32.whl", hash = "sha256:f16ca8f10e62f25fd81d5310e852df6649af17824146ca74647a018424ddeccf"}, + {file = "jiter-0.5.0-cp310-none-win_amd64.whl", hash = "sha256:b2950e4798e82dd9176935ef6a55cf6a448b5c71515a556da3f6b811a7844f1e"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4c8e1ed0ef31ad29cae5ea16b9e41529eb50a7fba70600008e9f8de6376d553"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6f16e21276074a12d8421692515b3fd6d2ea9c94fd0734c39a12960a20e85f3"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5280e68e7740c8c128d3ae5ab63335ce6d1fb6603d3b809637b11713487af9e6"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:583c57fc30cc1fec360e66323aadd7fc3edeec01289bfafc35d3b9dcb29495e4"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26351cc14507bdf466b5f99aba3df3143a59da75799bf64a53a3ad3155ecded9"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829df14d656b3fb87e50ae8b48253a8851c707da9f30d45aacab2aa2ba2d614"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42a4bdcf7307b86cb863b2fb9bb55029b422d8f86276a50487982d99eed7c6e"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04d461ad0aebf696f8da13c99bc1b3e06f66ecf6cfd56254cc402f6385231c06"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6375923c5f19888c9226582a124b77b622f8fd0018b843c45eeb19d9701c403"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cec323a853c24fd0472517113768c92ae0be8f8c384ef4441d3632da8baa646"}, + {file = "jiter-0.5.0-cp311-none-win32.whl", hash = "sha256:aa1db0967130b5cab63dfe4d6ff547c88b2a394c3410db64744d491df7f069bb"}, + {file = "jiter-0.5.0-cp311-none-win_amd64.whl", hash = "sha256:aa9d2b85b2ed7dc7697597dcfaac66e63c1b3028652f751c81c65a9f220899ae"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9f664e7351604f91dcdd557603c57fc0d551bc65cc0a732fdacbf73ad335049a"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:044f2f1148b5248ad2c8c3afb43430dccf676c5a5834d2f5089a4e6c5bbd64df"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:702e3520384c88b6e270c55c772d4bd6d7b150608dcc94dea87ceba1b6391248"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:528d742dcde73fad9d63e8242c036ab4a84389a56e04efd854062b660f559544"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf80e5fe6ab582c82f0c3331df27a7e1565e2dcf06265afd5173d809cdbf9ba"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44dfc9ddfb9b51a5626568ef4e55ada462b7328996294fe4d36de02fce42721f"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c451f7922992751a936b96c5f5b9bb9312243d9b754c34b33d0cb72c84669f4e"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:308fce789a2f093dca1ff91ac391f11a9f99c35369117ad5a5c6c4903e1b3e3a"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7f5ad4a7c6b0d90776fdefa294f662e8a86871e601309643de30bf94bb93a64e"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ea189db75f8eca08807d02ae27929e890c7d47599ce3d0a6a5d41f2419ecf338"}, + {file = "jiter-0.5.0-cp312-none-win32.whl", hash = "sha256:e3bbe3910c724b877846186c25fe3c802e105a2c1fc2b57d6688b9f8772026e4"}, + {file = "jiter-0.5.0-cp312-none-win_amd64.whl", hash = "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f04bc2fc50dc77be9d10f73fcc4e39346402ffe21726ff41028f36e179b587e6"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f433a4169ad22fcb550b11179bb2b4fd405de9b982601914ef448390b2954f3"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad4a6398c85d3a20067e6c69890ca01f68659da94d74c800298581724e426c7e"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6baa88334e7af3f4d7a5c66c3a63808e5efbc3698a1c57626541ddd22f8e4fbf"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ece0a115c05efca597c6d938f88c9357c843f8c245dbbb53361a1c01afd7148"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:335942557162ad372cc367ffaf93217117401bf930483b4b3ebdb1223dbddfa7"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649b0ee97a6e6da174bffcb3c8c051a5935d7d4f2f52ea1583b5b3e7822fbf14"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4be354c5de82157886ca7f5925dbda369b77344b4b4adf2723079715f823989"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5206144578831a6de278a38896864ded4ed96af66e1e63ec5dd7f4a1fce38a3a"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8120c60f8121ac3d6f072b97ef0e71770cc72b3c23084c72c4189428b1b1d3b6"}, + {file = "jiter-0.5.0-cp38-none-win32.whl", hash = "sha256:6f1223f88b6d76b519cb033a4d3687ca157c272ec5d6015c322fc5b3074d8a5e"}, + {file = "jiter-0.5.0-cp38-none-win_amd64.whl", hash = "sha256:c59614b225d9f434ea8fc0d0bec51ef5fa8c83679afedc0433905994fb36d631"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0af3838cfb7e6afee3f00dc66fa24695199e20ba87df26e942820345b0afc566"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:550b11d669600dbc342364fd4adbe987f14d0bbedaf06feb1b983383dcc4b961"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:489875bf1a0ffb3cb38a727b01e6673f0f2e395b2aad3c9387f94187cb214bbf"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b250ca2594f5599ca82ba7e68785a669b352156260c5362ea1b4e04a0f3e2389"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ea18e01f785c6667ca15407cd6dabbe029d77474d53595a189bdc813347218e"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462a52be85b53cd9bffd94e2d788a09984274fe6cebb893d6287e1c296d50653"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92cc68b48d50fa472c79c93965e19bd48f40f207cb557a8346daa020d6ba973b"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c834133e59a8521bc87ebcad773608c6fa6ab5c7a022df24a45030826cf10bc"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab3a71ff31cf2d45cb216dc37af522d335211f3a972d2fe14ea99073de6cb104"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cccd3af9c48ac500c95e1bcbc498020c87e1781ff0345dd371462d67b76643eb"}, + {file = "jiter-0.5.0-cp39-none-win32.whl", hash = "sha256:368084d8d5c4fc40ff7c3cc513c4f73e02c85f6009217922d0823a48ee7adf61"}, + {file = "jiter-0.5.0-cp39-none-win_amd64.whl", hash = "sha256:ce03f7b4129eb72f1687fa11300fbf677b02990618428934662406d2a76742a1"}, + {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, +] + [[package]] name = "joblib" version = "1.4.2" @@ -496,7 +552,7 @@ files = [ [[package]] name = "langchain-core" -version = "0.2.12" +version = "0.2.31" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" @@ -513,17 +569,18 @@ pydantic = [ ] PyYAML = ">=5.3" tenacity = "^8.1.0,!=8.4.0" +typing-extensions = ">=4.7" [package.source] type = "git" url = "https://github.com/langchain-ai/langchain.git" reference = "HEAD" -resolved_reference = "007c5a85d5264203ec0e0a6c44eb13b079bfb984" +resolved_reference = "63aba3fe5b9f851d211f769ae054333f6401b58e" subdirectory = "libs/core" [[package]] name = "langchain-openai" -version = "0.1.14" +version = "0.1.21" description = "An integration package connecting OpenAI and LangChain" optional = false python-versions = ">=3.8.1,<4.0" @@ -531,26 +588,26 @@ files = [] develop = false [package.dependencies] -langchain-core = ">=0.2.2,<0.3" -openai = "^1.32.0" +langchain-core = "^0.2.29" +openai = "^1.40.0" tiktoken = ">=0.7,<1" [package.source] type = "git" url = "https://github.com/langchain-ai/langchain.git" reference = "HEAD" -resolved_reference = "007c5a85d5264203ec0e0a6c44eb13b079bfb984" +resolved_reference = "63aba3fe5b9f851d211f769ae054333f6401b58e" subdirectory = "libs/partners/openai" [[package]] name = "langsmith" -version = "0.1.84" +version = "0.1.99" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.84-py3-none-any.whl", hash = "sha256:01f3c6390dba26c583bac8dd0e551ce3d0509c7f55cad714db0b5c8d36e4c7ff"}, - {file = "langsmith-0.1.84.tar.gz", hash = "sha256:5220c0439838b9a5bd320fd3686be505c5083dcee22d2452006c23891153bea1"}, + {file = "langsmith-0.1.99-py3-none-any.whl", hash = "sha256:ef8d1d74a2674c514aa429b0171a9fbb661207dc3835142cca0e8f1bf97b26b0"}, + {file = "langsmith-0.1.99.tar.gz", hash = "sha256:b5c6a1f158abda61600a4a445081ee848b4a28b758d91f2793dc02aeffafcaf1"}, ] [package.dependencies] @@ -630,24 +687,6 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] -[[package]] -name = "mkl" -version = "2021.4.0" -description = "Intel® oneAPI Math Kernel Library" -optional = false -python-versions = "*" -files = [ - {file = "mkl-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:67460f5cd7e30e405b54d70d1ed3ca78118370b65f7327d495e9c8847705e2fb"}, - {file = "mkl-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:636d07d90e68ccc9630c654d47ce9fdeb036bb46e2b193b3a9ac8cfea683cce5"}, - {file = "mkl-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:398dbf2b0d12acaf54117a5210e8f191827f373d362d796091d161f610c1ebfb"}, - {file = "mkl-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8"}, - {file = "mkl-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:ceef3cafce4c009dd25f65d7ad0d833a0fbadc3d8903991ec92351fe5de1e718"}, -] - -[package.dependencies] -intel-openmp = "==2021.*" -tbb = "==2021.*" - [[package]] name = "mpmath" version = "1.3.0" @@ -667,44 +706,44 @@ tests = ["pytest (>=4.6)"] [[package]] name = "mypy" -version = "1.10.1" +version = "1.11.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02"}, - {file = "mypy-1.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7"}, - {file = "mypy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a"}, - {file = "mypy-1.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9"}, - {file = "mypy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d"}, - {file = "mypy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a"}, - {file = "mypy-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84"}, - {file = "mypy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f"}, - {file = "mypy-1.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b"}, - {file = "mypy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e"}, - {file = "mypy-1.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7"}, - {file = "mypy-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3"}, - {file = "mypy-1.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e"}, - {file = "mypy-1.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04"}, - {file = "mypy-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31"}, - {file = "mypy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c"}, - {file = "mypy-1.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade"}, - {file = "mypy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37"}, - {file = "mypy-1.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7"}, - {file = "mypy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d"}, - {file = "mypy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3"}, - {file = "mypy-1.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf"}, - {file = "mypy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531"}, - {file = "mypy-1.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3"}, - {file = "mypy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f"}, - {file = "mypy-1.10.1-py3-none-any.whl", hash = "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a"}, - {file = "mypy-1.10.1.tar.gz", hash = "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0"}, + {file = "mypy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a32fc80b63de4b5b3e65f4be82b4cfa362a46702672aa6a0f443b4689af7008c"}, + {file = "mypy-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c1952f5ea8a5a959b05ed5f16452fddadbaae48b5d39235ab4c3fc444d5fd411"}, + {file = "mypy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1e30dc3bfa4e157e53c1d17a0dad20f89dc433393e7702b813c10e200843b03"}, + {file = "mypy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c63350af88f43a66d3dfeeeb8d77af34a4f07d760b9eb3a8697f0386c7590b4"}, + {file = "mypy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:a831671bad47186603872a3abc19634f3011d7f83b083762c942442d51c58d58"}, + {file = "mypy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7b6343d338390bb946d449677726edf60102a1c96079b4f002dedff375953fc5"}, + {file = "mypy-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4fe9f4e5e521b458d8feb52547f4bade7ef8c93238dfb5bbc790d9ff2d770ca"}, + {file = "mypy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:886c9dbecc87b9516eff294541bf7f3655722bf22bb898ee06985cd7269898de"}, + {file = "mypy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fca4a60e1dd9fd0193ae0067eaeeb962f2d79e0d9f0f66223a0682f26ffcc809"}, + {file = "mypy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:0bd53faf56de9643336aeea1c925012837432b5faf1701ccca7fde70166ccf72"}, + {file = "mypy-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f39918a50f74dc5969807dcfaecafa804fa7f90c9d60506835036cc1bc891dc8"}, + {file = "mypy-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0bc71d1fb27a428139dd78621953effe0d208aed9857cb08d002280b0422003a"}, + {file = "mypy-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b868d3bcff720dd7217c383474008ddabaf048fad8d78ed948bb4b624870a417"}, + {file = "mypy-1.11.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a707ec1527ffcdd1c784d0924bf5cb15cd7f22683b919668a04d2b9c34549d2e"}, + {file = "mypy-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:64f4a90e3ea07f590c5bcf9029035cf0efeae5ba8be511a8caada1a4893f5525"}, + {file = "mypy-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:749fd3213916f1751fff995fccf20c6195cae941dc968f3aaadf9bb4e430e5a2"}, + {file = "mypy-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b639dce63a0b19085213ec5fdd8cffd1d81988f47a2dec7100e93564f3e8fb3b"}, + {file = "mypy-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c956b49c5d865394d62941b109728c5c596a415e9c5b2be663dd26a1ff07bc0"}, + {file = "mypy-1.11.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45df906e8b6804ef4b666af29a87ad9f5921aad091c79cc38e12198e220beabd"}, + {file = "mypy-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:d44be7551689d9d47b7abc27c71257adfdb53f03880841a5db15ddb22dc63edb"}, + {file = "mypy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2684d3f693073ab89d76da8e3921883019ea8a3ec20fa5d8ecca6a2db4c54bbe"}, + {file = "mypy-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79c07eb282cb457473add5052b63925e5cc97dfab9812ee65a7c7ab5e3cb551c"}, + {file = "mypy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11965c2f571ded6239977b14deebd3f4c3abd9a92398712d6da3a772974fad69"}, + {file = "mypy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a2b43895a0f8154df6519706d9bca8280cda52d3d9d1514b2d9c3e26792a0b74"}, + {file = "mypy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:1a81cf05975fd61aec5ae16501a091cfb9f605dc3e3c878c0da32f250b74760b"}, + {file = "mypy-1.11.1-py3-none-any.whl", hash = "sha256:0624bdb940255d2dd24e829d99a13cfeb72e4e9031f9492148f410ed30bcab54"}, + {file = "mypy-1.11.1.tar.gz", hash = "sha256:f404a0b069709f18bbdb702eb3dcfe51910602995de00bd39cea3050b5772d08"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -832,12 +871,13 @@ files = [ [[package]] name = "nvidia-cudnn-cu12" -version = "8.9.2.26" +version = "9.1.0.70" description = "cuDNN runtime libraries" optional = false python-versions = ">=3" files = [ - {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, + {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, + {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, ] [package.dependencies] @@ -908,13 +948,14 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.5.82" +version = "12.6.20" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f9b37bc5c8cf7509665cb6ada5aaa0ce65618f2332b7d3e78e9790511f111212"}, - {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-win_amd64.whl", hash = "sha256:e782564d705ff0bf61ac3e1bf730166da66dd2fe9012f111ede5fc49b64ae697"}, + {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_aarch64.whl", hash = "sha256:84fb38465a5bc7c70cbc320cfd0963eb302ee25a5e939e9f512bbba55b6072fb"}, + {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_x86_64.whl", hash = "sha256:562ab97ea2c23164823b2a89cb328d01d45cb99634b8c65fe7cd60d14562bd79"}, + {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-win_amd64.whl", hash = "sha256:ed3c43a17f37b0c922a919203d2d36cbef24d41cc3e6b625182f8b58203644f6"}, ] [[package]] @@ -930,85 +971,92 @@ files = [ [[package]] name = "openai" -version = "1.35.10" +version = "1.40.6" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.35.10-py3-none-any.whl", hash = "sha256:962cb5c23224b5cbd16078308dabab97a08b0a5ad736a4fdb3dc2ffc44ac974f"}, - {file = "openai-1.35.10.tar.gz", hash = "sha256:85966949f4f960f3e4b239a659f9fd64d3a97ecc43c44dc0a044b5c7f11cccc6"}, + {file = "openai-1.40.6-py3-none-any.whl", hash = "sha256:b36372124a779381a420a34dd96f762baa748b6bdfaf83a6b9f2745f72ccc1c5"}, + {file = "openai-1.40.6.tar.gz", hash = "sha256:2239232bcb7f4bd4ce8e02544b5769618582411cf399816d96686d1b6c1e5c8d"}, ] [package.dependencies] anyio = ">=3.5.0,<5" distro = ">=1.7.0,<2" httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" pydantic = ">=1.9.0,<3" sniffio = "*" tqdm = ">4" -typing-extensions = ">=4.7,<5" +typing-extensions = ">=4.11,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "orjson" -version = "3.10.6" +version = "3.10.7" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"}, - {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"}, - {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"}, - {file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"}, - {file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"}, - {file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"}, - {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"}, - {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"}, - {file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"}, - {file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"}, - {file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"}, - {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"}, - {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"}, - {file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"}, - {file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"}, - {file = "orjson-3.10.6-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"}, - {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"}, - {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"}, - {file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"}, - {file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"}, - {file = "orjson-3.10.6-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb"}, - {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2"}, - {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a"}, - {file = "orjson-3.10.6-cp39-none-win32.whl", hash = "sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219"}, - {file = "orjson-3.10.6-cp39-none-win_amd64.whl", hash = "sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844"}, - {file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"}, + {file = "orjson-3.10.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:74f4544f5a6405b90da8ea724d15ac9c36da4d72a738c64685003337401f5c12"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34a566f22c28222b08875b18b0dfbf8a947e69df21a9ed5c51a6bf91cfb944ac"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf6ba8ebc8ef5792e2337fb0419f8009729335bb400ece005606336b7fd7bab7"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac7cf6222b29fbda9e3a472b41e6a5538b48f2c8f99261eecd60aafbdb60690c"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de817e2f5fc75a9e7dd350c4b0f54617b280e26d1631811a43e7e968fa71e3e9"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:348bdd16b32556cf8d7257b17cf2bdb7ab7976af4af41ebe79f9796c218f7e91"}, + {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:479fd0844ddc3ca77e0fd99644c7fe2de8e8be1efcd57705b5c92e5186e8a250"}, + {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fdf5197a21dd660cf19dfd2a3ce79574588f8f5e2dbf21bda9ee2d2b46924d84"}, + {file = "orjson-3.10.7-cp310-none-win32.whl", hash = "sha256:d374d36726746c81a49f3ff8daa2898dccab6596864ebe43d50733275c629175"}, + {file = "orjson-3.10.7-cp310-none-win_amd64.whl", hash = "sha256:cb61938aec8b0ffb6eef484d480188a1777e67b05d58e41b435c74b9d84e0b9c"}, + {file = "orjson-3.10.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7db8539039698ddfb9a524b4dd19508256107568cdad24f3682d5773e60504a2"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:480f455222cb7a1dea35c57a67578848537d2602b46c464472c995297117fa09"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8a9c9b168b3a19e37fe2778c0003359f07822c90fdff8f98d9d2a91b3144d8e0"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8de062de550f63185e4c1c54151bdddfc5625e37daf0aa1e75d2a1293e3b7d9a"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b0dd04483499d1de9c8f6203f8975caf17a6000b9c0c54630cef02e44ee624e"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b58d3795dafa334fc8fd46f7c5dc013e6ad06fd5b9a4cc98cb1456e7d3558bd6"}, + {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33cfb96c24034a878d83d1a9415799a73dc77480e6c40417e5dda0710d559ee6"}, + {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e724cebe1fadc2b23c6f7415bad5ee6239e00a69f30ee423f319c6af70e2a5c0"}, + {file = "orjson-3.10.7-cp311-none-win32.whl", hash = "sha256:82763b46053727a7168d29c772ed5c870fdae2f61aa8a25994c7984a19b1021f"}, + {file = "orjson-3.10.7-cp311-none-win_amd64.whl", hash = "sha256:eb8d384a24778abf29afb8e41d68fdd9a156cf6e5390c04cc07bbc24b89e98b5"}, + {file = "orjson-3.10.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44a96f2d4c3af51bfac6bc4ef7b182aa33f2f054fd7f34cc0ee9a320d051d41f"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ac14cd57df0572453543f8f2575e2d01ae9e790c21f57627803f5e79b0d3c3"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bdbb61dcc365dd9be94e8f7df91975edc9364d6a78c8f7adb69c1cdff318ec93"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b48b3db6bb6e0a08fa8c83b47bc169623f801e5cc4f24442ab2b6617da3b5313"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23820a1563a1d386414fef15c249040042b8e5d07b40ab3fe3efbfbbcbcb8864"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c6a008e91d10a2564edbb6ee5069a9e66df3fbe11c9a005cb411f441fd2c09"}, + {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d352ee8ac1926d6193f602cbe36b1643bbd1bbcb25e3c1a657a4390f3000c9a5"}, + {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2d9f990623f15c0ae7ac608103c33dfe1486d2ed974ac3f40b693bad1a22a7b"}, + {file = "orjson-3.10.7-cp312-none-win32.whl", hash = "sha256:7c4c17f8157bd520cdb7195f75ddbd31671997cbe10aee559c2d613592e7d7eb"}, + {file = "orjson-3.10.7-cp312-none-win_amd64.whl", hash = "sha256:1d9c0e733e02ada3ed6098a10a8ee0052dd55774de3d9110d29868d24b17faa1"}, + {file = "orjson-3.10.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:77d325ed866876c0fa6492598ec01fe30e803272a6e8b10e992288b009cbe149"}, + {file = "orjson-3.10.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea2c232deedcb605e853ae1db2cc94f7390ac776743b699b50b071b02bea6fe"}, + {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3dcfbede6737fdbef3ce9c37af3fb6142e8e1ebc10336daa05872bfb1d87839c"}, + {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11748c135f281203f4ee695b7f80bb1358a82a63905f9f0b794769483ea854ad"}, + {file = "orjson-3.10.7-cp313-none-win32.whl", hash = "sha256:a7e19150d215c7a13f39eb787d84db274298d3f83d85463e61d277bbd7f401d2"}, + {file = "orjson-3.10.7-cp313-none-win_amd64.whl", hash = "sha256:eef44224729e9525d5261cc8d28d6b11cafc90e6bd0be2157bde69a52ec83024"}, + {file = "orjson-3.10.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6ea2b2258eff652c82652d5e0f02bd5e0463a6a52abb78e49ac288827aaa1469"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430ee4d85841e1483d487e7b81401785a5dfd69db5de01314538f31f8fbf7ee1"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b6146e439af4c2472c56f8540d799a67a81226e11992008cb47e1267a9b3225"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:084e537806b458911137f76097e53ce7bf5806dda33ddf6aaa66a028f8d43a23"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829cf2195838e3f93b70fd3b4292156fc5e097aac3739859ac0dcc722b27ac0"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1193b2416cbad1a769f868b1749535d5da47626ac29445803dae7cc64b3f5c98"}, + {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4e6c3da13e5a57e4b3dca2de059f243ebec705857522f188f0180ae88badd354"}, + {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c31008598424dfbe52ce8c5b47e0752dca918a4fdc4a2a32004efd9fab41d866"}, + {file = "orjson-3.10.7-cp38-none-win32.whl", hash = "sha256:7122a99831f9e7fe977dc45784d3b2edc821c172d545e6420c375e5a935f5a1c"}, + {file = "orjson-3.10.7-cp38-none-win_amd64.whl", hash = "sha256:a763bc0e58504cc803739e7df040685816145a6f3c8a589787084b54ebc9f16e"}, + {file = "orjson-3.10.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e76be12658a6fa376fcd331b1ea4e58f5a06fd0220653450f0d415b8fd0fbe20"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed350d6978d28b92939bfeb1a0570c523f6170efc3f0a0ef1f1df287cd4f4960"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:144888c76f8520e39bfa121b31fd637e18d4cc2f115727865fdf9fa325b10412"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09b2d92fd95ad2402188cf51573acde57eb269eddabaa60f69ea0d733e789fe9"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b24a579123fa884f3a3caadaed7b75eb5715ee2b17ab5c66ac97d29b18fe57f"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591bcfe7512353bd609875ab38050efe3d55e18934e2f18950c108334b4ff"}, + {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f4db56635b58cd1a200b0a23744ff44206ee6aa428185e2b6c4a65b3197abdcd"}, + {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0fa5886854673222618638c6df7718ea7fe2f3f2384c452c9ccedc70b4a510a5"}, + {file = "orjson-3.10.7-cp39-none-win32.whl", hash = "sha256:8272527d08450ab16eb405f47e0f4ef0e5ff5981c3d82afe0efd25dcbef2bcd2"}, + {file = "orjson-3.10.7-cp39-none-win_amd64.whl", hash = "sha256:974683d4618c0c7dbf4f69c95a979734bf183d0658611760017f6e70a145af58"}, + {file = "orjson-3.10.7.tar.gz", hash = "sha256:75ef0640403f945f3a1f9f6400686560dbfb0fb5b16589ad62cd477043c4eee3"}, ] [[package]] @@ -1292,13 +1340,13 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no [[package]] name = "pytest-asyncio" -version = "0.23.7" +version = "0.23.8" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, - {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, + {file = "pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2"}, + {file = "pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3"}, ] [package.dependencies] @@ -1361,90 +1409,93 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "redis" -version = "5.0.7" +version = "5.0.8" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.7-py3-none-any.whl", hash = "sha256:0e479e24da960c690be5d9b96d21f7b918a98c0cf49af3b6fafaa0753f93a0db"}, - {file = "redis-5.0.7.tar.gz", hash = "sha256:8f611490b93c8109b50adc317b31bfd84fff31def3475b92e7e80bf39f48175b"}, + {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, + {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, ] [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] -hiredis = ["hiredis (>=1.0.0)"] +hiredis = ["hiredis (>1.0.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] [[package]] name = "redisvl" -version = "0.2.3" +version = "0.3.0" description = "Python client library and CLI for using Redis as a vector database" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "redisvl-0.2.3-py3-none-any.whl", hash = "sha256:0739889de62f45345b501fbd6aea03b7350e25dc078c9154c0bc9c32d67e5eb1"}, - {file = "redisvl-0.2.3.tar.gz", hash = "sha256:13e07a3f70550f74b424ab3734171661a9199c9d1a9f6e001c38ccc422e71f83"}, + {file = "redisvl-0.3.0-py3-none-any.whl", hash = "sha256:3acac374a69d899fed4af24b4e0c6f7130aafcba4b6f97f2162a37df5e1e99ef"}, + {file = "redisvl-0.3.0.tar.gz", hash = "sha256:491a6775562310dd7162c923245790ee7f8eb69dc700205a95c4b7cddc07f9e0"}, ] [package.dependencies] @@ -1465,90 +1516,90 @@ sentence-transformers = ["sentence-transformers (>=2.2.2)"] [[package]] name = "regex" -version = "2024.5.15" +version = "2024.7.24" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, - {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, - {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, - {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, - {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, - {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, - {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, - {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, - {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, - {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, - {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, - {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, + {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, + {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, + {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, + {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, + {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, + {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, + {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, + {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, + {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, + {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, + {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, ] [[package]] @@ -1574,138 +1625,148 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "ruff" -version = "0.5.1" +version = "0.5.7" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.5.1-py3-none-linux_armv6l.whl", hash = "sha256:6ecf968fcf94d942d42b700af18ede94b07521bd188aaf2cd7bc898dd8cb63b6"}, - {file = "ruff-0.5.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:204fb0a472f00f2e6280a7c8c7c066e11e20e23a37557d63045bf27a616ba61c"}, - {file = "ruff-0.5.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d235968460e8758d1e1297e1de59a38d94102f60cafb4d5382033c324404ee9d"}, - {file = "ruff-0.5.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38beace10b8d5f9b6bdc91619310af6d63dd2019f3fb2d17a2da26360d7962fa"}, - {file = "ruff-0.5.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e478d2f09cf06add143cf8c4540ef77b6599191e0c50ed976582f06e588c994"}, - {file = "ruff-0.5.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0368d765eec8247b8550251c49ebb20554cc4e812f383ff9f5bf0d5d94190b0"}, - {file = "ruff-0.5.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3a9a9a1b582e37669b0138b7c1d9d60b9edac880b80eb2baba6d0e566bdeca4d"}, - {file = "ruff-0.5.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdd9f723e16003623423affabcc0a807a66552ee6a29f90eddad87a40c750b78"}, - {file = "ruff-0.5.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be9fd62c1e99539da05fcdc1e90d20f74aec1b7a1613463ed77870057cd6bd96"}, - {file = "ruff-0.5.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e216fc75a80ea1fbd96af94a6233d90190d5b65cc3d5dfacf2bd48c3e067d3e1"}, - {file = "ruff-0.5.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c4c2112e9883a40967827d5c24803525145e7dab315497fae149764979ac7929"}, - {file = "ruff-0.5.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dfaf11c8a116394da3b65cd4b36de30d8552fa45b8119b9ef5ca6638ab964fa3"}, - {file = "ruff-0.5.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d7ceb9b2fe700ee09a0c6b192c5ef03c56eb82a0514218d8ff700f6ade004108"}, - {file = "ruff-0.5.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bac6288e82f6296f82ed5285f597713acb2a6ae26618ffc6b429c597b392535c"}, - {file = "ruff-0.5.1-py3-none-win32.whl", hash = "sha256:5c441d9c24ec09e1cb190a04535c5379b36b73c4bc20aa180c54812c27d1cca4"}, - {file = "ruff-0.5.1-py3-none-win_amd64.whl", hash = "sha256:b1789bf2cd3d1b5a7d38397cac1398ddf3ad7f73f4de01b1e913e2abc7dfc51d"}, - {file = "ruff-0.5.1-py3-none-win_arm64.whl", hash = "sha256:2875b7596a740cbbd492f32d24be73e545a4ce0a3daf51e4f4e609962bfd3cd2"}, - {file = "ruff-0.5.1.tar.gz", hash = "sha256:3164488aebd89b1745b47fd00604fb4358d774465f20d1fcd907f9c0fc1b0655"}, + {file = "ruff-0.5.7-py3-none-linux_armv6l.whl", hash = "sha256:548992d342fc404ee2e15a242cdbea4f8e39a52f2e7752d0e4cbe88d2d2f416a"}, + {file = "ruff-0.5.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:00cc8872331055ee017c4f1071a8a31ca0809ccc0657da1d154a1d2abac5c0be"}, + {file = "ruff-0.5.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf3d86a1fdac1aec8a3417a63587d93f906c678bb9ed0b796da7b59c1114a1e"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a01c34400097b06cf8a6e61b35d6d456d5bd1ae6961542de18ec81eaf33b4cb8"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcc8054f1a717e2213500edaddcf1dbb0abad40d98e1bd9d0ad364f75c763eea"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f70284e73f36558ef51602254451e50dd6cc479f8b6f8413a95fcb5db4a55fc"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a78ad870ae3c460394fc95437d43deb5c04b5c29297815a2a1de028903f19692"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ccd078c66a8e419475174bfe60a69adb36ce04f8d4e91b006f1329d5cd44bcf"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e31c9bad4ebf8fdb77b59cae75814440731060a09a0e0077d559a556453acbb"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d796327eed8e168164346b769dd9a27a70e0298d667b4ecee6877ce8095ec8e"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a09ea2c3f7778cc635e7f6edf57d566a8ee8f485f3c4454db7771efb692c499"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a36d8dcf55b3a3bc353270d544fb170d75d2dff41eba5df57b4e0b67a95bb64e"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9369c218f789eefbd1b8d82a8cf25017b523ac47d96b2f531eba73770971c9e5"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b88ca3db7eb377eb24fb7c82840546fb7acef75af4a74bd36e9ceb37a890257e"}, + {file = "ruff-0.5.7-py3-none-win32.whl", hash = "sha256:33d61fc0e902198a3e55719f4be6b375b28f860b09c281e4bdbf783c0566576a"}, + {file = "ruff-0.5.7-py3-none-win_amd64.whl", hash = "sha256:083bbcbe6fadb93cd86709037acc510f86eed5a314203079df174c40bbbca6b3"}, + {file = "ruff-0.5.7-py3-none-win_arm64.whl", hash = "sha256:2dca26154ff9571995107221d0aeaad0e75a77b5a682d6236cf89a58c70b76f4"}, + {file = "ruff-0.5.7.tar.gz", hash = "sha256:8dfc0a458797f5d9fb622dd0efc52d796f23f0a1493a9527f4e49a550ae9a7e5"}, ] [[package]] name = "safetensors" -version = "0.4.3" +version = "0.4.4" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "safetensors-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dcf5705cab159ce0130cd56057f5f3425023c407e170bca60b4868048bae64fd"}, - {file = "safetensors-0.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bb4f8c5d0358a31e9a08daeebb68f5e161cdd4018855426d3f0c23bb51087055"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a5319ef409e7f88686a46607cbc3c428271069d8b770076feaf913664a07ac"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb9c65bd82f9ef3ce4970dc19ee86be5f6f93d032159acf35e663c6bea02b237"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edb5698a7bc282089f64c96c477846950358a46ede85a1c040e0230344fdde10"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efcc860be094b8d19ac61b452ec635c7acb9afa77beb218b1d7784c6d41fe8ad"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d88b33980222085dd6001ae2cad87c6068e0991d4f5ccf44975d216db3b57376"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5fc6775529fb9f0ce2266edd3e5d3f10aab068e49f765e11f6f2a63b5367021d"}, - {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9c6ad011c1b4e3acff058d6b090f1da8e55a332fbf84695cf3100c649cc452d1"}, - {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c496c5401c1b9c46d41a7688e8ff5b0310a3b9bae31ce0f0ae870e1ea2b8caf"}, - {file = "safetensors-0.4.3-cp310-none-win32.whl", hash = "sha256:38e2a8666178224a51cca61d3cb4c88704f696eac8f72a49a598a93bbd8a4af9"}, - {file = "safetensors-0.4.3-cp310-none-win_amd64.whl", hash = "sha256:393e6e391467d1b2b829c77e47d726f3b9b93630e6a045b1d1fca67dc78bf632"}, - {file = "safetensors-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:22f3b5d65e440cec0de8edaa672efa888030802e11c09b3d6203bff60ebff05a"}, - {file = "safetensors-0.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c4fa560ebd4522adddb71dcd25d09bf211b5634003f015a4b815b7647d62ebe"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9afd5358719f1b2cf425fad638fc3c887997d6782da317096877e5b15b2ce93"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8c5093206ef4b198600ae484230402af6713dab1bd5b8e231905d754022bec7"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0b2104df1579d6ba9052c0ae0e3137c9698b2d85b0645507e6fd1813b70931a"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cf18888606dad030455d18f6c381720e57fc6a4170ee1966adb7ebc98d4d6a3"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bf4f9d6323d9f86eef5567eabd88f070691cf031d4c0df27a40d3b4aaee755b"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:585c9ae13a205807b63bef8a37994f30c917ff800ab8a1ca9c9b5d73024f97ee"}, - {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faefeb3b81bdfb4e5a55b9bbdf3d8d8753f65506e1d67d03f5c851a6c87150e9"}, - {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:befdf0167ad626f22f6aac6163477fcefa342224a22f11fdd05abb3995c1783c"}, - {file = "safetensors-0.4.3-cp311-none-win32.whl", hash = "sha256:a7cef55929dcbef24af3eb40bedec35d82c3c2fa46338bb13ecf3c5720af8a61"}, - {file = "safetensors-0.4.3-cp311-none-win_amd64.whl", hash = "sha256:840b7ac0eff5633e1d053cc9db12fdf56b566e9403b4950b2dc85393d9b88d67"}, - {file = "safetensors-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:22d21760dc6ebae42e9c058d75aa9907d9f35e38f896e3c69ba0e7b213033856"}, - {file = "safetensors-0.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d22c1a10dff3f64d0d68abb8298a3fd88ccff79f408a3e15b3e7f637ef5c980"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1648568667f820b8c48317c7006221dc40aced1869908c187f493838a1362bc"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:446e9fe52c051aeab12aac63d1017e0f68a02a92a027b901c4f8e931b24e5397"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fef5d70683643618244a4f5221053567ca3e77c2531e42ad48ae05fae909f542"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a1f4430cc0c9d6afa01214a4b3919d0a029637df8e09675ceef1ca3f0dfa0df"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d603846a8585b9432a0fd415db1d4c57c0f860eb4aea21f92559ff9902bae4d"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a844cdb5d7cbc22f5f16c7e2a0271170750763c4db08381b7f696dbd2c78a361"}, - {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:88887f69f7a00cf02b954cdc3034ffb383b2303bc0ab481d4716e2da51ddc10e"}, - {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ee463219d9ec6c2be1d331ab13a8e0cd50d2f32240a81d498266d77d07b7e71e"}, - {file = "safetensors-0.4.3-cp312-none-win32.whl", hash = "sha256:d0dd4a1db09db2dba0f94d15addc7e7cd3a7b0d393aa4c7518c39ae7374623c3"}, - {file = "safetensors-0.4.3-cp312-none-win_amd64.whl", hash = "sha256:d14d30c25897b2bf19b6fb5ff7e26cc40006ad53fd4a88244fdf26517d852dd7"}, - {file = "safetensors-0.4.3-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d1456f814655b224d4bf6e7915c51ce74e389b413be791203092b7ff78c936dd"}, - {file = "safetensors-0.4.3-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:455d538aa1aae4a8b279344a08136d3f16334247907b18a5c3c7fa88ef0d3c46"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf476bca34e1340ee3294ef13e2c625833f83d096cfdf69a5342475602004f95"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02ef3a24face643456020536591fbd3c717c5abaa2737ec428ccbbc86dffa7a4"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7de32d0d34b6623bb56ca278f90db081f85fb9c5d327e3c18fd23ac64f465768"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a0deb16a1d3ea90c244ceb42d2c6c276059616be21a19ac7101aa97da448faf"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c59d51f182c729f47e841510b70b967b0752039f79f1de23bcdd86462a9b09ee"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f598b713cc1a4eb31d3b3203557ac308acf21c8f41104cdd74bf640c6e538e3"}, - {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5757e4688f20df083e233b47de43845d1adb7e17b6cf7da5f8444416fc53828d"}, - {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fe746d03ed8d193674a26105e4f0fe6c726f5bb602ffc695b409eaf02f04763d"}, - {file = "safetensors-0.4.3-cp37-none-win32.whl", hash = "sha256:0d5ffc6a80f715c30af253e0e288ad1cd97a3d0086c9c87995e5093ebc075e50"}, - {file = "safetensors-0.4.3-cp37-none-win_amd64.whl", hash = "sha256:a11c374eb63a9c16c5ed146457241182f310902bd2a9c18255781bb832b6748b"}, - {file = "safetensors-0.4.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1e31be7945f66be23f4ec1682bb47faa3df34cb89fc68527de6554d3c4258a4"}, - {file = "safetensors-0.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:03a4447c784917c9bf01d8f2ac5080bc15c41692202cd5f406afba16629e84d6"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d244bcafeb1bc06d47cfee71727e775bca88a8efda77a13e7306aae3813fa7e4"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53c4879b9c6bd7cd25d114ee0ef95420e2812e676314300624594940a8d6a91f"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74707624b81f1b7f2b93f5619d4a9f00934d5948005a03f2c1845ffbfff42212"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d52c958dc210265157573f81d34adf54e255bc2b59ded6218500c9b15a750eb"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f9568f380f513a60139971169c4a358b8731509cc19112369902eddb33faa4d"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d9cd8e1560dfc514b6d7859247dc6a86ad2f83151a62c577428d5102d872721"}, - {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:89f9f17b0dacb913ed87d57afbc8aad85ea42c1085bd5de2f20d83d13e9fc4b2"}, - {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1139eb436fd201c133d03c81209d39ac57e129f5e74e34bb9ab60f8d9b726270"}, - {file = "safetensors-0.4.3-cp38-none-win32.whl", hash = "sha256:d9c289f140a9ae4853fc2236a2ffc9a9f2d5eae0cb673167e0f1b8c18c0961ac"}, - {file = "safetensors-0.4.3-cp38-none-win_amd64.whl", hash = "sha256:622afd28968ef3e9786562d352659a37de4481a4070f4ebac883f98c5836563e"}, - {file = "safetensors-0.4.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8651c7299cbd8b4161a36cd6a322fa07d39cd23535b144d02f1c1972d0c62f3c"}, - {file = "safetensors-0.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e375d975159ac534c7161269de24ddcd490df2157b55c1a6eeace6cbb56903f0"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084fc436e317f83f7071fc6a62ca1c513b2103db325cd09952914b50f51cf78f"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41a727a7f5e6ad9f1db6951adee21bbdadc632363d79dc434876369a17de6ad6"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7dbbde64b6c534548696808a0e01276d28ea5773bc9a2dfb97a88cd3dffe3df"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbae3b4b9d997971431c346edbfe6e41e98424a097860ee872721e176040a893"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01e4b22e3284cd866edeabe4f4d896229495da457229408d2e1e4810c5187121"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dd37306546b58d3043eb044c8103a02792cc024b51d1dd16bd3dd1f334cb3ed"}, - {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8815b5e1dac85fc534a97fd339e12404db557878c090f90442247e87c8aeaea"}, - {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e011cc162503c19f4b1fd63dfcddf73739c7a243a17dac09b78e57a00983ab35"}, - {file = "safetensors-0.4.3-cp39-none-win32.whl", hash = "sha256:01feb3089e5932d7e662eda77c3ecc389f97c0883c4a12b5cfdc32b589a811c3"}, - {file = "safetensors-0.4.3-cp39-none-win_amd64.whl", hash = "sha256:3f9cdca09052f585e62328c1c2923c70f46814715c795be65f0b93f57ec98a02"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1b89381517891a7bb7d1405d828b2bf5d75528299f8231e9346b8eba092227f9"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cd6fff9e56df398abc5866b19a32124815b656613c1c5ec0f9350906fd798aac"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:840caf38d86aa7014fe37ade5d0d84e23dcfbc798b8078015831996ecbc206a3"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9650713b2cfa9537a2baf7dd9fee458b24a0aaaa6cafcea8bdd5fb2b8efdc34"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e4119532cd10dba04b423e0f86aecb96cfa5a602238c0aa012f70c3a40c44b50"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e066e8861eef6387b7c772344d1fe1f9a72800e04ee9a54239d460c400c72aab"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:90964917f5b0fa0fa07e9a051fbef100250c04d150b7026ccbf87a34a54012e0"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c41e1893d1206aa7054029681778d9a58b3529d4c807002c156d58426c225173"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae7613a119a71a497d012ccc83775c308b9c1dab454806291427f84397d852fd"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9bac020faba7f5dc481e881b14b6425265feabb5bfc552551d21189c0eddc3"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:420a98f593ff9930f5822560d14c395ccbc57342ddff3b463bc0b3d6b1951550"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f5e6883af9a68c0028f70a4c19d5a6ab6238a379be36ad300a22318316c00cb0"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:cdd0a3b5da66e7f377474599814dbf5cbf135ff059cc73694de129b58a5e8a2c"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9bfb92f82574d9e58401d79c70c716985dc049b635fef6eecbb024c79b2c46ad"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3615a96dd2dcc30eb66d82bc76cda2565f4f7bfa89fcb0e31ba3cea8a1a9ecbb"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:868ad1b6fc41209ab6bd12f63923e8baeb1a086814cb2e81a65ed3d497e0cf8f"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffba80aa49bd09195145a7fd233a7781173b422eeb995096f2b30591639517"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0acbe31340ab150423347e5b9cc595867d814244ac14218932a5cf1dd38eb39"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19bbdf95de2cf64f25cd614c5236c8b06eb2cfa47cbf64311f4b5d80224623a3"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b852e47eb08475c2c1bd8131207b405793bfc20d6f45aff893d3baaad449ed14"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d07cbca5b99babb692d76d8151bec46f461f8ad8daafbfd96b2fca40cadae65"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1ab6527a20586d94291c96e00a668fa03f86189b8a9defa2cdd34a1a01acc7d5"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02318f01e332cc23ffb4f6716e05a492c5f18b1d13e343c49265149396284a44"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec4b52ce9a396260eb9731eb6aea41a7320de22ed73a1042c2230af0212758ce"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:018b691383026a2436a22b648873ed11444a364324e7088b99cd2503dd828400"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:309b10dbcab63269ecbf0e2ca10ce59223bb756ca5d431ce9c9eeabd446569da"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b277482120df46e27a58082df06a15aebda4481e30a1c21eefd0921ae7e03f65"}, - {file = "safetensors-0.4.3.tar.gz", hash = "sha256:2f85fc50c4e07a21e95c24e07460fe6f7e2859d0ce88092838352b798ce711c2"}, + {file = "safetensors-0.4.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2adb497ada13097f30e386e88c959c0fda855a5f6f98845710f5bb2c57e14f12"}, + {file = "safetensors-0.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7db7fdc2d71fd1444d85ca3f3d682ba2df7d61a637dfc6d80793f439eae264ab"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d4f0eed76b430f009fbefca1a0028ddb112891b03cb556d7440d5cd68eb89a9"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57d216fab0b5c432aabf7170883d7c11671622bde8bd1436c46d633163a703f6"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d9b76322e49c056bcc819f8bdca37a2daa5a6d42c07f30927b501088db03309"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32f0d1f6243e90ee43bc6ee3e8c30ac5b09ca63f5dd35dbc985a1fc5208c451a"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d464bdc384874601a177375028012a5f177f1505279f9456fea84bbc575c7f"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63144e36209ad8e4e65384dbf2d52dd5b1866986079c00a72335402a38aacdc5"}, + {file = "safetensors-0.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:051d5ecd490af7245258000304b812825974d5e56f14a3ff7e1b8b2ba6dc2ed4"}, + {file = "safetensors-0.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51bc8429d9376224cd3cf7e8ce4f208b4c930cd10e515b6ac6a72cbc3370f0d9"}, + {file = "safetensors-0.4.4-cp310-none-win32.whl", hash = "sha256:fb7b54830cee8cf9923d969e2df87ce20e625b1af2fd194222ab902d3adcc29c"}, + {file = "safetensors-0.4.4-cp310-none-win_amd64.whl", hash = "sha256:4b3e8aa8226d6560de8c2b9d5ff8555ea482599c670610758afdc97f3e021e9c"}, + {file = "safetensors-0.4.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:bbaa31f2cb49013818bde319232ccd72da62ee40f7d2aa532083eda5664e85ff"}, + {file = "safetensors-0.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9fdcb80f4e9fbb33b58e9bf95e7dbbedff505d1bcd1c05f7c7ce883632710006"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55c14c20be247b8a1aeaf3ab4476265e3ca83096bb8e09bb1a7aa806088def4f"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:949aaa1118660f992dbf0968487b3e3cfdad67f948658ab08c6b5762e90cc8b6"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c11a4ab7debc456326a2bac67f35ee0ac792bcf812c7562a4a28559a5c795e27"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0cea44bba5c5601b297bc8307e4075535b95163402e4906b2e9b82788a2a6df"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9d752c97f6bbe327352f76e5b86442d776abc789249fc5e72eacb49e6916482"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03f2bb92e61b055ef6cc22883ad1ae898010a95730fa988c60a23800eb742c2c"}, + {file = "safetensors-0.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:87bf3f91a9328a941acc44eceffd4e1f5f89b030985b2966637e582157173b98"}, + {file = "safetensors-0.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:20d218ec2b6899d29d6895419a58b6e44cc5ff8f0cc29fac8d236a8978ab702e"}, + {file = "safetensors-0.4.4-cp311-none-win32.whl", hash = "sha256:8079486118919f600c603536e2490ca37b3dbd3280e3ad6eaacfe6264605ac8a"}, + {file = "safetensors-0.4.4-cp311-none-win_amd64.whl", hash = "sha256:2f8c2eb0615e2e64ee27d478c7c13f51e5329d7972d9e15528d3e4cfc4a08f0d"}, + {file = "safetensors-0.4.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:baec5675944b4a47749c93c01c73d826ef7d42d36ba8d0dba36336fa80c76426"}, + {file = "safetensors-0.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f15117b96866401825f3e94543145028a2947d19974429246ce59403f49e77c6"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a13a9caea485df164c51be4eb0c87f97f790b7c3213d635eba2314d959fe929"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b54bc4ca5f9b9bba8cd4fb91c24b2446a86b5ae7f8975cf3b7a277353c3127c"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08332c22e03b651c8eb7bf5fc2de90044f3672f43403b3d9ac7e7e0f4f76495e"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb62841e839ee992c37bb75e75891c7f4904e772db3691c59daaca5b4ab960e1"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e5b927acc5f2f59547270b0309a46d983edc44be64e1ca27a7fcb0474d6cd67"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a69c71b1ae98a8021a09a0b43363b0143b0ce74e7c0e83cacba691b62655fb8"}, + {file = "safetensors-0.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23654ad162c02a5636f0cd520a0310902c4421aab1d91a0b667722a4937cc445"}, + {file = "safetensors-0.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0677c109d949cf53756859160b955b2e75b0eefe952189c184d7be30ecf7e858"}, + {file = "safetensors-0.4.4-cp312-none-win32.whl", hash = "sha256:a51d0ddd4deb8871c6de15a772ef40b3dbd26a3c0451bb9e66bc76fc5a784e5b"}, + {file = "safetensors-0.4.4-cp312-none-win_amd64.whl", hash = "sha256:2d065059e75a798bc1933c293b68d04d79b586bb7f8c921e0ca1e82759d0dbb1"}, + {file = "safetensors-0.4.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9d625692578dd40a112df30c02a1adf068027566abd8e6a74893bb13d441c150"}, + {file = "safetensors-0.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7cabcf39c81e5b988d0adefdaea2eb9b4fd9bd62d5ed6559988c62f36bfa9a89"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8359bef65f49d51476e9811d59c015f0ddae618ee0e44144f5595278c9f8268c"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1a32c662e7df9226fd850f054a3ead0e4213a96a70b5ce37b2d26ba27004e013"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c329a4dcc395364a1c0d2d1574d725fe81a840783dda64c31c5a60fc7d41472c"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:239ee093b1db877c9f8fe2d71331a97f3b9c7c0d3ab9f09c4851004a11f44b65"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd574145d930cf9405a64f9923600879a5ce51d9f315443a5f706374841327b6"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f6784eed29f9e036acb0b7769d9e78a0dc2c72c2d8ba7903005350d817e287a4"}, + {file = "safetensors-0.4.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:65a4a6072436bf0a4825b1c295d248cc17e5f4651e60ee62427a5bcaa8622a7a"}, + {file = "safetensors-0.4.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:df81e3407630de060ae8313da49509c3caa33b1a9415562284eaf3d0c7705f9f"}, + {file = "safetensors-0.4.4-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:e4a0f374200e8443d9746e947ebb346c40f83a3970e75a685ade0adbba5c48d9"}, + {file = "safetensors-0.4.4-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:181fb5f3dee78dae7fd7ec57d02e58f7936498d587c6b7c1c8049ef448c8d285"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb4ac1d8f6b65ec84ddfacd275079e89d9df7c92f95675ba96c4f790a64df6e"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76897944cd9239e8a70955679b531b9a0619f76e25476e57ed373322d9c2075d"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a9e9d1a27e51a0f69e761a3d581c3af46729ec1c988fa1f839e04743026ae35"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:005ef9fc0f47cb9821c40793eb029f712e97278dae84de91cb2b4809b856685d"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26987dac3752688c696c77c3576f951dbbdb8c57f0957a41fb6f933cf84c0b62"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c05270b290acd8d249739f40d272a64dd597d5a4b90f27d830e538bc2549303c"}, + {file = "safetensors-0.4.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:068d3a33711fc4d93659c825a04480ff5a3854e1d78632cdc8f37fee917e8a60"}, + {file = "safetensors-0.4.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:063421ef08ca1021feea8b46951251b90ae91f899234dd78297cbe7c1db73b99"}, + {file = "safetensors-0.4.4-cp37-none-win32.whl", hash = "sha256:d52f5d0615ea83fd853d4e1d8acf93cc2e0223ad4568ba1e1f6ca72e94ea7b9d"}, + {file = "safetensors-0.4.4-cp37-none-win_amd64.whl", hash = "sha256:88a5ac3280232d4ed8e994cbc03b46a1807ce0aa123867b40c4a41f226c61f94"}, + {file = "safetensors-0.4.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3467ab511bfe3360967d7dc53b49f272d59309e57a067dd2405b4d35e7dcf9dc"}, + {file = "safetensors-0.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2ab4c96d922e53670ce25fbb9b63d5ea972e244de4fa1dd97b590d9fd66aacef"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87df18fce4440477c3ef1fd7ae17c704a69a74a77e705a12be135ee0651a0c2d"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e5fe345b2bc7d88587149ac11def1f629d2671c4c34f5df38aed0ba59dc37f8"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f1a3e01dce3cd54060791e7e24588417c98b941baa5974700eeb0b8eb65b0a0"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6bf35e9a8998d8339fd9a05ac4ce465a4d2a2956cc0d837b67c4642ed9e947"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:166c0c52f6488b8538b2a9f3fbc6aad61a7261e170698779b371e81b45f0440d"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87e9903b8668a16ef02c08ba4ebc91e57a49c481e9b5866e31d798632805014b"}, + {file = "safetensors-0.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9c421153aa23c323bd8483d4155b4eee82c9a50ac11cccd83539104a8279c64"}, + {file = "safetensors-0.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a4b8617499b2371c7353302c5116a7e0a3a12da66389ce53140e607d3bf7b3d3"}, + {file = "safetensors-0.4.4-cp38-none-win32.whl", hash = "sha256:c6280f5aeafa1731f0a3709463ab33d8e0624321593951aefada5472f0b313fd"}, + {file = "safetensors-0.4.4-cp38-none-win_amd64.whl", hash = "sha256:6ceed6247fc2d33b2a7b7d25d8a0fe645b68798856e0bc7a9800c5fd945eb80f"}, + {file = "safetensors-0.4.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5cf6c6f6193797372adf50c91d0171743d16299491c75acad8650107dffa9269"}, + {file = "safetensors-0.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:419010156b914a3e5da4e4adf992bee050924d0fe423c4b329e523e2c14c3547"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88f6fd5a5c1302ce79993cc5feeadcc795a70f953c762544d01fb02b2db4ea33"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d468cffb82d90789696d5b4d8b6ab8843052cba58a15296691a7a3df55143cd2"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9353c2af2dd467333d4850a16edb66855e795561cd170685178f706c80d2c71e"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83c155b4a33368d9b9c2543e78f2452090fb030c52401ca608ef16fa58c98353"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9850754c434e636ce3dc586f534bb23bcbd78940c304775bee9005bf610e98f1"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:275f500b4d26f67b6ec05629a4600645231bd75e4ed42087a7c1801bff04f4b3"}, + {file = "safetensors-0.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5c2308de665b7130cd0e40a2329278226e4cf083f7400c51ca7e19ccfb3886f3"}, + {file = "safetensors-0.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e06a9ebc8656e030ccfe44634f2a541b4b1801cd52e390a53ad8bacbd65f8518"}, + {file = "safetensors-0.4.4-cp39-none-win32.whl", hash = "sha256:ef73df487b7c14b477016947c92708c2d929e1dee2bacdd6fff5a82ed4539537"}, + {file = "safetensors-0.4.4-cp39-none-win_amd64.whl", hash = "sha256:83d054818a8d1198d8bd8bc3ea2aac112a2c19def2bf73758321976788706398"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1d1f34c71371f0e034004a0b583284b45d233dd0b5f64a9125e16b8a01d15067"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a8043a33d58bc9b30dfac90f75712134ca34733ec3d8267b1bd682afe7194f5"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8db8f0c59c84792c12661f8efa85de160f80efe16b87a9d5de91b93f9e0bce3c"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfc1fc38e37630dd12d519bdec9dcd4b345aec9930bb9ce0ed04461f49e58b52"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e5c9d86d9b13b18aafa88303e2cd21e677f5da2a14c828d2c460fe513af2e9a5"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:43251d7f29a59120a26f5a0d9583b9e112999e500afabcfdcb91606d3c5c89e3"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:2c42e9b277513b81cf507e6121c7b432b3235f980cac04f39f435b7902857f91"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3daacc9a4e3f428a84dd56bf31f20b768eb0b204af891ed68e1f06db9edf546f"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218bbb9b883596715fc9997bb42470bf9f21bb832c3b34c2bf744d6fa8f2bbba"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bd5efc26b39f7fc82d4ab1d86a7f0644c8e34f3699c33f85bfa9a717a030e1b"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56ad9776b65d8743f86698a1973292c966cf3abff627efc44ed60e66cc538ddd"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:30f23e6253c5f43a809dea02dc28a9f5fa747735dc819f10c073fe1b605e97d4"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:5512078d00263de6cb04e9d26c9ae17611098f52357fea856213e38dc462f81f"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b96c3d9266439d17f35fc2173111d93afc1162f168e95aed122c1ca517b1f8f1"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:08d464aa72a9a13826946b4fb9094bb4b16554bbea2e069e20bd903289b6ced9"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:210160816d5a36cf41f48f38473b6f70d7bcb4b0527bedf0889cc0b4c3bb07db"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb276a53717f2bcfb6df0bcf284d8a12069002508d4c1ca715799226024ccd45"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a2c28c6487f17d8db0089e8b2cdc13de859366b94cc6cdc50e1b0a4147b56551"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7915f0c60e4e6e65d90f136d85dd3b429ae9191c36b380e626064694563dbd9f"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:00eea99ae422fbfa0b46065acbc58b46bfafadfcec179d4b4a32d5c45006af6c"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb1ed4fcb0b3c2f3ea2c5767434622fe5d660e5752f21ac2e8d737b1e5e480bb"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:73fc9a0a4343188bdb421783e600bfaf81d0793cd4cce6bafb3c2ed567a74cd5"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c37e6b714200824c73ca6eaf007382de76f39466a46e97558b8dc4cf643cfbf"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f75698c5c5c542417ac4956acfc420f7d4a2396adca63a015fd66641ea751759"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca1a209157f242eb183e209040097118472e169f2e069bfbd40c303e24866543"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:177f2b60a058f92a3cec7a1786c9106c29eca8987ecdfb79ee88126e5f47fa31"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ee9622e84fe6e4cd4f020e5fda70d6206feff3157731df7151d457fdae18e541"}, + {file = "safetensors-0.4.4.tar.gz", hash = "sha256:5fe3e9b705250d0172ed4e100a811543108653fb2b66b9e702a088ad03772a07"}, ] [package.extras] @@ -1846,13 +1907,13 @@ files = [ [[package]] name = "sympy" -version = "1.13.0" +version = "1.13.2" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.13.0-py3-none-any.whl", hash = "sha256:6b0b32a4673fb91bd3cac3b55406c8e01d53ae22780be467301cc452f6680c92"}, - {file = "sympy-1.13.0.tar.gz", hash = "sha256:3b6af8f4d008b9a1a6a4268b335b984b23835f26d1d60b0526ebc71d48a25f57"}, + {file = "sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9"}, + {file = "sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13"}, ] [package.dependencies] @@ -1889,19 +1950,6 @@ files = [ [package.extras] widechars = ["wcwidth"] -[[package]] -name = "tbb" -version = "2021.13.0" -description = "Intel® oneAPI Threading Building Blocks (oneTBB)" -optional = false -python-versions = "*" -files = [ - {file = "tbb-2021.13.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:a2567725329639519d46d92a2634cf61e76601dac2f777a05686fea546c4fe4f"}, - {file = "tbb-2021.13.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:aaf667e92849adb012b8874d6393282afc318aca4407fc62f912ee30a22da46a"}, - {file = "tbb-2021.13.0-py3-none-win32.whl", hash = "sha256:6669d26703e9943f6164c6407bd4a237a45007e79b8d3832fe6999576eaaa9ef"}, - {file = "tbb-2021.13.0-py3-none-win_amd64.whl", hash = "sha256:3528a53e4bbe64b07a6112b4c5a00ff3c61924ee46c9c68e004a1ac7ad1f09c3"}, -] - [[package]] name = "tenacity" version = "8.5.0" @@ -1919,13 +1967,13 @@ test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "testcontainers" -version = "4.7.1" +version = "4.8.0" description = "Python library for throwaway instances of anything that can run in a Docker container" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "testcontainers-4.7.1-py3-none-any.whl", hash = "sha256:20f45c8a95c0062001d6c8c7030ffcae679b22b585543bb9368902f71d8e09eb"}, - {file = "testcontainers-4.7.1.tar.gz", hash = "sha256:64f78e18c82d523720dbcb02d2404b10aae7a506e929579a29fd256fbfad0c8b"}, + {file = "testcontainers-4.8.0-py3-none-any.whl", hash = "sha256:0b85d787e5b1f8b32042704d23b6c54787bf6751d2d3cfee2c031349ef2eea30"}, + {file = "testcontainers-4.8.0.tar.gz", hash = "sha256:56153bb5938694844f0e6bd0cf82e19dd6a6516bc29881440e273939201a42d5"}, ] [package.dependencies] @@ -1936,10 +1984,12 @@ wrapt = "*" [package.extras] arangodb = ["python-arango (>=7.8,<8.0)"] +aws = ["boto3", "httpx"] azurite = ["azure-storage-blob (>=12.19,<13.0)"] chroma = ["chromadb-client"] clickhouse = ["clickhouse-driver"] cosmosdb = ["azure-cosmos"] +db2 = ["ibm_db_sa", "sqlalchemy"] generic = ["httpx"] google = ["google-cloud-datastore (>=2)", "google-cloud-pubsub (>=2)"] influxdb = ["influxdb", "influxdb-client"] @@ -1960,9 +2010,11 @@ qdrant = ["qdrant-client"] rabbitmq = ["pika"] redis = ["redis"] registry = ["bcrypt"] +scylla = ["cassandra-driver (==3.29.1)"] selenium = ["selenium"] sftp = ["cryptography"] test-module-import = ["httpx"] +trino = ["trino"] weaviate = ["weaviate-client (>=4.5.4,<5.0.0)"] [[package]] @@ -2158,44 +2210,43 @@ files = [ [[package]] name = "torch" -version = "2.3.1" +version = "2.4.0" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.8.0" files = [ - {file = "torch-2.3.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:605a25b23944be5ab7c3467e843580e1d888b8066e5aaf17ff7bf9cc30001cc3"}, - {file = "torch-2.3.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f2357eb0965583a0954d6f9ad005bba0091f956aef879822274b1bcdb11bd308"}, - {file = "torch-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:32b05fe0d1ada7f69c9f86c14ff69b0ef1957a5a54199bacba63d22d8fab720b"}, - {file = "torch-2.3.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:7c09a94362778428484bcf995f6004b04952106aee0ef45ff0b4bab484f5498d"}, - {file = "torch-2.3.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:b2ec81b61bb094ea4a9dee1cd3f7b76a44555375719ad29f05c0ca8ef596ad39"}, - {file = "torch-2.3.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:490cc3d917d1fe0bd027057dfe9941dc1d6d8e3cae76140f5dd9a7e5bc7130ab"}, - {file = "torch-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5802530783bd465fe66c2df99123c9a54be06da118fbd785a25ab0a88123758a"}, - {file = "torch-2.3.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:a7dd4ed388ad1f3d502bf09453d5fe596c7b121de7e0cfaca1e2017782e9bbac"}, - {file = "torch-2.3.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:a486c0b1976a118805fc7c9641d02df7afbb0c21e6b555d3bb985c9f9601b61a"}, - {file = "torch-2.3.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:224259821fe3e4c6f7edf1528e4fe4ac779c77addaa74215eb0b63a5c474d66c"}, - {file = "torch-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:e5fdccbf6f1334b2203a61a0e03821d5845f1421defe311dabeae2fc8fbeac2d"}, - {file = "torch-2.3.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:3c333dc2ebc189561514eda06e81df22bf8fb64e2384746b2cb9f04f96d1d4c8"}, - {file = "torch-2.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:07e9ba746832b8d069cacb45f312cadd8ad02b81ea527ec9766c0e7404bb3feb"}, - {file = "torch-2.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:462d1c07dbf6bb5d9d2f3316fee73a24f3d12cd8dacf681ad46ef6418f7f6626"}, - {file = "torch-2.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff60bf7ce3de1d43ad3f6969983f321a31f0a45df3690921720bcad6a8596cc4"}, - {file = "torch-2.3.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:bee0bd33dc58aa8fc8a7527876e9b9a0e812ad08122054a5bff2ce5abf005b10"}, - {file = "torch-2.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:aaa872abde9a3d4f91580f6396d54888620f4a0b92e3976a6034759df4b961ad"}, - {file = "torch-2.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:3d7a7f7ef21a7520510553dc3938b0c57c116a7daee20736a9e25cbc0e832bdc"}, - {file = "torch-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:4777f6cefa0c2b5fa87223c213e7b6f417cf254a45e5829be4ccd1b2a4ee1011"}, - {file = "torch-2.3.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:2bb5af780c55be68fe100feb0528d2edebace1d55cb2e351de735809ba7391eb"}, + {file = "torch-2.4.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:4ed94583e244af51d6a8d28701ca5a9e02d1219e782f5a01dd401f90af17d8ac"}, + {file = "torch-2.4.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c4ca297b7bd58b506bfd6e78ffd14eb97c0e7797dcd7965df62f50bb575d8954"}, + {file = "torch-2.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:2497cbc7b3c951d69b276ca51fe01c2865db67040ac67f5fc20b03e41d16ea4a"}, + {file = "torch-2.4.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:685418ab93730efbee71528821ff54005596970dd497bf03c89204fb7e3f71de"}, + {file = "torch-2.4.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e743adadd8c8152bb8373543964551a7cb7cc20ba898dc8f9c0cdbe47c283de0"}, + {file = "torch-2.4.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:7334325c0292cbd5c2eac085f449bf57d3690932eac37027e193ba775703c9e6"}, + {file = "torch-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:97730014da4c57ffacb3c09298c6ce05400606e890bd7a05008d13dd086e46b1"}, + {file = "torch-2.4.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:f169b4ea6dc93b3a33319611fcc47dc1406e4dd539844dcbd2dec4c1b96e166d"}, + {file = "torch-2.4.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:997084a0f9784d2a89095a6dc67c7925e21bf25dea0b3d069b41195016ccfcbb"}, + {file = "torch-2.4.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:bc3988e8b36d1e8b998d143255d9408d8c75da4ab6dd0dcfd23b623dfb0f0f57"}, + {file = "torch-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:3374128bbf7e62cdaed6c237bfd39809fbcfaa576bee91e904706840c3f2195c"}, + {file = "torch-2.4.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:91aaf00bfe1ffa44dc5b52809d9a95129fca10212eca3ac26420eb11727c6288"}, + {file = "torch-2.4.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cc30457ea5489c62747d3306438af00c606b509d78822a88f804202ba63111ed"}, + {file = "torch-2.4.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a046491aaf96d1215e65e1fa85911ef2ded6d49ea34c8df4d0638879f2402eef"}, + {file = "torch-2.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:688eec9240f3ce775f22e1e1a5ab9894f3d5fe60f3f586deb7dbd23a46a83916"}, + {file = "torch-2.4.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:3af4de2a618fb065e78404c4ba27a818a7b7957eaeff28c6c66ce7fb504b68b8"}, + {file = "torch-2.4.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:618808d3f610d5f180e47a697d4ec90b810953bb1e020f424b2ac7fb0884b545"}, + {file = "torch-2.4.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:ed765d232d23566052ba83632ec73a4fccde00b4c94ad45d63b471b09d63b7a7"}, + {file = "torch-2.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2feb98ac470109472fb10dfef38622a7ee08482a16c357863ebc7bc7db7c8f7"}, + {file = "torch-2.4.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:8940fc8b97a4c61fdb5d46a368f21f4a3a562a17879e932eb51a5ec62310cb31"}, ] [package.dependencies] filelock = "*" fsspec = "*" jinja2 = "*" -mkl = {version = ">=2021.1.1,<=2021.4.0", markers = "platform_system == \"Windows\""} networkx = "*" nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "9.1.0.70", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} @@ -2203,22 +2254,22 @@ nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \" nvidia-nccl-cu12 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} sympy = "*" -triton = {version = "2.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +triton = {version = "3.0.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.13\""} typing-extensions = ">=4.8.0" [package.extras] opt-einsum = ["opt-einsum (>=3.3)"] -optree = ["optree (>=0.9.1)"] +optree = ["optree (>=0.11.0)"] [[package]] name = "tqdm" -version = "4.66.4" +version = "4.66.5" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, - {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] [package.dependencies] @@ -2232,19 +2283,19 @@ telegram = ["requests"] [[package]] name = "transformers" -version = "4.42.3" +version = "4.44.0" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.8.0" files = [ - {file = "transformers-4.42.3-py3-none-any.whl", hash = "sha256:a61a0df9609b7d69229d941b2fd857c841ba3043d6da503d0da1a4b133f65b92"}, - {file = "transformers-4.42.3.tar.gz", hash = "sha256:7539873ff45809145265cbc94ea4619d2713c41ceaa277b692d8b0be3430f7eb"}, + {file = "transformers-4.44.0-py3-none-any.whl", hash = "sha256:ea0ff72def71e9f4812d9414d4803b22681b1617aa6f511bd51cfff2b44a6fca"}, + {file = "transformers-4.44.0.tar.gz", hash = "sha256:75699495e30b7635ca444d8d372e138c687ab51a875b387e33f1fb759c37f196"}, ] [package.dependencies] filelock = "*" huggingface-hub = ">=0.23.2,<1.0" -numpy = ">=1.17,<2.0" +numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" @@ -2256,15 +2307,15 @@ tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.21.0)"] agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] benchmark = ["optimum-benchmark (>=0.2.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] @@ -2275,42 +2326,46 @@ natten = ["natten (>=0.14.6,<0.15.0)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] optuna = ["optuna"] -quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.4.4)", "urllib3 (<2.0.0)"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.5.1)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] -ruff = ["ruff (==0.4.4)"] +ruff = ["ruff (==0.5.1)"] sagemaker = ["sagemaker (>=2.31.0)"] sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] -tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] timm = ["timm (<=0.9.16)"] tokenizers = ["tokenizers (>=0.19,<0.20)"] torch = ["accelerate (>=0.21.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17,<2.0)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] [[package]] name = "triton" -version = "2.3.1" +version = "3.0.0" description = "A language and compiler for custom Deep Learning operations" optional = false python-versions = "*" files = [ - {file = "triton-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c84595cbe5e546b1b290d2a58b1494df5a2ef066dd890655e5b8a8a92205c33"}, - {file = "triton-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d64ae33bcb3a7a18081e3a746e8cf87ca8623ca13d2c362413ce7a486f893e"}, - {file = "triton-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf80e8761a9e3498aa92e7bf83a085b31959c61f5e8ac14eedd018df6fccd10"}, - {file = "triton-2.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b13bf35a2b659af7159bf78e92798dc62d877aa991de723937329e2d382f1991"}, - {file = "triton-2.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63381e35ded3304704ea867ffde3b7cfc42c16a55b3062d41e017ef510433d66"}, - {file = "triton-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d968264523c7a07911c8fb51b4e0d1b920204dae71491b1fe7b01b62a31e124"}, + {file = "triton-3.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e1efef76935b2febc365bfadf74bcb65a6f959a9872e5bddf44cc9e0adce1e1a"}, + {file = "triton-3.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ce8520437c602fb633f1324cc3871c47bee3b67acf9756c1a66309b60e3216c"}, + {file = "triton-3.0.0-1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e509deb77f1c067d8640725ef00c5cbfcb2052a1a3cb6a6d343841f92624eb"}, + {file = "triton-3.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bcbf3b1c48af6a28011a5c40a5b3b9b5330530c3827716b5fbf6d7adcc1e53e9"}, + {file = "triton-3.0.0-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6e5727202f7078c56f91ff13ad0c1abab14a0e7f2c87e91b12b6f64f3e8ae609"}, + {file = "triton-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b052da883351fdf6be3d93cedae6db3b8e3988d3b09ed221bccecfa9612230"}, + {file = "triton-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd34f19a8582af96e6291d4afce25dac08cb2a5d218c599163761e8e0827208e"}, + {file = "triton-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d5e10de8c011adeb7c878c6ce0dd6073b14367749e34467f1cff2bde1b78253"}, + {file = "triton-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8903767951bf86ec960b4fe4e21bc970055afc65e9d57e916d79ae3c93665e3"}, + {file = "triton-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41004fb1ae9a53fcb3e970745feb87f0e3c94c6ce1ba86e95fa3b8537894bef7"}, ] [package.dependencies] @@ -2318,8 +2373,8 @@ filelock = "*" [package.extras] build = ["cmake (>=3.20)", "lit"] -tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)", "torch"] -tutorials = ["matplotlib", "pandas", "tabulate", "torch"] +tests = ["autopep8", "flake8", "isort", "llnl-hatchet", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] [[package]] name = "typing-extensions" @@ -2431,4 +2486,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "ee2d37ceeb180dc89febf7509b42f02fa99356517342b1ab4026b6e4c3e6d830" +content-hash = "63c9100cee8cc953ae714a00f62f6d0093b0e0d0b9ab3d0b41e81700334b3357" diff --git a/libs/redis/pyproject.toml b/libs/redis/pyproject.toml index ad56988..f169e1e 100644 --- a/libs/redis/pyproject.toml +++ b/libs/redis/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langchain-redis" -version = "0.0.1" +version = "0.0.2" description = "An integration package connecting Redis and LangChain" authors = ["Brian Sam-Bodden "] readme = "README.md" @@ -13,7 +13,7 @@ license = "MIT" [tool.poetry.dependencies] python = ">=3.9,<4.0" langchain-core = ">=0.1.52,<0.3" -redisvl = "^0.2.3" +redisvl = "^0.3.0" numpy = "^1" python-ulid = "^2.7.0" sentence-transformers = "^3.0.1" diff --git a/libs/redis/tests/unit_tests/test_cache.py b/libs/redis/tests/unit_tests/test_cache.py index 50881e6..4cb75b9 100644 --- a/libs/redis/tests/unit_tests/test_cache.py +++ b/libs/redis/tests/unit_tests/test_cache.py @@ -7,6 +7,8 @@ from langchain_core.outputs import Generation from langchain_redis import RedisCache, RedisSemanticCache from unittest.mock import Mock, patch, MagicMock +from redis.exceptions import ResponseError +from langchain_redis.version import __full_lib_name__ class MockRedisJSON: @@ -42,6 +44,9 @@ def delete(self, *keys: str) -> None: for key in keys: self._json.data.pop(key, None) + def client_setinfo(self, attr: str, value: str) -> None: + pass + # Helper functions (make sure these match the ones in your actual implementation) def _serialize_generations(generations: List[Generation]) -> str: @@ -95,12 +100,40 @@ def redis_cache(self) -> RedisCache: mock_redis.expire = MagicMock() mock_redis.scan = Mock(return_value=(0, [])) mock_redis.delete = Mock() + mock_redis.client_setinfo = Mock() + mock_redis.echo = Mock() with patch("langchain_redis.cache.Redis.from_url", return_value=mock_redis): cache = RedisCache(redis_url="redis://localhost:6379", ttl=3600) cache.redis = mock_redis return cache + def test_initialization(self, redis_cache: RedisCache) -> None: + # Test that client_setinfo was called + redis_cache.redis.client_setinfo.assert_called_once_with( # type: ignore + "LIB-NAME", __full_lib_name__ + ) + + # Test that echo was not called (as client_setinfo didn't raise an exception) + redis_cache.redis.echo.assert_not_called() # type: ignore + + def test_initialization_fallback(self, redis_cache: RedisCache) -> None: + # Reset the mock to clear previous calls + redis_cache.redis.client_setinfo.reset_mock() # type: ignore + redis_cache.redis.echo.reset_mock() # type: ignore + + # Simulate ResponseError for client_setinfo + redis_cache.redis.client_setinfo.side_effect = ResponseError("Test error") # type: ignore + + # Simulate the initialization process + with patch( + "langchain_redis.cache.Redis.from_url", return_value=redis_cache.redis + ): + RedisCache(redis_url="redis://localhost:6379", ttl=3600) + + # Test that echo was called as a fallback + redis_cache.redis.echo.assert_called_once_with(__full_lib_name__) # type: ignore + def test_update_and_lookup(self, redis_cache: RedisCache) -> None: prompt = "test prompt" llm_string = "test_llm" diff --git a/libs/redis/tests/unit_tests/test_chat_message_history.py b/libs/redis/tests/unit_tests/test_chat_message_history.py index 1d88a9b..3f9ae80 100644 --- a/libs/redis/tests/unit_tests/test_chat_message_history.py +++ b/libs/redis/tests/unit_tests/test_chat_message_history.py @@ -57,6 +57,9 @@ def execute_command(self, *args: Any, **kwargs: Any) -> List[Any]: else: return [] + def client_setinfo(self, attr: str, value: str) -> None: + pass + class MockFT: def __init__(self, redis: MockRedis, index_name: str) -> None: