From bd5f14dc1cbd901d18745c92eed34023ee9b0acf Mon Sep 17 00:00:00 2001 From: Istoc Rares Date: Fri, 5 Jul 2024 14:39:20 +0300 Subject: [PATCH] Restructure repository (#26) * retruscture * 5-inference added * 5-inference added * added .gitignore * refactoring * Solved Embeding insertion into qdrant vector index * Added pulimi remaining resources --------- Co-authored-by: Vesa Alexandru --- .docker/Dockerfile.bytewax | 48 + .docker/Dockerfile.cdc | 35 + .../Dockerfile => .docker/Dockerfile.crawlers | 13 +- .gitignore | 4 + .python-version | 1 + .../Readme.md => 1-data-crawling/README.md | 0 1-data-crawling/config.py | 12 + 1-data-crawling/crawlers/__init__.py | 5 + 1-data-crawling/crawlers/base.py | 67 + 1-data-crawling/crawlers/github.py | 57 + 1-data-crawling/crawlers/linkedin.py | 156 + 1-data-crawling/crawlers/medium.py | 43 + .../db}/__init__.py | 0 .../db/documents.py | 9 +- .../module-3 => 1-data-crawling}/db/mongo.py | 24 +- .../dispatcher.py | 0 .../module-1 => 1-data-crawling}/errors.py | 0 {course/module-1 => 1-data-crawling}/lib.py | 0 {course/module-1 => 1-data-crawling}/main.py | 5 +- .../utils.py | 0 .../Readme.md => 2-data-ingestion/README.md | 0 {course/module-2 => 2-data-ingestion}/cdc.py | 6 +- .../settings.py => 2-data-ingestion/config.py | 4 +- 2-data-ingestion/db.py | 34 + .../data_flow => 2-data-ingestion}/mq.py | 2 +- .../module-2 => 2-data-ingestion}/test_cdc.py | 11 +- 3-feature-pipeline/config.py | 36 + .../data_flow}/__init__.py | 0 .../data_flow/stream_input.py | 5 +- .../data_flow/stream_output.py | 9 +- .../data_logic}/__init__.py | 0 .../data_logic/chunking_data_handlers.py | 0 .../data_logic/cleaning_data_handlers.py | 0 .../data_logic/dispatchers.py | 6 +- .../data_logic/embedding_data_handlers.py | 0 3-feature-pipeline/db.py | 82 + .../finetuning/__init__.py | 0 .../finetuning/exceptions.py | 0 .../finetuning/file_handler.py | 0 .../finetuning/generate_data.py | 6 +- .../finetuning/llm_communication.py | 6 +- .../llm}/__init__.py | 0 .../llm}/chain.py | 0 .../llm}/prompt_templates.py | 0 .../main.py | 4 +- .../models/__init__.py | 0 .../models/base.py | 8 +- .../models/chunk.py | 0 .../models/clean.py | 0 .../models/embedded_chunk.py | 0 .../models/raw.py | 8 +- .../data_flow => 3-feature-pipeline}/mq.py | 8 +- 3-feature-pipeline/rag/__init__.py | 0 .../rag/query_expanison.py | 6 +- 3-feature-pipeline/rag/reranking.py | 35 + .../rag/retriever.py | 6 +- .../rag/self_query.py | 6 +- .../retriever.py | 5 +- .../scripts/bytewax_entrypoint.sh | 22 + .../utils/__init__.py | 0 .../utils/chunking.py | 2 +- .../utils/cleaning.py | 0 .../utils/embeddings.py | 2 +- 3-feature-pipeline/utils/logging.py | 5 + 4-finetuning/.env.example | 4 + 4-finetuning/README.md | 272 + 4-finetuning/build_config.yaml | 52 + 4-finetuning/finetuning/__init__.py | 5 + 4-finetuning/finetuning/config.yaml | 12 + 4-finetuning/finetuning/dataset_client.py | 54 + 4-finetuning/finetuning/model.py | 209 + 4-finetuning/finetuning/requirements.txt | 12 + 4-finetuning/finetuning/settings.py | 13 + 4-finetuning/media/fine-tuning-workflow.png | Bin 0 -> 468674 bytes 4-finetuning/test_local.py | 15 + 5-inference/.env.example | 12 + 5-inference/Makefile | 6 + 5-inference/README.txt | 4 + 5-inference/config.py | 52 + 5-inference/evaluation/__init__.py | 4 + 5-inference/evaluation/model.py | 19 + 5-inference/evaluation/rag.py | 19 + 5-inference/finetuning/__init__.py | 5 + 5-inference/finetuning/config.yaml | 12 + 5-inference/finetuning/dataset_client.py | 56 + 5-inference/finetuning/model.py | 211 + 5-inference/finetuning/settings.py | 14 + 5-inference/inference_pipeline.py | 70 + 5-inference/llm/__init__.py | 0 5-inference/llm/chain.py | 10 + 5-inference/llm/prompt_templates.py | 133 + 5-inference/main.py | 26 + 5-inference/monitoring/__init__.py | 3 + 5-inference/monitoring/prompt_monitoring.py | 55 + 5-inference/pyproject.toml | 51 + 5-inference/rag/__init__.py | 0 5-inference/rag/query_expanison.py | 31 + .../module-3 => 5-inference}/rag/reranking.py | 6 +- 5-inference/rag/retriever.py | 128 + 5-inference/rag/self_query.py | 25 + 5-inference/utils/__init__.py | 4 + 5-inference/utils/chunking.py | 25 + 5-inference/utils/cleaning.py | 107 + 5-inference/utils/embeddings.py | 16 + Makefile | 110 + core/__init__.py | 0 {course/module-1 => core/db}/documents.py | 29 +- {course/module-3 => core}/db/errors.py | 0 {course/module-2 => core}/db/mongo.py | 0 {course/module-3 => core}/db/qdrant.py | 15 +- core/logger_utils.py | 5 + course/module-1/config.py | 16 - course/module-1/db.py | 31 - course/module-3/cdc.py | 32 - course/module-3/cleaned_articles.json | 1 + course/module-3/insert_data_mongo.py | 146 - course/module-5/db/documents.py | 2 +- course/module-5/db/mongo.py | 2 +- course/module-5/db/qdrant.py | 2 +- course/module-5/main.py | 2 +- course/module-5/rag/retriever.py | 2 +- docker-bake.hcl | 13 + docker-compose.yml | 124 +- ops/components/ecs/cluster.ts | 62 + ops/components/ecs/iam.ts | 69 + ops/components/ecs/service.ts | 128 + ops/components/mq.ts | 115 + ops/index.ts | 51 + poetry.lock | 5973 +++++++++++++++++ pyproject.toml | 62 + requirements.txt | 2972 ++++++++ course/module-3/settings.py => settings.py | 5 +- 132 files changed, 12172 insertions(+), 352 deletions(-) create mode 100644 .docker/Dockerfile.bytewax create mode 100644 .docker/Dockerfile.cdc rename course/module-1/Dockerfile => .docker/Dockerfile.crawlers (79%) create mode 100644 .python-version rename course/module-1/Readme.md => 1-data-crawling/README.md (100%) create mode 100644 1-data-crawling/config.py create mode 100644 1-data-crawling/crawlers/__init__.py create mode 100644 1-data-crawling/crawlers/base.py create mode 100644 1-data-crawling/crawlers/github.py create mode 100644 1-data-crawling/crawlers/linkedin.py create mode 100644 1-data-crawling/crawlers/medium.py rename {course/module-3/data_flow => 1-data-crawling/db}/__init__.py (100%) rename {course/module-3 => 1-data-crawling}/db/documents.py (96%) rename {course/module-3 => 1-data-crawling}/db/mongo.py (51%) rename {course/module-1 => 1-data-crawling}/dispatcher.py (100%) rename {course/module-1 => 1-data-crawling}/errors.py (100%) rename {course/module-1 => 1-data-crawling}/lib.py (100%) rename {course/module-1 => 1-data-crawling}/main.py (96%) rename course/module-3/logger_utils.py => 1-data-crawling/utils.py (100%) rename course/module-2/Readme.md => 2-data-ingestion/README.md (100%) rename {course/module-2 => 2-data-ingestion}/cdc.py (88%) rename course/module-2/settings.py => 2-data-ingestion/config.py (89%) create mode 100644 2-data-ingestion/db.py rename {course/module-2/data_flow => 2-data-ingestion}/mq.py (99%) rename {course/module-2 => 2-data-ingestion}/test_cdc.py (70%) create mode 100644 3-feature-pipeline/config.py rename {course/module-3/data_logic => 3-feature-pipeline/data_flow}/__init__.py (100%) rename {course/module-3 => 3-feature-pipeline}/data_flow/stream_input.py (95%) rename {course/module-3 => 3-feature-pipeline}/data_flow/stream_output.py (98%) rename {course/module-3/db => 3-feature-pipeline/data_logic}/__init__.py (100%) rename {course/module-3 => 3-feature-pipeline}/data_logic/chunking_data_handlers.py (100%) rename {course/module-3 => 3-feature-pipeline}/data_logic/cleaning_data_handlers.py (100%) rename {course/module-3 => 3-feature-pipeline}/data_logic/dispatchers.py (97%) rename {course/module-3 => 3-feature-pipeline}/data_logic/embedding_data_handlers.py (100%) create mode 100644 3-feature-pipeline/db.py rename {course/module-3 => 3-feature-pipeline}/finetuning/__init__.py (100%) rename {course/module-3 => 3-feature-pipeline}/finetuning/exceptions.py (100%) rename {course/module-3 => 3-feature-pipeline}/finetuning/file_handler.py (100%) rename {course/module-3 => 3-feature-pipeline}/finetuning/generate_data.py (98%) rename {course/module-3 => 3-feature-pipeline}/finetuning/llm_communication.py (93%) rename {course/module-3/llm_components => 3-feature-pipeline/llm}/__init__.py (100%) rename {course/module-3/llm_components => 3-feature-pipeline/llm}/chain.py (100%) rename {course/module-3/llm_components => 3-feature-pipeline/llm}/prompt_templates.py (100%) rename course/module-3/data_flow/bytewax_pipeline.py => 3-feature-pipeline/main.py (95%) rename {course/module-3 => 3-feature-pipeline}/models/__init__.py (100%) rename {course/module-3 => 3-feature-pipeline}/models/base.py (71%) rename {course/module-3 => 3-feature-pipeline}/models/chunk.py (100%) rename {course/module-3 => 3-feature-pipeline}/models/clean.py (100%) rename {course/module-3 => 3-feature-pipeline}/models/embedded_chunk.py (100%) rename {course/module-3 => 3-feature-pipeline}/models/raw.py (76%) rename {course/module-3/data_flow => 3-feature-pipeline}/mq.py (96%) create mode 100644 3-feature-pipeline/rag/__init__.py rename {course/module-3 => 3-feature-pipeline}/rag/query_expanison.py (85%) create mode 100644 3-feature-pipeline/rag/reranking.py rename {course/module-3 => 3-feature-pipeline}/rag/retriever.py (97%) rename {course/module-3 => 3-feature-pipeline}/rag/self_query.py (78%) rename {course/module-3 => 3-feature-pipeline}/retriever.py (91%) create mode 100644 3-feature-pipeline/scripts/bytewax_entrypoint.sh rename {course/module-3 => 3-feature-pipeline}/utils/__init__.py (100%) rename {course/module-3 => 3-feature-pipeline}/utils/chunking.py (95%) rename {course/module-3 => 3-feature-pipeline}/utils/cleaning.py (100%) rename {course/module-3 => 3-feature-pipeline}/utils/embeddings.py (93%) create mode 100644 3-feature-pipeline/utils/logging.py create mode 100644 4-finetuning/.env.example create mode 100644 4-finetuning/README.md create mode 100644 4-finetuning/build_config.yaml create mode 100644 4-finetuning/finetuning/__init__.py create mode 100644 4-finetuning/finetuning/config.yaml create mode 100644 4-finetuning/finetuning/dataset_client.py create mode 100644 4-finetuning/finetuning/model.py create mode 100644 4-finetuning/finetuning/requirements.txt create mode 100644 4-finetuning/finetuning/settings.py create mode 100644 4-finetuning/media/fine-tuning-workflow.png create mode 100644 4-finetuning/test_local.py create mode 100644 5-inference/.env.example create mode 100644 5-inference/Makefile create mode 100644 5-inference/README.txt create mode 100644 5-inference/config.py create mode 100644 5-inference/evaluation/__init__.py create mode 100644 5-inference/evaluation/model.py create mode 100644 5-inference/evaluation/rag.py create mode 100644 5-inference/finetuning/__init__.py create mode 100644 5-inference/finetuning/config.yaml create mode 100644 5-inference/finetuning/dataset_client.py create mode 100644 5-inference/finetuning/model.py create mode 100644 5-inference/finetuning/settings.py create mode 100644 5-inference/inference_pipeline.py create mode 100644 5-inference/llm/__init__.py create mode 100644 5-inference/llm/chain.py create mode 100644 5-inference/llm/prompt_templates.py create mode 100644 5-inference/main.py create mode 100644 5-inference/monitoring/__init__.py create mode 100644 5-inference/monitoring/prompt_monitoring.py create mode 100644 5-inference/pyproject.toml create mode 100644 5-inference/rag/__init__.py create mode 100644 5-inference/rag/query_expanison.py rename {course/module-3 => 5-inference}/rag/reranking.py (90%) create mode 100644 5-inference/rag/retriever.py create mode 100644 5-inference/rag/self_query.py create mode 100644 5-inference/utils/__init__.py create mode 100644 5-inference/utils/chunking.py create mode 100644 5-inference/utils/cleaning.py create mode 100644 5-inference/utils/embeddings.py create mode 100644 Makefile create mode 100644 core/__init__.py rename {course/module-1 => core/db}/documents.py (84%) rename {course/module-3 => core}/db/errors.py (100%) rename {course/module-2 => core}/db/mongo.py (100%) rename {course/module-3 => core}/db/qdrant.py (92%) create mode 100644 core/logger_utils.py delete mode 100644 course/module-1/config.py delete mode 100644 course/module-1/db.py delete mode 100644 course/module-3/cdc.py create mode 100644 course/module-3/cleaned_articles.json create mode 100644 docker-bake.hcl create mode 100644 ops/components/ecs/cluster.ts create mode 100644 ops/components/ecs/iam.ts create mode 100644 ops/components/ecs/service.ts create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 requirements.txt rename course/module-3/settings.py => settings.py (92%) diff --git a/.docker/Dockerfile.bytewax b/.docker/Dockerfile.bytewax new file mode 100644 index 0000000..1d0345d --- /dev/null +++ b/.docker/Dockerfile.bytewax @@ -0,0 +1,48 @@ +# Use an official Python runtime as a parent image +FROM python:3.11-slim-bullseye + +ENV WORKSPACE_ROOT=/usr/src/app \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + POETRY_HOME="/opt/poetry" \ + POETRY_NO_INTERACTION=1 + +RUN mkdir -p $WORKSPACE_ROOT + +# Install system dependencies +RUN apt-get update -y \ + && apt-get install -y --no-install-recommends build-essential \ + gcc \ + python3-dev \ + curl \ + build-essential \ + && apt-get clean + +# Install Poetry +RUN curl -sSL https://install.python-poetry.org | python - + +# Add Poetry to PATH +ENV PATH="$POETRY_HOME/bin:$PATH" + +RUN apt-get remove -y curl + +# Copy the pyproject.toml and poetry.lock files from the root directory +COPY ./pyproject.toml ./poetry.lock ./ + +# Install dependencies +RUN poetry config virtualenvs.create false && poetry install + +# Set the working directory +WORKDIR $WORKSPACE_ROOT + +# Copy the 3-feature-pipeline and any other necessary directories +COPY ./3-feature-pipeline . +COPY ./core ./core + +# Set the PYTHONPATH environment variable +ENV PYTHONPATH=/usr/src/app + +RUN chmod +x /usr/src/app/scripts/bytewax_entrypoint.sh + +# Command to run the Bytewax pipeline script +CMD ["/usr/src/app/scripts/bytewax_entrypoint.sh"] diff --git a/.docker/Dockerfile.cdc b/.docker/Dockerfile.cdc new file mode 100644 index 0000000..8b555b4 --- /dev/null +++ b/.docker/Dockerfile.cdc @@ -0,0 +1,35 @@ +# Use an official Python runtime as a parent image +FROM python:3.11-slim + +# Install system dependencies +RUN apt-get update && apt-get install -y \ + gcc \ + python3-dev \ + curl \ + build-essential \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install Poetry +RUN pip install poetry + +# Add Poetry to PATH +ENV PATH="/etc/poetry/bin:$PATH" + +# Set the working directory +WORKDIR /app + +# Copy the pyproject.toml and poetry.lock files from the root directory +COPY ./pyproject.toml ./poetry.lock ./ + +# Install dependencies +RUN poetry install --no-root + +# Copy the 2-data-ingestion and core directories +COPY ./2-data-ingestion ./2-data-ingestion + +# Set the PYTHONPATH environment variable +ENV PYTHONPATH=/app + +# Command to run the script +CMD poetry run python /app/2-data-ingestion/cdc.py && tail -f /dev/null \ No newline at end of file diff --git a/course/module-1/Dockerfile b/.docker/Dockerfile.crawlers similarity index 79% rename from course/module-1/Dockerfile rename to .docker/Dockerfile.crawlers index 1625828..ec594ce 100644 --- a/course/module-1/Dockerfile +++ b/.docker/Dockerfile.crawlers @@ -44,20 +44,21 @@ RUN yum install -y \ COPY --from=build /opt/chrome-linux /opt/chrome COPY --from=build /opt/chromedriver /opt/ -COPY poetry.lock pyproject.toml ./ +COPY ./pyproject.toml ./poetry.lock ./ # Install Poetry, export dependencies to requirements.txt, and install dependencies # in the Lambda task directory, finally cleanup manifest files. -RUN python3 -m pip install --upgrade pip && pip3 install poetry -RUN poetry export -f requirements.txt > requirements.txt && \ - pip3 install --no-cache-dir -r requirements.txt --target "${LAMBDA_TASK_ROOT}" && \ +RUN python -m pip install --upgrade pip && pip install poetry +RUN poetry export --without 3-feature-pipeline,ml -f requirements.txt > requirements.txt && \ + pip install --no-cache-dir -r requirements.txt --target "${LAMBDA_TASK_ROOT}" && \ rm requirements.txt pyproject.toml poetry.lock # Optional TLS CA only if you plan to store the extracted data into Document DB RUN wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem -P ${LAMBDA_TASK_ROOT} +ENV PYTHONPATH=${LAMBDA_TASK_ROOT}/1-data-crawling # Copy function code -COPY . ${LAMBDA_TASK_ROOT} +COPY ./1-data-crawling ${LAMBDA_TASK_ROOT}/1-data-crawling # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) -CMD ["main.handler"] +CMD ["1-data-crawling.main.handler"] diff --git a/.gitignore b/.gitignore index 44d5bae..56e9b2e 100644 --- a/.gitignore +++ b/.gitignore @@ -162,6 +162,10 @@ cython_debug/ # Ruff .ruff_cache +data/ +dataset/ +data + # Data output .cache diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..0c7d5f5 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.11.4 diff --git a/course/module-1/Readme.md b/1-data-crawling/README.md similarity index 100% rename from course/module-1/Readme.md rename to 1-data-crawling/README.md diff --git a/1-data-crawling/config.py b/1-data-crawling/config.py new file mode 100644 index 0000000..0baf1f1 --- /dev/null +++ b/1-data-crawling/config.py @@ -0,0 +1,12 @@ +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class Settings(BaseSettings): + model_config = SettingsConfigDict(env_file="../.env", env_file_encoding="utf-8") + + # MongoDB configs + MONGO_DATABASE_HOST: str = "mongodb://localhost:30001,localhost:30002,localhost:30003/?replicaSet=my-replica-set" + MONGO_DATABASE_NAME: str = "scrabble" + + +settings = Settings() diff --git a/1-data-crawling/crawlers/__init__.py b/1-data-crawling/crawlers/__init__.py new file mode 100644 index 0000000..c0ff844 --- /dev/null +++ b/1-data-crawling/crawlers/__init__.py @@ -0,0 +1,5 @@ +from .github import GithubCrawler +from .linkedin import LinkedInCrawler +from .medium import MediumCrawler + +__all__ = ["GithubCrawler", "LinkedInCrawler", "MediumCrawler"] diff --git a/1-data-crawling/crawlers/base.py b/1-data-crawling/crawlers/base.py new file mode 100644 index 0000000..094d762 --- /dev/null +++ b/1-data-crawling/crawlers/base.py @@ -0,0 +1,67 @@ +import time +from abc import ABC, abstractmethod +from tempfile import mkdtemp + +from selenium import webdriver +from selenium.webdriver.chrome.options import Options + +from db.documents import BaseDocument + + +class BaseCrawler(ABC): + model: type[BaseDocument] + + @abstractmethod + def extract(self, link: str, **kwargs) -> None: ... + + +class BaseAbstractCrawler(BaseCrawler, ABC): + def __init__(self, scroll_limit: int = 5) -> None: + options = webdriver.ChromeOptions() + options.binary_location = "/opt/chrome/chrome" + options.add_argument("--no-sandbox") + options.add_argument("--headless=new") + options.add_argument("--single-process") + options.add_argument("--disable-dev-shm-usage") + options.add_argument("--disable-gpu") + options.add_argument("--log-level=3") + options.add_argument("--disable-popup-blocking") + options.add_argument("--disable-notifications") + options.add_argument("--disable-dev-tools") + options.add_argument("--ignore-certificate-errors") + options.add_argument("--no-zygote") + options.add_argument(f"--user-data-dir={mkdtemp()}") + options.add_argument(f"--data-path={mkdtemp()}") + options.add_argument(f"--disk-cache-dir={mkdtemp()}") + options.add_argument("--remote-debugging-port=9222") + + self.set_extra_driver_options(options) + + self.scroll_limit = scroll_limit + self.driver = webdriver.Chrome( + service=webdriver.ChromeService("/opt/chromedriver"), + options=options, + ) + + def set_extra_driver_options(self, options: Options) -> None: + pass + + def login(self) -> None: + pass + + def scroll_page(self) -> None: + """Scroll through the LinkedIn page based on the scroll limit.""" + current_scroll = 0 + last_height = self.driver.execute_script("return document.body.scrollHeight") + while True: + self.driver.execute_script( + "window.scrollTo(0, document.body.scrollHeight);" + ) + time.sleep(5) + new_height = self.driver.execute_script("return document.body.scrollHeight") + if new_height == last_height or ( + self.scroll_limit and current_scroll >= self.scroll_limit + ): + break + last_height = new_height + current_scroll += 1 diff --git a/1-data-crawling/crawlers/github.py b/1-data-crawling/crawlers/github.py new file mode 100644 index 0000000..011e981 --- /dev/null +++ b/1-data-crawling/crawlers/github.py @@ -0,0 +1,57 @@ +import os +import shutil +import subprocess +import tempfile + +from aws_lambda_powertools import Logger + +from crawlers.base import BaseCrawler +from db.documents import RepositoryDocument + +logger = Logger(service="llm-twin-course/crawler") + + +class GithubCrawler(BaseCrawler): + model = RepositoryDocument + + def __init__(self, ignore=(".git", ".toml", ".lock", ".png")) -> None: + super().__init__() + self._ignore = ignore + + def extract(self, link: str, **kwargs) -> None: + logger.info(f"Starting scrapping GitHub repository: {link}") + + repo_name = link.rstrip("/").split("/")[-1] + + local_temp = tempfile.mkdtemp() + + try: + os.chdir(local_temp) + subprocess.run(["git", "clone", link]) + + repo_path = os.path.join(local_temp, os.listdir(local_temp)[0]) + + tree = {} + for root, dirs, files in os.walk(repo_path): + dir = root.replace(repo_path, "").lstrip("/") + if dir.startswith(self._ignore): + continue + + for file in files: + if file.endswith(self._ignore): + continue + file_path = os.path.join(dir, file) + with open(os.path.join(root, file), "r", errors="ignore") as f: + tree[file_path] = f.read().replace(" ", "") + + instance = self.model( + name=repo_name, link=link, content=tree, owner_id=kwargs.get("user") + ) + instance.save() + + except Exception: + raise + finally: + shutil.rmtree(local_temp) + + logger.info(f"Finished scrapping GitHub repository: {link}") diff --git a/1-data-crawling/crawlers/linkedin.py b/1-data-crawling/crawlers/linkedin.py new file mode 100644 index 0000000..6ae5ec0 --- /dev/null +++ b/1-data-crawling/crawlers/linkedin.py @@ -0,0 +1,156 @@ +import time +from typing import Dict, List + +from aws_lambda_powertools import Logger +from bs4 import BeautifulSoup +from bs4.element import Tag +from errors import ImproperlyConfigured +from selenium.webdriver.common.by import By + +from db.documents import PostDocument +from crawlers.base import BaseAbstractCrawler +from config import settings + +logger = Logger(service="decodingml/crawler") + + +class LinkedInCrawler(BaseAbstractCrawler): + model = PostDocument + + def set_extra_driver_options(self, options) -> None: + options.add_experimental_option("detach", True) + + def extract(self, link: str, **kwargs): + logger.info(f"Starting scrapping data for profile: {link}") + + self.login() + + soup = self._get_page_content(link) + + data = { + "Name": self._scrape_section(soup, "h1", class_="text-heading-xlarge"), + "About": self._scrape_section(soup, "div", class_="display-flex ph5 pv3"), + "Main Page": self._scrape_section(soup, "div", {"id": "main-content"}), + "Experience": self._scrape_experience(link), + "Education": self._scrape_education(link), + } + + self.driver.get(link) + time.sleep(5) + button = self.driver.find_element( + By.CSS_SELECTOR, + ".app-aware-link.profile-creator-shared-content-view__footer-action", + ) + button.click() + + # Scrolling and scraping posts + self.scroll_page() + soup = BeautifulSoup(self.driver.page_source, "html.parser") + post_elements = soup.find_all( + "div", + class_="update-components-text relative update-components-update-v2__commentary", + ) + buttons = soup.find_all("button", class_="update-components-image__image-link") + post_images = self._extract_image_urls(buttons) + + posts = self._extract_posts(post_elements, post_images) + logger.info(f"Found {len(posts)} posts for profile: {link}") + + self.driver.close() + + self.model.bulk_insert( + [ + PostDocument( + platform="linkedin", content=post, author_id=kwargs.get("user") + ) + for post in posts + ] + ) + + logger.info(f"Finished scrapping data for profile: {link}") + + def _scrape_section(self, soup: BeautifulSoup, *args, **kwargs) -> str: + """Scrape a specific section of the LinkedIn profile.""" + # Example: Scrape the 'About' section + parent_div = soup.find(*args, **kwargs) + return parent_div.get_text(strip=True) if parent_div else "" + + def _extract_image_urls(self, buttons: List[Tag]) -> Dict[str, str]: + """ + Extracts image URLs from button elements. + + Args: + buttons (List[Tag]): A list of BeautifulSoup Tag objects representing buttons. + + Returns: + Dict[str, str]: A dictionary mapping post indexes to image URLs. + """ + post_images = {} + for i, button in enumerate(buttons): + img_tag = button.find("img") + if img_tag and "src" in img_tag.attrs: + post_images[f"Post_{i}"] = img_tag["src"] + else: + logger.warning("No image found in this button") + return post_images + + def _get_page_content(self, url: str) -> BeautifulSoup: + """Retrieve the page content of a given URL.""" + self.driver.get(url) + time.sleep(5) + return BeautifulSoup(self.driver.page_source, "html.parser") + + def _extract_posts( + self, post_elements: List[Tag], post_images: Dict[str, str] + ) -> Dict[str, Dict[str, str]]: + """ + Extracts post texts and combines them with their respective images. + + Args: + post_elements (List[Tag]): A list of BeautifulSoup Tag objects representing post elements. + post_images (Dict[str, str]): A dictionary containing image URLs mapped by post index. + + Returns: + Dict[str, Dict[str, str]]: A dictionary containing post data with text and optional image URL. + """ + posts_data = {} + for i, post_element in enumerate(post_elements): + post_text = post_element.get_text(strip=True, separator="\n") + post_data = {"text": post_text} + if f"Post_{i}" in post_images: + post_data["image"] = post_images[f"Post_{i}"] + posts_data[f"Post_{i}"] = post_data + return posts_data + + def _scrape_experience(self, profile_url: str) -> str: + """Scrapes the Experience section of the LinkedIn profile.""" + self.driver.get(profile_url + "/details/experience/") + time.sleep(5) + soup = BeautifulSoup(self.driver.page_source, "html.parser") + experience_content = soup.find("section", {"id": "experience-section"}) + return experience_content.get_text(strip=True) if experience_content else "" + + def _scrape_education(self, profile_url: str) -> str: + self.driver.get(profile_url + "/details/education/") + time.sleep(5) + soup = BeautifulSoup(self.driver.page_source, "html.parser") + education_content = soup.find("section", {"id": "education-section"}) + return education_content.get_text(strip=True) if education_content else "" + + def login(self): + """Log in to LinkedIn.""" + self.driver.get("https://www.linkedin.com/login") + if not settings.LINKEDIN_USERNAME and not settings.LINKEDIN_PASSWORD: + raise ImproperlyConfigured( + "LinkedIn scraper requires an valid account to perform extraction" + ) + + self.driver.find_element(By.ID, "username").send_keys( + settings.LINKEDIN_USERNAME + ) + self.driver.find_element(By.ID, "password").send_keys( + settings.LINKEDIN_PASSWORD + ) + self.driver.find_element( + By.CSS_SELECTOR, ".login__form_action_container button" + ).click() diff --git a/1-data-crawling/crawlers/medium.py b/1-data-crawling/crawlers/medium.py new file mode 100644 index 0000000..888b1be --- /dev/null +++ b/1-data-crawling/crawlers/medium.py @@ -0,0 +1,43 @@ +from aws_lambda_powertools import Logger +from bs4 import BeautifulSoup +from selenium.webdriver.common.by import By + +from crawlers.base import BaseAbstractCrawler +from db.documents import ArticleDocument + +logger = Logger(service="decodingml/crawler") + + +class MediumCrawler(BaseAbstractCrawler): + model = ArticleDocument + + def set_extra_driver_options(self, options) -> None: + options.add_argument(r"--profile-directory=Profile 2") + + def extract(self, link: str, **kwargs) -> None: + logger.info(f"Starting scrapping Medium article: {link}") + + self.driver.get(link) + self.scroll_page() + + soup = BeautifulSoup(self.driver.page_source, "html.parser") + title = soup.find_all("h1", class_="pw-post-title") + subtitle = soup.find_all("h2", class_="pw-subtitle-paragraph") + + data = { + "Title": title[0].string if title else None, + "Subtitle": subtitle[0].string if subtitle else None, + "Content": soup.get_text(), + } + + logger.info(f"Successfully scraped and saved article: {link}") + self.driver.close() + instance = self.model( + platform="medium", content=data, link=link, author_id=kwargs.get("user") + ) + instance.save() + + def login(self): + """Log in to Medium with Google""" + self.driver.get("https://medium.com/m/signin") + self.driver.find_element(By.TAG_NAME, "a").click() diff --git a/course/module-3/data_flow/__init__.py b/1-data-crawling/db/__init__.py similarity index 100% rename from course/module-3/data_flow/__init__.py rename to 1-data-crawling/db/__init__.py diff --git a/course/module-3/db/documents.py b/1-data-crawling/db/documents.py similarity index 96% rename from course/module-3/db/documents.py rename to 1-data-crawling/db/documents.py index 12fab04..4b963da 100644 --- a/course/module-3/db/documents.py +++ b/1-data-crawling/db/documents.py @@ -1,15 +1,16 @@ import uuid from typing import List, Optional -import logger_utils -from db.errors import ImproperlyConfigured -from db.mongo import connection +from errors import ImproperlyConfigured from pydantic import UUID4, BaseModel, ConfigDict, Field from pymongo import errors +from utils import get_logger + +from db.mongo import connection _database = connection.get_database("scrabble") -logger = logger_utils.get_logger(__name__) +logger = get_logger(__name__) class BaseDocument(BaseModel): diff --git a/course/module-3/db/mongo.py b/1-data-crawling/db/mongo.py similarity index 51% rename from course/module-3/db/mongo.py rename to 1-data-crawling/db/mongo.py index a49526a..f2c5f27 100644 --- a/course/module-3/db/mongo.py +++ b/1-data-crawling/db/mongo.py @@ -1,29 +1,24 @@ from pymongo import MongoClient from pymongo.errors import ConnectionFailure -import logger_utils -from settings import settings - -logger = logger_utils.get_logger(__name__) +from config import settings class MongoDatabaseConnector: + """Singleton class to connect to MongoDB database.""" + _instance: MongoClient = None def __new__(cls, *args, **kwargs): if cls._instance is None: try: cls._instance = MongoClient(settings.MONGO_DATABASE_HOST) - except ConnectionFailure: - logger.exception( - "Couldn't connect to the database", - database_host=settings.MONGO_DATABASE_HOST, - ) - + except ConnectionFailure as e: + print(f"Couldn't connect to the database: {str(e)}") raise - logger.info( - "Connection to database successful", uri=settings.MONGO_DATABASE_HOST + print( + f"Connection to database with uri: {settings.MONGO_DATABASE_HOST} successful" ) return cls._instance @@ -33,10 +28,7 @@ def get_database(self): def close(self): if self._instance: self._instance.close() - logger.info( - "Connected to database has been closed.", - uri=settings.MONGO_DATABASE_HOST, - ) + print("Connected to database has been closed.") connection = MongoDatabaseConnector() diff --git a/course/module-1/dispatcher.py b/1-data-crawling/dispatcher.py similarity index 100% rename from course/module-1/dispatcher.py rename to 1-data-crawling/dispatcher.py diff --git a/course/module-1/errors.py b/1-data-crawling/errors.py similarity index 100% rename from course/module-1/errors.py rename to 1-data-crawling/errors.py diff --git a/course/module-1/lib.py b/1-data-crawling/lib.py similarity index 100% rename from course/module-1/lib.py rename to 1-data-crawling/lib.py diff --git a/course/module-1/main.py b/1-data-crawling/main.py similarity index 96% rename from course/module-1/main.py rename to 1-data-crawling/main.py index aec81ac..db1fbfb 100644 --- a/course/module-1/main.py +++ b/1-data-crawling/main.py @@ -1,11 +1,12 @@ from typing import Any -import lib from aws_lambda_powertools import Logger from aws_lambda_powertools.utilities.typing import LambdaContext + +import lib from crawlers import GithubCrawler, LinkedInCrawler, MediumCrawler +from db.documents import UserDocument from dispatcher import CrawlerDispatcher -from documents import UserDocument logger = Logger(service="decodingml/crawler") diff --git a/course/module-3/logger_utils.py b/1-data-crawling/utils.py similarity index 100% rename from course/module-3/logger_utils.py rename to 1-data-crawling/utils.py diff --git a/course/module-2/Readme.md b/2-data-ingestion/README.md similarity index 100% rename from course/module-2/Readme.md rename to 2-data-ingestion/README.md diff --git a/course/module-2/cdc.py b/2-data-ingestion/cdc.py similarity index 88% rename from course/module-2/cdc.py rename to 2-data-ingestion/cdc.py index 6db8aac..d26352a 100644 --- a/course/module-2/cdc.py +++ b/2-data-ingestion/cdc.py @@ -2,9 +2,9 @@ import logging from bson import json_util +from mq import publish_to_rabbitmq -from data_flow.mq import publish_to_rabbitmq -from db.mongo import MongoDatabaseConnector +from db import MongoDatabaseConnector # Configure logging logging.basicConfig( @@ -33,7 +33,7 @@ def stream_process(): logging.info(f"Change detected and serialized: {data}") # Send data to rabbitmq - publish_to_rabbitmq(queue_name="test_queue", data=data) + publish_to_rabbitmq(queue_name="default", data=data) logging.info("Data published to RabbitMQ.") except Exception as e: diff --git a/course/module-2/settings.py b/2-data-ingestion/config.py similarity index 89% rename from course/module-2/settings.py rename to 2-data-ingestion/config.py index 3b0265b..fb54aea 100644 --- a/course/module-2/settings.py +++ b/2-data-ingestion/config.py @@ -1,7 +1,7 @@ from pydantic_settings import BaseSettings -class AppSettings(BaseSettings): +class Settings(BaseSettings): # MongoDB configs MONGO_DATABASE_HOST: str = "mongodb://localhost:30001,localhost:30002,localhost:30003/?replicaSet=my-replica-set" MONGO_DATABASE_NAME: str = "admin" @@ -12,4 +12,4 @@ class AppSettings(BaseSettings): RABBITMQ_DEFAULT_PASSWORD: str = "guest" # Default password -settings = AppSettings() +settings = Settings() diff --git a/2-data-ingestion/db.py b/2-data-ingestion/db.py new file mode 100644 index 0000000..f2c5f27 --- /dev/null +++ b/2-data-ingestion/db.py @@ -0,0 +1,34 @@ +from pymongo import MongoClient +from pymongo.errors import ConnectionFailure + +from config import settings + + +class MongoDatabaseConnector: + """Singleton class to connect to MongoDB database.""" + + _instance: MongoClient = None + + def __new__(cls, *args, **kwargs): + if cls._instance is None: + try: + cls._instance = MongoClient(settings.MONGO_DATABASE_HOST) + except ConnectionFailure as e: + print(f"Couldn't connect to the database: {str(e)}") + raise + + print( + f"Connection to database with uri: {settings.MONGO_DATABASE_HOST} successful" + ) + return cls._instance + + def get_database(self): + return self._instance[settings.MONGO_DATABASE_NAME] + + def close(self): + if self._instance: + self._instance.close() + print("Connected to database has been closed.") + + +connection = MongoDatabaseConnector() diff --git a/course/module-2/data_flow/mq.py b/2-data-ingestion/mq.py similarity index 99% rename from course/module-2/data_flow/mq.py rename to 2-data-ingestion/mq.py index f255cdd..542e4eb 100644 --- a/course/module-2/data_flow/mq.py +++ b/2-data-ingestion/mq.py @@ -1,6 +1,6 @@ import pika -from settings import settings +from config import settings class RabbitMQConnection: diff --git a/course/module-2/test_cdc.py b/2-data-ingestion/test_cdc.py similarity index 70% rename from course/module-2/test_cdc.py rename to 2-data-ingestion/test_cdc.py index 7426bf5..ae798c3 100644 --- a/course/module-2/test_cdc.py +++ b/2-data-ingestion/test_cdc.py @@ -24,8 +24,9 @@ def insert_data_to_mongodb(uri, database_name, collection_name, data): if __name__ == "__main__": - mongodb_uri = "mongodb://localhost:30001,localhost:30002,localhost:30003/?replicaSet=my-replica-set" - database_name = "scrabble" - collection_name = "test" - test_data = {"name": "LLM TWIN"} - insert_data_to_mongodb(mongodb_uri, database_name, collection_name, test_data) + insert_data_to_mongodb( + "mongodb://localhost:30001,localhost:30002,localhost:30003/?replicaSet=my-replica-set", + "scrabble", + "posts", + {"platform": "linkedin", "content": "Test content"} + ) diff --git a/3-feature-pipeline/config.py b/3-feature-pipeline/config.py new file mode 100644 index 0000000..cd13c8f --- /dev/null +++ b/3-feature-pipeline/config.py @@ -0,0 +1,36 @@ +from pydantic_settings import BaseSettings + + +class Settings(BaseSettings): + + # CometML config + COMET_API_KEY: str | None = None + COMET_WORKSPACE: str | None = None + COMET_PROJECT: str | None = None + + # Embeddings config + EMBEDDING_MODEL_ID: str = "sentence-transformers/all-MiniLM-L6-v2" + EMBEDDING_MODEL_MAX_INPUT_LENGTH: int = 256 + EMBEDDING_SIZE: int = 384 + EMBEDDING_MODEL_DEVICE: str = "cpu" + + # OpenAI + OPENAI_MODEL_ID: str = "gpt-4-1106-preview" + OPENAI_API_KEY: str | None = None + + # MQ config + RABBITMQ_DEFAULT_USERNAME: str = "guest" + RABBITMQ_DEFAULT_PASSWORD: str = "guest" + RABBITMQ_HOST: str = "localhost" + RABBITMQ_PORT: int = 5673 + + # QdrantDB config + QDRANT_DATABASE_HOST: str = "localhost" + QDRANT_DATABASE_PORT: int = 6333 + QDRANT_DATABASE_URL: str = "http://localhost:6333" + QDRANT_CLOUD_URL: str = "str" + USE_QDRANT_CLOUD: bool = False + QDRANT_APIKEY: str | None = None + + +settings = Settings() diff --git a/course/module-3/data_logic/__init__.py b/3-feature-pipeline/data_flow/__init__.py similarity index 100% rename from course/module-3/data_logic/__init__.py rename to 3-feature-pipeline/data_flow/__init__.py diff --git a/course/module-3/data_flow/stream_input.py b/3-feature-pipeline/data_flow/stream_input.py similarity index 95% rename from course/module-3/data_flow/stream_input.py rename to 3-feature-pipeline/data_flow/stream_input.py index 4d690dd..37b6373 100644 --- a/course/module-3/data_flow/stream_input.py +++ b/3-feature-pipeline/data_flow/stream_input.py @@ -3,7 +3,8 @@ from typing import Generic, Iterable, List, Optional, TypeVar from bytewax.inputs import FixedPartitionedSource, StatefulSourcePartition -from data_flow.mq import RabbitMQConnection + +from mq import RabbitMQConnection DataT = TypeVar("DataT") MessageT = TypeVar("MessageT") @@ -54,4 +55,4 @@ def list_parts(self) -> List[str]: def build_part( self, now: datetime, for_part: str, resume_state: MessageT | None = None ) -> StatefulSourcePartition[DataT, MessageT]: - return RabbitMQPartition(queue_name="mongo_data") + return RabbitMQPartition(queue_name="test_queue") diff --git a/course/module-3/data_flow/stream_output.py b/3-feature-pipeline/data_flow/stream_output.py similarity index 98% rename from course/module-3/data_flow/stream_output.py rename to 3-feature-pipeline/data_flow/stream_output.py index 3e22ca7..a994ef8 100644 --- a/course/module-3/data_flow/stream_output.py +++ b/3-feature-pipeline/data_flow/stream_output.py @@ -1,11 +1,12 @@ -import logger_utils from bytewax.outputs import DynamicSink, StatelessSinkPartition -from db.qdrant import QdrantDatabaseConnector -from models.base import VectorDBDataModel from qdrant_client.http.api_client import UnexpectedResponse from qdrant_client.models import Batch -logger = logger_utils.get_logger(__name__) +from utils.logging import get_logger +from db import QdrantDatabaseConnector +from models.base import VectorDBDataModel + +logger = get_logger(__name__) class QdrantOutput(DynamicSink): diff --git a/course/module-3/db/__init__.py b/3-feature-pipeline/data_logic/__init__.py similarity index 100% rename from course/module-3/db/__init__.py rename to 3-feature-pipeline/data_logic/__init__.py diff --git a/course/module-3/data_logic/chunking_data_handlers.py b/3-feature-pipeline/data_logic/chunking_data_handlers.py similarity index 100% rename from course/module-3/data_logic/chunking_data_handlers.py rename to 3-feature-pipeline/data_logic/chunking_data_handlers.py diff --git a/course/module-3/data_logic/cleaning_data_handlers.py b/3-feature-pipeline/data_logic/cleaning_data_handlers.py similarity index 100% rename from course/module-3/data_logic/cleaning_data_handlers.py rename to 3-feature-pipeline/data_logic/cleaning_data_handlers.py diff --git a/course/module-3/data_logic/dispatchers.py b/3-feature-pipeline/data_logic/dispatchers.py similarity index 97% rename from course/module-3/data_logic/dispatchers.py rename to 3-feature-pipeline/data_logic/dispatchers.py index 92ecb71..337d189 100644 --- a/course/module-3/data_logic/dispatchers.py +++ b/3-feature-pipeline/data_logic/dispatchers.py @@ -1,4 +1,5 @@ -import logger_utils +from utils.logging import get_logger + from data_logic.chunking_data_handlers import ( ArticleChunkingHandler, ChunkingDataHandler, @@ -20,7 +21,7 @@ from models.base import DataModel from models.raw import ArticleRawModel, PostsRawModel, RepositoryRawModel -logger = logger_utils.get_logger(__name__) +logger = get_logger(__name__) class RawDispatcher: @@ -30,6 +31,7 @@ def handle_mq_message(message: dict) -> DataModel: logger.info("Received message.", data_type=data_type) + print(message) if data_type == "posts": return PostsRawModel(**message) elif data_type == "articles": diff --git a/course/module-3/data_logic/embedding_data_handlers.py b/3-feature-pipeline/data_logic/embedding_data_handlers.py similarity index 100% rename from course/module-3/data_logic/embedding_data_handlers.py rename to 3-feature-pipeline/data_logic/embedding_data_handlers.py diff --git a/3-feature-pipeline/db.py b/3-feature-pipeline/db.py new file mode 100644 index 0000000..15e812a --- /dev/null +++ b/3-feature-pipeline/db.py @@ -0,0 +1,82 @@ +from qdrant_client import QdrantClient, models +from qdrant_client.http.exceptions import UnexpectedResponse +from qdrant_client.http.models import Batch, Distance, VectorParams + +from utils.logging import get_logger +from config import settings + +logger = get_logger(__name__) + + +class QdrantDatabaseConnector: + _instance: QdrantClient | None = None + + def __init__(self) -> None: + if self._instance is None: + try: + if settings.USE_QDRANT_CLOUD: + self._instance = QdrantClient( + url=settings.QDRANT_CLOUD_URL, + api_key=settings.QDRANT_APIKEY, + ) + else: + self._instance = QdrantClient( + host=settings.QDRANT_DATABASE_HOST, + port=settings.QDRANT_DATABASE_PORT, + ) + except UnexpectedResponse: + logger.exception( + "Couldn't connect to Qdrant.", + host=settings.QDRANT_DATABASE_HOST, + port=settings.QDRANT_DATABASE_PORT, + url=settings.QDRANT_CLOUD_URL, + ) + + raise + + def get_collection(self, collection_name: str): + return self._instance.get_collection(collection_name=collection_name) + + def create_non_vector_collection(self, collection_name: str): + self._instance.create_collection( + collection_name=collection_name, vectors_config={} + ) + + def create_vector_collection(self, collection_name: str): + self._instance.create_collection( + collection_name=collection_name, + vectors_config=VectorParams( + size=settings.EMBEDDING_SIZE, distance=Distance.COSINE + ), + ) + + def write_data(self, collection_name: str, points: Batch): + try: + self._instance.upsert(collection_name=collection_name, points=points) + except Exception: + logger.exception("An error occurred while inserting data.") + + raise + + def search( + self, + collection_name: str, + query_vector: list, + query_filter: models.Filter, + limit: int, + ) -> list: + return self._instance.search( + collection_name=collection_name, + query_vector=query_vector, + query_filter=query_filter, + limit=limit, + ) + + def scroll(self, collection_name: str, limit: int): + return self._instance.scroll(collection_name=collection_name, limit=limit) + + def close(self): + if self._instance: + self._instance.close() + + logger.info("Connected to database has been closed.") diff --git a/course/module-3/finetuning/__init__.py b/3-feature-pipeline/finetuning/__init__.py similarity index 100% rename from course/module-3/finetuning/__init__.py rename to 3-feature-pipeline/finetuning/__init__.py diff --git a/course/module-3/finetuning/exceptions.py b/3-feature-pipeline/finetuning/exceptions.py similarity index 100% rename from course/module-3/finetuning/exceptions.py rename to 3-feature-pipeline/finetuning/exceptions.py diff --git a/course/module-3/finetuning/file_handler.py b/3-feature-pipeline/finetuning/file_handler.py similarity index 100% rename from course/module-3/finetuning/file_handler.py rename to 3-feature-pipeline/finetuning/file_handler.py diff --git a/course/module-3/finetuning/generate_data.py b/3-feature-pipeline/finetuning/generate_data.py similarity index 98% rename from course/module-3/finetuning/generate_data.py rename to 3-feature-pipeline/finetuning/generate_data.py index 4b4fbef..7a18432 100644 --- a/course/module-3/finetuning/generate_data.py +++ b/3-feature-pipeline/finetuning/generate_data.py @@ -3,13 +3,13 @@ from comet_ml import Artifact, Experiment -import logger_utils +from utils.logging import get_logger from db.qdrant import QdrantDatabaseConnector from finetuning.file_handler import FileHandler from finetuning.llm_communication import GptCommunicator -from settings import settings +from config import settings -logger = logger_utils.get_logger(__name__) +logger = get_logger(__name__) client = QdrantDatabaseConnector() diff --git a/course/module-3/finetuning/llm_communication.py b/3-feature-pipeline/finetuning/llm_communication.py similarity index 93% rename from course/module-3/finetuning/llm_communication.py rename to 3-feature-pipeline/finetuning/llm_communication.py index d073dc1..9fce573 100644 --- a/course/module-3/finetuning/llm_communication.py +++ b/3-feature-pipeline/finetuning/llm_communication.py @@ -2,15 +2,15 @@ from openai import OpenAI -import logger_utils -from settings import settings +from utils.logging import get_logger +from ..config import settings MAX_LENGTH = 16384 SYSTEM_PROMPT = ( "You are a technical writer handing someone's account to post about AI and MLOps." ) -logger = logger_utils.get_logger(__name__) +logger = get_logger(__name__) class GptCommunicator: diff --git a/course/module-3/llm_components/__init__.py b/3-feature-pipeline/llm/__init__.py similarity index 100% rename from course/module-3/llm_components/__init__.py rename to 3-feature-pipeline/llm/__init__.py diff --git a/course/module-3/llm_components/chain.py b/3-feature-pipeline/llm/chain.py similarity index 100% rename from course/module-3/llm_components/chain.py rename to 3-feature-pipeline/llm/chain.py diff --git a/course/module-3/llm_components/prompt_templates.py b/3-feature-pipeline/llm/prompt_templates.py similarity index 100% rename from course/module-3/llm_components/prompt_templates.py rename to 3-feature-pipeline/llm/prompt_templates.py diff --git a/course/module-3/data_flow/bytewax_pipeline.py b/3-feature-pipeline/main.py similarity index 95% rename from course/module-3/data_flow/bytewax_pipeline.py rename to 3-feature-pipeline/main.py index fb832f4..c457e67 100644 --- a/course/module-3/data_flow/bytewax_pipeline.py +++ b/3-feature-pipeline/main.py @@ -1,5 +1,8 @@ import bytewax.operators as op from bytewax.dataflow import Dataflow + +from db import QdrantDatabaseConnector + from data_flow.stream_input import RabbitMQSource from data_flow.stream_output import QdrantOutput from data_logic.dispatchers import ( @@ -8,7 +11,6 @@ EmbeddingDispatcher, RawDispatcher, ) -from db.qdrant import QdrantDatabaseConnector connection = QdrantDatabaseConnector() diff --git a/course/module-3/models/__init__.py b/3-feature-pipeline/models/__init__.py similarity index 100% rename from course/module-3/models/__init__.py rename to 3-feature-pipeline/models/__init__.py diff --git a/course/module-3/models/base.py b/3-feature-pipeline/models/base.py similarity index 71% rename from course/module-3/models/base.py rename to 3-feature-pipeline/models/base.py index f76e746..52b28d2 100644 --- a/course/module-3/models/base.py +++ b/3-feature-pipeline/models/base.py @@ -3,16 +3,16 @@ from pydantic import BaseModel -class DataModel(ABC, BaseModel): +class DataModel(BaseModel): """ - Abstract class for all data model + Abstract class for all data models """ - entry_id: int + entry_id: str type: str -class VectorDBDataModel(DataModel): +class VectorDBDataModel(ABC, DataModel): """ Abstract class for all data models that need to be saved into a vector DB (e.g. Qdrant) """ diff --git a/course/module-3/models/chunk.py b/3-feature-pipeline/models/chunk.py similarity index 100% rename from course/module-3/models/chunk.py rename to 3-feature-pipeline/models/chunk.py diff --git a/course/module-3/models/clean.py b/3-feature-pipeline/models/clean.py similarity index 100% rename from course/module-3/models/clean.py rename to 3-feature-pipeline/models/clean.py diff --git a/course/module-3/models/embedded_chunk.py b/3-feature-pipeline/models/embedded_chunk.py similarity index 100% rename from course/module-3/models/embedded_chunk.py rename to 3-feature-pipeline/models/embedded_chunk.py diff --git a/course/module-3/models/raw.py b/3-feature-pipeline/models/raw.py similarity index 76% rename from course/module-3/models/raw.py rename to 3-feature-pipeline/models/raw.py index 8fd8dde..c484090 100644 --- a/course/module-3/models/raw.py +++ b/3-feature-pipeline/models/raw.py @@ -4,27 +4,21 @@ class RepositoryRawModel(DataModel): - entry_id: str name: str link: str content: dict owner_id: str - type: str class ArticleRawModel(DataModel): - entry_id: str platform: str link: str content: dict author_id: str - type: str class PostsRawModel(DataModel): - entry_id: str platform: str content: dict - author_id: str + author_id: str | None = None image: Optional[str] = None - type: str diff --git a/course/module-3/data_flow/mq.py b/3-feature-pipeline/mq.py similarity index 96% rename from course/module-3/data_flow/mq.py rename to 3-feature-pipeline/mq.py index 41e274f..ac5df40 100644 --- a/course/module-3/data_flow/mq.py +++ b/3-feature-pipeline/mq.py @@ -1,11 +1,9 @@ import pika -import logger_utils +from utils.logging import get_logger +from config import settings -from settings import settings - - -logger = logger_utils.get_logger(__name__) +logger = get_logger(__name__) class RabbitMQConnection: diff --git a/3-feature-pipeline/rag/__init__.py b/3-feature-pipeline/rag/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/course/module-3/rag/query_expanison.py b/3-feature-pipeline/rag/query_expanison.py similarity index 85% rename from course/module-3/rag/query_expanison.py rename to 3-feature-pipeline/rag/query_expanison.py index 1122446..af54c7a 100644 --- a/course/module-3/rag/query_expanison.py +++ b/3-feature-pipeline/rag/query_expanison.py @@ -1,8 +1,8 @@ from langchain_openai import ChatOpenAI -from llm_components.chain import GeneralChain -from llm_components.prompt_templates import QueryExpansionTemplate -from settings import settings +from llm.chain import GeneralChain +from llm.prompt_templates import QueryExpansionTemplate +from config import settings class QueryExpansion: diff --git a/3-feature-pipeline/rag/reranking.py b/3-feature-pipeline/rag/reranking.py new file mode 100644 index 0000000..6cfdf9b --- /dev/null +++ b/3-feature-pipeline/rag/reranking.py @@ -0,0 +1,35 @@ +from langchain_openai import ChatOpenAI + +from llm.chain import GeneralChain +from llm.prompt_templates import RerankingTemplate +from config import settings + + +class Reranker: + @staticmethod + def generate_response( + query: str, passages: list[str], keep_top_k: int + ) -> list[str]: + reranking_template = RerankingTemplate() + prompt_template = reranking_template.create_template(keep_top_k=keep_top_k) + + model = ChatOpenAI(model=settings.OPENAI_MODEL_ID) + chain = GeneralChain().get_chain( + llm=model, output_key="rerank", template=prompt_template + ) + + stripped_passages = [ + stripped_item for item in passages if (stripped_item := item.strip()) + ] + passages = reranking_template.separator.join(stripped_passages) + response = chain.invoke({"question": query, "passages": passages}) + + result = response["rerank"] + reranked_passages = result.strip().split(reranking_template.separator) + stripped_passages = [ + stripped_item + for item in reranked_passages + if (stripped_item := item.strip()) + ] + + return stripped_passages diff --git a/course/module-3/rag/retriever.py b/3-feature-pipeline/rag/retriever.py similarity index 97% rename from course/module-3/rag/retriever.py rename to 3-feature-pipeline/rag/retriever.py index 657b455..237f238 100644 --- a/course/module-3/rag/retriever.py +++ b/3-feature-pipeline/rag/retriever.py @@ -1,6 +1,6 @@ import concurrent.futures -import logger_utils +from utils.logging import get_logger import utils from db.qdrant import QdrantDatabaseConnector from qdrant_client import models @@ -8,9 +8,9 @@ from rag.reranking import Reranker from rag.self_query import SelfQuery from sentence_transformers.SentenceTransformer import SentenceTransformer -from settings import settings +from config import settings -logger = logger_utils.get_logger(__name__) +logger = get_logger(__name__) class VectorRetriever: diff --git a/course/module-3/rag/self_query.py b/3-feature-pipeline/rag/self_query.py similarity index 78% rename from course/module-3/rag/self_query.py rename to 3-feature-pipeline/rag/self_query.py index c58b59b..e5fd8f8 100644 --- a/course/module-3/rag/self_query.py +++ b/3-feature-pipeline/rag/self_query.py @@ -1,7 +1,7 @@ from langchain_openai import ChatOpenAI -from llm_components.chain import GeneralChain -from llm_components.prompt_templates import SelfQueryTemplate -from settings import settings +from llm.chain import GeneralChain +from llm.prompt_templates import SelfQueryTemplate +from config import settings class SelfQuery: diff --git a/course/module-3/retriever.py b/3-feature-pipeline/retriever.py similarity index 91% rename from course/module-3/retriever.py rename to 3-feature-pipeline/retriever.py index c8eca8b..3861322 100644 --- a/course/module-3/retriever.py +++ b/3-feature-pipeline/retriever.py @@ -1,11 +1,12 @@ -import logger_utils from dotenv import load_dotenv from langchain.globals import set_verbose from rag.retriever import VectorRetriever +from utils.logging import get_logger + set_verbose(True) -logger = logger_utils.get_logger(__name__) +logger = get_logger(__name__) if __name__ == "__main__": load_dotenv() diff --git a/3-feature-pipeline/scripts/bytewax_entrypoint.sh b/3-feature-pipeline/scripts/bytewax_entrypoint.sh new file mode 100644 index 0000000..545db5f --- /dev/null +++ b/3-feature-pipeline/scripts/bytewax_entrypoint.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +if [ "$DEBUG" = true ] +then + python -m bytewax.run "tools.run_real_time:build_flow(debug=True)" +else + if [ "$BYTEWAX_PYTHON_FILE_PATH" = "" ] + then + echo 'BYTEWAX_PYTHON_FILE_PATH is not set. Exiting...' + exit 1 + fi + python -m bytewax.run $BYTEWAX_PYTHON_FILE_PATH +fi + + +echo 'Process ended.' + +if [ "$BYTEWAX_KEEP_CONTAINER_ALIVE" = true ] +then + echo 'Keeping container alive...'; + while :; do sleep 1; done +fi \ No newline at end of file diff --git a/course/module-3/utils/__init__.py b/3-feature-pipeline/utils/__init__.py similarity index 100% rename from course/module-3/utils/__init__.py rename to 3-feature-pipeline/utils/__init__.py diff --git a/course/module-3/utils/chunking.py b/3-feature-pipeline/utils/chunking.py similarity index 95% rename from course/module-3/utils/chunking.py rename to 3-feature-pipeline/utils/chunking.py index 856cad9..bdc4980 100644 --- a/course/module-3/utils/chunking.py +++ b/3-feature-pipeline/utils/chunking.py @@ -3,7 +3,7 @@ SentenceTransformersTokenTextSplitter, ) -from settings import settings +from config import settings def chunk_text(text: str) -> list[str]: diff --git a/course/module-3/utils/cleaning.py b/3-feature-pipeline/utils/cleaning.py similarity index 100% rename from course/module-3/utils/cleaning.py rename to 3-feature-pipeline/utils/cleaning.py diff --git a/course/module-3/utils/embeddings.py b/3-feature-pipeline/utils/embeddings.py similarity index 93% rename from course/module-3/utils/embeddings.py rename to 3-feature-pipeline/utils/embeddings.py index 811f0cd..97bba46 100644 --- a/course/module-3/utils/embeddings.py +++ b/3-feature-pipeline/utils/embeddings.py @@ -1,7 +1,7 @@ from InstructorEmbedding import INSTRUCTOR from sentence_transformers.SentenceTransformer import SentenceTransformer -from settings import settings +from config import settings def embedd_text(text: str): diff --git a/3-feature-pipeline/utils/logging.py b/3-feature-pipeline/utils/logging.py new file mode 100644 index 0000000..a1d5f3b --- /dev/null +++ b/3-feature-pipeline/utils/logging.py @@ -0,0 +1,5 @@ +import structlog + + +def get_logger(cls: str): + return structlog.get_logger().bind(cls=cls) \ No newline at end of file diff --git a/4-finetuning/.env.example b/4-finetuning/.env.example new file mode 100644 index 0000000..3f93585 --- /dev/null +++ b/4-finetuning/.env.example @@ -0,0 +1,4 @@ +HUGGINGFACE_ACCESS_TOKEN = "str" +COMET_API_KEY = "str" +COMET_WORKSPACE = "str" +COMET_PROJECT = "scrabble" \ No newline at end of file diff --git a/4-finetuning/README.md b/4-finetuning/README.md new file mode 100644 index 0000000..e028721 --- /dev/null +++ b/4-finetuning/README.md @@ -0,0 +1,272 @@ +# Introduction + +This module reflects the LLM fine-tuning pipeline where we download versioned datsets from CometML and manage the deployment at scale using Qwak. +**Completing this lesson**, you'll gain a solid understanding of the following: + +- what is Qwak AI and how does it help solve MLOps challenges +- how to fine-tune a Mistral7b-Instruct on our custom llm-twin dataset +- what is PEFT (parameter-efficient-fine-tuning) +- what purpose do QLoRA Adapters and BitsAndBytes configs serve +- how to fetch versioned datasets from Comet ML +- how to log training metrics and model to Comet ML +- understanding model-specific special tokens +- the detailed walkthrough of how the Qwak build system works + +# What Is Fine-Tuning? + +Represents the process of taking pre-trained models and further training them on smaller, specific datasets to refine their capabilities and improve performance in a particular task or domain. Fine-tuning is about turning general-purpose models and turning them into specialized models. + +> [!IMPORTANT] +> Foundation models know a lot about a lot, but for production, we need models that know a lot about a little. + +In our LLM-Twin use case, we're aiming to fine-tune our model from a general knowledge corpora towards a targeted context that reflects your writing persona. + +We're using the following concepts widely adopted when Fine-Tuning LLMs: + +- [PEFT](https://huggingface.co/docs/peft/en/index) - Parameter Efficient Fine Tuning +- [QLoRA](https://github.com/microsoft/LoRA) - Quantized Low Rank Adaptation +- [BitsAndBytes](https://huggingface.co/blog/4bit-transformers-bitsandbytes) - Library to allow low-precision operations over custom GPU kernels + +You can learn more about the Dataset Generation and Fine-tuning Pipeline from Decoding ML LLM Twin Course: + +- Lesson 6: [The Role of Feature Stores in Fine-Tuning LLMs](https://medium.com/decodingml/the-role-of-feature-stores-in-fine-tuning-llms-22bd60afd4b9) +- Lesson 7: [How to fine-tune LLMs on custom datasets at Scale using Qwak and CometML](https://medium.com/decodingml/how-to-fine-tune-llms-on-custom-datasets-at-scale-using-qwak-and-cometml-12216a777c34) + +## Refresher from Previous Lessons + +- In **Lesson 2** : [The Importance of Data Pipelines in the Era of Generative AI](https://medium.com/decodingml/the-importance-of-data-pipelines-in-the-era-of-generative-ai-673e1505a861) + We've described the process of data ingestion where we're scrapping articles from Medium, posts from LinkedIn, and Code snippets from GitHub and storing them in our Mongo Database. +- In **Lesson 3** : [Change Data Capture: Enabling Event-Driven Architectures](https://medium.com/decodingml/the-3nd-out-of-11-lessons-of-the-llm-twin-free-course-ba82752dad5a) + We've showcased how to listen to MongoDB Oplog via the CDC pattern, and adapt RabbitMQ to stream captured events, this is our ingestion pipeline. +- In **Lesson 6**: [The Role of Feature Stores in Fine-Tuning LLMs](https://medium.com/decodingml/the-role-of-feature-stores-in-fine-tuning-llms-22bd60afd4b9) + We've showcased how to use filtered data samples from QDrant. Using Knowledge Distillation, we have the GPT3.5 Turbo to structure and generate the fine-tuning dataset that is versioned with CometML. + +# Architecture Overview + +![Architecture](./media/fine-tuning-workflow.png) + +**Here's what we're going to learn**: + +- Set-up the HuggingFace connection to be able to download Mistral7b-Instruct model. +- Learn how to leverage Qwak to manage our training job at scale. +- How to efficiently fine-tune a large model using PEFT & QLoRA +- How to download datasets versioned with Comet ML +- How does the Qwak Build Lifecycle works + +# Dependencies + +## Installation + +To prepare your environment for these components, follow these steps: + +```shell +poetry install +``` + +# Setup External Services + +1. [HuggingFace](https://huggingface.co) +2. [Comet ML](https://www.comet.com/signup/?utm_source=decoding_ml&utm_medium=partner&utm_content=github) +3. [Qwak](https://www.qwak.com/lp/end-to-end-mlops/?utm_source=github&utm_medium=referral&utm_campaign=decodingml) + + +## 1. HuggingFace Integration + +We need a Hugging Face Access Token to download the model checkpoint and use it for fine-tuning. + +**Here's how to get it:** + +- Log-in to [HuggingFace](https://huggingface.co) +- Head over to your profile (top-left) and click on Settings. +- On the left panel, go to Access Tokens and generate a new Token +- Save the Token + + +## 2. Comet ML Integration + +### Overview + +[Comet ML](https://www.comet.com/signup/?utm_source=decoding_ml&utm_medium=partner&utm_content=github) is a cloud-based platform that provides tools for tracking, comparing, explaining, and optimizing experiments and models in machine learning. CometML helps data scientists and teams to better manage and collaborate on machine learning experiments. + +### Why Use Comet ML? + +- **Experiment Tracking**: CometML automatically tracks your code, experiments, and results, allowing you to compare between different runs and configurations visually. +- **Model Optimization**: It offers tools to compare different models side by side, analyze hyperparameters, and track model performance across various metrics. +- **Collaboration and Sharing**: Share findings and models with colleagues or the ML community, enhancing team collaboration and knowledge transfer. +- **Reproducibility**: By logging every detail of the experiment setup, CometML ensures experiments are reproducible, making it easier to debug and iterate. + +### Comet ML Variables + +When integrating CometML into your projects, you'll need to set up several environment variables to manage the authentication and configuration: + +- `COMET_API_KEY`: Your unique API key that authenticates your interactions with the CometML API. +- `COMET_PROJECT`: The project name under which your experiments will be logged. +- `COMET_WORKSPACE`: The workspace name that organizes various projects and experiments. + +### Obtaining Comet ML Variables + +To access and set up the necessary CometML variables for your project, follow these steps: + +1. **Create an Account or Log In**: + + - Visit [Comet ML's website](https://www.comet.com/signup/?utm_source=decoding_ml&utm_medium=partner&utm_content=github) and log in if you already have an account, or sign up if you're a new user. + +2. **Create a New Project**: + + - Once logged in, navigate to your dashboard. Here, you can create a new project by clicking on "New Project" and entering the relevant details for your project. + +3. **Access API Key**: + + - After creating your project, you will need to obtain your API key. Navigate to your account settings by clicking on your profile at the top right corner. Select 'API Keys' from the menu, and you'll see an option to generate or copy your existing API key. + +4. **Set Environment Variables**: + - These variables, `COMET_API_KEY`, `COMET_PROJECT` and `COMET_WORKSPACE`, should be added in the `build_config.yaml` when deploying on qwak. Follow the next module to integrate Qwak. + +## 3. Qwak Integration + +### Overview + +[Qwak](https://www.qwak.com/lp/end-to-end-mlops/?utm_source=github&utm_medium=referral&utm_campaign=decodingml) is an all-in-one MLOps platform designed to streamline the entire machine learning lifecycle from data preparation to deployment and monitoring. It offers a comprehensive suite of tools that allow data science teams to build, train, deploy, manage, and monitor AI and machine learning models efficiently. + +### Why Use Qwak? + +Qwak is used by a range of companies across various industries, from banking and finance to e-commerce and technology, underscoring its versatility and effectiveness in handling diverse AI and ML needs. Here are a few reasons: + +- **End-to-End MLOps Platform**: Qwak provides tools for every stage of the machine learning lifecycle, including data preparation, model training, deployment, and monitoring. This integration helps eliminate the need for multiple disparate tools and simplifies the workflow for data science teams +- **Integration with Existing Tools**: Qwak supports integrations with popular tools and platforms such as HuggingFace, Snowflake, Kafka, PostgreSQL, and more, facilitating seamless incorporation into existing workflows and infrastructure​. +- **User-Friendly Interface**: Qwak offers a user-friendly interface and managed Jupyter notebooks, making it accessible for both experienced data scientists and those new to the field​ +- **Smooth Developer Experience**: The CLI sdk is very intuitive and easy to use, and allows developers to scale inference/training jobs accordingly without the hassle of managing infrastructure. + +### Setting Up Qwak + +[Qwak.ai](https://www.qwak.com/lp/end-to-end-mlops/?utm_source=github&utm_medium=referral&utm_campaign=decodingml) is straightforward and easy to set-up. + +To configure your environment for Qwak, log in to [Qwak.ai](https://www.qwak.com/lp/end-to-end-mlops/?utm_source=github&utm_medium=referral&utm_campaign=decodingml) and go to your profile → settings → Account Settings → Personal API Keys and generate a new key. + +In your terminal, run `qwak configure` and it'll ask you for your `API-KEY`, paste it and you're done! + +### Creating a new Qwak Model + +In order to deploy model versions remotely on qwak, first you'll have to initialize a `model` and a `project`. To do that, run in the terminal: + +``` +qwak models create "ModelName" --project "ProjectName" +``` + +Once you've done that, make sure you have these environment variables: + +```plaintext +HUGGINGFACE_TOKEN="your-hugging-face-token" +COMET_API_KEY="your-key" +COMET_WORKSPACE="your-workspace" +COMET_PROJECT='your-project' +``` + +Now, populate the `env` variables in the `build_config.yaml` to complete the qwak deployment prerequisites.: + +``` +build_env: + docker: + assumed_iam_role_arn: null + base_image: public.ecr.aws/qwak-us-east-1/qwak-base:0.0.13-gpu + cache: true + env_vars: + - HUGGINGFACE_ACCESS_TOKEN="" + - COMET_API_KEY="" + - COMET_WORKSPACE="" + - COMET_PROJECT="" + no_cache: false + params: [] + push: true + python_env: + dependency_file_path: finetuning/requirements.txt + git_credentials: null + git_credentials_secret: null + poetry: null + virtualenv: null + remote: + is_remote: true + resources: + cpus: null + gpu_amount: null + gpu_type: null + instance: gpu.a10.2xl + memory: null +build_properties: + branch: finetuning + build_id: null + gpu_compatible: false + model_id: ---MODEL_NAME--- + model_uri: + dependency_required_folders: [] + git_branch: master + git_credentials: null + git_credentials_secret: null + git_secret_ssh: null + main_dir: finetuning + uri: . + tags: [] +deploy: false +deployment_instance: null +post_build: null +pre_build: null +purchase_option: null +step: + tests: true + validate_build_artifact: true + validate_build_artifact_timeout: 120 +verbose: 0 +``` + +# Usage + +The project includes a `Makefile` for easy management of common tasks. Here are the main commands you can use: + +- `make help`: Displays help for each make command. +- `make test`: Runs tests on local-qwak deployment. +- `make create-qwak-project`: Create a Qwak project to deploy the model. +- `make deploy`: Triggers a new fine-tuning job to Qwak remotely, using the configuration specified in `build_config.yaml` + +------ + +# Meet your teachers! + +The course is created under the [Decoding ML](https://decodingml.substack.com/) umbrella by: + + + + + + + + + + + + + + +
+ Paul Iusztin
+ Senior ML & MLOps Engineer +
+ Alexandru Vesa
+ Senior AI Engineer +
+ Răzvanț Alexandru
+ Senior ML Engineer +
+ +# License + +This course is an open-source project released under the MIT license. Thus, as long you distribute our LICENSE and acknowledge our work, you can safely clone or fork this project and use it as a source of inspiration for whatever you want (e.g., university projects, college degree projects, personal projects, etc.). + +# 🏆 Contribution + +A big "Thank you 🙏" to all our contributors! This course is possible only because of their efforts. + +

+ + + +

diff --git a/4-finetuning/build_config.yaml b/4-finetuning/build_config.yaml new file mode 100644 index 0000000..e4d93bc --- /dev/null +++ b/4-finetuning/build_config.yaml @@ -0,0 +1,52 @@ +build_env: + docker: + assumed_iam_role_arn: null + base_image: public.ecr.aws/qwak-us-east-1/qwak-base:0.0.13-gpu + cache: true + env_vars: + - HUGGINGFACE_ACCESS_TOKEN= + - COMET_API_KEY= + - COMET_WORKSPACE= + - COMET_PROJECT=llm-twin-course + no_cache: false + params: [] + push: true + python_env: + dependency_file_path: finetuning/requirements.txt + git_credentials: null + git_credentials_secret: null + poetry: null + virtualenv: null + remote: + is_remote: true + resources: + cpus: null + gpu_amount: null + gpu_type: null + instance: gpu.a10.2xl + memory: null +build_properties: + branch: finetuning + build_id: null + gpu_compatible: false + model_id: llm_twin + model_uri: + dependency_required_folders: [] + git_branch: master + git_credentials: null + git_credentials_secret: null + git_secret_ssh: null + main_dir: finetuning + uri: . + tags: [] +deploy: false +deployment_instance: null +post_build: null +pre_build: null +purchase_option: null +step: + tests: true + validate_build_artifact: true + validate_build_artifact_timeout: 120 +verbose: 0 + diff --git a/4-finetuning/finetuning/__init__.py b/4-finetuning/finetuning/__init__.py new file mode 100644 index 0000000..4b33fae --- /dev/null +++ b/4-finetuning/finetuning/__init__.py @@ -0,0 +1,5 @@ +from .model import CopywriterMistralModel + + +def load_model(): + return CopywriterMistralModel() diff --git a/4-finetuning/finetuning/config.yaml b/4-finetuning/finetuning/config.yaml new file mode 100644 index 0000000..3a5b43c --- /dev/null +++ b/4-finetuning/finetuning/config.yaml @@ -0,0 +1,12 @@ +training_arguments: + output_dir: "mistral_instruct_generation" + max_steps: 10 + per_device_train_batch_size: 1 + logging_steps: 10 + save_strategy: "epoch" + evaluation_strategy: "steps" + eval_steps: 2 + learning_rate: 0.0002 + fp16: true + remove_unused_columns: false + lr_scheduler_type: "constant" diff --git a/4-finetuning/finetuning/dataset_client.py b/4-finetuning/finetuning/dataset_client.py new file mode 100644 index 0000000..d6d1b50 --- /dev/null +++ b/4-finetuning/finetuning/dataset_client.py @@ -0,0 +1,54 @@ +import json +import logging +import os + + +from comet_ml import Experiment +from finetuning.settings import settings +from sklearn.model_selection import train_test_split + + +class DatasetClient: + def __init__(self, output_dir: str = "./finetuning"): + self.project = settings.COMET_PROJECT + self.api_key = settings.COMET_API_KEY + self.experiment = Experiment(api_key=self.api_key, project_name=self.project) + self.output_dir = output_dir + + def get_artifact(self, artifact_name: str): + try: + logged_artifact = self.experiment.get_artifact(artifact_name) + logged_artifact.download(self.output_dir) + self.experiment.end() + logging.info( + f"Successfully downloaded {artifact_name} at location {self.output_dir}" + ) + except Exception as e: + logging.error(f"Error retrieving artifact: {str(e)}") + + def split_data(self, artifact_name: str) -> tuple: + try: + training_file_path = os.path.join(self.output_dir, "train.json") + validation_file_path = os.path.join(self.output_dir, "validation.json") + file_name = artifact_name + ".json" + with open(os.path.join(self.output_dir, file_name), "r") as file: + data = json.load(file) + + train_data, val_data = train_test_split( + data, test_size=0.2, random_state=42 + ) + + with open(training_file_path, "w") as train_file: + json.dump(train_data, train_file) + + with open(validation_file_path, "w") as val_file: + json.dump(val_data, val_file) + + logging.info("Data split into train.json and validation.json successfully.") + return training_file_path, validation_file_path + except Exception as e: + logging.error(f"Error splitting data: {str(e)}") + + def download_dataset(self, file_name: str): + self.get_artifact(file_name) + return self.split_data(file_name) diff --git a/4-finetuning/finetuning/model.py b/4-finetuning/finetuning/model.py new file mode 100644 index 0000000..f043cd2 --- /dev/null +++ b/4-finetuning/finetuning/model.py @@ -0,0 +1,209 @@ +import logging +import os + +import pandas as pd +import qwak +import torch as th +import yaml +from comet_ml import Experiment +from datasets import DatasetDict, load_dataset +from peft import LoraConfig, PeftModel, get_peft_model, prepare_model_for_kbit_training +from qwak.model.adapters import DefaultOutputAdapter +from qwak.model.base import QwakModel +from qwak.model.schema import ModelSchema +from qwak.model.schema_entities import InferenceOutput, RequestInput +from transformers import ( + AutoModelForCausalLM, + AutoTokenizer, + BitsAndBytesConfig, + PreTrainedModel, + Trainer, + TrainingArguments, +) + +from finetuning.dataset_client import DatasetClient +from finetuning.settings import settings + + +class CopywriterMistralModel(QwakModel): + def __init__( + self, + is_saved: bool = False, + model_save_dir: str = "./model", + model_type: str = "mistralai/Mistral-7B-Instruct-v0.1", + comet_artifact_name: str = "posts-instruct-dataset", + config_file: str = "./finetuning/config.yaml", + ) -> None: + self._prep_environment() + self.experiment = None + self.model_save_dir = model_save_dir + self.model_type = model_type + self.comet_dataset_artifact = comet_artifact_name + self.training_args_config_file = config_file + if is_saved: + self.experiment = Experiment( + api_key=settings.COMET_API_KEY, + project_name=settings.COMET_PROJECT, + workspace=settings.COMET_WORKSPACE, + ) + + def _prep_environment(self): + os.environ["TOKENIZERS_PARALLELISM"] = settings.TOKENIZERS_PARALLELISM + th.cuda.empty_cache() + logging.info("Emptied cuda cache. Environment prepared successfully!") + + def init_model(self) -> None: + self.model = AutoModelForCausalLM.from_pretrained( + self.model_type, + token=settings.HUGGINGFACE_ACCESS_TOKEN, + device_map=th.cuda.current_device(), + quantization_config=self.nf4_config, + use_cache=False, + torchscript=True, + ) + self.tokenizer = AutoTokenizer.from_pretrained( + self.model_type, token=settings.HUGGINGFACE_ACCESS_TOKEN + ) + self.tokenizer.pad_token = self.tokenizer.eos_token + self.tokenizer.padding_side = "right" + logging.info(f"Initialized model{self.model_type} successfully") + + def _init_4bit_config(self) -> None: + self.nf4_config = BitsAndBytesConfig( + load_in_4bit=True, + bnb_4bit_quant_type="nf4", + bnb_4bit_use_double_quant=True, + bnb_4bit_compute_dtype=th.bfloat16, + ) + if self.experiment: + self.experiment.log_parameters(self.nf4_config) + logging.info( + "Initialized config for param representation on 4bits successfully!" + ) + + def _initialize_qlora(self, model: PreTrainedModel) -> PeftModel: + self.qlora_config = LoraConfig( + lora_alpha=16, lora_dropout=0.1, r=64, bias="none", task_type="CAUSAL_LM" + ) + + if self.experiment: + self.experiment.log_parameters(self.qlora_config) + + model = prepare_model_for_kbit_training(model) + model = get_peft_model(model, self.qlora_config) + logging.info("Initialized qlora config successfully!") + return model + + def _init_trainig_args(self) -> None: + with open(self.training_args_config_file, "r") as file: + config = yaml.safe_load(file) + self.training_arguments = TrainingArguments(**config["training_arguments"]) + if self.experiment: + self.experiment.log_parameters(self.training_arguments) + logging.info("Initialized training arguments successfully!") + + def _remove_model_class_attributes(self) -> None: + # Remove class attributes to skip default serialization with Pickle done by Qwak + del self.model + del self.trainer + del self.experiment + + def generate_prompt(self, sample: dict) -> dict: + full_prompt = f"""[INST]{sample['instruction']} + [/INST] {sample['content']}""" + result = self.tokenize(full_prompt) + return result + + def tokenize(self, prompt: str) -> dict: + result = self.tokenizer( + prompt, + padding="max_length", + max_length=2300, + truncation=True, + ) + result["labels"] = result["input_ids"].copy() + return result + + def load_dataset(self) -> DatasetDict: + dataset_handler = DatasetClient() + train_data_file, validation_data_file = dataset_handler.download_dataset( + self.comet_dataset_artifact + ) + data_files = {"train": train_data_file, "validation": validation_data_file} + raw_datasets = load_dataset("json", data_files=data_files) + train_dataset, val_dataset = self.preprocess_data_split(raw_datasets) + return DatasetDict({"train": train_dataset, "validation": val_dataset}) + + def preprocess_data_split(self, raw_datasets: DatasetDict): + train_data = raw_datasets["train"] + val_data = raw_datasets["validation"] + generated_train_dataset = train_data.map(self.generate_prompt) + generated_train_dataset = generated_train_dataset.remove_columns( + ["instruction", "content"] + ) + generated_val_dataset = val_data.map(self.generate_prompt) + generated_val_dataset = generated_val_dataset.remove_columns( + ["instruction", "content"] + ) + return generated_train_dataset, generated_val_dataset + + def build(self) -> None: + self._init_4bit_config() + self.init_model() + if self.experiment: + self.experiment.log_parameters(self.nf4_config) + self.model = self._initialize_qlora(self.model) + self._init_trainig_args() + tokenized_datasets = self.load_dataset() + self.device = th.device("cuda" if th.cuda.is_available() else "cpu") + self.model = self.model.to(self.device) + self.trainer = Trainer( + model=self.model, + args=self.training_arguments, + train_dataset=tokenized_datasets["train"], + eval_dataset=tokenized_datasets["validation"], + tokenizer=self.tokenizer, + ) + logging.info("Initialized model trainer") + self.trainer.train() + logging.info(f"Finished training LLM: {self.model_type}") + self.trainer.save_model(self.model_save_dir) + logging.info(f"Finished saving model to {self.model_save_dir}") + self.experiment.end() + + self._remove_model_class_attributes() + + def initialize_model(self) -> None: + self.model = AutoModelForCausalLM.from_pretrained( + self.model_save_dir, + token=settings.HUGGINGFACE_ACCESS_TOKEN, + quantization_config=self.nf4_config, + ) + logging.info(f"Successfully loaded model from {self.model_save_dir}") + + def schema(self) -> ModelSchema: + return ModelSchema( + inputs=[RequestInput(name="instruction", type=str)], + outputs=[InferenceOutput(name="content", type=str)], + ) + + @qwak.api(output_adapter=DefaultOutputAdapter()) + def predict(self, df): + input_text = list(df["instruction"].values) + input_ids = self.tokenizer( + input_text, return_tensors="pt", add_special_tokens=True + ) + input_ids = input_ids.to(self.device) + + generated_ids = self.model.generate( + **input_ids, + max_new_tokens=500, + do_sample=True, + pad_token_id=self.tokenizer.eos_token_id, + ) + + decoded_output = self.tokenizer.batch_decode( + generated_ids[input_ids.shape[0] :] + )[0] + + return pd.DataFrame([{"content": decoded_output}]) diff --git a/4-finetuning/finetuning/requirements.txt b/4-finetuning/finetuning/requirements.txt new file mode 100644 index 0000000..ea93c67 --- /dev/null +++ b/4-finetuning/finetuning/requirements.txt @@ -0,0 +1,12 @@ +numpy==1.23.5 +pandas==2.2.2 +peft==0.11.0 +datasets==2.19.1 +transformers==4.40.2 +safetensors==0.4.3 +comet_ml==3.42.0 +accelerate==0.30.1 +bitsandbytes==0.42.0 +pydantic_settings==2.2.1 +scikit-learn==1.4.2 +qwak-sdk==0.5.68 diff --git a/4-finetuning/finetuning/settings.py b/4-finetuning/finetuning/settings.py new file mode 100644 index 0000000..38aa332 --- /dev/null +++ b/4-finetuning/finetuning/settings.py @@ -0,0 +1,13 @@ +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class AppSettings(BaseSettings): + model_config = SettingsConfigDict() + + TOKENIZERS_PARALLELISM: str = "false" + HUGGINGFACE_ACCESS_TOKEN: str = "" + COMET_API_KEY: str = "" + COMET_WORKSPACE: str = "" + COMET_PROJECT: str = "" + +settings = AppSettings() \ No newline at end of file diff --git a/4-finetuning/media/fine-tuning-workflow.png b/4-finetuning/media/fine-tuning-workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..4d070e760f3a5b6f042f8c55e523947669ce65fa GIT binary patch literal 468674 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 z%0D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

%E;{&xeEwtBn-d?_ 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

4HnRJA`t19>=pgGw2exDC8M?`G;dge+=f zJihUNUTOo-dFQR)3TQ2**5N%`_BP+p0fhqu>BlZ@20Zk)ITH#i7@(%dgU!c!2nys} zNSihRUeX{v@^?(}MZ-UjV@P$jV?`RgDl2Ja43Bq7K;@#UGZN1JQrb^z^PhTyO|#W7 zn-(ReoL%L??WYakdR7h|4nIWlg@B)|7!u&Ba3lPWpPwe}@=Y7FIprc%7(>fg^Z-D@3JUrv}GiMVMoc6#! zk@dIkC;fgAA&-#u++RUTLQ1D^S33O{F!^OEEoNW`#*h=L&O*FT9e;*WtLKnM!BFhk zKQ{-$d@25i!~!?@{P+(o@=sI#_rSk25#C|w!Ip$+ZEMH&IVx~C-Di6)q_Mn;lWd(R z9Qow#4X5ZX;x8X)HeMXk_TGTHpRkZREnTk3{_y3iyT!SMM3)HhTbpQEn)e@MFNbT* z+_PufbUp2Kru$CmSPBZ@#~X`}o2&w*cm zzUtMkRsa4!;8sLrq<+g4<%B}pBw#0OeAAJk5r`IBf|u2wlf=XCjga^SAEet>0H3fb zkEq#Zh0I=p6c-m8l#nTlKm2n826WxWAz%rp8i*myL;9gm|sYZjgVStpN z#6U;QE@g#M0`Um2lKi((k?!L|3sQ@i*7+mi<8=&W+0z78WO_ctbQQ6E(u|*i@Iw3c zF^%QxCggD6dhz>7ylBpGu4l1r4^m90QQp!gnM^M>GlaPel30~t}q8S){Nn6)}6d5o+Q-^U0gUf82WRsm-qBEvX*o{rNe(@$&%>zi4n!+&Sz2)QCv?`(Izplqwf} z?M+M1*r}0@%SpmFRA~Lfe9^a~Y2Mb5&-I~YZxj8v zqh9kM?GC*6`&Oh~V}|Ub2Yw9?t|+BkeohHfp@h8`+MwQxax080As4@)8hPE_-G1$a zK5zUs>XShDrM2=@WM%TkTki+Ubdo3!zXQ*FS37XISX&#BZ!m#N^BFDT_5j|LyKcFD z^M1m+rnM8anDbI;RuC-e;#;?T(t6Vs7t1i$xETVS4`lL1v`5jqwxnmb`Yge;i^{-z;MPv@lPH)J64sI=*Yi#XLiFBB&1rPg*V40SqbI&ZE z@e6mP)|g1xHyUMIzjI|2c&WD)d$%G%um6h>3(-s%PWop&mR_CaGR5wX7QQhpBt-EIOBdWOh9S{iep+V+73$1?C`uPy5Mm$5W6K&)SLKcFr-eMY3$v4(shhO zri2W##Cm4)rv#+tg9LvBf>1%YEoqneiIF%cW|TKUabbt{0o7GO%RpKwGdXttWL9t_{_|x{E4Bp1_tzw~t69S%Wm0J*K5x}le`i7QV|s^i_GIF6 z6*;ft&fkA1+}Ysz@sV1tvI92By&x#`)*25*^T@nAz!aNdfX;A)*mNIzbLsbf{(O0Q zVaNMy+dFsZYo<%lgDdp+k-uXBqAAOt{829Z6WaZRra|*pWOlRKCC}%SYxl<*!y@UK zZi_EnQ&_v^M^!xbX85G5$4%?GQ`&@y0BKadU^VYojnpC@61}5|M#ZE3M#b+EdeZBw z$GVe7X|_SQ)4?G%op2?&M?rX89$JK);o+=(;+HD4V=8pta7$R>Ih+qI{q*bFlD2pc z2*5LnY~JVY=iW@jFM7aIJS)@*U_AXb#=0c7Tl;z?NlZ&jbK`R7{B6I~s}GWrtA4Ge zr@wR!zP8mI4CWH!z4d~Dt-Zb7ICyg4D9XUByNBAe8n%4L3cDp`jBV!I>C-gp4Tf)- z0l4XpV$sxI&6e!el(c0sFoVW*&7Zitc0LN*`tfP#C)c-|b`ALGo1=Ec_3(HlIWUEt z(7*>OCmQ>Na9P#_(ixeXx)eK=t;a{5qOl&QBoTJ?Iq4=f(UP_S)5JE|t@{LfG^v-L zXRpn6S!`T^A57nPk*usDEMNLmze+CUwgqz>io!{@&qLmwmwbq#Y3BD{Z4;l< zfihWDz>(_Fn_Qfs#zK=jc)(w`&eQW`^8ASY>?HJ5c!`{x%Ov*Cqa&3qPTgMn8e>Qy ztsZ>KPX5nc(MZI-k}XfJ_5Jw88FUYgj(=m*KinRl{)UWPhocTnOP&~ikLo?~RVpJ& zx*_{2KcB=#<8hn9&X=Uh#DXzfIPCsju1sr~D?)7N%J6Y%G2;1)Ah=XL{mm~leMsZ& zdr|e4tQ?oaWxKj8&!h1pZcxd}C+I5=c+2avaHJ~3v~Azt%|Ek-T4M zILjdReMV=^hYOT7Olirgp745=nwPCsJe2DlO8Vj2)$E$^?$>(#;9_&p3O)8us-bk( z6b)JuEFp+jt|w+qxD;TTqzSxiP}6K!oMhp-R&%y7a!#!?K9ZH5`Df}E;#bny?cFrk zey+b$wsz1Q{Uk5BcyNe)gNCaPInN2&;@j11wOB#SA{6{foAD;0c&>s5 zYw_JLvaDL+vTq4Oa(d(-Wb#JLTv+ec7s)s5R5O{!#(D8wZf z-e#ipMK{WkOD6H;5$}+ zAfw)D$}o&rcmp|?qKNCPn@`NXRAK!HHz;`c$+a!+=5XMFO6p$t=1gl`+{swzieN78 zGqbDBU;R>C%+2A4e&>tca)jzYDC0W1m?>_*y-^oKhTWuDJP2H$3)Zy4K7L`rX}fTE z#}iFdmQ46$&@j#QS(&a~<4r0$bt9hZ`FBS=<(1NNUA4JSHu=C_^PFOEV{Z8K;k?U1*|-4bSB>fNdr$9ag)14~ zdcj5znGua|LrO)eolq#RUzV5@sH9?@z|F!AzW$+b)TOahFVJt;GpAd4+EgJpFHX4p z+BX>C<0j`QOFBH&s z9gmt6wVJUH0lIM3hQTYRO%Pz4ebv~GV7+f3f<)xb7)9&gwmE8L=A~xIz*_m(|3M^ zk{gP`q%H7n=FJeE%%o256`L9N2BDDx(5i26HJ8@NskvLq33u+4aa#CNn6JvIJ-A%o z-R1t__2uWRg@(yO<%vlStjmN}93O5gEcUOOe$8Cidun=OIbv(>5E0Puw0tse%mHS$ zZENEbJD<;N^d!-y{E2>5Lii`=#)V;c$QHxk&|u<+50qMWglu+puU6yLa+^=ORSM4T zlolDkq3*n`A>|9^GW16a?i`)p2xK%ys>Eh^d2L3JRCwLi^ifXODVpv~i97Au_C)qj zGk9#R=^$Df91r`Z&mI*Nu$(MLHr7>-K1cqUkgUpzGqd^Em;wfXY#|tuhq|tOj!XhR z*S=BS-hz(}m<5|lNgPyxjZ5Qg3|EI(SxCb4%b$Ra0q`3BA)Y$SM_Lm|nLlIaBW^w< z%FJq&OlGgNR+@C(KeI4v)amg-3_-_!r4pF#k-bTtt_8R4{Q|w_oaH=Ky~F zNulx9ax5rRwlt~M$4W{DH`S=k>IPqFeL%-k+hZAdxU&j16Jrj4y+`wIfQm`rb5MbL zLzYy7xH*QX%Q1v;D!T=iEGY({p07`;9qHBL0HCS(=2C@Xd=baC|8(ci)X-g%iLz{Z zbiQ_~W`ovL{xFbwc~}B_hqrT|tOK)|nU<4o7}o#yEdHEMzjC%0OJ%sF)JivN@o zMR&eT?ns-<$eJ+f)L<`^siropg*RlA`R3^A(}-)&r5--M4HC*kUm=qZzX!D!_KcP^ zuSy@!a@A2GRLOs0q!MKx#Tr*Xd(|>Ap2>x`E||pFUrvq#HR0ZryN+`ZgEZM?l{P0a zxs=QNK%3my{Cb%j>wMo;=(;ky?qnY~Tlk0S&;WY@3hEmac&a}N{j~5L1^7m92(uL$ zK2_7UXi(u!_3wLU`ZYA@Jg{_lvw&uyce8Q+aj0e@y)-s8%WK{KWO0R0Py#9|mivQV zG~`{PrsV5@%E+Ni=w8LRhP8!5v_2zpvvT)@3-SwCcW*4TE)%G!t7}t;<ai%H!m zbNm3(yrL(|UZ1oo=8Fgx6`ga#7e#oHlP4xtm^MUnqvjB~gK`x;nRd@8oMvjRk$1kb z-=|?@EHdWBul5;o2sxQ8pK0^wf;0NPU{n2wheyU;8j+=w&)Xd+J8`X@1HuMo z>KR3v{iOQuv(q7)KAC1GV6&esnxPrUbXucLkp_okB6^V>cqayA?1`CV?duj@mpQ6C z@9RA~)a*kCfi>m+D7yVeda7dE=Sb(agJxXptn|Ayev#x|83_E-e5v=KXoe7-I^pFf z?-2`Gf>cy1-`j0PJq3yOKIV1KE0EnyQc+Xq;g=HDG^L=py|Q|9?<2a^C*_GY*}Zrg z{L@ow3#D(Mt1(B{@PpY*53^pG;ZmNqg!I9UdihNxm|whqPBA)7>iXWl*H3ko9_aawFc595oA!d3Y?-pK}6drA6Zu#kdZ$8xaHLd`uFYIMCqddiV{q4*Mjy2#J71-KX#0A0>Od@i8S06B_zf zD?1x(TB^IYjbb0-OoEa5n~pk&Jcw4xX^isEOp*lzCyYDFiq^{hE;BonC0e;0bv8~UqOmCt(VYm8^vg-U*8JA#&hIBrdBlP8`7zBME!LS z8bg^r+LV7GT44Cq6?r#2+^FFib9LZ0&8ClBJatk+I3ln&JtNCDe}_;JE1W@onWh}I1iHI(N#wk z`jzAkGWFO9yf~ScXh*t3Zd=&ag13u+w)h;`Y1rqIptPea~BV4 z-?Oz=3Uu8s&vCW)n(qCjwhtv{ir$LxbsRfXb^f3Sm_ss4_Se;+234nehOX!kyzfGOz1`A$BGfV9Ba z(L*K+IO%0TAyr;KX678hq&q0ia2 z_J&U~?_gXL{tZlR_RXLp0Ds5^?Ux(zN0yNSMiLW?BcVu_VF~N4wXH|8ImJQPSUR(g zQjG-NwA|cnwKxZ8i7r=CEm`H$#F-hx6>1|PIwBSDLr+ii;1Dmr=s2q~S=sXYl{um0 zdgXR@Ee=HowzW#Oi9oXThWGhljAhC116Spd$_6pVO zHGUH(N*po9o=6((W?AiW{_I%0wC3oS1Lu01Vr44N8(~{(UHF;~?zhZui<>|!-ha5V zH)`Kmdp^-IoDeBUdQ~?5gH?Q5Q3ajhP~`cL#Nt+`xew0ymbF;xfd*^=KClw#`|y#_ zm)ET}r8Z*89?7lS3+ko1=G9X_^QF*Ei1tsfH%+12IW|rKvGJUP!_r^oa_%z^K9uTs z%|Ie4tEtI1q-Eh!q@M8^k-2Swdkt5Xmm_O+wj@sMef0mZ^-aN*wL!a+WMbRN#I`-L zZQGjI$;8%=loS?s@B!IS$o&&)o(xO?u^2}81Y!S3sa@4(ll9f z+YPYW9@YH(!&)7#8%L7uf9b(8%KOhZ@Tr7e5=DC?y$vgJEa)ed9w| z1DHIPx-VT+sFT1>w`zRxF*Ckwx~>bWm!bcc6q6MM;kouc%3yPNj(QaPIYlBfo&3CZ zwp42_Z(`>fqE#uD)%+hGKE%igyMLU=!aFZcD~y7BoY5YqBvXK~^&I!_U=p6Oi&Olo zPB*iqZMtB9`0_?LEUpUK>l|2n_Y zpF>AgL2l1@EUJL2EM)-+k;>yioi*npL7MB3sbX7%O9`e>=yN2~N*^p{Y4wvL~XntgYPB*sD zGrx>yX#p_9MrCob;oKp`sbnwCc7f1;8xjCuT!f+;$FlrhSShHNh4RlkzIUchsWr>)iN+K;xU)mnjXAEyv~@#OR2`)?Mqm^t5_hh!8e0f_@gJTH3o!Y14V}O!x-P_#3?Av@GRr zjnMmx2)Lc0`?c$-)?+-m@F3SoooD;SXqlP;#;)T=Oz&-ViJ6(VBM+nkiv)N+_`PjD z-DYarad9Fwxuc$i)XcI5BU!NGbO5z*jb^(I!3TSd?yUN0-UJ5U0~)l!cw)={SJV~k zl@nMo#gq)GONECnI~@W@pwK@UHF`@afp|16seUnvb6uK-zeJDHvf2Syk8t+ zJv=N?Wj-`3PR%ADv8P44B|j+0sZRT=Psg;ZZTcXQ*;pQ;!NxlB_a~vXSjh2JWv$@_ zrL|f#BRA(a(R5bH(xtKc1?ze0c>Fy&qcowfx?!x8|R;8Zh#rP^10%kdafw5faTiQb*r;NFaF(X^96ekNfiGV9T9; ze+ydv;P6+7Bjba6e7Y^ScSktcw0HQ@i1ccjto4x(y!x;ptiSW;xy;O!Ow~oD12h=e z6irG}+%s{o3?07V!oe>dSBi*1SnWG8F51*s^D7jJbPAXncIAZGzIu(>w7cOxR7~to z@P~wO{2H?~zsc0@?%#jrY=|sGTKLR|B9sQ!Fw6LsD>D{NrHRV3tX#8Z!(wUy<$f5R zZ?P8+kGNb|{xhkWylz&gDU4IC3nQiFVw#P1e8MEwSXg+u&CRi_Gzme#Ttyfd_)$TC zeNfOyk};!y7&XgF!9J|n$vE}CPFt@DG$^`p*U%B%xtr^UsP(VIoqJqA6Ffn?4?))G zT^mpDA^Kf4^X%jcFSj~Tbia>x%glU$P0c1oGPH$BGjt}R%5(brcsV2a-_== zw0!wiwZ2-79o$9))nJGtZhD?odT$33^5zU-k)-H2BMaQI2=vqF-N4B4?tE{uSrMvV zv3yvzU~SpojcnZxfJM-JqoT+j7^TPr9!`%Bg+RmI|0T684^*VU3H_eP>DM{ECSs6{ z$5Of$#_5_H!$f6q5_%@+&^ zNx)nds|m~&6a>!1LN)6>gJyO>#30@@*?4bZ!Cz z0^W9zOI`O$^nNen?!B;8`(sA}DNa+|sR>Kf6b)LuEygidHko-^)Hgjgh@B6KF2eqA zZtN{r{+e=nTf@Kn7@X$nEA-d~fbSNz-qzET_zo5}k;XJ)Ime>Oq5vCLjHAZME=1Pt zJuV6Z+7x44;26gxeHU-)6UYvl)yq~kfoeu$c7e$8?ky7-e^sfArqh^R9nd{E$eoO8 zurZEYA6r4FRTkP?uq9=IXjNulfqC#y$SRjL5Ry%ARAdiPzf){Yn0fej3vF$=Y&-puy?-)R1op{#I4lF~^ZLM)*GR3R-R!2_PVLLE9vXCHa0#XhlXM z`Gd;Qvy82*5GLVmh|(O|!7zqZggpvjPPtM+3N>vKf(p3X%&?|g&b|^tq$~+XG7Y#f znMg!RQw&hlkTxlYnNM2C_E)}At!TyqFx+$O4P?S=&(fb12+Hcsx8T->VY@t}hlU>L z00r9D#(%Zxo*AyzC(eA|bROmKzmOL9yEa%c&7eUdkR*a3VfJWW0T8h${)xcA`$c=Xa?f|!UEgc}zDlFXra*CDkm&gaMa0Of zQ>+{FzHD0T^x8&kp20jYu-UnOlg}i_@ACVCC*6k7y2jHMQPeABr53{)g84SMGqF@5 z5rvC~m6`m>rdX}4?rM{#HQ(*elKz`j)!V>V5gx#94fs;?NkXb0(+!#^r%71q z;a}fk_S{DwaCa)CV=kE5cFK`Rz$z`PVi0fh*vJ60-{8v<&%hGL_!7t1gwhm6N|KrD zDrEfh32XVL`_@?xq=IQ#C5+O2^Xq_>ZCNQ;1t%K>$XX6UZ&eNJRVA0BdI}_{pR3tlq^%AZB zq%i)w}wZmzQTTyBDk+hVk95=L8;<=dBv|aC#z`07qPe zpP5@bb4$9-Dl|Q)jeI_Awli6}`MDHQTL%8q3vdJr}57Ur*uS;h7m3 zf9mTCbbfrm-Mf8Os+Fr)vr#wdjTJH%I;JWmE0(L4E?EbW7Itq+x2n`U_)`JCAL81w zSNNys;6PE4?$pXVomOJ-o(*vEJKc@UT6FK_ZrIftuVEOSn`nVLl)|bAnm26sE0zbM zN-;V2t8OIgGYw2JBM|Ii3jKiIU{nXh?L$}l>{zZpWb(LAN>3XV=n>Nut9Xh*9pH!} zr=}86STe+MU{K;XnXr}=+Px-ub)N8V#!b>#4B3mkZIhMt}IT`l1EIE3Rc1Ze$Yu$;Zhh9 zmhlI7DsvLaXmQO@l@JYwk`WoK1wpiNrc{Nrxrs^G6%T*wePER>Q-fE3QUnb;T!t(N zz@d5>*eu;}ZK7UB!5e%GRex&hU3btRzWGMQ+paa;K>9t0M#;-Ca&nGPd_CHa)>Wi; z_&kfTF*En|^nA;Hdq1LzFgoev^Lk=tXCI=`e;F&ZjcFX*KRujGf8n_DVPIilk>02- zTcFl|nN8t5DM&zQn*p6abE#^-g*nNt$lWkoP%sVojSg z_O<(8H5(XE;=jIev(HoVJonEZrU88$8uvbf^s(7&`q@5{qeky^`|84)CaVRjJYSA| zCKjU6Y?at3{1Nr|#H?_YTdZZ4Q=QV=#obTR4~KxLM0i~6_bbk-GexRWsIodmDoqLJ zn1m*UDrqdy8of>_l~$TEX>0(CDn%-Y73nvvEY$Z^(R5u@__XMZ<(Q5atr5U;%N-F# z47+6mXtUh~4@Sy$oU45|&@_V=Z`T}t(f@b>uIr8}Ol{uivz#7BO&STL_}J=lRpV5`FW3i# z60DLL1q8(MTYuKi6l_pSq{CAmpfEvCusa@_ktoB`opw@bf;7O+D&ZPQ0mxO#RL#uI zj?d2iBhXp>gL!}LmQEYJJ(IpQ35WpD&;|kn_##(AKAd17`C>!uvXYL#8?{ct{S;yk z0V#b$cfbwjn8OG|BbqOq0-9^%!GTl{oBU-T{RIcq2Uds&QVfNT!K{+)*NV|ZdF^QH%HY>JnCOin zk6(d;6^$0-$&EjXQv)hUP~fo9-~d*V>GU8pv*M?Crs4Btxhej$^UIf^!B2fi%?`29 zaqgeMAGh$k;0+Han*HvsGXJ#|zhD&>v-5cQ!VkD*`q$ya$GgfjKRsT>-?=sMRy7i7 zp`&)Cs<=XED)3y3_>c_R{Q{9X)?5)m6c_-~D5ZojDRdlZ=BTBpL>LhfATEjeUWEqk zVL^j~dtmgVQ-`rRu=k}CDbm=jDpZ*;C{o|?J@$>0Zx2*MI55!r_~Yv`?2OjeL*OHI znz6g)8`9gl2F1Pe|; zKl1-%F#MG@y{3daxl|td;nl8oA(}@8H0VOsouJ1442M(CESDjzDP9kFYw@!T*D+5y zPE-8ijMjMg;_SXQWjUjZ(PHKXUp^me^*I(+33)$(B&#H;R+&;2;_)`aa;s>mLaAia z0?Rhm7ZX6)A>~9@rd0I zdSffKh^bM0_uru7Km1}4k-1@EauVc$wHZ_a5k=t-Sz^twMByLs(1me;;6!FBO$iA} z%6J9x6X(uThz2Ny0)OI@Dn-($D}sFclA)=UAl*5-$Eb_LT(3(LJEJJGdQld7q)2ua z7F+Vev%sA8f2kjDpe^tp>!mtStP390LO{Z2n`>ja{1-Xs_T5scr2}VmNU-sxvo6^&UG^n z`$omg==UZpd2K#aW8vU<&p()%o4>pt2>|y#0v}7?vJDC#nSg*Nx_({ijQJ0X?!)T8 z?}A+UJXq`R?Gb))UU?t!q%86Q`h8vq$7O-5Q}Ew6#rf+RK6ktH9?H}mM#)m}9Dsx= zgZE72^IohUo{+(Gm(RNEnk}$7z%thJ{ONO+;kNLsd+7Z9Jb#h$|Av~Rr_mxj+w+S$ zzwc$n!GCP$i(He*FWso`u!S9D{)_b6u4*JeMb; zX6}ZX2ubJ&$3${glR`F`Ti=xFCoMP7I+=4E!weURU&y`GfKLoUDMSkE|B`3GC^F_l z0`&5|wchw^UasAdu+KZ{xeT6UxG80NZc&p{3@@ zcdR2u38-hLfIqWiYpiQ=9EZo1sy~_}g>q{D7HCl?G;68MGTUka0Sf1Xrup22c92Q! zxcYFe7y<#i1p4tK*qH>dJz2Gok~mr{-Rc1=iWpA|%v|61{%H-pJyvyZ%^hSfqtlb` zKuJog6yQwJ5}YR*2F_%kK*|;0kT5c)ohe?xvs*VONH>6X990!%DTKn4Sq&h~rR44v z0DLP%Dbx~@rJ$*?}NftqsH?3HS3_g_O#kb3_A}PR!Xi%pJviHMp8J1+PWkn2uepzVwOF6xqMtbupp#}p&jYOa z{ec-BhVUf$`S*y3%xzYQS(`X#i&eRP&WZjrY{27C2^TA8R=s$3NxD^wY#b%oGwXYs zZkbW>nkp12k>=}0=llgFnvmPBW?CHZPbC81fK(%dC0lXS?(<;8^mxqyPLY@_H%vTOHE(cB1$?E5d)@uw8o@D%$XV%d#Y}O0?X^ zX4R~BVA~5i~YMG=QFy-LoTmNBKDYjg=$ysezJ`#=`>PO z5TOZ4p;c^IY$w1U;Z10sAr0p?EmLes6mCBWpul4yW5iK|2|%ku1E2|+M;QZ(?&m#A zRmKv_ROQYq8Cz-)jeKp|Bk-rVQiKa#foCQbpE0P0W!mkP--mj;tTYzs>{#a;`j&cup=Zd}JQJzRov1 zGKx%nj^3uP+Aa??t*S4pHaRSEENw&v(8GvxW(J}(#aQmR9VFLL5>mn?&7!h0NX=N@ zWDfV;SrZblsm@h zlkmJhhdn<;Z|1Y31yao>@4A+*eAa+_RZbP21h0#fABZIO!HN$ZQLfS*awC_k z+2(Yw4C|B^T(jl1^j7hOx*tpQ`h>zDxYDu&_u~r3_xEZ}$2XY{e`3thk<~$$HdbIs zNm}=bT&7OrIiwkU&#~Gmm-^4(2n5_g_gW?V_dAGpb+~rh|AE4!k{QzJN^i=jWBUPg3G$qc!H!y3;gZHgZvG^DEoe zQt}Nd;Kx6%DIFA#&A0rwsXYQO`m@@C5FXUZ4_) zXkVsA5*~gkJ1{UnPK=`LQxx+k#EeXg5f2r(eTPTK#|eIftRKBzzlgFDR!4a(%PgWI zX$)3HDvOGMKT>-$Cm+_aJ7!t6=6We?cPEah4#N69Ki~l(vNWwsBpe(?QR%F_S}eR0 z374$4>lH^Z0Du!_yO4+uJwOSeA6!EV)fw;DS?k!zBBvXartz8w)Y(}sJ)A?dUGaWa z7_R)vtli}u-jdj@$|@rV8C~@ zYDK%rA_B4pGvpnL9v$YXGUz1|gP4|jI&0-p37<6x9P-QhunjLy!qVy5lTi^UUt6T zn(*=Vq%Pn!4a{BcV!+v@YwVk!P0gwte6&rH9;%yqpOag0rr4Y6EOy03#V>@w zVvl3f8P#pwgJP;R;q-R<=Hu<93m7&_0@omqgq$@kmwhdL`W{Y5SnKF+WkB9e`F;=B-)LKHM8Z0 zIxm8!k}$|45*gBhMjS;O30f>w#^jcj0WqeCZN?G~EQSR%HpE@&4rQ4{qdBpK8q`6o z+AtMa%|+52)p~Tj>!}?WaZOI|(*44GO5R{)m0(WUFu-?fx(7~Byn2=d9UsvYEuE|c zx6j3N#LR>X+Uu#A%uK<~0DX%}fZnl`gsqF7F>H7|wFNqKsqS+o83s|276XcKRArxK zkyU%$5WN|ih+I@q7}S&}^FvGBKH0S9@L+jRitg-mtZrjkIs@Usu)YU6O>*^q@7oh# zlBRZ`1PjUZ;&s9MZl}}xtcMi!PWR9$ca9F50PhD443ad79V1e41rD}>QQ7#jh+xJd zRb7DAY=Mp237YLL=i#q%;l)dX&V1I-`ESw;24ut06cw8Z8PD?H`7ZTUzrd-ty#&eB z-7^H#NqE5NeL~i%e=i?INr{m}Gb%L>q;59;MDI`=CRRm~UdZ26oz&=Bic{SWbIU=< zCvYLS;@zZbsawiZWwR=+7P2D7KvgyVxsdc5Wf0jCz?fD9H}N25p%;dvw)(p@^KqlAlqs^s+y503+wv9JecQ>1aXC~j9^jxvOhO0kM0kK|&`nVi61~0byEHM!6B+rqqe}d z<6+W%Usr%It>)huiVXQ6vzq^x-czYcLVn1r6F2@~9;+3Tq)qudBt$K==#JvUpOFBX zn_Xnm#6woksjKws}UE}EirOcfXej=a9 zmLCGo(3vreII){Rv}nIMup9yM$bXMd;AtTcTo1Pxl*A^?60yQ<*3vRFy;BM?_rhEG zLN6w@dY5GyDEpd+HUkiXwW>8gh(I=@I4WHt8Z;KUsp|16wEu)8%2boUZr*qk2o*Wkk z+Rb&|FSjhK*=3F=g(77Mr-$IrRyvPTQ^RrpmAbAwk5|XdTfBYVI4+Xys87htm#Wsi0rsS5f{Q5lYTItyRR#HgD-u+~@L0PVkWD zq2Y3O26ToFt+-uN0`HI~cbQ4yh|i-+Yf|5XO4O>dS4@wCnx`B;o|t*DuM zq9{b6!!0cTG)`QG5(|>xt@R%XK(F~N!C=xaRF2N6-AF`5a1%gWQnQQ-4m)>*7EgUj zR<@wQWBiLVnZsxi4pCvbv0_<)qH+ltCeJQ3lyH6A27)~r`!>tDVn|}Lu2!>#m|dhk zv=sKZ4ks_*fh<}gjCB}m5I1-|{tuL-G5I0vP>9m%27R;`*dD&{xZ2%z;9HI2_pSk@ zMzz#Ea$mZl(PSac4-zV$h|XqpU=6iAr#VGY{nQ?sj?j6h%%$7Zv;_l zOPlE1#28aa^bJNUSo1_hIC50AqN+%EKf=OeXi!iS%XDpsQcNo=r%LZE6xE36gI(B< zK4Dq?k$yj<2xbVy>-Ge4E&wCQthEoTglk1$iHOH_RCp-;gbklEhhTrHl_1Ch$%#R<8fpJN}ImxkNvt2 z$2XuStQtt5anRL5%ZRwY$#aH3OioTQabI+5{vI#1SnJ%~M!*Y!z;N1M811Ktky_M!z2_jMrIMpbNAO*iR>ogC zycAotSF5APkF6S?v}j{|SHdcR%8Tc^AKBT1IK3rCBH<-CRm9rCRYu50$Wf)B8Vim^ z)W-2;bmI?Fp(5q3%rUUEs`KRS*P!GYU9&?N z_YPx$&^cX`p@>EnH@ESX8Dv9ta7R&E;wUC((PCEAvf{Eq6jLbZ3)!z9c%&56yud7b zJOwYmp?WR?Z5m(s0^VZdKpKKjx1-hu&Ea8TVSS1PUY0KEw%y{+j6lz(jaxt@NG!j1 zWMo7$xHF2WV>`|Inb7a8IZ`!9zx9HB6SBC$gD-xm<23305b_IXHFY_(|5pti@Po7W zFbTh^)daXhqdDax7w8D`ExfH9E&EP7o|GRtoN8@eA~G@E$jQvrzjMOQQtu=J+W(p{x=oL4{zvwA_FFn1?2)x6^KDOA$_L-kPb5KTDu$MWVbqLR__6F^HgpT8?j%MpaAtTI`pegWil4 zyh33Ele(?0s7g8N1LEH)$N7WAJA4EJ{yuL_Kshl?3sz*D2ve|iJSh{qvKj(KMIyu$ z7WonLAx}&P2S)96z;N6Vwl$=YSclSnjg+se?O)3$$Xo?t($QPVx-D*_sdlP8qjepb^96ByL&jiJXK)o6t5>|26EUX-D6=nHNpk$C!%*anZNy@?; zl87Y~lD?eiT2styR?L1s(BYz{Ohnw~;BSjB^Ce5IpM?y%|K*zJf$#dCw<(xlVnCR# z<2@rPUtUWclcJ>Wc4;q!teNrQ!G5;+s~^6^$)GIsVT$L<#L6lHIB)p@Dh01XL%ywDFcV zgOu=82u$0Kup|;?xFuzX(2#4RKk3uUZtegtH^QB!tMlGB&+WuBvDfL1 zs0MWbKY+mV*P>!eJ>q4{Bih zkbx7fYRUOP=a6#Daoo-$xl<5%bM>@eo(_ z9HchU^j_BDU)W_XQNXd{>{6+w6OAxtPU7+CiLJtU4VVZloGuzynu;tk`%*Ng#zn_M zG{q(GGky-4ACQE?GHgOhrR3sSjtf(aazvdDfxm7ggaSb#b|nLJq-$^98}vcKo}QU0 z7+^>(4Qy1vujh%_L5+Wxz-WL##J*aYP@V$IrIHI<=^IhVl;)YbA2d>08vqjJ`iZ7? znTaVDj;$g^>tBOSl~GY}1|2GUBGF`Zpr;_hCUo&`CY?R&LgFhPw*6X-&^F(zc(c8H zl%`L=Ez;O~f;)8FH$V4)A^y6)Hq7xvQm56QT5YtR_WauP;?A5(t#n4Xlu#v`W|P;6b#%Z^M6*d81Yn~c?b-!9;n(x9#}Us~>;6UOWupKRsK!4}Bl(1|TVV#g z?jA@G>lE}q8q0kA)1NCIms>2o!tGBa7an>IE-V6ftLk+JyNWV8f3vKae4GI%H~HsW zW!?vyKJRC`h}T!u?HQPM_{JvgSPV>h(yN*&qp6w*@-lbZxgK_2?jezoQg&TN@HFZ+ z27_aYfaL&8?#uuYSQE}%`u+-BtJ_xlb0crNEXb!m6LI(9v!M9TV(bR4sXBiErY`%q z?Gs|=!fP2!rl!&!lbS>{8M~Cx59AuLnoh|;HH?U$Af-keqN5}LwZVZmTS$!p<-%S^ zjumC2Rm`m(CAt*&QoEg88I#|_6Lfqs+yWg|pi*Ap-hZFiQa|MK%QNc~f}*vnAgmdM zl$O<~lyY>QwVQ%*YUTwqe>&6Lr~`_zOw{n>YRPvRg-CeKO9|Y-{d!%ip}0Y|LxiTA z1l=}KF{y=nljuP&QBJOXwMGqmfnEzi=u-HnL7YxdlnwH{;qy;4~s3q zNBq>?TH%BVx3-2={9EGUtVQ>gcoOd|X}zA)1sV`W3pO0oZ{mw~Osg4&Ui}U|9PU3N z9g20D%{3|&btA!Iv$j6?!_8g3ow-zh_><8Um$_fH-c9kOW~PFaLEh~~GME7&l==I1 zsT$%r-PbJxaInwQ315e~pa|!$>mUCaB|PrZH=WgFH5Rq(+D^znZ>v9Hm>`%!zRrXR zcPadCDJ18dCD)3ci68&R3*i2FS7p@S=5oH$d=>RX_^)aiNu_Fqd3e?I1)L8;P_v!d zd`Tpfhu@W^o`uCEbx*w7i(cTiE~Vbp1`2)rK3*~+Pqcl_)YB@>F00m&b=QSKcR05c zgx~kv1;AzTT_IWGh#)YKytAt=1Hd72E-GWDTq#(xa%z zjI-s7v6V(5{UgydCec=}#sxq7>lL9%pBm`C?g>#nqW1}B`qVxyg{j^NUoFZrxfF~rzOg-O z+U3t=PB{cg0P2WTXqZ|rL;1b9kUp`u`4uhxRf`Q{9z7EzD z13To+x(I*cXe(R+PBAx1A#})EdBOG$W`&w#K!Zb zArEebVND-JD1%Hy>!pgrm+AJ?sKu8fzfbdyr!b}xY6kBe*xJW^$ft0+`K40ot*$G6 z-yOcIUJpOLesy5i*|xdgEYm zMyTqz9V4?pI>fc#Ci$Ay=c{}|`B%_gcb>a2wDnx5^F@pGnpz*ZTd4a->YI>@IuPD4p5bE z{&l~AV%PObECylSP-M<1O30k(u+{(e=Z_V#q+|vu9zSn1US=K_b5wZFpYfFzPjCUx zJx+!dE#kv;Wx>SZeqD#Ii)K z!3alnAAL^ga3x~SBSlEECKw%$(mqWI^yO2ZYS4v!p};)%BgUaTh^QwtQ^-KFN_fV~ z}H620F?4(i-0S4zxc<%%3Cs(nBjH1FD6K^mF=)sR%nubOtk7@)*GeZJ3& zc*Qrdf6vN8=#?l8i3o7hf}4j+sni|1qhIR_VIwJ!jOMf>KK->JIrah#aEzfDMq$5) zXXM)|T(JRK=|xy%u`jI|xw%CQttL{y#SwVN{{H6NLddJNL&If$)& z8>x$u_r6W=-sbR27u*mW%bm};vv){?I_v7il-FyO?{S+>&!*@!7q7W0X z$3>D&v08` zyVAgir;;c~$-B9G^OCUO6Ri8h2`j&0S2erOJW6BV$JDJ6Ss~PzeMs4P_nN+sFS%V4 zR&@uM!6mRbtvB529#dGKP_fO#8;HBC)yiIlTx|T#UwA*NLiMe$}vt{LWg|$_K ziegq?P_Xp19iXZ*K^H^VXH}U^*4z3-RtvEH8ahkskTnV(@H8TsCnkcZpj@QfE~`nj zvS0s^2nDp9&*ub!N^e?sD%qFUBnRd#g&pv<=v_~Q=fRXMJPXbQ_qu$OQX%_u?0Qs+ zh;X~`M!1)s{Vs0SSWs-hj3?FhvR!#;G11u1iX zQExFiseFbjy(WaJ@}12+{NO4%+aIQsFbZYX_@f@?_n;gYQ`}x=@wav(-MlkTR$5V7q16-9aw*&h{DY)ML}sd>&sQzuw;9MR4{LIBjF2>-|}MX`uILQ zp=C9KR9NfZ?vgRk5Wg>o3rH2u`Rhr~UvK|Vrzf =>VW!b#eadzYz6YKZBhgtD* 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 literal 0 HcmV?d00001 diff --git a/4-finetuning/test_local.py b/4-finetuning/test_local.py new file mode 100644 index 0000000..2e77d36 --- /dev/null +++ b/4-finetuning/test_local.py @@ -0,0 +1,15 @@ +from pandas import DataFrame +from qwak.model.tools import run_local + +from finetuning import CopywriterMistralModel + +if __name__ == '__main__': + model = CopywriterMistralModel() + input_vector = DataFrame( + [{ + "instruction": "Write me a Linkedin post about Data Science" + }] + ).to_json() + + prediction = run_local(model, input_vector) + print(prediction) diff --git a/5-inference/.env.example b/5-inference/.env.example new file mode 100644 index 0000000..7837545 --- /dev/null +++ b/5-inference/.env.example @@ -0,0 +1,12 @@ +OPENAI_API_KEY = "str" +HUGGINGFACE_ACCESS_TOKEN = "str" + +COMET_API_KEY = "str" +COMET_WORKSPACE = "str" +COMET_PROJECT = "llm-twin-course" + +QWAK_DEPLOYMENT_MODEL_ID = "str" +QWAK_DEPLOYMENT_MODEL_API = "str" + +QDRANT_CLOUD_URL = "str" +QDRANT_APIKEY = "str" diff --git a/5-inference/Makefile b/5-inference/Makefile new file mode 100644 index 0000000..b98cf2e --- /dev/null +++ b/5-inference/Makefile @@ -0,0 +1,6 @@ +help: + @grep -E '^[a-zA-Z0-9 -]+:.*#' Makefile | sort | while read -r l; do printf "\033[1;32m$$(echo $$l | cut -f 1 -d':')\033[00m:$$(echo $$l | cut -f 2- -d'#')\n"; done + +call-inference-pipeline: # Test the inference pipeline. + poetry run python main.py + diff --git a/5-inference/README.txt b/5-inference/README.txt new file mode 100644 index 0000000..8e0c129 --- /dev/null +++ b/5-inference/README.txt @@ -0,0 +1,4 @@ +before running the inference do: + - need to use `qwak configure` and set the API Key from your qwak env + - when deploying the model on qwak as realtime under advanced setting you need to set the timeout filed to a bigger + value (eg: 50000ms) \ No newline at end of file diff --git a/5-inference/config.py b/5-inference/config.py new file mode 100644 index 0000000..120f481 --- /dev/null +++ b/5-inference/config.py @@ -0,0 +1,52 @@ +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class AppSettings(BaseSettings): + model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8") + + # Embeddings config + EMBEDDING_MODEL_ID: str = "sentence-transformers/all-MiniLM-L6-v2" + EMBEDDING_MODEL_MAX_INPUT_LENGTH: int = 256 + EMBEDDING_SIZE: int = 384 + EMBEDDING_MODEL_DEVICE: str = "cpu" + + # OpenAI config + OPENAI_MODEL_ID: str = "gpt-4-1106-preview" + OPENAI_API_KEY: str | None = None + + # QdrantDB config + QDRANT_DATABASE_HOST: str = "localhost" + QDRANT_DATABASE_PORT: int = 6333 + QDRANT_DATABASE_URL: str = "http://localhost:6333" + + QDRANT_CLOUD_URL: str = "str" + USE_QDRANT_CLOUD: bool = True + QDRANT_APIKEY: str | None = None + + # MQ config + RABBITMQ_DEFAULT_USERNAME: str = "guest" + RABBITMQ_DEFAULT_PASSWORD: str = "guest" + RABBITMQ_HOST: str = "localhost" + RABBITMQ_PORT: int = 5673 + + # CometML config + COMET_API_KEY: str + COMET_WORKSPACE: str + COMET_PROJECT: str = "llm-twin-course" + + # LLM Model config + TOKENIZERS_PARALLELISM: str = "false" + HUGGINGFACE_ACCESS_TOKEN: str | None = None + MODEL_TYPE: str = "mistralai/Mistral-7B-Instruct-v0.1" + QWAK_DEPLOYMENT_MODEL_ID: str = "copywriter_model" + QWAK_DEPLOYMENT_MODEL_API: str = ( + "https://models.llm-twin.qwak.ai/v1/copywriter_model/default/predict" + ) + + # RAG config + TOP_K: int = 5 + KEEP_TOP_K: int = 5 + EXPAND_N_QUERY: int = 5 + + +settings = AppSettings() diff --git a/5-inference/evaluation/__init__.py b/5-inference/evaluation/__init__.py new file mode 100644 index 0000000..9125d95 --- /dev/null +++ b/5-inference/evaluation/__init__.py @@ -0,0 +1,4 @@ +from .llm import evaluate as evaluate_llm +from .rag import evaluate as evaluate_rag + +__all__ = ["evaluate_llm", "evaluate_rag"] diff --git a/5-inference/evaluation/model.py b/5-inference/evaluation/model.py new file mode 100644 index 0000000..121e427 --- /dev/null +++ b/5-inference/evaluation/model.py @@ -0,0 +1,19 @@ +from langchain_openai import ChatOpenAI + +from llm.chain import GeneralChain +from llm.prompt_templates import LLMEvaluationTemplate +from settings import settings + + +def evaluate(query: str, output: str) -> str: + evaluation_template = LLMEvaluationTemplate() + prompt_template = evaluation_template.create_template() + + model = ChatOpenAI(model=settings.OPENAI_MODEL_ID, api_key=settings.OPENAI_API_KEY) + chain = GeneralChain.get_chain( + llm=model, output_key="evaluation", template=prompt_template + ) + + response = chain.invoke({"query": query, "output": output}) + + return response["evaluation"] diff --git a/5-inference/evaluation/rag.py b/5-inference/evaluation/rag.py new file mode 100644 index 0000000..5203414 --- /dev/null +++ b/5-inference/evaluation/rag.py @@ -0,0 +1,19 @@ +from langchain_openai import ChatOpenAI + +import llm as templates +from llm import GeneralChain +from config import settings + + +def evaluate(query: str, context: list[str], output: str) -> str: + evaluation_template = templates.RAGEvaluationTemplate() + prompt_template = evaluation_template.create_template() + + model = ChatOpenAI(model=settings.OPENAI_MODEL_ID) + chain = GeneralChain.get_chain( + llm=model, output_key="rag_eval", template=prompt_template + ) + + response = chain.invoke({"query": query, "context": context, "output": output}) + + return response["rag_eval"] diff --git a/5-inference/finetuning/__init__.py b/5-inference/finetuning/__init__.py new file mode 100644 index 0000000..4b33fae --- /dev/null +++ b/5-inference/finetuning/__init__.py @@ -0,0 +1,5 @@ +from .model import CopywriterMistralModel + + +def load_model(): + return CopywriterMistralModel() diff --git a/5-inference/finetuning/config.yaml b/5-inference/finetuning/config.yaml new file mode 100644 index 0000000..3a5b43c --- /dev/null +++ b/5-inference/finetuning/config.yaml @@ -0,0 +1,12 @@ +training_arguments: + output_dir: "mistral_instruct_generation" + max_steps: 10 + per_device_train_batch_size: 1 + logging_steps: 10 + save_strategy: "epoch" + evaluation_strategy: "steps" + eval_steps: 2 + learning_rate: 0.0002 + fp16: true + remove_unused_columns: false + lr_scheduler_type: "constant" diff --git a/5-inference/finetuning/dataset_client.py b/5-inference/finetuning/dataset_client.py new file mode 100644 index 0000000..88b2e6e --- /dev/null +++ b/5-inference/finetuning/dataset_client.py @@ -0,0 +1,56 @@ +import json +import os +import logging +from comet_ml import Experiment +from sklearn.model_selection import train_test_split + +from settings import settings + + +class DatasetClient: + def __init__(self, output_dir: str = "./finetuning"): + self.project = settings.COMET_PROJECT + self.api_key = settings.COMET_API_KEY + self.experiment = Experiment(api_key=self.api_key, project_name=self.project) + self.output_dir = output_dir + + def get_artifact(self, artifact_name: str): + try: + logged_artifact = self.experiment.get_artifact(artifact_name) + logged_artifact.download(self.output_dir) + self.experiment.end() + logging.info( + f"Successfully downloaded {artifact_name} at location {self.output_dir}" + ) + except Exception as e: + logging.error(f"Error retrieving artifact: {str(e)}") + + def split_data(self, artifact_name: str) -> tuple: + try: + training_file_path = os.path.join(self.output_dir, "train.json") + validation_file_path = os.path.join(self.output_dir, "validation.json") + file_name = artifact_name + ".json" + with open(os.path.join(self.output_dir, file_name), "r") as file: + data = json.load(file) + + train_data, val_data = train_test_split( + data, test_size=0.2, random_state=42 + ) + + with open(training_file_path, "w") as train_file: + json.dump(train_data, train_file) + + with open(validation_file_path, "w") as val_file: + json.dump(val_data, val_file) + + logging.info("Data split into train.json and validation.json successfully.") + return training_file_path, validation_file_path + except Exception as e: + logging.error(f"Error splitting data: {str(e)}") + + raise + + def download_dataset(self, file_name: str) -> tuple: + self.get_artifact(file_name) + + return self.split_data(file_name) diff --git a/5-inference/finetuning/model.py b/5-inference/finetuning/model.py new file mode 100644 index 0000000..0667a4c --- /dev/null +++ b/5-inference/finetuning/model.py @@ -0,0 +1,211 @@ +import logging +import os + +import pandas as pd +import qwak +import torch as th +import yaml +from comet_ml import Experiment +from datasets import DatasetDict, load_dataset +from peft import LoraConfig, PeftModel, get_peft_model, prepare_model_for_kbit_training +from qwak.model.adapters import DefaultOutputAdapter +from qwak.model.base import QwakModel +from qwak.model.schema import ModelSchema +from qwak.model.schema_entities import InferenceOutput, RequestInput +from transformers import ( + AutoModelForCausalLM, + AutoTokenizer, + BitsAndBytesConfig, + PreTrainedModel, + Trainer, + TrainingArguments, +) + +from finetuning.dataset_client import DatasetClient +from settings import settings + + +class CopywriterMistralModel(QwakModel): + def __init__( + self, + is_saved: bool = False, + model_save_dir: str = "./model", + model_type: str = "mistralai/Mistral-7B-Instruct-v0.1", + comet_artifact_name: str = "cleaned_posts", + config_file: str = "./finetuning/config.yaml", + ) -> None: + self._prep_environment() + + self.experiment = None + self.model_save_dir = model_save_dir + self.model_type = model_type + self.comet_dataset_artifact = comet_artifact_name + self.training_args_config_file = config_file + if is_saved: + self.experiment = Experiment( + api_key=settings.COMET_API_KEY, + project_name=settings.COMET_PROJECT, + workspace=settings.COMET_WORKSPACE, + ) + + def _prep_environment(self) -> None: + os.environ["TOKENIZERS_PARALLELISM"] = settings.TOKENIZERS_PARALLELISM + th.cuda.empty_cache() + logging.info("Emptied cuda cache. Environment prepared successfully!") + + def init_model(self) -> None: + self.model = AutoModelForCausalLM.from_pretrained( + self.model_type, + token=settings.HUGGINGFACE_ACCESS_TOKEN, + device_map=th.cuda.current_device(), + quantization_config=self.nf4_config, + use_cache=False, + torchscript=True, + ) + self.tokenizer = AutoTokenizer.from_pretrained( + self.model_type, token=settings.HUGGINGFACE_ACCESS_TOKEN + ) + self.tokenizer.pad_token = self.tokenizer.eos_token + self.tokenizer.padding_side = "right" + logging.info(f"Initialized model{self.model_type} successfully") + + def _init_4bit_config(self): + self.nf4_config = BitsAndBytesConfig( + load_in_4bit=True, + bnb_4bit_quant_type="nf4", + bnb_4bit_use_double_quant=True, + bnb_4bit_compute_dtype=th.bfloat16, + ) + if self.experiment: + self.experiment.log_parameters(self.nf4_config) + logging.info( + "Initialized config for param representation on 4bits successfully!" + ) + + def _initialize_qlora(self, model: PreTrainedModel) -> PeftModel: + self.qlora_config = LoraConfig( + lora_alpha=16, lora_dropout=0.1, r=64, bias="none", task_type="CAUSAL_LM" + ) + + if self.experiment: + self.experiment.log_parameters(self.qlora_config) + + model = prepare_model_for_kbit_training(model) + model = get_peft_model(model, self.qlora_config) + logging.info("Initialized qlora config successfully!") + return model + + def _init_trainig_args(self): + with open(self.training_args_config_file, "r") as file: + config = yaml.safe_load(file) + self.training_arguments = TrainingArguments(**config["training_arguments"]) + if self.experiment: + self.experiment.log_parameters(self.training_arguments) + logging.info("Initialized training arguments successfully!") + + def _remove_model_class_attributes(self): + # remove needed in order to skip default serialization with Pickle done by Qwak + del self.model + del self.trainer + del self.experiment + + def generate_prompt(self, sample: dict) -> dict: + full_prompt = f"""[INST]{sample['instruction']} + [/INST] {sample['content']}""" + result = self.tokenize(full_prompt) + return result + + def tokenize(self, prompt: str) -> dict: + result = self.tokenizer( + prompt, + padding="max_length", + max_length=100, + truncation=True, + ) + result["labels"] = result["input_ids"].copy() + return result + + def load_dataset(self) -> DatasetDict: + dataset_handler = DatasetClient() + train_data_file, validation_data_file = dataset_handler.download_dataset( + self.comet_dataset_artifact + ) + data_files = {"train": train_data_file, "validation": validation_data_file} + raw_datasets = load_dataset("json", data_files=data_files) + train_dataset, val_dataset = self.preprocess_data_split(raw_datasets) + return DatasetDict({"train": train_dataset, "validation": val_dataset}) + + def preprocess_data_split(self, raw_datasets: DatasetDict): + train_data = raw_datasets["train"] + val_data = raw_datasets["validation"] + generated_train_dataset = train_data.map(self.generate_prompt) + generated_train_dataset = generated_train_dataset.remove_columns( + ["instruction", "content"] + ) + generated_val_dataset = val_data.map(self.generate_prompt) + generated_val_dataset = generated_val_dataset.remove_columns( + ["instruction", "content"] + ) + return generated_train_dataset, generated_val_dataset + + def build(self): + self._init_4bit_config() + self.init_model() + if self.experiment: + self.experiment.log_parameters(self.nf4_config) + self.model = self._initialize_qlora(self.model) + self._init_trainig_args() + tokenized_datasets = self.load_dataset() + self.device = th.device("cuda" if th.cuda.is_available() else "cpu") + self.model = self.model.to(self.device) + self.trainer = Trainer( + model=self.model, + args=self.training_arguments, + train_dataset=tokenized_datasets["train"], + eval_dataset=tokenized_datasets["validation"], + tokenizer=self.tokenizer, + ) + + logging.info("Initialized model trainer") + self.trainer.train() + logging.info(f"Finished training LLM: {self.model_type}") + self.trainer.save_model(self.model_save_dir) + logging.info(f"Finished saving model to {self.model_save_dir}") + self.experiment.end() + + self._remove_model_class_attributes() + + def initialize_model(self) -> None: + self.model = AutoModelForCausalLM.from_pretrained( + self.model_save_dir, + token=settings.HUGGINGFACE_ACCESS_TOKEN, + quantization_config=self.nf4_config, + ) + logging.info(f"Successfully loaded model from {self.model_save_dir}") + + def schema(self) -> ModelSchema: + return ModelSchema( + inputs=[RequestInput(name="instruction", type=str)], + outputs=[InferenceOutput(name="content", type=str)], + ) + + @qwak.api(output_adapter=DefaultOutputAdapter()) + def predict(self, df): + input_text = list(df["instruction"].values) + input_ids = self.tokenizer( + input_text, return_tensors="pt", add_special_tokens=True + ) + input_ids = input_ids.to(self.device) + + generated_ids = self.model.generate( + **input_ids, + max_new_tokens=500, + do_sample=True, + pad_token_id=self.tokenizer.eos_token_id, + ) + + decoded_output = self.tokenizer.batch_decode( + generated_ids[input_ids.shape[0] :] + )[0] + + return pd.DataFrame([{"content": decoded_output}]) diff --git a/5-inference/finetuning/settings.py b/5-inference/finetuning/settings.py new file mode 100644 index 0000000..cd3bb47 --- /dev/null +++ b/5-inference/finetuning/settings.py @@ -0,0 +1,14 @@ +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class AppSettings(BaseSettings): + model_config = SettingsConfigDict() + + TOKENIZERS_PARALLELISM: str = "false" + HUGGINGFACE_ACCESS_TOKEN: str = "" + COMET_API_KEY: str = "" + COMET_WORKSPACE: str = "" + COMET_PROJECT: str = "" + + +settings = AppSettings() diff --git a/5-inference/inference_pipeline.py b/5-inference/inference_pipeline.py new file mode 100644 index 0000000..b4341cc --- /dev/null +++ b/5-inference/inference_pipeline.py @@ -0,0 +1,70 @@ +import pandas as pd +from evaluation import evaluate_llm +from llm.prompt_templates import InferenceTemplate +from monitoring import PromptMonitoringManager +from qwak_inference import RealTimeClient +from rag.retriever import VectorRetriever +from config import settings + + +class LLMTwin: + def __init__(self) -> None: + self.qwak_client = RealTimeClient( + model_id=settings.QWAK_DEPLOYMENT_MODEL_ID, + model_api=settings.QWAK_DEPLOYMENT_MODEL_API, + ) + self.template = InferenceTemplate() + self.prompt_monitoring_manager = PromptMonitoringManager() + + def generate( + self, + query: str, + enable_rag: bool = False, + enable_evaluation: bool = False, + enable_monitoring: bool = True, + ) -> dict: + prompt_template = self.template.create_template(enable_rag=enable_rag) + prompt_template_variables = { + "question": query, + } + + if enable_rag is True: + retriever = VectorRetriever(query=query) + hits = retriever.retrieve_top_k( + k=settings.TOP_K, to_expand_to_n_queries=settings.EXPAND_N_QUERY + ) + context = retriever.rerank(hits=hits, keep_top_k=settings.KEEP_TOP_K) + prompt_template_variables["context"] = context + + prompt = prompt_template.format(question=query, context=context) + else: + prompt = prompt_template.format(question=query) + + input_ = pd.DataFrame([{"instruction": prompt}]).to_json() + + response: list[dict] = self.qwak_client.predict(input_) + answer = response[0]["content"][0] + + if enable_evaluation is True: + evaluation_result = evaluate_llm(query=query, output=answer) + else: + evaluation_result = None + + if enable_monitoring is True: + if evaluation_result is not None: + metadata = {"llm_evaluation_result": evaluation_result} + else: + metadata = None + + self.prompt_monitoring_manager.log( + prompt=prompt, + prompt_template=prompt_template.template, + prompt_template_variables=prompt_template_variables, + output=answer, + metadata=metadata, + ) + self.prompt_monitoring_manager.log_chain( + query=query, response=answer, eval_output=evaluation_result + ) + + return {"answer": answer, "llm_evaluation_result": evaluation_result} diff --git a/5-inference/llm/__init__.py b/5-inference/llm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/5-inference/llm/chain.py b/5-inference/llm/chain.py new file mode 100644 index 0000000..ea0fcf1 --- /dev/null +++ b/5-inference/llm/chain.py @@ -0,0 +1,10 @@ +from langchain.chains.llm import LLMChain +from langchain.prompts import PromptTemplate + + +class GeneralChain: + @staticmethod + def get_chain(llm, template: PromptTemplate, output_key: str, verbose=True): + return LLMChain( + llm=llm, prompt=template, output_key=output_key, verbose=verbose + ) diff --git a/5-inference/llm/prompt_templates.py b/5-inference/llm/prompt_templates.py new file mode 100644 index 0000000..baf5a40 --- /dev/null +++ b/5-inference/llm/prompt_templates.py @@ -0,0 +1,133 @@ +from abc import ABC, abstractmethod + +from langchain.prompts import PromptTemplate +from pydantic import BaseModel + + +class BasePromptTemplate(ABC, BaseModel): + @abstractmethod + def create_template(self, *args) -> PromptTemplate: + pass + + +class QueryExpansionTemplate(BasePromptTemplate): + prompt: str = """You are an AI language model assistant. Your task is to generate {to_expand_to_n} + different versions of the given user question to retrieve relevant documents from a vector + database. By generating multiple perspectives on the user question, your goal is to help + the user overcome some of the limitations of the distance-based similarity search. + Provide these alternative questions seperated by '{separator}'. + Original question: {question}""" + + @property + def separator(self) -> str: + return "#next-question#" + + def create_template(self, to_expand_to_n: int) -> PromptTemplate: + return PromptTemplate( + template=self.prompt, + input_variables=["question"], + partial_variables={ + "separator": self.separator, + "to_expand_to_n": to_expand_to_n, + }, + ) + + +class SelfQueryTemplate(BasePromptTemplate): + prompt: str = """You are an AI language model assistant. Your task is to extract information from a user question. + The required information that needs to be extracted is the user or author id. + Your response should consists of only the extracted id (e.g. 1345256), nothing else. + User question: {question}""" + + def create_template(self) -> PromptTemplate: + return PromptTemplate(template=self.prompt, input_variables=["question"]) + + +class RerankingTemplate(BasePromptTemplate): + prompt: str = """You are an AI language model assistant. Your task is to rerank passages related to a query + based on their relevance. + The most relevant passages should be put at the beginning. + You should only pick at max {keep_top_k} passages. + The provided and reranked documents are separated by '{separator}'. + + The following are passages related to this query: {question}. + + Passages: + {passages} + """ + + def create_template(self, keep_top_k: int) -> PromptTemplate: + return PromptTemplate( + template=self.prompt, + input_variables=["question", "passages"], + partial_variables={"keep_top_k": keep_top_k, "separator": self.separator}, + ) + + @property + def separator(self) -> str: + return "\n#next-document#\n" + + +class InferenceTemplate(BasePromptTemplate): + simple_prompt: str = """You are an AI language model assistant. Your task is to generate a cohesive and concise response to the user question. + Question: {question} + """ + + rag_prompt: str = """ You are a specialist in technical content writing. Your task is to create technical content based on a user query given a specific context + with additional information consisting of the user's previous writings and his knowledge. + + Here is a list of steps that you need to follow in order to solve this task: + Step 1: You need to analyze the user provided query : {question} + Step 2: You need to analyze the provided context and how the information in it relates to the user question: {context} + Step 3: Generate the content keeping in mind that it needs to be as cohesive and concise as possible related to the subject presented in the query and similar to the users writing style and knowledge presented in the context. + """ + + def create_template(self, enable_rag: bool = True) -> PromptTemplate: + if enable_rag is True: + return PromptTemplate( + template=self.rag_prompt, input_variables=["question", "context"] + ) + + return PromptTemplate(template=self.simple_prompt, input_variables=["question"]) + + +class LLMEvaluationTemplate(BasePromptTemplate): + prompt: str = """ + You are an AI assistant and your task is to evaluate the output generated by another LLM. + You need to follow these steps: + Step 1: Analyze the user query: {query} + Step 2: Analyze the response: {output} + Step 3: Evaluate the generated response based on the following criteria and provide a score from 1 to 5 along with a brief justification for each criterion: + + Evaluation: + Relevance - [score] + [1 sentence justification why relevance = score] + Coherence - [score] + [1 sentence justification why coherence = score] + Conciseness - [score] + [1 sentence justification why conciseness = score] +""" + + def create_template(self) -> PromptTemplate: + return PromptTemplate(template=self.prompt, input_variables=["query", "output"]) + + +class RAGEvaluationTemplate(BasePromptTemplate): + prompt: str = """You are an AI assistant and your task is to evaluate the output generated by another LLM. + The other LLM generates writing content based on a user query and a given context. + The given context is comprised of custom data produces by a user that consists of posts, articles or code fragments. + Here is a list of steps you need to follow in order to solve this task: + Step 1: You need to analyze the user query : {query} + Step 2: You need to analyze the given context: {contex} + Step 3: You need to analyze the generated output: {output} + Step 4: Generate the evaluation + When doing the evaluation step you need to take the following into consideration the following: + -The evaluation needs to have some sort of metrics. + -The generated content needs to be evaluated based on the writing similarity form the context. + -The generated content needs to be evaluated based on it's coherence and conciseness related to the given query and context. + -The generated content needs to be evaluate based on how well it represents the user knowledge extracted from the context.""" + + def create_template(self) -> PromptTemplate: + return PromptTemplate( + template=self.prompt, input_variables=["query", "context", "output"] + ) diff --git a/5-inference/main.py b/5-inference/main.py new file mode 100644 index 0000000..6df2593 --- /dev/null +++ b/5-inference/main.py @@ -0,0 +1,26 @@ +import core.logger_utils as logger_utils +from inference_pipeline import LLMTwin + +logger = logger_utils.get_logger(__name__) + + +if __name__ == "__main__": + inference_endpoint = LLMTwin() + + query = """ + Hello my author_id is 1. + + Could you please draft a LinkedIn post discussing Vector Databases? + I'm particularly interested in how do they work. + """ + + response = inference_endpoint.generate( + query=query, + enable_rag=False, + enable_evaluation=True, + enable_monitoring=True, + ) + + logger.info(f"Answer: {response['answer']}") + logger.info("=" * 50) + logger.info(f"LLM Evaluation Result: {response['llm_evaluation_result']}") diff --git a/5-inference/monitoring/__init__.py b/5-inference/monitoring/__init__.py new file mode 100644 index 0000000..01dfb22 --- /dev/null +++ b/5-inference/monitoring/__init__.py @@ -0,0 +1,3 @@ +from .prompt_monitoring import PromptMonitoringManager + +__all__ = ["PromptMonitoringManager"] diff --git a/5-inference/monitoring/prompt_monitoring.py b/5-inference/monitoring/prompt_monitoring.py new file mode 100644 index 0000000..c69ef70 --- /dev/null +++ b/5-inference/monitoring/prompt_monitoring.py @@ -0,0 +1,55 @@ +import comet_llm + +from config import settings + + +class PromptMonitoringManager: + @classmethod + def log( + cls, + prompt: str, + output: str, + prompt_template: str | None = None, + prompt_template_variables: dict | None = None, + metadata: dict | None = None, + ) -> None: + comet_llm.init() + + metadata = metadata or {} + metadata = { + "model": settings.MODEL_TYPE, + **metadata, + } + + comet_llm.log_prompt( + workspace=settings.COMET_WORKSPACE, + project=f"{settings.COMET_PROJECT}-monitoring", + api_key=settings.COMET_API_KEY, + prompt=prompt, + prompt_template=prompt_template, + prompt_template_variables=prompt_template_variables, + output=output, + metadata=metadata, + ) + + @classmethod + def log_chain(cls, query: str, response: str, eval_output: str): + comet_llm.init(project=f"{settings.COMET_PROJECT}-monitoring") + comet_llm.start_chain( + inputs={"user_query": query}, + project=f"{settings.COMET_PROJECT}-monitoring", + api_key=settings.COMET_API_KEY, + workspace=settings.COMET_WORKSPACE, + ) + with comet_llm.Span( + category="twin_response", + inputs={"user_query": query}, + ) as span: + span.set_outputs(outputs=response) + + with comet_llm.Span( + category="gpt3.5-eval", + inputs={"eval_result": eval_output}, + ) as span: + span.set_outputs(outputs=response) + comet_llm.end_chain(outputs={"response": response, "eval_output": eval_output}) diff --git a/5-inference/pyproject.toml b/5-inference/pyproject.toml new file mode 100644 index 0000000..d1a919d --- /dev/null +++ b/5-inference/pyproject.toml @@ -0,0 +1,51 @@ +[tool.poetry] +name = "inference-pipeline" +description = "" +version = "0.1.0" +authors = [ + "vlad_adu ", + "Paul Iusztin ", + "Alex Vesa ", +] +package-mode = false +readme = "README.md" + + +[tool.poetry.dependencies] +python = ">=3.10, <3.12" +pydantic = "^2.6.3" +pydantic-settings = "^2.1.0" +bytewax = "0.18.2" +pika = "^1.3.2" +qdrant-client = "^1.8.0" +unstructured = "^0.12.6" +langchain = "^0.1.13" +sentence-transformers = "^2.6.1" +instructorembedding = "^1.0.1" +numpy = "^1.26.4" +langchain-openai = "^0.1.3" +gdown = "^5.1.0" +pymongo = "^4.7.1" +structlog = "^24.1.0" +rich = "^13.7.1" +pip = "^24.0" +install = "^1.3.5" +comet-ml = "^3.41.0" +ruff = "^0.4.3" +comet-llm = "^2.2.4" +qwak-sdk = "^0.5.69" +pandas = "^2.2.2" +datasets = "^2.19.1" +peft = "^0.11.1" +bitsandbytes = "^0.43.1" +qwak-inference = "^0.1.17" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + + +[tool.ruff] +line-length = 88 +select = ["F401", "F403"] diff --git a/5-inference/rag/__init__.py b/5-inference/rag/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/5-inference/rag/query_expanison.py b/5-inference/rag/query_expanison.py new file mode 100644 index 0000000..e77b25e --- /dev/null +++ b/5-inference/rag/query_expanison.py @@ -0,0 +1,31 @@ +from langchain_openai import ChatOpenAI + +from llm_components.chain import GeneralChain +from llm_components.prompt_templates import QueryExpansionTemplate +from config import settings + + +class QueryExpansion: + @staticmethod + def generate_response(query: str, to_expand_to_n: int) -> list[str]: + query_expansion_template = QueryExpansionTemplate() + prompt_template = query_expansion_template.create_template(to_expand_to_n) + model = ChatOpenAI( + model=settings.OPENAI_MODEL_ID, + api_key=settings.OPENAI_API_KEY, + temperature=0, + ) + + chain = GeneralChain().get_chain( + llm=model, output_key="expanded_queries", template=prompt_template + ) + + response = chain.invoke({"question": query}) + result = response["expanded_queries"] + + queries = result.strip().split(query_expansion_template.separator) + stripped_queries = [ + stripped_item for item in queries if (stripped_item := item.strip()) + ] + + return stripped_queries diff --git a/course/module-3/rag/reranking.py b/5-inference/rag/reranking.py similarity index 90% rename from course/module-3/rag/reranking.py rename to 5-inference/rag/reranking.py index 44f1774..6decf89 100644 --- a/course/module-3/rag/reranking.py +++ b/5-inference/rag/reranking.py @@ -1,8 +1,8 @@ from langchain_openai import ChatOpenAI - from llm_components.chain import GeneralChain from llm_components.prompt_templates import RerankingTemplate -from settings import settings + +from config import settings class Reranker: @@ -13,7 +13,7 @@ def generate_response( reranking_template = RerankingTemplate() prompt_template = reranking_template.create_template(keep_top_k=keep_top_k) - model = ChatOpenAI(model=settings.OPENAI_MODEL_ID) + model = ChatOpenAI(model=settings.OPENAI_MODEL_ID, api_key=settings.OPENAI_API_KEY) chain = GeneralChain().get_chain( llm=model, output_key="rerank", template=prompt_template ) diff --git a/5-inference/rag/retriever.py b/5-inference/rag/retriever.py new file mode 100644 index 0000000..a500f42 --- /dev/null +++ b/5-inference/rag/retriever.py @@ -0,0 +1,128 @@ +import concurrent.futures + +import core.logger_utils as logger_utils +from core.db.qdrant import QdrantDatabaseConnector +from qdrant_client import models +from sentence_transformers.SentenceTransformer import SentenceTransformer + +import utils +from rag.query_expanison import QueryExpansion +from rag.reranking import Reranker +from rag.self_query import SelfQuery +from config import settings + +logger = logger_utils.get_logger(__name__) + + +class VectorRetriever: + """ + Class for retrieving vectors from a Vector store in a RAG system using query expansion and Multitenancy search. + """ + + def __init__(self, query: str) -> None: + self._client = QdrantDatabaseConnector() + self.query = query + self._embedder = SentenceTransformer(settings.EMBEDDING_MODEL_ID) + self._query_expander = QueryExpansion() + self._metadata_extractor = SelfQuery() + self._reranker = Reranker() + + def _search_single_query( + self, generated_query: str, metadata_filter_value: str, k: int + ): + assert k > 3, "k should be greater than 3" + + query_vector = self._embedder.encode(generated_query).tolist() + + vectors = [ + self._client.search( + collection_name="vector_posts", + query_filter=models.Filter( + must=[ + models.FieldCondition( + key="author_id", + match=models.MatchValue( + value=metadata_filter_value, + ), + ) + ] + ), + query_vector=query_vector, + limit=k // 3, + ), + self._client.search( + collection_name="vector_articles", + query_filter=models.Filter( + must=[ + models.FieldCondition( + key="author_id", + match=models.MatchValue( + value=metadata_filter_value, + ), + ) + ] + ), + query_vector=query_vector, + limit=k // 3, + ), + self._client.search( + collection_name="vector_repositories", + query_filter=models.Filter( + must=[ + models.FieldCondition( + key="owner_id", + match=models.MatchValue( + value=metadata_filter_value, + ), + ) + ] + ), + query_vector=query_vector, + limit=k // 3, + ), + ] + + return utils.flatten(vectors) + + def retrieve_top_k(self, k: int, to_expand_to_n_queries: int) -> list: + generated_queries = self._query_expander.generate_response( + self.query, to_expand_to_n=to_expand_to_n_queries + ) + logger.info( + "Successfully generated queries for search.", + num_queries=len(generated_queries), + ) + + author_id = self._metadata_extractor.generate_response(self.query) + logger.info( + "Successfully extracted the author_id from the query.", + author_id=author_id, + ) + + with concurrent.futures.ThreadPoolExecutor() as executor: + search_tasks = [ + executor.submit(self._search_single_query, query, author_id, k) + for query in generated_queries + ] + + hits = [ + task.result() for task in concurrent.futures.as_completed(search_tasks) + ] + hits = utils.flatten(hits) + + logger.info("All documents retrieved successfully.", num_documents=len(hits)) + + return hits + + def rerank(self, hits: list, keep_top_k: int) -> list[str]: + content_list = [hit.payload["content"] for hit in hits] + rerank_hits = self._reranker.generate_response( + query=self.query, passages=content_list, keep_top_k=keep_top_k + ) + + logger.info("Documents reranked successfully.", num_documents=len(rerank_hits)) + + return rerank_hits + + def set_query(self, query: str): + self.query = query diff --git a/5-inference/rag/self_query.py b/5-inference/rag/self_query.py new file mode 100644 index 0000000..d520d24 --- /dev/null +++ b/5-inference/rag/self_query.py @@ -0,0 +1,25 @@ +from langchain_openai import ChatOpenAI + +from llm_components.chain import GeneralChain +from llm_components.prompt_templates import SelfQueryTemplate +from config import settings + + +class SelfQuery: + @staticmethod + def generate_response(query: str) -> str: + prompt = SelfQueryTemplate().create_template() + model = ChatOpenAI( + model=settings.OPENAI_MODEL_ID, + api_key=settings.OPENAI_API_KEY, + temperature=0, + ) + + chain = GeneralChain().get_chain( + llm=model, output_key="metadata_filter_value", template=prompt + ) + + response = chain.invoke({"question": query}) + result = response["metadata_filter_value"] + + return result diff --git a/5-inference/utils/__init__.py b/5-inference/utils/__init__.py new file mode 100644 index 0000000..9f029a9 --- /dev/null +++ b/5-inference/utils/__init__.py @@ -0,0 +1,4 @@ +def flatten(nested_list: list) -> list: + """Flatten a list of lists into a single list.""" + + return [item for sublist in nested_list for item in sublist] diff --git a/5-inference/utils/chunking.py b/5-inference/utils/chunking.py new file mode 100644 index 0000000..bdc4980 --- /dev/null +++ b/5-inference/utils/chunking.py @@ -0,0 +1,25 @@ +from langchain.text_splitter import ( + RecursiveCharacterTextSplitter, + SentenceTransformersTokenTextSplitter, +) + +from config import settings + + +def chunk_text(text: str) -> list[str]: + character_splitter = RecursiveCharacterTextSplitter( + separators=["\n\n"], chunk_size=500, chunk_overlap=0 + ) + text_split = character_splitter.split_text(text) + + token_splitter = SentenceTransformersTokenTextSplitter( + chunk_overlap=50, + tokens_per_chunk=settings.EMBEDDING_MODEL_MAX_INPUT_LENGTH, + model_name=settings.EMBEDDING_MODEL_ID, + ) + chunks = [] + + for section in text_split: + chunks.extend(token_splitter.split_text(section)) + + return chunks diff --git a/5-inference/utils/cleaning.py b/5-inference/utils/cleaning.py new file mode 100644 index 0000000..622ff06 --- /dev/null +++ b/5-inference/utils/cleaning.py @@ -0,0 +1,107 @@ +import re + +from unstructured.cleaners.core import ( + clean, + clean_non_ascii_chars, + replace_unicode_quotes, +) + + +def unbold_text(text): + # Mapping of bold numbers to their regular equivalents + bold_numbers = { + "𝟬": "0", + "𝟭": "1", + "𝟮": "2", + "𝟯": "3", + "𝟰": "4", + "𝟱": "5", + "𝟲": "6", + "𝟳": "7", + "𝟴": "8", + "𝟵": "9", + } + + # Function to convert bold characters (letters and numbers) + def convert_bold_char(match): + char = match.group(0) + # Convert bold numbers + if char in bold_numbers: + return bold_numbers[char] + # Convert bold uppercase letters + elif "\U0001d5d4" <= char <= "\U0001d5ed": + return chr(ord(char) - 0x1D5D4 + ord("A")) + # Convert bold lowercase letters + elif "\U0001d5ee" <= char <= "\U0001d607": + return chr(ord(char) - 0x1D5EE + ord("a")) + else: + return char # Return the character unchanged if it's not a bold number or letter + + # Regex for bold characters (numbers, uppercase, and lowercase letters) + bold_pattern = re.compile( + r"[\U0001D5D4-\U0001D5ED\U0001D5EE-\U0001D607\U0001D7CE-\U0001D7FF]" + ) + text = bold_pattern.sub(convert_bold_char, text) + + return text + + +def unitalic_text(text): + # Function to convert italic characters (both letters) + def convert_italic_char(match): + char = match.group(0) + # Unicode ranges for italic characters + if "\U0001d608" <= char <= "\U0001d621": # Italic uppercase A-Z + return chr(ord(char) - 0x1D608 + ord("A")) + elif "\U0001d622" <= char <= "\U0001d63b": # Italic lowercase a-z + return chr(ord(char) - 0x1D622 + ord("a")) + else: + return char # Return the character unchanged if it's not an italic letter + + # Regex for italic characters (uppercase and lowercase letters) + italic_pattern = re.compile(r"[\U0001D608-\U0001D621\U0001D622-\U0001D63B]") + text = italic_pattern.sub(convert_italic_char, text) + + return text + + +def remove_emojis_and_symbols(text): + # Extended pattern to include specific symbols like ↓ (U+2193) or ↳ (U+21B3) + emoji_and_symbol_pattern = re.compile( + "[" + "\U0001f600-\U0001f64f" # emoticons + "\U0001f300-\U0001f5ff" # symbols & pictographs + "\U0001f680-\U0001f6ff" # transport & map symbols + "\U0001f1e0-\U0001f1ff" # flags (iOS) + "\U00002193" # downwards arrow + "\U000021b3" # downwards arrow with tip rightwards + "\U00002192" # rightwards arrow + "]+", + flags=re.UNICODE, + ) + + return emoji_and_symbol_pattern.sub(r" ", text) + + +def replace_urls_with_placeholder(text, placeholder="[URL]"): + # Regular expression pattern for matching URLs + url_pattern = r"https?://\S+|www\.\S+" + + return re.sub(url_pattern, placeholder, text) + + +def remove_non_ascii(text: str) -> str: + text = text.encode("ascii", "ignore").decode("ascii") + return text + + +def clean_text(text_content: str) -> str: + cleaned_text = unbold_text(text_content) + cleaned_text = unitalic_text(cleaned_text) + cleaned_text = remove_emojis_and_symbols(cleaned_text) + cleaned_text = clean(cleaned_text) + cleaned_text = replace_unicode_quotes(cleaned_text) + cleaned_text = clean_non_ascii_chars(cleaned_text) + cleaned_text = replace_urls_with_placeholder(cleaned_text) + + return cleaned_text diff --git a/5-inference/utils/embeddings.py b/5-inference/utils/embeddings.py new file mode 100644 index 0000000..97bba46 --- /dev/null +++ b/5-inference/utils/embeddings.py @@ -0,0 +1,16 @@ +from InstructorEmbedding import INSTRUCTOR +from sentence_transformers.SentenceTransformer import SentenceTransformer + +from config import settings + + +def embedd_text(text: str): + model = SentenceTransformer(settings.EMBEDDING_MODEL_ID) + return model.encode(text) + + +def embedd_repositories(text: str): + model = INSTRUCTOR("hkunlp/instructor-xl") + sentence = text + instruction = "Represent the structure of the repository" + return model.encode([instruction, sentence]) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d0bb38b --- /dev/null +++ b/Makefile @@ -0,0 +1,110 @@ +include .env + +$(eval export $(shell sed -ne 's/ *#.*$$//; /./ s/=.*$$// p' .env)) + +AWS_CURRENT_REGION_ID := $(shell aws configure get region) +AWS_CURRENT_ACCOUNT_ID := $(shell aws sts get-caller-identity --query "Account" --output text) + +PYTHONPATH := $(shell pwd) + +.PHONY: build-all env-var + +env-var: + @echo "Environment variable VAR is: ${RABBITMQ_HOST}" + +# Makefile to build and run Docker services using BuildKit and docker-compose + +# Define the builder name +BUILDER_NAME=my_builder_2 + + +build-all: + @echo "Creating BuildKit builder if it doesn't exist..." + @if ! docker buildx inspect $(BUILDER_NAME) > /dev/null 2>&1; then \ + echo "Creating BuildKit builder..."; \ + docker buildx create --use --bootstrap --name $(BUILDER_NAME); \ + else \ + echo "Using existing BuildKit builder..."; \ + fi + @echo "Building Docker images using BuildKit..." + @docker buildx bake --builder $(BUILDER_NAME) --load + @echo "Starting services using docker-compose..." + @docker-compose up + @echo "Cleaning up BuildKit builder..." + @docker buildx rm $(BUILDER_NAME) + +help: + @grep -E '^[a-zA-Z0-9 -]+:.*#' Makefile | sort | while read -r l; do printf "\033[1;32m$$(echo $$l | cut -f 1 -d':')\033[00m:$$(echo $$l | cut -f 2- -d'#')\n"; done + +local-test: # Send test command on local to test the lambda + curl -X POST "http://localhost:9010/2015-03-31/functions/function/invocations" \ + -d '{"user": "Paul Iuztin", "link": "https://medium.com/@pauliusztin/the-llms-kit-build-a-production-ready-real-time-financial-advisor-system-using-streaming-ffdcb2b50714"}' + +invoke: # Invoke remote lambda from local + aws lambda invoke \ + --function-name crawler \ + --cli-binary-format raw-in-base64-out \ + --payload '{"user": "Paul Iuztin", "link": "https://github.com/iusztinpaul/hands-on-llms"}' \ + response.json + +push: # Build & push image to docker ECR (e.g make push IMAGE_TAG=latest) + echo "Logging into AWS ECR..." + aws ecr get-login-password --region $(AWS_CURRENT_REGION_ID) | docker login --username AWS --password-stdin $(AWS_CURRENT_ACCOUNT_ID).dkr.ecr.$(AWS_CURRENT_REGION_ID).amazonaws.com + echo "Build & Push Docker image..." + docker buildx build --platform linux/amd64 -t $(AWS_CURRENT_ACCOUNT_ID).dkr.ecr.$(AWS_CURRENT_REGION_ID).amazonaws.com/crawler:$(IMAGE_TAG) . + echo "Push completed successfully." + +local-start: # Buil and start mongodb and mq. + docker-compose -f docker-compose.yml up --build -d + +local-stop: # Stop mongodb, mq and qdrant. + docker-compose -f docker-compose.yml down --remove-orphans + +local-bytewax: # Run bytewax pipeline + RUST_BACKTRACE=full python -m bytewax.run 3-feature-pipeline/main.py + +generate-dataset: # Generate dataset for finetuning and version it in Comet ML + python -m finetuning.generate_data + +local-test-retriever: # Test retriever + poetry run python retriever.py + + + + RED := \033[0;31m +BLUE := \033[0;34m +GREEN := \033[0;32m +YELLOW := \033[0;33m +RESET := \033[0m + +help: + @echo "Usage: make [target]" + @echo "" + @echo "Available targets:" + @echo "-------------------" + @echo "$(YELLOW)list$(RESET) : List available targets with descriptions" + @echo "" + @echo "== Deploy ==" + @echo "$(GREEN)deploy$(RESET) : Dumps the poetry env requirements to requirements.txt and triggers Qwak Model Build" + @echo "" + @echo "== Test ==" + @echo "$(YELLOW)test$(RESET) : Runs unit-tests on local deployed model wrapped as QwakModel" + @echo "" + @echo "" + +list: help + +create-qwak-project: + @echo "$(YELLOW)Creating Qwak project $(RESET)" + qwak models create "llm_twin" --project "llm-twin-course" + +deploy: + @echo "$(YELLOW)Dumping poetry env requirements to $(RESET) $(GREEN) requirements.txt $(RESET)" + poetry export -f requirements.txt --output finetuning/requirements.txt --without-hashes + @echo "$(GREEN)Triggering Qwak Model Build$(RESET)" + poetry run qwak models build -f build_config.yaml . + +test: + poetry run python test_local.py + + diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/course/module-1/documents.py b/core/db/documents.py similarity index 84% rename from course/module-1/documents.py rename to core/db/documents.py index 506fece..c896547 100644 --- a/course/module-1/documents.py +++ b/core/db/documents.py @@ -1,15 +1,16 @@ import uuid from typing import List, Optional -from aws_lambda_powertools import Logger -from config import settings -from db import connection -from errors import ImproperlyConfigured +import core.logger_utils as logger_utils from pydantic import UUID4, BaseModel, ConfigDict, Field from pymongo import errors -logger = Logger(service="decodingml/crawler") -_database = connection.get_database(settings.DATABASE_NAME) +from core.db.errors import ImproperlyConfigured +from core.db.mongo import connection + +_database = connection.get_database("scrabble") + +logger = logger_utils.get_logger(__name__) class BaseDocument(BaseModel): @@ -42,11 +43,13 @@ def to_mongo(self, **kwargs) -> dict: def save(self, **kwargs): collection = _database[self._get_collection_name()] + try: result = collection.insert_one(self.to_mongo(**kwargs)) return result.inserted_id - except errors.WriteError as e: - logger.error(f"Failed to insert document {e}") + except errors.WriteError: + logger.exception("Failed to insert document.") + return None @classmethod @@ -59,8 +62,9 @@ def get_or_create(cls, **filter_options) -> Optional[str]: new_instance = cls(**filter_options) new_instance = new_instance.save() return new_instance - except errors.OperationFailure as e: - logger.error(f"Failed to retrieve document: {e}") + except errors.OperationFailure: + logger.exception("Failed to retrieve or create document.") + return None @classmethod @@ -71,8 +75,9 @@ def bulk_insert(cls, documents: List, **kwargs) -> Optional[List[str]]: [doc.to_mongo(**kwargs) for doc in documents] ) return result.inserted_ids - except errors.WriteError as e: - logger.error(f"Failed to insert document {e}") + except errors.WriteError: + logger.exception("Failed to insert documents.") + return None @classmethod diff --git a/course/module-3/db/errors.py b/core/db/errors.py similarity index 100% rename from course/module-3/db/errors.py rename to core/db/errors.py diff --git a/course/module-2/db/mongo.py b/core/db/mongo.py similarity index 100% rename from course/module-2/db/mongo.py rename to core/db/mongo.py diff --git a/course/module-3/db/qdrant.py b/core/db/qdrant.py similarity index 92% rename from course/module-3/db/qdrant.py rename to core/db/qdrant.py index 5a797e7..7b9d165 100644 --- a/course/module-3/db/qdrant.py +++ b/core/db/qdrant.py @@ -1,9 +1,8 @@ -import logger_utils from qdrant_client import QdrantClient, models from qdrant_client.http.exceptions import UnexpectedResponse from qdrant_client.http.models import Batch, Distance, VectorParams - +import core.logger_utils as logger_utils from settings import settings logger = logger_utils.get_logger(__name__) @@ -11,7 +10,7 @@ class QdrantDatabaseConnector: _instance: QdrantClient | None = None - + def __init__(self) -> None: if self._instance is None: try: @@ -58,8 +57,14 @@ def write_data(self, collection_name: str, points: Batch): logger.exception("An error occurred while inserting data.") raise - - def search(self, collection_name: str, query_vector: list, query_filter: models.Filter, limit: int) -> list: + + def search( + self, + collection_name: str, + query_vector: list, + query_filter: models.Filter, + limit: int, + ) -> list: return self._instance.search( collection_name=collection_name, query_vector=query_vector, diff --git a/core/logger_utils.py b/core/logger_utils.py new file mode 100644 index 0000000..98fe9f5 --- /dev/null +++ b/core/logger_utils.py @@ -0,0 +1,5 @@ +import structlog + + +def get_logger(cls: str): + return structlog.get_logger().bind(cls=cls) diff --git a/course/module-1/config.py b/course/module-1/config.py deleted file mode 100644 index 9680312..0000000 --- a/course/module-1/config.py +++ /dev/null @@ -1,16 +0,0 @@ -from pydantic_settings import BaseSettings, SettingsConfigDict - - -class Settings(BaseSettings): - model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8") - - # MongoDB - DATABASE_HOST: str = "mongodb://decodingml:decodingml@decodingml_mongo:27017" - DATABASE_NAME: str = "twin" - - # LinkedIn Credentials - LINKEDIN_USERNAME: str | None = None - LINKEDIN_PASSWORD: str | None = None - - -settings = Settings() diff --git a/course/module-1/db.py b/course/module-1/db.py deleted file mode 100644 index 2617924..0000000 --- a/course/module-1/db.py +++ /dev/null @@ -1,31 +0,0 @@ -from aws_lambda_powertools import Logger -from config import settings -from pymongo import MongoClient -from pymongo.errors import ConnectionFailure - -logger = Logger(service="decodingml/crawler") - - -class MongoDatabaseConnector: - _instance: MongoClient | None = None - - def __new__(cls, *args, **kwargs) -> MongoClient: - if cls._instance is None: - try: - cls._instance = MongoClient(settings.DATABASE_HOST) - except ConnectionFailure as e: - logger.error(f"Couldn't connect to the database: {str(e)}") - raise - - logger.info( - f"Connection to database with uri: {settings.DATABASE_HOST} successful" - ) - return cls._instance - - def close(self): - if self._instance: - self._instance.close() - logger.info("Connected to database has been closed.") - - -connection = MongoDatabaseConnector() diff --git a/course/module-3/cdc.py b/course/module-3/cdc.py deleted file mode 100644 index 1672af1..0000000 --- a/course/module-3/cdc.py +++ /dev/null @@ -1,32 +0,0 @@ -import json - -from bson import json_util -from data_flow.mq import RabbitMQConnection -from db.mongo import MongoDatabaseConnector - - -def stream_process() -> None: - mq_connection = RabbitMQConnection() - mq_connection.connect() - - client = MongoDatabaseConnector() - - db = client["scrabble"] - - changes = db.watch( - [{"$match": {"operationType": {"$in": ["insert"]}}}] - ) # Filter for inserts only - for change in changes: - data_type = change["ns"]["coll"] - entry_id = str(change["fullDocument"]["_id"]) - - change["fullDocument"].pop("_id") - change["fullDocument"]["type"] = data_type - change["fullDocument"]["entry_id"] = entry_id - - data = json.dumps(change["fullDocument"], default=json_util.default) - mq_connection.publish_message(data=data, queue="mongo_data") - - -if __name__ == "__main__": - stream_process() diff --git a/course/module-3/cleaned_articles.json b/course/module-3/cleaned_articles.json new file mode 100644 index 0000000..beb7c4c --- /dev/null +++ b/course/module-3/cleaned_articles.json @@ -0,0 +1 @@ +[{"instruction": "Design and build a production-ready feature pipeline using a Python streaming engine to process data in real-time, ingest data from a queue, clean, chunk, and embed data for LLM fine-tuning and RAG, and load features to a Qdrant vector DB. Deploy the feature pipeline to AWS and integrate it with data collection pipeline, MongoDB, and CDC.", "content": "SOTA Python Streaming Pipelines for Fine-tuning LLMs and RAG \\u2014 in Real-Time!Use a Python streaming engine to populate a feature store from 4+ data sourcesStreaming Pipelines for LLMs and RAG | Decoding MLOpen in appSign upSign inWriteSign upSign inMastodonLLM TWIN COURSE: BUILDING YOUR PRODUCTION-READY AI REPLICASOTA Python Streaming Pipelines for Fine-tuning LLMs and RAG in Real-Time!Use a Python streaming engine to populate a feature store from 4+ data sourcesPaul IusztinFollowPublished inDecoding ML18 min read6 days ago698ListenShare the 4th out of 11 lessons of the LLM Twin free courseWhat is your LLM Twin? It is an AI character that writes like yourself by incorporating your style, personality and voice into an LLM.Image by DALL-EWhy is this course different?By finishing the LLM Twin: Building Your Production-Ready AI Replica free course, you will learn how to design, train, and deploy a production-ready LLM twin of yourself powered by LLMs, vector DBs, and LLMOps good practices.Why should you care? \\U0001faf5 No more isolated scripts or Notebooks! Learn production ML by building and deploying an end-to-end production-grade LLM system.What will you learn to build by the end of this course?You will learn how to architect and build a real-world LLM system from start to finish from data collection to deployment.You will also learn to leverage MLOps best practices, such as experiment trackers, model registries, prompt monitoring, and versioning.The end goal? Build and deploy your own LLM twin.The architecture of the LLM twin is split into 4 Python microservices:the data collection pipeline: crawl your digital data from various social media platforms. Clean, normalize and load the data to a NoSQL DB through a series of ETL pipelines. Send database changes to a queue using the CDC pattern. (deployed on AWS)the feature pipeline: consume messages from a queue through a Bytewax streaming pipeline. Every message will be cleaned, chunked, embedded (using Superlinked), and loaded into a Qdrant vector DB in real-time. (deployed on AWS)the training pipeline: create a custom dataset based on your digital data. Fine-tune an LLM using QLoRA. Use Comet MLs experiment tracker to monitor the experiments. Evaluate and save the best model to Comets model registry. (deployed on Qwak)the inference pipeline: load and quantize the fine-tuned LLM from Comets model registry. Deploy it as a REST API. Enhance the prompts using RAG. Generate content using your LLM twin. Monitor the LLM using Comets prompt monitoring dashboard. (deployed on Qwak)LLM twin system architecture [Image by the Author]Along the 4 microservices, you will learn to integrate 3 serverless tools:Comet ML as your ML Platform;Qdrant as your vector DB;Qwak as your ML infrastructure;Who is this for?Audience: MLE, DE, DS, or SWE who want to learn to engineer production-ready LLM systems using LLMOps good principles.Level: intermediatePrerequisites: basic knowledge of Python, ML, and the cloudHow will you learn?The course contains 11 hands-on written lessons and the open-source code you can access on GitHub.You can read everything at your own pace. To get the most out of this course, we encourage you to clone and run the repository while you cover the lessons.Costs?The articles and code are completely free. They will always remain free.But if you plan to run the code while reading it, you have to know that we use several cloud tools that might generate additional costs.The cloud computing platforms (AWS, Qwak) have a pay-as-you-go pricing plan. Qwak offers a few hours of free computing. Thus, we did our best to keep costs to a minimum.For the other serverless tools (Qdrant, Comet), we will stick to their freemium version, which is free of charge.Meet your teachers!The course is created under the Decoding ML umbrella by:Paul Iusztin | Senior ML & MLOps EngineerAlex Vesa | Senior AI EngineerAlex Razvant | Senior ML & MLOps EngineerLessonsThe course is split into 11 lessons. Every Medium article will be its own lesson.An End-to-End Framework for Production-Ready LLM Systems by Building Your LLM TwinThe Importance of Data Pipelines in the Era of Generative AIChange Data Capture: Enabling Event-Driven ArchitecturesSOTA Python Streaming Pipelines for Fine-tuning LLMs and RAG in Real-Time!Vector DB retrieval clients [Module 2] WIPTraining data preparation [Module 3] WIPFine-tuning LLM [Module 3] WIPLLM evaluation [Module 4] WIPQuantization [Module 5] WIPBuild the digital twin inference pipeline [Module 6] WIPDeploy the digital twin as a REST API [Module 6] WIP Check out the code on GitHub [1] and support us with a Lets start with Lesson 4 Lesson 4: Python Streaming Pipelines for Fine-tuning LLMs and RAG in Real-Time!In the 4th lesson, we will focus on the feature pipeline.The feature pipeline is the first pipeline presented in the 3 pipeline architecture: feature, training and inference pipelines.A feature pipeline is responsible for taking raw data as input, processing it into features, and storing it in a feature store, from which the training & inference pipelines will use it.The component is completely isolated from the training and inference code. All the communication is done through the feature store.To avoid repeating myself, if you are unfamiliar with the 3 pipeline architecture, check out Lesson 1 for a refresher.By the end of this article, you will learn to design and build a production-ready feature pipeline that:uses Bytewax as a stream engine to process data in real-time;ingests data from a RabbitMQ queue;uses SWE practices to process multiple data types: posts, articles, code;cleans, chunks, and embeds data for LLM fine-tuning and RAG;loads the features to a Qdrant vector DB.Note: In our use case, the feature pipeline is also a streaming pipeline, as we use a Bytewax streaming engine. Thus, we will use these words interchangeably.We will wrap up Lesson 4 by showing you how to deploy the feature pipeline to AWS and integrate it with the components from previous lessons: data collection pipeline, MongoDB, and CDC.In the 5th lesson, we will go through the vector DB retrieval client, where we will teach you how to query the vector DB and improve the accuracy of the results using advanced retrieval techniques.Excited? Lets get started!The architecture of the feature/streaming pipeline.Table of ContentsWhy are we doing this?System design of the feature pipelineThe Bytewax streaming flowPydantic data modelsLoad data to QdrantThe dispatcher layerPreprocessing steps: Clean, chunk, embedThe AWS infrastructureRun the code locallyDeploy the code to AWS & Run it from the cloudConclusion Check out the code on GitHub [1] and support us with a 1. Why are we doing this?A quick reminder from previous lessonsTo give you some context, in Lesson 2, we crawl data from LinkedIn, Medium, and GitHub, normalize it, and load it to MongoDB.In Lesson 3, we are using CDC to listen to changes to the MongoDB database and emit events in a RabbitMQ queue based on any CRUD operation done on MongoDB.and here we are in Lesson 4, where we are building the feature pipeline that listens 24/7 to the RabbitMQ queue for new events to process and load them to a Qdrant vector DB.The problem we are solvingIn our LLM Twin use case, the feature pipeline constantly syncs the MongoDB warehouse with the Qdrant vector DB while processing the raw data into features.Important: In our use case, the Qdrant vector DB will be our feature store.Why we are solving itThe feature store will be the central point of access for all the features used within the training and inference pipelines.For consistency and simplicity, we will refer to different formats of our text data as features. The training pipeline will use the feature store to create fine-tuning datasets for your LLM twin. The inference pipeline will use the feature store for RAG.For reliable results (especially for RAG), the data from the vector DB must always be in sync with the data from the data warehouse.The question is, what is the best way to sync these 2?Other potential solutionsThe most common solution is probably to use a batch pipeline that constantly polls from the warehouse, computes a difference between the 2 databases, and updates the target database.The issue with this technique is that computing the difference between the 2 databases is extremely slow and costly.Another solution is to use a push technique using a webhook. Thus, on any CRUD change in the warehouse, you also update the source DB.The biggest issue here is that if the webhook fails, you have to implement complex recovery logic.Lesson 3 on CDC covers more of this.2. System design of the feature pipeline: our solutionOur solution is based on CDC, a queue, a streaming engine, and a vector DB: CDC adds any change made to the Mongo DB to the queue (read more in Lesson 3). the RabbitMQ queue stores all the events until they are processed. The Bytewax streaming engine cleans, chunks, and embeds the data. A streaming engine works naturally with a queue-based system. The data is uploaded to a Qdrant vector DB on the flyWhy is this powerful?Here are 4 core reasons:The data is processed in real-time.Out-of-the-box recovery system: If the streaming pipeline fails to process a message will be added back to the queueLightweight: No need for any diffs between databases or batching too many recordsNo I/O bottlenecks on the source database It solves all our problems!The architecture of the feature/streaming pipeline.How is the data stored?We store 2 snapshots of our data in the feature store. Here is why Remember that we said that the training and inference pipeline will access the features only from the feature store, which, in our case, is the Qdrant vector DB?Well, if we had stored only the chunked & embedded version of the data, that would have been useful only for RAG but not for fine-tuning.Thus, we make an additional snapshot of the cleaned data, which will be used by the training pipeline.Afterward, we pass it down the streaming flow for chunking & embedding.How do we process multiple data types?How do you process multiple types of data in a single streaming pipeline without writing spaghetti code?Yes, that is for you, data scientists! Jokingam I?We have 3 data types: posts, articles, and code.Each data type (and its state) will be modeled using Pydantic models.To process them we will write a dispatcher layer, which will use a creational factory pattern [9] to instantiate a handler implemented for that specific data type (post, article, code) and operation (cleaning, chunking, embedding).The handler follows the strategy behavioral pattern [10].Intuitively, you can see the combination between the factory and strategy patterns as follows:Initially, we know we want to clean the data, but as we dont know the data type, we cant know how to do so.What we can do, is write the whole code around the cleaning code and abstract away the login under a Handler() interface (aka the strategy).When we get a data point, the factory class creates the right cleaning handler based on its type.Ultimately the handler is injected into the rest of the system and executed.By doing so, we can easily isolate the logic for a given data type & operation while leveraging polymorphism to avoid filling up the code with 1000x if else statements.We will dig into the implementation in future sections.Streaming over batchYou may ask why we need a streaming engine instead of implementing a batch job that polls the messages at a given frequency.That is a valid question.The thing is thatNowadays, using tools such as Bytewax makes implementing streaming pipelines a lot more frictionless than using their JVM alternatives.The key aspect of choosing a streaming vs. a batch design is real-time synchronization between your source and destination DBs.In our particular case, we will process social media data, which changes fast and irregularly.Also, for our digital twin, it is important to do RAG on up-to-date data. We dont want to have any delay between what happens in the real world and what your LLM twin sees.That being said choosing a streaming architecture seemed natural in our use case.3. The Bytewax streaming flowThe Bytewax flow is the central point of the streaming pipeline. It defines all the required steps, following the next simplified pattern: input -> processing -> output.As I come from the AI world, I like to see it as the graph of the streaming pipeline, where you use the input(), map(), and output() Bytewax functions to define your graph, which in the Bytewax world is called a flow.As you can see in the code snippet below, we ingest posts, articles or code messages from a RabbitMQ queue. After we clean, chunk and embed them. Ultimately, we load the cleaned and embedded data to a Qdrant vector DB, which in our LLM twin use case will represent the feature store of our system.To structure and validate the data, between each Bytewax step, we map and pass a different Pydantic model based on its current state: raw, cleaned, chunked, or embedded.Bytewax flow GitHub Code We have a single streaming pipeline that processes everything.As we ingest multiple data types (posts, articles, or code snapshots), we have to process them differently.To do this the right way, we implemented a dispatcher layer that knows how to apply data-specific operations based on the type of message.More on this in the next sections Why Bytewax?Bytewax is an open-source streaming processing framework that:- is built in Rust for performance- has Python bindings for leveraging its powerful ML ecosystem so, for all the Python fanatics out there, no more JVM headaches for you.Jokes aside, here is why Bytewax is so powerful - Bytewax local setup is plug-and-play- can quickly be integrated into any Python project (you can go wild even use it in Notebooks)- can easily be integrated with other Python packages (NumPy, PyTorch, HuggingFace, OpenCV, SkLearn, you name it)- out-of-the-box connectors for Kafka and local files, or you can quickly implement your ownWe used Bytewax to build the streaming pipeline for the LLM Twin course and loved it.To learn more about Bytewax, go and check them out. They are open source, so no strings attached Bytewax [2] 4. Pydantic data modelsLets take a look at what our Pydantic models look like.First, we defined a set of base abstract models for using the same parent class across all our components.Pydantic base model structure GitHub Code Afterward, we defined a hierarchy of Pydantic models for:all our data types: posts, articles, or codeall our states: raw, cleaned, chunked, and embeddedThis is how the set of classes for the posts will look like Pydantic posts model structure GitHub Code We repeated the same process for the articles and code model hierarchy.Check out the other data classes on our GitHub.Why is keeping our data in Pydantic models so powerful?There are 4 main criteria:every field has an enforced type: you are ensured the data types are going to be correctthe fields are automatically validated based on their type: for example, if the field is a string and you pass an int, it will through an errorthe data structure is clear and verbose: no more clandestine dicts that you never know what is in themyou make your data the first-class citizen of your program5. Load data to QdrantThe first step is to implement our custom Bytewax DynamicSink class Qdrant DynamicSink GitHub Code Next, for every type of operation we need (output cleaned or embedded data ) we have to subclass the StatelessSinkPartition Bytewax class (they also provide a stateful option more in their docs)An instance of the class will run on every partition defined within the Bytewax deployment.In the course, we are using a single partition per worker. But, by adding more partitions (and workers), you can quickly scale your Bytewax pipeline horizontally.Qdrant worker partitions GitHub Code Note that we used Qdrants Batch method to upload all the available points at once. By doing so, we reduce the latency on the network I/O side: more on that here [8] The RabbitMQ streaming input follows a similar pattern. Check it out here 6. The dispatcher layerNow that we have the Bytewax flow and all our data models.How do we map a raw data model to a cleaned data model? All our domain logic is modeled by a set of Handler() classes.For example, this is how the handler used to map a PostsRawModel to a PostCleanedModel looks like Handler hierarchy of classes GitHub Code Check out the other handlers on our GitHub: ChunkingDataHandler and EmbeddingDataHandlerIn the next sections, we will explore the exact cleaning, chunking and embedding logic.Now, to build our dispatcher, we need 2 last components:a factory class: instantiates the right handler based on the type of the eventa dispatcher class: the glue code that calls the factory class and handlerHere is what the cleaning dispatcher and factory look like The dispatcher and factory classes GitHub Code Check out the other dispatchers on our GitHub.By repeating the same logic, we will end up with the following set of dispatchers:RawDispatcher (no factory class required as the data is not processed)CleaningDispatcher (with a ChunkingHandlerFactory class)ChunkingDispatcher (with a ChunkingHandlerFactory class)EmbeddingDispatcher (with an EmbeddingHandlerFactory class)7. Preprocessing steps: Clean, chunk, embedHere we will focus on the concrete logic used to clean, chunk, and embed a data point.Note that this logic is wrapped by our handler to be integrated into our dispatcher layer using the Strategy behavioral pattern [10].We already described that in the previous section. Thus, we will directly jump into the actual logic here, which can be found in the utils module of our GitHub repository.Note: These steps are experimental. Thus, what we present here is just the first iteration of the system. In a real-world scenario, you would experiment with different cleaning, chunking or model versions to improve it on your data.CleaningThis is the main utility function used to clean the text for our posts, articles, and code.Out of simplicity, we used the same logic for all the data types, but after more investigation, you would probably need to adapt it to your specific needs.For example, your posts might start containing some weird characters, and you dont want to run the unbold_text() or unitalic_text() functions on your code data point as is completely redundant.Cleaning logic GitHub Code Most of the functions above are from the unstructured [3] Python package. It is a great tool for quickly finding utilities to clean text data. More examples of unstructured here [3] One key thing to notice is that at the cleaning step, we just want to remove all the weird, non-interpretable characters from the text.Also, we want to remove redundant data, such as extra whitespace or URLs, as they do not provide much value.These steps are critical for our tokenizer to understand and efficiently transform our string input into numbers that will be fed into the transformer models.Note that when using bigger models (transformers) + modern tokenization techniques, you dont need to standardize your dataset too much.For example, it is redundant to apply lemmatization or stemming, as the tokenizer knows how to split your input into a commonly used sequence of characters efficiently, and the transformers can pick up the nuances of the words. What is important at the cleaning step is to throw out the noise.ChunkingWe are using Langchain to chunk our text.We use a 2 step strategy using Langchains RecursiveCharacterTextSplitter [4] and SentenceTransformersTokenTextSplitter [5]. As seen below Chunking logic GitHub Code Overlapping your chunks is a common pre-indexing RAG technique, which helps to cluster chunks from the same document semantically.Again, we are using the same chunking logic for all of our data types, but to get the most out of it, we would probably need to tweak the separators, chunk_size, and chunk_overlap parameters for our different use cases.But our dispatcher + handler architecture would easily allow us to configure the chunking step in future iterations.EmbeddingThe data preprocessing, aka the hard part is done.Now we just have to call an embedding model to create our vectors.Embedding logic GitHub Code We used the all-MiniLm-L6-v2 [6] from the sentence-transformers library to embed our articles and posts: a lightweight embedding model that can easily run in real-time on a 2 vCPU machine.As the code data points contain more complex relationships and specific jargon to embed, we used a more powerful embedding model: hkunlp/instructor-xl [7].This embedding model is unique as it can be customized on the fly with instructions based on your particular data. This allows the embedding model to specialize on your data without fine-tuning, which is handy for embedding pieces of code.8. The AWS infrastructureIn Lesson 2, we covered how to deploy the data collection pipeline that is triggered by a link to Medium, Substack, LinkedIn or GitHub crawls the given link saves the crawled information to a MongoDB.In Lesson 3, we explained how to deploy the CDC components that emit events to a RabbitMQ queue based on any CRUD operation done to MongoDB.What is left is to deploy the Bytewax streaming pipeline and Qdrant vector DB.We will use Qdrants self-hosted option, which is easy to set up and scale.To test things out, they offer a Free Tier plan for up to a 1GB cluster, which is more than enough for our course. We explained in our GitHub repository how to configure Qdrant.AWS infrastructure of the feature/streaming pipeline.The last piece of the puzzle is the Bytewax streaming pipeline.As we dont require a GPU and the streaming pipeline needs to run 24/7, we will deploy it to AWS Fargate, a cost-effective serverless solution from AWS.As a serverless solution, Fargate allows us to deploy our code quickly and scale it fast in case of high traffic.How do we deploy the streaming pipeline code to Fargate?Using GitHub Actions, we wrote a CD pipeline that builds a Docker image on every new commit made on the main branch.After, the Docker image is pushed to AWS ECR. Ultimately, Fargate pulls the latest version of the Docker image.This is a common CD pipeline to deploy your code to AWS services.Why not use lambda functions, as we did for the data pipeline?An AWS lambda function executes a function once and then closes down.This worked perfectly for the crawling logic, but it won't work for our streaming pipeline, which has to run 24/7.9. Run the code locallyTo quickly test things up, we wrote a docker-compose.yaml file to spin up the MongoDB, RabbitMQ queue and Qdrant vector db.You can spin up the Docker containers using our Makefile by running the following:make local-start-infraTo fully test the Bytewax streaming pipeline, you have to start the CDC component by running:make local-start-cdcUltimately, you start the streaming pipeline:make local-bytewaxTo simulate the data collection pipeline, mock it as follows:make local-insert-data-mongoThe README of our GitHub repository provides more details on how to run and set up everything.10. Deploy the code to AWS & Run it from the cloudThis article is already too long, so I wont go into the details of how to deploy the AWS infrastructure described above and test it out here.But to give you some insights, we have used Pulumi as our infrastructure as a code (IaC) tool, which will allow you to spin it quickly with a few commands.Also, I wont let you hang on to this one. We made a promise and We prepared step-by-step instructions in the README of our GitHub repository on how to use Pulumni to spin up the infrastructure and test it out.ConclusionNow you know how to write streaming pipelines like a PRO!In Lesson 4, you learned how to:design a feature pipeline using the 3-pipeline architecturewrite a streaming pipeline using Bytewax as a streaming engineuse a dispatcher layer to write a modular and flexible application to process multiple types of data (posts, articles, code)load the cleaned and embedded data to Qdrantdeploy the streaming pipeline to AWS This is only the ingestion part used for fine-tuning LLMs and RAG.In Lesson 5, you will learn how to write a retrieval client for the 3 data types using good SWE practices and improve the retrieval accuracy using advanced retrieval & post-retrieval techniques. See you there! Check out the code on GitHub [1] and support us with a Enjoyed This Article?Join the Decoding ML Newsletter for battle-tested content on designing, coding, and deploying production-grade ML & MLOps systems. Every week. For FREE Decoding ML Newsletter | Paul Iusztin | SubstackJoin for battle-tested content on designing, coding, and deploying production-grade ML & MLOps systems. Every week. Fordecodingml.substack.comReferencesLiterature[1] Your LLM Twin Course GitHub Repository (2024), Decoding ML GitHub Organization[2] Bytewax, Bytewax Landing Page[3] Unstructured Cleaning Examples, Unstructured Documentation[4] Recursively split by character, LangChains Documentation[5] Split by tokens, LangChains Documentation[6] sentence-transformers/all-MiniLM-L6-v2, HuggingFace[7] hkunlp/instructor-xl, HuggingFace[8] Qdrant, Qdrant Documentation[9] Abstract Factory Pattern, Refactoring Guru[10] Strategy Pattern, Refactoring GuruImagesIf not otherwise stated, all images are created by the author.Sign up to discover human stories that deepen your understanding of the world.FreeDistraction-free reading. No ads.Organize your knowledge with lists and highlights.Tell your story. Find your audience.Sign up for freeMembershipAccess the best member-only stories.Support independent authors.Listen to audio narrations.Read offline.Join the Partner Program and earn for your writing.Try for $5/monthMl System DesignMachine LearningArtificial IntelligenceData ScienceSoftware Engineering698698FollowWritten by Paul Iusztin2.4K FollowersEditor for Decoding ML Senior ML Engineer | Helping machine learning engineers design and productionize ML systems. | Decoding ML Newsletter: [URL] from Paul Iusztin and Decoding MLPaul IusztininDecoding MLAn End-to-End Framework for Production-Ready LLM Systems by Building Your LLM TwinFrom data gathering to productionizing LLMs using LLMOps good practices.16 min readMar 16, 20241.5K10Razvant AlexandruinDecoding MLHow to build a Real-Time News Search Engine using Serverless Upstash Kafka and Vector DBA hands-on guide to implementing a live news aggregating streaming pipeline with Apache Kafka, Bytewax, and Upstash Vector Database.19 min readApr 13, 20246873Paul IusztininDecoding MLThe LLMs kit: Build a production-ready real-time financial advisor system using streamingLesson 1: LLM architecture system design using the 3-pipeline pattern12 min readJan 5, 2024383Paul IusztininDecoding MLA Real-time Retrieval System for RAG on Social Media DataUse a streaming engine to populate a vector DB in real-time. Improve RAG accuracy using rerank & UMAP.12 min readMar 30, 2024305See all from Paul IusztinSee all from Decoding MLRecommended from MediumVipra SinghBuilding LLM Applications: Serving LLMs (Part 9)Learn Large Language Models ( LLM ) through the lens of a Retrieval Augmented Generation ( RAG ) Application.49 min readApr 18, 20243741A B Vijay KumarMulti-Agent System\\u200a\\u200aCrew.AIMulti-Agent systems are LLM applications that are changing the automation landscape with intelligent bots.7 min readApr 18, 20241574ListsPredictive Modeling w/ Python20 stories1126 savesNatural Language Processing1402 stories899 savesPractical Guides to Machine Learning10 stories1352 savesdata science and AI40 stories137 savesFabio MatricardiinGenerative AILlama3 is out and you can run it on your Computer!After only 1 day from the release, here is how you can run even on your Laptop with CPU only the latest Meta-AI model.8 min read6 days ago1.2K13Gavin LiinAI AdvancesRun the strongest open-source LLM model: Llama3 70B with just a single 4GB GPU!The strongest open source LLM model Llama3 has been released, Here is how you can run Llama3 70B locally with just 4GB GPU, even on Macbook4 min read4 days ago7982Plaban NayakinThe AI ForumSemantic Chunking for RAGWhat is Chunking\\xa0?17 min read4 days ago1651Damian GilinTowards Data ScienceAdvanced Retriever Techniques to Improve Your RAGsMaster Advanced Information Retrieval: Cutting-edge Techniques to Optimize the Selection of Relevant Documents with Langchain to Create18 min readApr 17, 20245393See more recommendationsHelpStatusAboutCareersBlogPrivacyTermsText to speechTeams\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nTo make Medium work, we log user data. By using Medium, you agree to our Privacy Policy, including cookie policy."}, {"instruction": "Create battle-tested content on designing, coding, and deploying production-grade ML & MLOps systems every week for free. Avoid bedtime stories in Jupyter Notebooks.", "content": "About Decoding MLThe hub for continuous learning on ML system design, ML engineering, MLOps, LLMs and computer vision.About Decoding ML. The hub for continuous learning on ML | by Paul Iusztin | Decoding ML | MediumOpen in appSign upSign inWriteSign upSign inMastodonAbout Decoding MLThe hub for continuous learning on ML system design, ML engineering, MLOps, LLMs and computer vision.Paul IusztinFollowPublished inDecoding ML2 min readFeb 19, 202491ListenShareDecoding ML is a publication that creates battle-tested content on building production-grade ML systems leveraging good SWE and MLOps practices.Our motto is More engineering, less F1 scores.Following Decoding ML, you will learn about the entire lifecycle of an ML system, from system design to deploying and monitoring.Decoding ML is the hub for continuous learning on:ML system designML engineeringMLOpsLarge language modelsComputer visionWe are all about end-to-end ML use cases that can directly be applied in the real world no stories just hands-on content.The minds behind Decoding ML Alex Vesa (left), Paul Iusztin (middle) and Alexandru Razvant (right)The minds behind Decoding ML are Vesa Alexandru, Paul Iusztin and Razvant Alexandru.Our passion for constantly learning and engineering production-ready ML systems inevitably turned into Decoding ML.With our 10+ years of hands-on experience in the industry in:Data ScienceDeep LearningComputer VisionGenerative AIML InfrastructureMLOpsSoftware Engineeringwe decided it is about time to share it with the world!Why follow?Join Decoding ML for battle-tested content on designing, coding, and deploying production-grade ML & MLOps systems. Every week. For FREE.No more bedtime stories in Jupyter Notebooks. DML is all about hands-on advice from our 10+ years of experience in AI.We are also on: Newsletter GitHubSign up to discover human stories that deepen your understanding of the world.FreeDistraction-free reading. No ads.Organize your knowledge with lists and highlights.Tell your story. Find your audience.Sign up for freeMembershipAccess the best member-only stories.Support independent authors.Listen to audio narrations.Read offline.Join the Partner Program and earn for your writing.Try for $5/monthAbout9191FollowWritten by Paul Iusztin2.4K FollowersEditor for Decoding ML Senior ML Engineer | Helping machine learning engineers design and productionize ML systems. | Decoding ML Newsletter: [URL] from Paul Iusztin and Decoding MLPaul IusztininDecoding MLAn End-to-End Framework for Production-Ready LLM Systems by Building Your LLM TwinFrom data gathering to productionizing LLMs using LLMOps good practices.16 min readMar 16, 20241.5K10Razvant AlexandruinDecoding MLHow to build a Real-Time News Search Engine using Serverless Upstash Kafka and Vector DBA hands-on guide to implementing a live news aggregating streaming pipeline with Apache Kafka, Bytewax, and Upstash Vector Database.19 min readApr 13, 20246873Paul IusztininDecoding MLThe LLMs kit: Build a production-ready real-time financial advisor system using streamingLesson 1: LLM architecture system design using the 3-pipeline pattern12 min readJan 5, 2024383Paul IusztininDecoding MLA Real-time Retrieval System for RAG on Social Media DataUse a streaming engine to populate a vector DB in real-time. Improve RAG accuracy using rerank & UMAP.12 min readMar 30, 2024305See all from Paul IusztinSee all from Decoding MLRecommended from MediumQwakHow to Build an End-to-End ML Pipeline in 2024Learn to build an end-to-end ML pipeline and streamline your ML workflows in 2024, from data ingestion to model deployment and performance24 min readApr 7, 20242071Paul IusztininDecoding MLThe LLMs kit: Build a production-ready real-time financial advisor system using streamingLesson 1: LLM architecture system design using the 3-pipeline pattern12 min readJan 5, 2024383ListsMedium's Huge List of Publications Accepting Submissions285 stories2516 savesYesmine RouisinTheFork Engineering BlogA Guide to MLOps with Airflow and MLflowIntroduction11 min readNov 6, 2023319ManralaiMastering MLOps for FreeYour Go-To GitHub Repositories Collection4 min readJan 28, 20246463Vipra SinghBuilding LLM Applications: Evaluation (Part 8)Learn Large Language Models ( LLM ) through the lens of a Retrieval Augmented Generation ( RAG ) Application.47 min readApr 8, 20241891Ramazan OlmezEnd-to-End Machine Learning Project: Churn PredictionThe main objective of this article is to develop an end-to-end machine learning project. For a model to be truly useful, it needs to be18 min readFeb 22, 202487See more recommendationsHelpStatusAboutCareersBlogPrivacyTermsText to speechTeams\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nTo make Medium work, we log user data. By using Medium, you agree to our Privacy Policy, including cookie policy."}, {"instruction": "Design and build a production-ready feature pipeline using Bytewax as a streaming engine to process data in real-time, ingest data from a RabbitMQ queue, and use SWE practices to clean, chunk, and embed data for fine-tuning LLM and RAG, finally loading the features to a Qdrant vector DB. Deploy the feature pipeline to AWS and integrate it with components from previous lessons.", "content": "SOTA Python Streaming Pipelines for Fine-tuning LLMs and RAG \\u2014 in Real-Time!Use a Python streaming engine to populate a feature store from 4+ data sourcesStreaming Pipelines for LLMs and RAG | Decoding MLOpen in appSign upSign inWriteSign upSign inMastodonLLM TWIN COURSE: BUILDING YOUR PRODUCTION-READY AI REPLICASOTA Python Streaming Pipelines for Fine-tuning LLMs and RAG in Real-Time!Use a Python streaming engine to populate a feature store from 4+ data sourcesPaul IusztinFollowPublished inDecoding ML18 min read6 days ago698ListenShare the 4th out of 11 lessons of the LLM Twin free courseWhat is your LLM Twin? It is an AI character that writes like yourself by incorporating your style, personality and voice into an LLM.Image by DALL-EWhy is this course different?By finishing the LLM Twin: Building Your Production-Ready AI Replica free course, you will learn how to design, train, and deploy a production-ready LLM twin of yourself powered by LLMs, vector DBs, and LLMOps good practices.Why should you care? \\U0001faf5 No more isolated scripts or Notebooks! Learn production ML by building and deploying an end-to-end production-grade LLM system.What will you learn to build by the end of this course?You will learn how to architect and build a real-world LLM system from start to finish from data collection to deployment.You will also learn to leverage MLOps best practices, such as experiment trackers, model registries, prompt monitoring, and versioning.The end goal? Build and deploy your own LLM twin.The architecture of the LLM twin is split into 4 Python microservices:the data collection pipeline: crawl your digital data from various social media platforms. Clean, normalize and load the data to a NoSQL DB through a series of ETL pipelines. Send database changes to a queue using the CDC pattern. (deployed on AWS)the feature pipeline: consume messages from a queue through a Bytewax streaming pipeline. Every message will be cleaned, chunked, embedded (using Superlinked), and loaded into a Qdrant vector DB in real-time. (deployed on AWS)the training pipeline: create a custom dataset based on your digital data. Fine-tune an LLM using QLoRA. Use Comet MLs experiment tracker to monitor the experiments. Evaluate and save the best model to Comets model registry. (deployed on Qwak)the inference pipeline: load and quantize the fine-tuned LLM from Comets model registry. Deploy it as a REST API. Enhance the prompts using RAG. Generate content using your LLM twin. Monitor the LLM using Comets prompt monitoring dashboard. (deployed on Qwak)LLM twin system architecture [Image by the Author]Along the 4 microservices, you will learn to integrate 3 serverless tools:Comet ML as your ML Platform;Qdrant as your vector DB;Qwak as your ML infrastructure;Who is this for?Audience: MLE, DE, DS, or SWE who want to learn to engineer production-ready LLM systems using LLMOps good principles.Level: intermediatePrerequisites: basic knowledge of Python, ML, and the cloudHow will you learn?The course contains 11 hands-on written lessons and the open-source code you can access on GitHub.You can read everything at your own pace. To get the most out of this course, we encourage you to clone and run the repository while you cover the lessons.Costs?The articles and code are completely free. They will always remain free.But if you plan to run the code while reading it, you have to know that we use several cloud tools that might generate additional costs.The cloud computing platforms (AWS, Qwak) have a pay-as-you-go pricing plan. Qwak offers a few hours of free computing. Thus, we did our best to keep costs to a minimum.For the other serverless tools (Qdrant, Comet), we will stick to their freemium version, which is free of charge.Meet your teachers!The course is created under the Decoding ML umbrella by:Paul Iusztin | Senior ML & MLOps EngineerAlex Vesa | Senior AI EngineerAlex Razvant | Senior ML & MLOps EngineerLessonsThe course is split into 11 lessons. Every Medium article will be its own lesson.An End-to-End Framework for Production-Ready LLM Systems by Building Your LLM TwinThe Importance of Data Pipelines in the Era of Generative AIChange Data Capture: Enabling Event-Driven ArchitecturesSOTA Python Streaming Pipelines for Fine-tuning LLMs and RAG in Real-Time!Vector DB retrieval clients [Module 2] WIPTraining data preparation [Module 3] WIPFine-tuning LLM [Module 3] WIPLLM evaluation [Module 4] WIPQuantization [Module 5] WIPBuild the digital twin inference pipeline [Module 6] WIPDeploy the digital twin as a REST API [Module 6] WIP Check out the code on GitHub [1] and support us with a Lets start with Lesson 4 Lesson 4: Python Streaming Pipelines for Fine-tuning LLMs and RAG in Real-Time!In the 4th lesson, we will focus on the feature pipeline.The feature pipeline is the first pipeline presented in the 3 pipeline architecture: feature, training and inference pipelines.A feature pipeline is responsible for taking raw data as input, processing it into features, and storing it in a feature store, from which the training & inference pipelines will use it.The component is completely isolated from the training and inference code. All the communication is done through the feature store.To avoid repeating myself, if you are unfamiliar with the 3 pipeline architecture, check out Lesson 1 for a refresher.By the end of this article, you will learn to design and build a production-ready feature pipeline that:uses Bytewax as a stream engine to process data in real-time;ingests data from a RabbitMQ queue;uses SWE practices to process multiple data types: posts, articles, code;cleans, chunks, and embeds data for LLM fine-tuning and RAG;loads the features to a Qdrant vector DB.Note: In our use case, the feature pipeline is also a streaming pipeline, as we use a Bytewax streaming engine. Thus, we will use these words interchangeably.We will wrap up Lesson 4 by showing you how to deploy the feature pipeline to AWS and integrate it with the components from previous lessons: data collection pipeline, MongoDB, and CDC.In the 5th lesson, we will go through the vector DB retrieval client, where we will teach you how to query the vector DB and improve the accuracy of the results using advanced retrieval techniques.Excited? Lets get started!The architecture of the feature/streaming pipeline.Table of ContentsWhy are we doing this?System design of the feature pipelineThe Bytewax streaming flowPydantic data modelsLoad data to QdrantThe dispatcher layerPreprocessing steps: Clean, chunk, embedThe AWS infrastructureRun the code locallyDeploy the code to AWS & Run it from the cloudConclusion Check out the code on GitHub [1] and support us with a 1. Why are we doing this?A quick reminder from previous lessonsTo give you some context, in Lesson 2, we crawl data from LinkedIn, Medium, and GitHub, normalize it, and load it to MongoDB.In Lesson 3, we are using CDC to listen to changes to the MongoDB database and emit events in a RabbitMQ queue based on any CRUD operation done on MongoDB.and here we are in Lesson 4, where we are building the feature pipeline that listens 24/7 to the RabbitMQ queue for new events to process and load them to a Qdrant vector DB.The problem we are solvingIn our LLM Twin use case, the feature pipeline constantly syncs the MongoDB warehouse with the Qdrant vector DB while processing the raw data into features.Important: In our use case, the Qdrant vector DB will be our feature store.Why we are solving itThe feature store will be the central point of access for all the features used within the training and inference pipelines.For consistency and simplicity, we will refer to different formats of our text data as features. The training pipeline will use the feature store to create fine-tuning datasets for your LLM twin. The inference pipeline will use the feature store for RAG.For reliable results (especially for RAG), the data from the vector DB must always be in sync with the data from the data warehouse.The question is, what is the best way to sync these 2?Other potential solutionsThe most common solution is probably to use a batch pipeline that constantly polls from the warehouse, computes a difference between the 2 databases, and updates the target database.The issue with this technique is that computing the difference between the 2 databases is extremely slow and costly.Another solution is to use a push technique using a webhook. Thus, on any CRUD change in the warehouse, you also update the source DB.The biggest issue here is that if the webhook fails, you have to implement complex recovery logic.Lesson 3 on CDC covers more of this.2. System design of the feature pipeline: our solutionOur solution is based on CDC, a queue, a streaming engine, and a vector DB: CDC adds any change made to the Mongo DB to the queue (read more in Lesson 3). the RabbitMQ queue stores all the events until they are processed. The Bytewax streaming engine cleans, chunks, and embeds the data. A streaming engine works naturally with a queue-based system. The data is uploaded to a Qdrant vector DB on the flyWhy is this powerful?Here are 4 core reasons:The data is processed in real-time.Out-of-the-box recovery system: If the streaming pipeline fails to process a message will be added back to the queueLightweight: No need for any diffs between databases or batching too many recordsNo I/O bottlenecks on the source database It solves all our problems!The architecture of the feature/streaming pipeline.How is the data stored?We store 2 snapshots of our data in the feature store. Here is why Remember that we said that the training and inference pipeline will access the features only from the feature store, which, in our case, is the Qdrant vector DB?Well, if we had stored only the chunked & embedded version of the data, that would have been useful only for RAG but not for fine-tuning.Thus, we make an additional snapshot of the cleaned data, which will be used by the training pipeline.Afterward, we pass it down the streaming flow for chunking & embedding.How do we process multiple data types?How do you process multiple types of data in a single streaming pipeline without writing spaghetti code?Yes, that is for you, data scientists! Jokingam I?We have 3 data types: posts, articles, and code.Each data type (and its state) will be modeled using Pydantic models.To process them we will write a dispatcher layer, which will use a creational factory pattern [9] to instantiate a handler implemented for that specific data type (post, article, code) and operation (cleaning, chunking, embedding).The handler follows the strategy behavioral pattern [10].Intuitively, you can see the combination between the factory and strategy patterns as follows:Initially, we know we want to clean the data, but as we dont know the data type, we cant know how to do so.What we can do, is write the whole code around the cleaning code and abstract away the login under a Handler() interface (aka the strategy).When we get a data point, the factory class creates the right cleaning handler based on its type.Ultimately the handler is injected into the rest of the system and executed.By doing so, we can easily isolate the logic for a given data type & operation while leveraging polymorphism to avoid filling up the code with 1000x if else statements.We will dig into the implementation in future sections.Streaming over batchYou may ask why we need a streaming engine instead of implementing a batch job that polls the messages at a given frequency.That is a valid question.The thing is thatNowadays, using tools such as Bytewax makes implementing streaming pipelines a lot more frictionless than using their JVM alternatives.The key aspect of choosing a streaming vs. a batch design is real-time synchronization between your source and destination DBs.In our particular case, we will process social media data, which changes fast and irregularly.Also, for our digital twin, it is important to do RAG on up-to-date data. We dont want to have any delay between what happens in the real world and what your LLM twin sees.That being said choosing a streaming architecture seemed natural in our use case.3. The Bytewax streaming flowThe Bytewax flow is the central point of the streaming pipeline. It defines all the required steps, following the next simplified pattern: input -> processing -> output.As I come from the AI world, I like to see it as the graph of the streaming pipeline, where you use the input(), map(), and output() Bytewax functions to define your graph, which in the Bytewax world is called a flow.As you can see in the code snippet below, we ingest posts, articles or code messages from a RabbitMQ queue. After we clean, chunk and embed them. Ultimately, we load the cleaned and embedded data to a Qdrant vector DB, which in our LLM twin use case will represent the feature store of our system.To structure and validate the data, between each Bytewax step, we map and pass a different Pydantic model based on its current state: raw, cleaned, chunked, or embedded.Bytewax flow GitHub Code We have a single streaming pipeline that processes everything.As we ingest multiple data types (posts, articles, or code snapshots), we have to process them differently.To do this the right way, we implemented a dispatcher layer that knows how to apply data-specific operations based on the type of message.More on this in the next sections Why Bytewax?Bytewax is an open-source streaming processing framework that:- is built in Rust for performance- has Python bindings for leveraging its powerful ML ecosystem so, for all the Python fanatics out there, no more JVM headaches for you.Jokes aside, here is why Bytewax is so powerful - Bytewax local setup is plug-and-play- can quickly be integrated into any Python project (you can go wild even use it in Notebooks)- can easily be integrated with other Python packages (NumPy, PyTorch, HuggingFace, OpenCV, SkLearn, you name it)- out-of-the-box connectors for Kafka and local files, or you can quickly implement your ownWe used Bytewax to build the streaming pipeline for the LLM Twin course and loved it.To learn more about Bytewax, go and check them out. They are open source, so no strings attached Bytewax [2] 4. Pydantic data modelsLets take a look at what our Pydantic models look like.First, we defined a set of base abstract models for using the same parent class across all our components.Pydantic base model structure GitHub Code Afterward, we defined a hierarchy of Pydantic models for:all our data types: posts, articles, or codeall our states: raw, cleaned, chunked, and embeddedThis is how the set of classes for the posts will look like Pydantic posts model structure GitHub Code We repeated the same process for the articles and code model hierarchy.Check out the other data classes on our GitHub.Why is keeping our data in Pydantic models so powerful?There are 4 main criteria:every field has an enforced type: you are ensured the data types are going to be correctthe fields are automatically validated based on their type: for example, if the field is a string and you pass an int, it will through an errorthe data structure is clear and verbose: no more clandestine dicts that you never know what is in themyou make your data the first-class citizen of your program5. Load data to QdrantThe first step is to implement our custom Bytewax DynamicSink class Qdrant DynamicSink GitHub Code Next, for every type of operation we need (output cleaned or embedded data ) we have to subclass the StatelessSinkPartition Bytewax class (they also provide a stateful option more in their docs)An instance of the class will run on every partition defined within the Bytewax deployment.In the course, we are using a single partition per worker. But, by adding more partitions (and workers), you can quickly scale your Bytewax pipeline horizontally.Qdrant worker partitions GitHub Code Note that we used Qdrants Batch method to upload all the available points at once. By doing so, we reduce the latency on the network I/O side: more on that here [8] The RabbitMQ streaming input follows a similar pattern. Check it out here 6. The dispatcher layerNow that we have the Bytewax flow and all our data models.How do we map a raw data model to a cleaned data model? All our domain logic is modeled by a set of Handler() classes.For example, this is how the handler used to map a PostsRawModel to a PostCleanedModel looks like Handler hierarchy of classes GitHub Code Check out the other handlers on our GitHub: ChunkingDataHandler and EmbeddingDataHandlerIn the next sections, we will explore the exact cleaning, chunking and embedding logic.Now, to build our dispatcher, we need 2 last components:a factory class: instantiates the right handler based on the type of the eventa dispatcher class: the glue code that calls the factory class and handlerHere is what the cleaning dispatcher and factory look like The dispatcher and factory classes GitHub Code Check out the other dispatchers on our GitHub.By repeating the same logic, we will end up with the following set of dispatchers:RawDispatcher (no factory class required as the data is not processed)CleaningDispatcher (with a ChunkingHandlerFactory class)ChunkingDispatcher (with a ChunkingHandlerFactory class)EmbeddingDispatcher (with an EmbeddingHandlerFactory class)7. Preprocessing steps: Clean, chunk, embedHere we will focus on the concrete logic used to clean, chunk, and embed a data point.Note that this logic is wrapped by our handler to be integrated into our dispatcher layer using the Strategy behavioral pattern [10].We already described that in the previous section. Thus, we will directly jump into the actual logic here, which can be found in the utils module of our GitHub repository.Note: These steps are experimental. Thus, what we present here is just the first iteration of the system. In a real-world scenario, you would experiment with different cleaning, chunking or model versions to improve it on your data.CleaningThis is the main utility function used to clean the text for our posts, articles, and code.Out of simplicity, we used the same logic for all the data types, but after more investigation, you would probably need to adapt it to your specific needs.For example, your posts might start containing some weird characters, and you dont want to run the unbold_text() or unitalic_text() functions on your code data point as is completely redundant.Cleaning logic GitHub Code Most of the functions above are from the unstructured [3] Python package. It is a great tool for quickly finding utilities to clean text data. More examples of unstructured here [3] One key thing to notice is that at the cleaning step, we just want to remove all the weird, non-interpretable characters from the text.Also, we want to remove redundant data, such as extra whitespace or URLs, as they do not provide much value.These steps are critical for our tokenizer to understand and efficiently transform our string input into numbers that will be fed into the transformer models.Note that when using bigger models (transformers) + modern tokenization techniques, you dont need to standardize your dataset too much.For example, it is redundant to apply lemmatization or stemming, as the tokenizer knows how to split your input into a commonly used sequence of characters efficiently, and the transformers can pick up the nuances of the words. What is important at the cleaning step is to throw out the noise.ChunkingWe are using Langchain to chunk our text.We use a 2 step strategy using Langchains RecursiveCharacterTextSplitter [4] and SentenceTransformersTokenTextSplitter [5]. As seen below Chunking logic GitHub Code Overlapping your chunks is a common pre-indexing RAG technique, which helps to cluster chunks from the same document semantically.Again, we are using the same chunking logic for all of our data types, but to get the most out of it, we would probably need to tweak the separators, chunk_size, and chunk_overlap parameters for our different use cases.But our dispatcher + handler architecture would easily allow us to configure the chunking step in future iterations.EmbeddingThe data preprocessing, aka the hard part is done.Now we just have to call an embedding model to create our vectors.Embedding logic GitHub Code We used the all-MiniLm-L6-v2 [6] from the sentence-transformers library to embed our articles and posts: a lightweight embedding model that can easily run in real-time on a 2 vCPU machine.As the code data points contain more complex relationships and specific jargon to embed, we used a more powerful embedding model: hkunlp/instructor-xl [7].This embedding model is unique as it can be customized on the fly with instructions based on your particular data. This allows the embedding model to specialize on your data without fine-tuning, which is handy for embedding pieces of code.8. The AWS infrastructureIn Lesson 2, we covered how to deploy the data collection pipeline that is triggered by a link to Medium, Substack, LinkedIn or GitHub crawls the given link saves the crawled information to a MongoDB.In Lesson 3, we explained how to deploy the CDC components that emit events to a RabbitMQ queue based on any CRUD operation done to MongoDB.What is left is to deploy the Bytewax streaming pipeline and Qdrant vector DB.We will use Qdrants self-hosted option, which is easy to set up and scale.To test things out, they offer a Free Tier plan for up to a 1GB cluster, which is more than enough for our course. We explained in our GitHub repository how to configure Qdrant.AWS infrastructure of the feature/streaming pipeline.The last piece of the puzzle is the Bytewax streaming pipeline.As we dont require a GPU and the streaming pipeline needs to run 24/7, we will deploy it to AWS Fargate, a cost-effective serverless solution from AWS.As a serverless solution, Fargate allows us to deploy our code quickly and scale it fast in case of high traffic.How do we deploy the streaming pipeline code to Fargate?Using GitHub Actions, we wrote a CD pipeline that builds a Docker image on every new commit made on the main branch.After, the Docker image is pushed to AWS ECR. Ultimately, Fargate pulls the latest version of the Docker image.This is a common CD pipeline to deploy your code to AWS services.Why not use lambda functions, as we did for the data pipeline?An AWS lambda function executes a function once and then closes down.This worked perfectly for the crawling logic, but it won't work for our streaming pipeline, which has to run 24/7.9. Run the code locallyTo quickly test things up, we wrote a docker-compose.yaml file to spin up the MongoDB, RabbitMQ queue and Qdrant vector db.You can spin up the Docker containers using our Makefile by running the following:make local-start-infraTo fully test the Bytewax streaming pipeline, you have to start the CDC component by running:make local-start-cdcUltimately, you start the streaming pipeline:make local-bytewaxTo simulate the data collection pipeline, mock it as follows:make local-insert-data-mongoThe README of our GitHub repository provides more details on how to run and set up everything.10. Deploy the code to AWS & Run it from the cloudThis article is already too long, so I wont go into the details of how to deploy the AWS infrastructure described above and test it out here.But to give you some insights, we have used Pulumi as our infrastructure as a code (IaC) tool, which will allow you to spin it quickly with a few commands.Also, I wont let you hang on to this one. We made a promise and We prepared step-by-step instructions in the README of our GitHub repository on how to use Pulumni to spin up the infrastructure and test it out.ConclusionNow you know how to write streaming pipelines like a PRO!In Lesson 4, you learned how to:design a feature pipeline using the 3-pipeline architecturewrite a streaming pipeline using Bytewax as a streaming engineuse a dispatcher layer to write a modular and flexible application to process multiple types of data (posts, articles, code)load the cleaned and embedded data to Qdrantdeploy the streaming pipeline to AWS This is only the ingestion part used for fine-tuning LLMs and RAG.In Lesson 5, you will learn how to write a retrieval client for the 3 data types using good SWE practices and improve the retrieval accuracy using advanced retrieval & post-retrieval techniques. See you there! Check out the code on GitHub [1] and support us with a Enjoyed This Article?Join the Decoding ML Newsletter for battle-tested content on designing, coding, and deploying production-grade ML & MLOps systems. Every week. For FREE Decoding ML Newsletter | Paul Iusztin | SubstackJoin for battle-tested content on designing, coding, and deploying production-grade ML & MLOps systems. Every week. Fordecodingml.substack.comReferencesLiterature[1] Your LLM Twin Course GitHub Repository (2024), Decoding ML GitHub Organization[2] Bytewax, Bytewax Landing Page[3] Unstructured Cleaning Examples, Unstructured Documentation[4] Recursively split by character, LangChains Documentation[5] Split by tokens, LangChains Documentation[6] sentence-transformers/all-MiniLM-L6-v2, HuggingFace[7] hkunlp/instructor-xl, HuggingFace[8] Qdrant, Qdrant Documentation[9] Abstract Factory Pattern, Refactoring Guru[10] Strategy Pattern, Refactoring GuruImagesIf not otherwise stated, all images are created by the author.Sign up to discover human stories that deepen your understanding of the world.FreeDistraction-free reading. No ads.Organize your knowledge with lists and highlights.Tell your story. Find your audience.Sign up for freeMembershipAccess the best member-only stories.Support independent authors.Listen to audio narrations.Read offline.Join the Partner Program and earn for your writing.Try for $5/monthMl System DesignMachine LearningArtificial IntelligenceData ScienceSoftware Engineering698698FollowWritten by Paul Iusztin2.4K FollowersEditor for Decoding ML Senior ML Engineer | Helping machine learning engineers design and productionize ML systems. | Decoding ML Newsletter: [URL] from Paul Iusztin and Decoding MLPaul IusztininDecoding MLAn End-to-End Framework for Production-Ready LLM Systems by Building Your LLM TwinFrom data gathering to productionizing LLMs using LLMOps good practices.16 min readMar 16, 20241.5K10Razvant AlexandruinDecoding MLHow to build a Real-Time News Search Engine using Serverless Upstash Kafka and Vector DBA hands-on guide to implementing a live news aggregating streaming pipeline with Apache Kafka, Bytewax, and Upstash Vector Database.19 min readApr 13, 20246873Paul IusztininDecoding MLThe LLMs kit: Build a production-ready real-time financial advisor system using streamingLesson 1: LLM architecture system design using the 3-pipeline pattern12 min readJan 5, 2024383Paul IusztininDecoding MLA Real-time Retrieval System for RAG on Social Media DataUse a streaming engine to populate a vector DB in real-time. Improve RAG accuracy using rerank & UMAP.12 min readMar 30, 2024305See all from Paul IusztinSee all from Decoding MLRecommended from MediumVipra SinghBuilding LLM Applications: Serving LLMs (Part 9)Learn Large Language Models ( LLM ) through the lens of a Retrieval Augmented Generation ( RAG ) Application.49 min readApr 18, 20243741A B Vijay KumarMulti-Agent System\\u200a\\u200aCrew.AIMulti-Agent systems are LLM applications that are changing the automation landscape with intelligent bots.7 min readApr 18, 20241574ListsPredictive Modeling w/ Python20 stories1126 savesNatural Language Processing1402 stories899 savesPractical Guides to Machine Learning10 stories1352 savesdata science and AI40 stories137 savesFabio MatricardiinGenerative AILlama3 is out and you can run it on your Computer!After only 1 day from the release, here is how you can run even on your Laptop with CPU only the latest Meta-AI model.8 min read6 days ago1.2K13Gavin LiinAI AdvancesRun the strongest open-source LLM model: Llama3 70B with just a single 4GB GPU!The strongest open source LLM model Llama3 has been released, Here is how you can run Llama3 70B locally with just 4GB GPU, even on Macbook4 min read4 days ago7982Plaban NayakinThe AI ForumSemantic Chunking for RAGWhat is Chunking\\xa0?17 min read4 days ago1651Damian GilinTowards Data ScienceAdvanced Retriever Techniques to Improve Your RAGsMaster Advanced Information Retrieval: Cutting-edge Techniques to Optimize the Selection of Relevant Documents with Langchain to Create18 min readApr 17, 20245393See more recommendationsHelpStatusAboutCareersBlogPrivacyTermsText to speechTeams\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nTo make Medium work, we log user data. By using Medium, you agree to our Privacy Policy, including cookie policy."}, {"instruction": "Create a publication on Medium named 'Decoding ML' focusing on producing high-quality content on ML system design, ML engineering, MLOps, large language models, and computer vision. Offer weekly battle-tested advice based on 10+ years of experience in AI, with an emphasis on hands-on content and real-world applications.", "content": "About Decoding MLThe hub for continuous learning on ML system design, ML engineering, MLOps, LLMs and computer vision.About Decoding ML. The hub for continuous learning on ML | by Paul Iusztin | Decoding ML | MediumOpen in appSign upSign inWriteSign upSign inMastodonAbout Decoding MLThe hub for continuous learning on ML system design, ML engineering, MLOps, LLMs and computer vision.Paul IusztinFollowPublished inDecoding ML2 min readFeb 19, 202491ListenShareDecoding ML is a publication that creates battle-tested content on building production-grade ML systems leveraging good SWE and MLOps practices.Our motto is More engineering, less F1 scores.Following Decoding ML, you will learn about the entire lifecycle of an ML system, from system design to deploying and monitoring.Decoding ML is the hub for continuous learning on:ML system designML engineeringMLOpsLarge language modelsComputer visionWe are all about end-to-end ML use cases that can directly be applied in the real world no stories just hands-on content.The minds behind Decoding ML Alex Vesa (left), Paul Iusztin (middle) and Alexandru Razvant (right)The minds behind Decoding ML are Vesa Alexandru, Paul Iusztin and Razvant Alexandru.Our passion for constantly learning and engineering production-ready ML systems inevitably turned into Decoding ML.With our 10+ years of hands-on experience in the industry in:Data ScienceDeep LearningComputer VisionGenerative AIML InfrastructureMLOpsSoftware Engineeringwe decided it is about time to share it with the world!Why follow?Join Decoding ML for battle-tested content on designing, coding, and deploying production-grade ML & MLOps systems. Every week. For FREE.No more bedtime stories in Jupyter Notebooks. DML is all about hands-on advice from our 10+ years of experience in AI.We are also on: Newsletter GitHubSign up to discover human stories that deepen your understanding of the world.FreeDistraction-free reading. No ads.Organize your knowledge with lists and highlights.Tell your story. Find your audience.Sign up for freeMembershipAccess the best member-only stories.Support independent authors.Listen to audio narrations.Read offline.Join the Partner Program and earn for your writing.Try for $5/monthAbout9191FollowWritten by Paul Iusztin2.4K FollowersEditor for Decoding ML Senior ML Engineer | Helping machine learning engineers design and productionize ML systems. | Decoding ML Newsletter: [URL] from Paul Iusztin and Decoding MLPaul IusztininDecoding MLAn End-to-End Framework for Production-Ready LLM Systems by Building Your LLM TwinFrom data gathering to productionizing LLMs using LLMOps good practices.16 min readMar 16, 20241.5K10Razvant AlexandruinDecoding MLHow to build a Real-Time News Search Engine using Serverless Upstash Kafka and Vector DBA hands-on guide to implementing a live news aggregating streaming pipeline with Apache Kafka, Bytewax, and Upstash Vector Database.19 min readApr 13, 20246873Paul IusztininDecoding MLThe LLMs kit: Build a production-ready real-time financial advisor system using streamingLesson 1: LLM architecture system design using the 3-pipeline pattern12 min readJan 5, 2024383Paul IusztininDecoding MLA Real-time Retrieval System for RAG on Social Media DataUse a streaming engine to populate a vector DB in real-time. Improve RAG accuracy using rerank & UMAP.12 min readMar 30, 2024305See all from Paul IusztinSee all from Decoding MLRecommended from MediumQwakHow to Build an End-to-End ML Pipeline in 2024Learn to build an end-to-end ML pipeline and streamline your ML workflows in 2024, from data ingestion to model deployment and performance24 min readApr 7, 20242071Paul IusztininDecoding MLThe LLMs kit: Build a production-ready real-time financial advisor system using streamingLesson 1: LLM architecture system design using the 3-pipeline pattern12 min readJan 5, 2024383ListsMedium's Huge List of Publications Accepting Submissions285 stories2516 savesYesmine RouisinTheFork Engineering BlogA Guide to MLOps with Airflow and MLflowIntroduction11 min readNov 6, 2023319ManralaiMastering MLOps for FreeYour Go-To GitHub Repositories Collection4 min readJan 28, 20246463Vipra SinghBuilding LLM Applications: Evaluation (Part 8)Learn Large Language Models ( LLM ) through the lens of a Retrieval Augmented Generation ( RAG ) Application.47 min readApr 8, 20241891Ramazan OlmezEnd-to-End Machine Learning Project: Churn PredictionThe main objective of this article is to develop an end-to-end machine learning project. For a model to be truly useful, it needs to be18 min readFeb 22, 202487See more recommendationsHelpStatusAboutCareersBlogPrivacyTermsText to speechTeams\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nTo make Medium work, we log user data. By using Medium, you agree to our Privacy Policy, including cookie policy."}, {"instruction": "Explain the importance of data pipelines in the era of generative AI", "content": "An End-to-End Framework for Production-Ready LLM Systems by Building Your LLM TwinFrom data gathering to productionizing LLMs using LLMOps good practices.End-to-End Framework for Production-Ready LLMs | Decoding MLOpen in appSign upSign inWriteSign upSign inMastodonLLM Twin Course: Building Your Production-Ready AI ReplicaAn End-to-End Framework for Production-Ready LLM Systems by Building Your LLM TwinFrom data gathering to productionizing LLMs using LLMOps good practices.Paul IusztinFollowPublished inDecoding ML16 min readMar 16, 20241.5K10ListenShare the 1st out of 11 lessons of the LLM Twin free courseWhat is your LLM Twin? It is an AI character that writes like yourself by incorporating your style, personality and voice into an LLM.Image by DALL-EWhy is this course different?By finishing the LLM Twin: Building Your Production-Ready AI Replica free course, you will learn how to design, train, and deploy a production-ready LLM twin of yourself powered by LLMs, vector DBs, and LLMOps good practices.Why should you care? No more isolated scripts or Notebooks! Learn production ML by building and deploying an end-to-end production-grade LLM system.What will you learn to build by the end of this course?You will learn how to architect and build a real-world LLM system from start to finish from data collection to deployment.You will also learn to leverage MLOps best practices, such as experiment trackers, model registries, prompt monitoring, and versioning.The end goal? Build and deploy your own LLM twin.The architecture of the LLM twin is split into 4 Python microservices:the data collection pipeline: crawl your digital data from various social media platforms. Clean, normalize and load the data to a NoSQL DB through a series of ETL pipelines. Send database changes to a queue using the CDC pattern. (deployed on AWS)the feature pipeline: consume messages from a queue through a Bytewax streaming pipeline. Every message will be cleaned, chunked, embedded (using Superlinked), and loaded into a Qdrant vector DB in real-time. (deployed on AWS)the training pipeline: create a custom dataset based on your digital data. Fine-tune an LLM using QLoRA. Use Comet MLs experiment tracker to monitor the experiments. Evaluate and save the best model to Comets model registry. (deployed on Qwak)the inference pipeline: load and quantize the fine-tuned LLM from Comets model registry. Deploy it as a REST API. Enhance the prompts using RAG. Generate content using your LLM twin. Monitor the LLM using Comets prompt monitoring dashboard. (deployed on Qwak)LLM twin system architecture [Image by the Author]Along the 4 microservices, you will learn to integrate 3 serverless tools:Comet ML as your ML Platform;Qdrant as your vector DB;Qwak as your ML infrastructure;Who is this for?Audience: MLE, DE, DS, or SWE who want to learn to engineer production-ready LLM systems using LLMOps good principles.Level: intermediatePrerequisites: basic knowledge of Python, ML, and the cloudHow will you learn?The course contains 11 hands-on written lessons and the open-source code you can access on GitHub.You can read everything at your own pace. To get the most out of this course, we encourage you to clone and run the repository while you cover the lessons.Costs?The articles and code are completely free. They will always remain free.But if you plan to run the code while reading it, you have to know that we use several cloud tools that might generate additional costs.The cloud computing platforms (AWS, Qwak) have a pay-as-you-go pricing plan. Qwak offers a few hours of free computing. Thus, we did our best to keep costs to a minimum.For the other serverless tools (Qdrant, Comet), we will stick to their freemium version, which is free of charge.Meet your teachers!The course is created under the Decoding ML umbrella by:Paul Iusztin | Senior ML & MLOps EngineerAlex Vesa | Senior AI EngineerAlex Razvant | Senior ML & MLOps EngineerLessonsThe course is split into 11 lessons. Every Medium article will be its own lesson.An End-to-End Framework for Production-Ready LLM Systems by Building Your LLM TwinThe Importance of Data Pipelines in the Era of Generative AIChange Data Capture: Enabling Event-Driven ArchitecturesSOTA Python Streaming Pipelines for Fine-tuning LLMs and RAG in Real-Time!Vector DB retrieval clients [Module 2] WIPTraining data preparation [Module 3] WIPFine-tuning LLM [Module 3] WIPLLM evaluation [Module 4] WIPQuantization [Module 5] WIPBuild the digital twin inference pipeline [Module 6] WIPDeploy the digital twin as a REST API [Module 6] WIP Check out the code on GitHub [1] and support us with a Lets start with Lesson 1 Lesson 1: End-to-end framework for production-ready LLM systemsIn the first lesson, we will present the project you will build during the course: your production-ready LLM Twin/AI replica.Afterward, we will explain what the 3-pipeline design is and how it is applied to a standard ML system.Ultimately, we will dig into the LLM project system design.We will present all our architectural decisions regarding the design of the data collection pipeline for social media data and how we applied the 3-pipeline architecture to our LLM microservices.In the following lessons, we will examine each components code and learn how to implement and deploy it to AWS and Qwak.LLM twin system architecture [Image by the Author]Table of ContentsWhat are you going to build? The LLM twin conceptThe 3-pipeline architectureLLM twin system design Check out the code on GitHub [1] and support us with a 1. What are you going to build? The LLM twin conceptThe outcome of this course is to learn to build your own AI replica. We will use an LLM to do that, hence the name of the course: LLM Twin: Building Your Production-Ready AI Replica.But what is an LLM twin?Shortly, your LLM twin will be an AI character who writes like you, using your writing style and personality.It will not be you. It will be your writing copycat.More concretely, you will build an AI replica that writes social media posts or technical articles (like this one) using your own voice.Why not directly use ChatGPT? You may askWhen trying to generate an article or post using an LLM, the results tend to:be very generic and unarticulated,contain misinformation (due to hallucination),require tedious prompting to achieve the desired result.But here is what we are going to do to fix that First, we will fine-tune an LLM on your digital data gathered from LinkedIn, Medium, Substack and GitHub.By doing so, the LLM will align with your writing style and online personality. It will teach the LLM to talk like the online version of yourself.Have you seen the universe of AI characters Meta released in 2024 in the Messenger app? If not, you can learn more about it here [2].To some extent, that is what we are going to build.But in our use case, we will focus on an LLM twin who writes social media posts or articles that reflect and articulate your voice.For example, we can ask your LLM twin to write a LinkedIn post about LLMs. Instead of writing some generic and unarticulated post about LLMs (e.g., what ChatGPT will do), it will use your voice and style.Secondly, we will give the LLM access to a vector DB to access external information to avoid hallucinating. Thus, we will force the LLM to write only based on concrete data.Ultimately, in addition to accessing the vector DB for information, you can provide external links that will act as the building block of the generation process.For example, we can modify the example above to: Write me a 1000-word LinkedIn post about LLMs based on the article from this link: [URL].Excited? Lets get started 2. The 3-pipeline architectureWe all know how messy ML systems can get. That is where the 3-pipeline architecture kicks in.The 3-pipeline design brings structure and modularity to your ML system while improving your MLOps processes.ProblemDespite advances in MLOps tooling, transitioning from prototype to production remains challenging.In 2022, only 54% of the models get into production. Auch.So what happens?Maybe the first things that come to your mind are:the model is not mature enoughsecurity risks (e.g., data privacy)not enough dataTo some extent, these are true.But the reality is that in many scenariosthe architecture of the ML system is built with research in mind, or the ML system becomes a massive monolith that is extremely hard to refactor from offline to online.So, good SWE processes and a well-defined architecture are as crucial as using suitable tools and models with high accuracy.Solution The 3-pipeline architectureLets understand what the 3-pipeline design is.It is a mental map that helps you simplify the development process and split your monolithic ML pipeline into 3 components:1. the feature pipeline2. the training pipeline3. the inference pipelinealso known as the Feature/Training/Inference (FTI) architecture.#1. The feature pipeline transforms your data into features & labels, which are stored and versioned in a feature store. The feature store will act as the central repository of your features. That means that features can be accessed and shared only through the feature store.#2. The training pipeline ingests a specific version of the features & labels from the feature store and outputs the trained model weights, which are stored and versioned inside a model registry. The models will be accessed and shared only through the model registry.#3. The inference pipeline uses a given version of the features from the feature store and downloads a specific version of the model from the model registry. Its final goal is to output the predictions to a client.The 3-pipeline architecture [Image by the Author].This is why the 3-pipeline design is so beautiful:- it is intuitive- it brings structure, as on a higher level, all ML systems can be reduced to these 3 components- it defines a transparent interface between the 3 components, making it easier for multiple teams to collaborate- the ML system has been built with modularity in mind since the beginning- the 3 components can easily be divided between multiple teams (if necessary)- every component can use the best stack of technologies available for the job- every component can be deployed, scaled, and monitored independently- the feature pipeline can easily be either batch, streaming or bothBut the most important benefit is thatby following this pattern, you know 100% that your ML model will move out of your Notebooks into production. If you want to learn more about the 3-pipeline design, I recommend this excellent article [3] written by Jim Dowling, one of the creators of the FTI architecture.3. LLM Twin System designLets understand how to apply the 3-pipeline architecture to our LLM system.The architecture of the LLM twin is split into 4 Python microservices:The data collection pipelineThe feature pipelineThe training pipelineThe inference pipelineLLM twin system architecture [Image by the Author]As you can see, the data collection pipeline doesnt follow the 3-pipeline design. Which is true.It represents the data pipeline that sits before the ML system.The data engineering team usually implements it, and its scope is to gather, clean, normalize and store the data required to build dashboards or ML models.But lets say you are part of a small team and have to build everything yourself, from data gathering to model deployment.Thus, we will show you how the data pipeline nicely fits and interacts with the FTI architecture.Now, lets zoom in on each component to understand how they work individually and interact with each other. 3.1. The data collection pipelineIts scope is to crawl data for a given user from:Medium (articles)Substack (articles)LinkedIn (posts)GitHub (code)As every platform is unique, we implemented a different Extract Transform Load (ETL) pipeline for each website. 1-min read on ETL pipelines [4]However, the baseline steps are the same for each platform.Thus, for each ETL pipeline, we can abstract away the following baseline steps:log in using your credentialsuse selenium to crawl your profileuse BeatifulSoup to parse the HTMLclean & normalize the extracted HTMLsave the normalized (but still raw) data to Mongo DBImportant note: We are crawling only our data, as most platforms do not allow us to access other peoples data due to privacy issues. But this is perfect for us, as to build our LLM twin, we need only our own digital data.Why Mongo DB?We wanted a NoSQL database that quickly allows us to store unstructured data (aka text).How will the data pipeline communicate with the feature pipeline?We will use the Change Data Capture (CDC) pattern to inform the feature pipeline of any change on our Mongo DB. 1-min read on the CDC pattern [5]To explain the CDC briefly, a watcher listens 24/7 for any CRUD operation that happens to the Mongo DB.The watcher will issue an event informing us what has been modified. We will add that event to a RabbitMQ queue.The feature pipeline will constantly listen to the queue, process the messages, and add them to the Qdrant vector DB.For example, when we write a new document to the Mongo DB, the watcher creates a new event. The event is added to the RabbitMQ queue; ultimately, the feature pipeline consumes and processes it.Doing this ensures that the Mongo DB and vector DB are constantly in sync.With the CDC technique, we transition from a batch ETL pipeline (our data pipeline) to a streaming pipeline (our feature pipeline).Using the CDC pattern, we avoid implementing a complex batch pipeline to compute the difference between the Mongo DB and vector DB. This approach can quickly get very slow when working with big data.Where will the data pipeline be deployed?The data collection pipeline and RabbitMQ service will be deployed to AWS. We will also use the freemium serverless version of Mongo DB.3.2. The feature pipelineThe feature pipeline is implemented using Bytewax (a Rust streaming engine with a Python interface). Thus, in our specific use case, we will also refer to it as a streaming ingestion pipeline.It is an entirely different service than the data collection pipeline.How does it communicate with the data pipeline?As explained above, the feature pipeline communicates with the data pipeline through a RabbitMQ queue.Currently, the streaming pipeline doesnt care how the data is generated or where it comes from.It knows it has to listen to a given queue, consume messages from there and process them.By doing so, we decouple the two components entirely. In the future, we can easily add messages from multiple sources to the queue, and the streaming pipeline will know how to process them. The only rule is that the messages in the queue should always respect the same structure/interface.What is the scope of the feature pipeline?It represents the ingestion component of the RAG system.It will take the raw data passed through the queue and:clean the data;chunk it;embed it using the embedding models from Superlinked;load it to the Qdrant vector DB.Every type of data (post, article, code) will be processed independently through its own set of classes.Even though all of them are text-based, we must clean, chunk and embed them using different strategies, as every type of data has its own particularities.What data will be stored?The training pipeline will have access only to the feature store, which, in our case, is represented by the Qdrant vector DB.Note that a vector DB can also be used as a NoSQL DB.With these 2 things in mind, we will store in Qdrant 2 snapshots of our data:1. The cleaned data (without using vectors as indexes store them in a NoSQL fashion).2. The cleaned, chunked, and embedded data (leveraging the vector indexes of Qdrant)The training pipeline needs access to the data in both formats as we want to fine-tune the LLM on standard and augmented prompts.With the cleaned data, we will create the prompts and answers.With the chunked data, we will augment the prompts (aka RAG).Why implement a streaming pipeline instead of a batch pipeline?There are 2 main reasons.The first one is that, coupled with the CDC pattern, it is the most efficient way to sync two DBs between each other. Otherwise, you would have to implement batch polling or pushing techniques that arent scalable when working with big data.Using CDC + a streaming pipeline, you process only the changes to the source DB without any overhead.The second reason is that by doing so, your source and vector DB will always be in sync. Thus, you will always have access to the latest data when doing RAG.Why Bytewax?Bytewax is a streaming engine built in Rust that exposes a Python interface. We use Bytewax because it combines Rusts impressive speed and reliability with the ease of use and ecosystem of Python. It is incredibly light, powerful, and easy for a Python developer.Where will the feature pipeline be deployed?The feature pipeline will be deployed to AWS. We will also use the freemium serverless version of Qdrant.3.3. The training pipelineHow do we have access to the training features?As highlighted in section 3.2, all the training data will be accessed from the feature store. In our case, the feature store is the Qdrant vector DB that contains:the cleaned digital data from which we will create prompts & answers;we will use the chunked & embedded data for RAG to augment the cleaned data.We will implement a different vector DB retrieval client for each of our main types of data (posts, articles, code).We must do this separation because we must preprocess each type differently before querying the vector DB, as each type has unique properties.Also, we will add custom behavior for each client based on what we want to query from the vector DB. But more on this in its dedicated lesson.What will the training pipeline do?The training pipeline contains a data-to-prompt layer that will preprocess the data retrieved from the vector DB into prompts.It will also contain an LLM fine-tuning module that inputs a HuggingFace dataset and uses QLoRA to fine-tune a given LLM (e.g., Mistral). By using HuggingFace, we can easily switch between different LLMs so we wont focus too much on any specific LLM.All the experiments will be logged into Comet MLs experiment tracker.We will use a bigger LLM (e.g., GPT4) to evaluate the results of our fine-tuned LLM. These results will be logged into Comets experiment tracker.Where will the production candidate LLM be stored?We will compare multiple experiments, pick the best one, and issue an LLM production candidate for the model registry.After, we will inspect the LLM production candidate manually using Comets prompt monitoring dashboard. If this final manual check passes, we will flag the LLM from the model registry as accepted.A CI/CD pipeline will trigger and deploy the new LLM version to the inference pipeline.Where will the training pipeline be deployed?The training pipeline will be deployed to Qwak.Qwak is a serverless solution for training and deploying ML models. It makes scaling your operation easy while you can focus on building.Also, we will use the freemium version of Comet ML for the following:experiment tracker;model registry;prompt monitoring.3.4. The inference pipelineThe inference pipeline is the final component of the LLM system. It is the one the clients will interact with.It will be wrapped under a REST API. The clients can call it through HTTP requests, similar to your experience with ChatGPT or similar tools.How do we access the features?To access the feature store, we will use the same Qdrant vector DB retrieval clients as in the training pipeline.In this case, we will need the feature store to access the chunked data to do RAG.How do we access the fine-tuned LLM?The fine-tuned LLM will always be downloaded from the model registry based on its tag (e.g., accepted) and version (e.g., v1.0.2, latest, etc.).How will the fine-tuned LLM be loaded?Here we are in the inference world.Thus, we want to optimize the LLM's speed and memory consumption as much as possible. That is why, after downloading the LLM from the model registry, we will quantize it.What are the components of the inference pipeline?The first one is the retrieval client used to access the vector DB to do RAG. This is the same module as the one used in the training pipeline.After we have a query to prompt the layer, that will map the prompt and retrieved documents from Qdrant into a prompt.After the LLM generates its answer, we will log it to Comets prompt monitoring dashboard and return it to the clients.For example, the client will request the inference pipeline to:Write a 1000-word LinkedIn post about LLMs, and the inference pipeline will go through all the steps above to return the generated post.Where will the inference pipeline be deployed?The inference pipeline will be deployed to Qwak.By default, Qwak also offers autoscaling solutions and a nice dashboard to monitor all the production environment resources.As for the training pipeline, we will use a serverless freemium version of Comet for its prompt monitoring dashboard.ConclusionThis is the 1st article of the LLM Twin: Building Your Production-Ready AI Replica free course.In this lesson, we presented what you will build during the course.After we briefly discussed how to design ML systems using the 3-pipeline design.Ultimately, we went through the system design of the course and presented the architecture of each microservice and how they interact with each other:The data collection pipelineThe feature pipelineThe training pipelineThe inference pipelineIn Lesson 2, we will dive deeper into the data collection pipeline, learn how to implement crawlers for various social media platforms, clean the gathered data, store it in a Mongo DB, and finally, show you how to deploy it to AWS. Check out the code on GitHub [1] and support us with a Have you enjoyed this article? Then Join 5k+ engineers in the Decoding ML Newsletter for battle-tested content on production-grade ML. Every week:Decoding ML Newsletter | Paul Iusztin | SubstackJoin for battle-tested content on designing, coding, and deploying production-grade ML & MLOps systems. Every week. Fordecodingml.substack.comReferences[1] Your LLM Twin Course GitHub Repository (2024), Decoding ML GitHub Organization[2] Introducing new AI experiences from Meta (2023), Meta[3] Jim Dowling, From MLOps to ML Systems with Feature/Training/Inference Pipelines (2023), Hopsworks[4] Extract Transform Load (ETL), Databricks Glossary[5] Daniel Svonava and Paolo Perrone, Understanding the different Data Modality / Types (2023), SuperlinkedSign up to discover human stories that deepen your understanding of the world.FreeDistraction-free reading. No ads.Organize your knowledge with lists and highlights.Tell your story. Find your audience.Sign up for freeMembershipAccess the best member-only stories.Support independent authors.Listen to audio narrations.Read offline.Join the Partner Program and earn for your writing.Try for $5/monthGenerative AiLarge Language ModelsMlopsArtificial IntelligenceMachine Learning1.5K1.5K10FollowWritten by Paul Iusztin2.4K FollowersEditor for Decoding ML Senior ML Engineer | Helping machine learning engineers design and productionize ML systems. | Decoding ML Newsletter: [URL] from Paul Iusztin and Decoding MLPaul IusztininDecoding MLA Real-time Retrieval System for RAG on Social Media DataUse a streaming engine to populate a vector DB in real-time. Improve RAG accuracy using rerank & UMAP.12 min readMar 30, 2024305Razvant AlexandruinDecoding MLHow to build a Real-Time News Search Engine using Serverless Upstash Kafka and Vector DBA hands-on guide to implementing a live news aggregating streaming pipeline with Apache Kafka, Bytewax, and Upstash Vector Database.19 min readApr 13, 20246873Vesa AlexandruinDecoding MLThe Importance of Data Pipelines in the Era of Generative AIFrom unstructured data crawling to structured valuable data17 min readMar 23, 20244343Paul IusztininDecoding MLThe LLMs kit: Build a production-ready real-time financial advisor system using streamingLesson 1: LLM architecture system design using the 3-pipeline pattern12 min readJan 5, 2024383See all from Paul IusztinSee all from Decoding MLRecommended from MediumAlex HoncharinTowards Data ScienceIntro to LLM Agents with Langchain: When RAG is Not EnoughFirst-order principles of brain structure for AI assistants7 min readMar 15, 20242K10Fabio MatricardiinGenerative AILlama3 is out and you can run it on your Computer!After only 1 day from the release, here is how you can run even on your Laptop with CPU only the latest Meta-AI model.8 min read6 days ago1.2K13ListsAI Regulation6 stories427 savesNatural Language Processing1402 stories899 savesPredictive Modeling w/ Python20 stories1126 savesPractical Guides to Machine Learning10 stories1352 savesVipra SinghBuilding LLM Applications: Serving LLMs (Part 9)Learn Large Language Models ( LLM ) through the lens of a Retrieval Augmented Generation ( RAG ) Application.49 min readApr 18, 20243741Mandar Karhade, MD. PhD.inTowards AIWhy RAG Applications Fail in ProductionIt worked as a prototype; then all went down!7 min readMar 19, 20241K11Gavin LiinAI AdvancesRun the strongest open-source LLM model: Llama3 70B with just a single 4GB GPU!The strongest open source LLM model Llama3 has been released, Here is how you can run Llama3 70B locally with just 4GB GPU, even on Macbook4 min read4 days ago7982Bijit GhoshRAG Vs VectorDBIntroduction to RAG and VectorDB14 min readJan 28, 20242384See more recommendationsHelpStatusAboutCareersBlogPrivacyTermsText to speechTeams To make Medium work, we log user data. By using Medium, you agree to our Privacy Policy, including cookie policy."}, {"instruction": "Explain the importance and benefits of the 3-pipeline architecture in ML systems and how it can improve MLOps processes.", "content": "An End-to-End Framework for Production-Ready LLM Systems by Building Your LLM TwinFrom data gathering to productionizing LLMs using LLMOps good practices.End-to-End Framework for Production-Ready LLMs | Decoding MLOpen in appSign upSign inWriteSign upSign inMastodonLLM Twin Course: Building Your Production-Ready AI ReplicaAn End-to-End Framework for Production-Ready LLM Systems by Building Your LLM TwinFrom data gathering to productionizing LLMs using LLMOps good practices.Paul IusztinFollowPublished inDecoding ML16 min readMar 16, 20241.5K10ListenShare the 1st out of 11 lessons of the LLM Twin free courseWhat is your LLM Twin? It is an AI character that writes like yourself by incorporating your style, personality and voice into an LLM.Image by DALL-EWhy is this course different?By finishing the LLM Twin: Building Your Production-Ready AI Replica free course, you will learn how to design, train, and deploy a production-ready LLM twin of yourself powered by LLMs, vector DBs, and LLMOps good practices.Why should you care? No more isolated scripts or Notebooks! Learn production ML by building and deploying an end-to-end production-grade LLM system.What will you learn to build by the end of this course?You will learn how to architect and build a real-world LLM system from start to finish from data collection to deployment.You will also learn to leverage MLOps best practices, such as experiment trackers, model registries, prompt monitoring, and versioning.The end goal? Build and deploy your own LLM twin.The architecture of the LLM twin is split into 4 Python microservices:the data collection pipeline: crawl your digital data from various social media platforms. Clean, normalize and load the data to a NoSQL DB through a series of ETL pipelines. Send database changes to a queue using the CDC pattern. (deployed on AWS)the feature pipeline: consume messages from a queue through a Bytewax streaming pipeline. Every message will be cleaned, chunked, embedded (using Superlinked), and loaded into a Qdrant vector DB in real-time. (deployed on AWS)the training pipeline: create a custom dataset based on your digital data. Fine-tune an LLM using QLoRA. Use Comet MLs experiment tracker to monitor the experiments. Evaluate and save the best model to Comets model registry. (deployed on Qwak)the inference pipeline: load and quantize the fine-tuned LLM from Comets model registry. Deploy it as a REST API. Enhance the prompts using RAG. Generate content using your LLM twin. Monitor the LLM using Comets prompt monitoring dashboard. (deployed on Qwak)LLM twin system architecture [Image by the Author]Along the 4 microservices, you will learn to integrate 3 serverless tools:Comet ML as your ML Platform;Qdrant as your vector DB;Qwak as your ML infrastructure;Who is this for?Audience: MLE, DE, DS, or SWE who want to learn to engineer production-ready LLM systems using LLMOps good principles.Level: intermediatePrerequisites: basic knowledge of Python, ML, and the cloudHow will you learn?The course contains 11 hands-on written lessons and the open-source code you can access on GitHub.You can read everything at your own pace. To get the most out of this course, we encourage you to clone and run the repository while you cover the lessons.Costs?The articles and code are completely free. They will always remain free.But if you plan to run the code while reading it, you have to know that we use several cloud tools that might generate additional costs.The cloud computing platforms (AWS, Qwak) have a pay-as-you-go pricing plan. Qwak offers a few hours of free computing. Thus, we did our best to keep costs to a minimum.For the other serverless tools (Qdrant, Comet), we will stick to their freemium version, which is free of charge.Meet your teachers!The course is created under the Decoding ML umbrella by:Paul Iusztin | Senior ML & MLOps EngineerAlex Vesa | Senior AI EngineerAlex Razvant | Senior ML & MLOps EngineerLessonsThe course is split into 11 lessons. Every Medium article will be its own lesson.An End-to-End Framework for Production-Ready LLM Systems by Building Your LLM TwinThe Importance of Data Pipelines in the Era of Generative AIChange Data Capture: Enabling Event-Driven ArchitecturesSOTA Python Streaming Pipelines for Fine-tuning LLMs and RAG in Real-Time!Vector DB retrieval clients [Module 2] WIPTraining data preparation [Module 3] WIPFine-tuning LLM [Module 3] WIPLLM evaluation [Module 4] WIPQuantization [Module 5] WIPBuild the digital twin inference pipeline [Module 6] WIPDeploy the digital twin as a REST API [Module 6] WIP Check out the code on GitHub [1] and support us with a Lets start with Lesson 1 Lesson 1: End-to-end framework for production-ready LLM systemsIn the first lesson, we will present the project you will build during the course: your production-ready LLM Twin/AI replica.Afterward, we will explain what the 3-pipeline design is and how it is applied to a standard ML system.Ultimately, we will dig into the LLM project system design.We will present all our architectural decisions regarding the design of the data collection pipeline for social media data and how we applied the 3-pipeline architecture to our LLM microservices.In the following lessons, we will examine each components code and learn how to implement and deploy it to AWS and Qwak.LLM twin system architecture [Image by the Author]Table of ContentsWhat are you going to build? The LLM twin conceptThe 3-pipeline architectureLLM twin system design Check out the code on GitHub [1] and support us with a 1. What are you going to build? The LLM twin conceptThe outcome of this course is to learn to build your own AI replica. We will use an LLM to do that, hence the name of the course: LLM Twin: Building Your Production-Ready AI Replica.But what is an LLM twin?Shortly, your LLM twin will be an AI character who writes like you, using your writing style and personality.It will not be you. It will be your writing copycat.More concretely, you will build an AI replica that writes social media posts or technical articles (like this one) using your own voice.Why not directly use ChatGPT? You may askWhen trying to generate an article or post using an LLM, the results tend to:be very generic and unarticulated,contain misinformation (due to hallucination),require tedious prompting to achieve the desired result.But here is what we are going to do to fix that First, we will fine-tune an LLM on your digital data gathered from LinkedIn, Medium, Substack and GitHub.By doing so, the LLM will align with your writing style and online personality. It will teach the LLM to talk like the online version of yourself.Have you seen the universe of AI characters Meta released in 2024 in the Messenger app? If not, you can learn more about it here [2].To some extent, that is what we are going to build.But in our use case, we will focus on an LLM twin who writes social media posts or articles that reflect and articulate your voice.For example, we can ask your LLM twin to write a LinkedIn post about LLMs. Instead of writing some generic and unarticulated post about LLMs (e.g., what ChatGPT will do), it will use your voice and style.Secondly, we will give the LLM access to a vector DB to access external information to avoid hallucinating. Thus, we will force the LLM to write only based on concrete data.Ultimately, in addition to accessing the vector DB for information, you can provide external links that will act as the building block of the generation process.For example, we can modify the example above to: Write me a 1000-word LinkedIn post about LLMs based on the article from this link: [URL].Excited? Lets get started 2. The 3-pipeline architectureWe all know how messy ML systems can get. That is where the 3-pipeline architecture kicks in.The 3-pipeline design brings structure and modularity to your ML system while improving your MLOps processes.ProblemDespite advances in MLOps tooling, transitioning from prototype to production remains challenging.In 2022, only 54% of the models get into production. Auch.So what happens?Maybe the first things that come to your mind are:the model is not mature enoughsecurity risks (e.g., data privacy)not enough dataTo some extent, these are true.But the reality is that in many scenariosthe architecture of the ML system is built with research in mind, or the ML system becomes a massive monolith that is extremely hard to refactor from offline to online.So, good SWE processes and a well-defined architecture are as crucial as using suitable tools and models with high accuracy.Solution The 3-pipeline architectureLets understand what the 3-pipeline design is.It is a mental map that helps you simplify the development process and split your monolithic ML pipeline into 3 components:1. the feature pipeline2. the training pipeline3. the inference pipelinealso known as the Feature/Training/Inference (FTI) architecture.#1. The feature pipeline transforms your data into features & labels, which are stored and versioned in a feature store. The feature store will act as the central repository of your features. That means that features can be accessed and shared only through the feature store.#2. The training pipeline ingests a specific version of the features & labels from the feature store and outputs the trained model weights, which are stored and versioned inside a model registry. The models will be accessed and shared only through the model registry.#3. The inference pipeline uses a given version of the features from the feature store and downloads a specific version of the model from the model registry. Its final goal is to output the predictions to a client.The 3-pipeline architecture [Image by the Author].This is why the 3-pipeline design is so beautiful:- it is intuitive- it brings structure, as on a higher level, all ML systems can be reduced to these 3 components- it defines a transparent interface between the 3 components, making it easier for multiple teams to collaborate- the ML system has been built with modularity in mind since the beginning- the 3 components can easily be divided between multiple teams (if necessary)- every component can use the best stack of technologies available for the job- every component can be deployed, scaled, and monitored independently- the feature pipeline can easily be either batch, streaming or bothBut the most important benefit is thatby following this pattern, you know 100% that your ML model will move out of your Notebooks into production. If you want to learn more about the 3-pipeline design, I recommend this excellent article [3] written by Jim Dowling, one of the creators of the FTI architecture.3. LLM Twin System designLets understand how to apply the 3-pipeline architecture to our LLM system.The architecture of the LLM twin is split into 4 Python microservices:The data collection pipelineThe feature pipelineThe training pipelineThe inference pipelineLLM twin system architecture [Image by the Author]As you can see, the data collection pipeline doesnt follow the 3-pipeline design. Which is true.It represents the data pipeline that sits before the ML system.The data engineering team usually implements it, and its scope is to gather, clean, normalize and store the data required to build dashboards or ML models.But lets say you are part of a small team and have to build everything yourself, from data gathering to model deployment.Thus, we will show you how the data pipeline nicely fits and interacts with the FTI architecture.Now, lets zoom in on each component to understand how they work individually and interact with each other. 3.1. The data collection pipelineIts scope is to crawl data for a given user from:Medium (articles)Substack (articles)LinkedIn (posts)GitHub (code)As every platform is unique, we implemented a different Extract Transform Load (ETL) pipeline for each website. 1-min read on ETL pipelines [4]However, the baseline steps are the same for each platform.Thus, for each ETL pipeline, we can abstract away the following baseline steps:log in using your credentialsuse selenium to crawl your profileuse BeatifulSoup to parse the HTMLclean & normalize the extracted HTMLsave the normalized (but still raw) data to Mongo DBImportant note: We are crawling only our data, as most platforms do not allow us to access other peoples data due to privacy issues. But this is perfect for us, as to build our LLM twin, we need only our own digital data.Why Mongo DB?We wanted a NoSQL database that quickly allows us to store unstructured data (aka text).How will the data pipeline communicate with the feature pipeline?We will use the Change Data Capture (CDC) pattern to inform the feature pipeline of any change on our Mongo DB. 1-min read on the CDC pattern [5]To explain the CDC briefly, a watcher listens 24/7 for any CRUD operation that happens to the Mongo DB.The watcher will issue an event informing us what has been modified. We will add that event to a RabbitMQ queue.The feature pipeline will constantly listen to the queue, process the messages, and add them to the Qdrant vector DB.For example, when we write a new document to the Mongo DB, the watcher creates a new event. The event is added to the RabbitMQ queue; ultimately, the feature pipeline consumes and processes it.Doing this ensures that the Mongo DB and vector DB are constantly in sync.With the CDC technique, we transition from a batch ETL pipeline (our data pipeline) to a streaming pipeline (our feature pipeline).Using the CDC pattern, we avoid implementing a complex batch pipeline to compute the difference between the Mongo DB and vector DB. This approach can quickly get very slow when working with big data.Where will the data pipeline be deployed?The data collection pipeline and RabbitMQ service will be deployed to AWS. We will also use the freemium serverless version of Mongo DB.3.2. The feature pipelineThe feature pipeline is implemented using Bytewax (a Rust streaming engine with a Python interface). Thus, in our specific use case, we will also refer to it as a streaming ingestion pipeline.It is an entirely different service than the data collection pipeline.How does it communicate with the data pipeline?As explained above, the feature pipeline communicates with the data pipeline through a RabbitMQ queue.Currently, the streaming pipeline doesnt care how the data is generated or where it comes from.It knows it has to listen to a given queue, consume messages from there and process them.By doing so, we decouple the two components entirely. In the future, we can easily add messages from multiple sources to the queue, and the streaming pipeline will know how to process them. The only rule is that the messages in the queue should always respect the same structure/interface.What is the scope of the feature pipeline?It represents the ingestion component of the RAG system.It will take the raw data passed through the queue and:clean the data;chunk it;embed it using the embedding models from Superlinked;load it to the Qdrant vector DB.Every type of data (post, article, code) will be processed independently through its own set of classes.Even though all of them are text-based, we must clean, chunk and embed them using different strategies, as every type of data has its own particularities.What data will be stored?The training pipeline will have access only to the feature store, which, in our case, is represented by the Qdrant vector DB.Note that a vector DB can also be used as a NoSQL DB.With these 2 things in mind, we will store in Qdrant 2 snapshots of our data:1. The cleaned data (without using vectors as indexes store them in a NoSQL fashion).2. The cleaned, chunked, and embedded data (leveraging the vector indexes of Qdrant)The training pipeline needs access to the data in both formats as we want to fine-tune the LLM on standard and augmented prompts.With the cleaned data, we will create the prompts and answers.With the chunked data, we will augment the prompts (aka RAG).Why implement a streaming pipeline instead of a batch pipeline?There are 2 main reasons.The first one is that, coupled with the CDC pattern, it is the most efficient way to sync two DBs between each other. Otherwise, you would have to implement batch polling or pushing techniques that arent scalable when working with big data.Using CDC + a streaming pipeline, you process only the changes to the source DB without any overhead.The second reason is that by doing so, your source and vector DB will always be in sync. Thus, you will always have access to the latest data when doing RAG.Why Bytewax?Bytewax is a streaming engine built in Rust that exposes a Python interface. We use Bytewax because it combines Rusts impressive speed and reliability with the ease of use and ecosystem of Python. It is incredibly light, powerful, and easy for a Python developer.Where will the feature pipeline be deployed?The feature pipeline will be deployed to AWS. We will also use the freemium serverless version of Qdrant.3.3. The training pipelineHow do we have access to the training features?As highlighted in section 3.2, all the training data will be accessed from the feature store. In our case, the feature store is the Qdrant vector DB that contains:the cleaned digital data from which we will create prompts & answers;we will use the chunked & embedded data for RAG to augment the cleaned data.We will implement a different vector DB retrieval client for each of our main types of data (posts, articles, code).We must do this separation because we must preprocess each type differently before querying the vector DB, as each type has unique properties.Also, we will add custom behavior for each client based on what we want to query from the vector DB. But more on this in its dedicated lesson.What will the training pipeline do?The training pipeline contains a data-to-prompt layer that will preprocess the data retrieved from the vector DB into prompts.It will also contain an LLM fine-tuning module that inputs a HuggingFace dataset and uses QLoRA to fine-tune a given LLM (e.g., Mistral). By using HuggingFace, we can easily switch between different LLMs so we wont focus too much on any specific LLM.All the experiments will be logged into Comet MLs experiment tracker.We will use a bigger LLM (e.g., GPT4) to evaluate the results of our fine-tuned LLM. These results will be logged into Comets experiment tracker.Where will the production candidate LLM be stored?We will compare multiple experiments, pick the best one, and issue an LLM production candidate for the model registry.After, we will inspect the LLM production candidate manually using Comets prompt monitoring dashboard. If this final manual check passes, we will flag the LLM from the model registry as accepted.A CI/CD pipeline will trigger and deploy the new LLM version to the inference pipeline.Where will the training pipeline be deployed?The training pipeline will be deployed to Qwak.Qwak is a serverless solution for training and deploying ML models. It makes scaling your operation easy while you can focus on building.Also, we will use the freemium version of Comet ML for the following:experiment tracker;model registry;prompt monitoring.3.4. The inference pipelineThe inference pipeline is the final component of the LLM system. It is the one the clients will interact with.It will be wrapped under a REST API. The clients can call it through HTTP requests, similar to your experience with ChatGPT or similar tools.How do we access the features?To access the feature store, we will use the same Qdrant vector DB retrieval clients as in the training pipeline.In this case, we will need the feature store to access the chunked data to do RAG.How do we access the fine-tuned LLM?The fine-tuned LLM will always be downloaded from the model registry based on its tag (e.g., accepted) and version (e.g., v1.0.2, latest, etc.).How will the fine-tuned LLM be loaded?Here we are in the inference world.Thus, we want to optimize the LLM's speed and memory consumption as much as possible. That is why, after downloading the LLM from the model registry, we will quantize it.What are the components of the inference pipeline?The first one is the retrieval client used to access the vector DB to do RAG. This is the same module as the one used in the training pipeline.After we have a query to prompt the layer, that will map the prompt and retrieved documents from Qdrant into a prompt.After the LLM generates its answer, we will log it to Comets prompt monitoring dashboard and return it to the clients.For example, the client will request the inference pipeline to:Write a 1000-word LinkedIn post about LLMs, and the inference pipeline will go through all the steps above to return the generated post.Where will the inference pipeline be deployed?The inference pipeline will be deployed to Qwak.By default, Qwak also offers autoscaling solutions and a nice dashboard to monitor all the production environment resources.As for the training pipeline, we will use a serverless freemium version of Comet for its prompt monitoring dashboard.ConclusionThis is the 1st article of the LLM Twin: Building Your Production-Ready AI Replica free course.In this lesson, we presented what you will build during the course.After we briefly discussed how to design ML systems using the 3-pipeline design.Ultimately, we went through the system design of the course and presented the architecture of each microservice and how they interact with each other:The data collection pipelineThe feature pipelineThe training pipelineThe inference pipelineIn Lesson 2, we will dive deeper into the data collection pipeline, learn how to implement crawlers for various social media platforms, clean the gathered data, store it in a Mongo DB, and finally, show you how to deploy it to AWS. Check out the code on GitHub [1] and support us with a Have you enjoyed this article? Then Join 5k+ engineers in the Decoding ML Newsletter for battle-tested content on production-grade ML. Every week:Decoding ML Newsletter | Paul Iusztin | SubstackJoin for battle-tested content on designing, coding, and deploying production-grade ML & MLOps systems. Every week. Fordecodingml.substack.comReferences[1] Your LLM Twin Course GitHub Repository (2024), Decoding ML GitHub Organization[2] Introducing new AI experiences from Meta (2023), Meta[3] Jim Dowling, From MLOps to ML Systems with Feature/Training/Inference Pipelines (2023), Hopsworks[4] Extract Transform Load (ETL), Databricks Glossary[5] Daniel Svonava and Paolo Perrone, Understanding the different Data Modality / Types (2023), SuperlinkedSign up to discover human stories that deepen your understanding of the world.FreeDistraction-free reading. No ads.Organize your knowledge with lists and highlights.Tell your story. Find your audience.Sign up for freeMembershipAccess the best member-only stories.Support independent authors.Listen to audio narrations.Read offline.Join the Partner Program and earn for your writing.Try for $5/monthGenerative AiLarge Language ModelsMlopsArtificial IntelligenceMachine Learning1.5K1.5K10FollowWritten by Paul Iusztin2.4K FollowersEditor for Decoding ML Senior ML Engineer | Helping machine learning engineers design and productionize ML systems. | Decoding ML Newsletter: [URL] from Paul Iusztin and Decoding MLPaul IusztininDecoding MLA Real-time Retrieval System for RAG on Social Media DataUse a streaming engine to populate a vector DB in real-time. Improve RAG accuracy using rerank & UMAP.12 min readMar 30, 2024305Razvant AlexandruinDecoding MLHow to build a Real-Time News Search Engine using Serverless Upstash Kafka and Vector DBA hands-on guide to implementing a live news aggregating streaming pipeline with Apache Kafka, Bytewax, and Upstash Vector Database.19 min readApr 13, 20246873Vesa AlexandruinDecoding MLThe Importance of Data Pipelines in the Era of Generative AIFrom unstructured data crawling to structured valuable data17 min readMar 23, 20244343Paul IusztininDecoding MLThe LLMs kit: Build a production-ready real-time financial advisor system using streamingLesson 1: LLM architecture system design using the 3-pipeline pattern12 min readJan 5, 2024383See all from Paul IusztinSee all from Decoding MLRecommended from MediumAlex HoncharinTowards Data ScienceIntro to LLM Agents with Langchain: When RAG is Not EnoughFirst-order principles of brain structure for AI assistants7 min readMar 15, 20242K10Fabio MatricardiinGenerative AILlama3 is out and you can run it on your Computer!After only 1 day from the release, here is how you can run even on your Laptop with CPU only the latest Meta-AI model.8 min read6 days ago1.2K13ListsAI Regulation6 stories427 savesNatural Language Processing1402 stories899 savesPredictive Modeling w/ Python20 stories1126 savesPractical Guides to Machine Learning10 stories1352 savesVipra SinghBuilding LLM Applications: Serving LLMs (Part 9)Learn Large Language Models ( LLM ) through the lens of a Retrieval Augmented Generation ( RAG ) Application.49 min readApr 18, 20243741Mandar Karhade, MD. PhD.inTowards AIWhy RAG Applications Fail in ProductionIt worked as a prototype; then all went down!7 min readMar 19, 20241K11Gavin LiinAI AdvancesRun the strongest open-source LLM model: Llama3 70B with just a single 4GB GPU!The strongest open source LLM model Llama3 has been released, Here is how you can run Llama3 70B locally with just 4GB GPU, even on Macbook4 min read4 days ago7982Bijit GhoshRAG Vs VectorDBIntroduction to RAG and VectorDB14 min readJan 28, 20242384See more recommendationsHelpStatusAboutCareersBlogPrivacyTermsText to speechTeams To make Medium work, we log user data. By using Medium, you agree to our Privacy Policy, including cookie policy."}] \ No newline at end of file diff --git a/course/module-3/insert_data_mongo.py b/course/module-3/insert_data_mongo.py index 3bed867..e69de29 100644 --- a/course/module-3/insert_data_mongo.py +++ b/course/module-3/insert_data_mongo.py @@ -1,146 +0,0 @@ -import json -import re -from pathlib import Path - -import gdown - -import logger_utils -from db.documents import ArticleDocument, PostDocument, RepositoryDocument - -logger = logger_utils.get_logger(__name__) - - -def fix_json_content(content: str) -> str: - """ - Fixes common JSON escape errors in the provided content. - """ - return re.sub(r'\\(?!["\\bfnrt/])', r"\\\\", content) - - -def download_dataset(output_dir: Path = Path("data")) -> list: - files = [ - { - "file_name": "articles_alex_vesa.json", - "file_id": "1-82FgMIUR6UL5B7a7SHWOr3NnpTMbd-F", - "type": "article", - "author_id": "1", - }, - { - "file_name": "posts_alex_vesa.json", - "file_id": "1HWvzvfyDRa50Dt-aLSonYHgGfY0JYulB", - "type": "post", - "author_id": "1", - }, - { - "file_name": "articles_paul_iusztin.json", - "file_id": "1VAg4DdTK4zaRFJgX_5eGTaD-WwjxbG6z", - "type": "article", - "author_id": "2", - }, - { - "file_name": "posts_paul_iusztin.json", - "file_id": "1hUeqVfh7nOTA1s_wv4PbDEc4sXU3TTmr", - "type": "post", - "author_id": "2", - }, - # { - # "file_name": "repositories_paul_iusztin.json", - # "file_id": "1tSWrlj_u85twAqVus-l0mzqgYVV6WHVz", - # "type": "repository", - # "author_id": "2", - # }, - ] - for file in files: - file["file_path"] = str(output_dir / file["file_name"]) - - if output_dir.exists() and len(list(output_dir.iterdir())) > 0: - logger.info("Directory already exists", directory=str(output_dir)) - - return files - else: - output_dir.mkdir(parents=True, exist_ok=True) - - for file in files: - gdown.download( - f"https://drive.google.com/uc?id={file['file_id']}", - file["file_path"], - quiet=False, - ) - - return files - - -def insert_posts(file_name: str, author_id: str) -> None: - with open(file_name, "r") as file: - posts: dict[str, dict] = json.load(file) - - for post_content in posts.values(): - try: - PostDocument( - platform="linkedin", content=post_content, author_id=author_id - ).save() - except: - continue - logger.info("Posts inserted into collection", num=len(posts), author_id=author_id) - - -def insert_articles(file_name: str, author_id: str) -> None: - file_name = file_name - try: - with open(file_name, "r") as file: - articles: list[dict] = json.load(file) - except: - with open(file_name, "r") as file: - content = file.read() - corrected_content = fix_json_content(content) - articles: list[dict] = json.loads(corrected_content) - - for article_content in articles: - try: - ArticleDocument( - platform="medium", - link="/htttps/alex/paul", - content=article_content, - author_id=author_id, - ).save() - except: - continue - - logger.info( - "Articles inserted into collection", num=len(articles), author_id=author_id - ) - - -def insert_repositories(file_name: str, author_id: str) -> None: - with open(file_name, "r") as file: - respositores: dict[str, dict] = json.load(file) - - for repository_name, repository_content in respositores.items(): - RepositoryDocument( - name=repository_name, - link="/htttps/alex/paul", - content=repository_content, - owner_id=author_id, - ).save() - - logger.info( - "Repository inserted into collection", - num=len(respositores), - author_id=author_id, - ) - - -if __name__ == "__main__": - output_dir = Path("./dataset") - files = download_dataset(output_dir=output_dir) - - for file in files: - match file["type"]: - case "post": - insert_posts(file["file_path"], file["author_id"]) - case "article": - insert_articles(file["file_path"], file["author_id"]) - case "repository": - pass - case _: - raise ValueError(f"Unknown type: {file['type']}") diff --git a/course/module-5/db/documents.py b/course/module-5/db/documents.py index 12fab04..0bb11c5 100644 --- a/course/module-5/db/documents.py +++ b/course/module-5/db/documents.py @@ -1,7 +1,7 @@ import uuid from typing import List, Optional -import logger_utils +import core.logger_utils as logger_utils from db.errors import ImproperlyConfigured from db.mongo import connection from pydantic import UUID4, BaseModel, ConfigDict, Field diff --git a/course/module-5/db/mongo.py b/course/module-5/db/mongo.py index a49526a..7970e5c 100644 --- a/course/module-5/db/mongo.py +++ b/course/module-5/db/mongo.py @@ -1,7 +1,7 @@ from pymongo import MongoClient from pymongo.errors import ConnectionFailure -import logger_utils +import core.logger_utils as logger_utils from settings import settings logger = logger_utils.get_logger(__name__) diff --git a/course/module-5/db/qdrant.py b/course/module-5/db/qdrant.py index 5a797e7..03afce2 100644 --- a/course/module-5/db/qdrant.py +++ b/course/module-5/db/qdrant.py @@ -1,4 +1,4 @@ -import logger_utils +import core.logger_utils as logger_utils from qdrant_client import QdrantClient, models from qdrant_client.http.exceptions import UnexpectedResponse from qdrant_client.http.models import Batch, Distance, VectorParams diff --git a/course/module-5/main.py b/course/module-5/main.py index ead7ca6..2678e5e 100644 --- a/course/module-5/main.py +++ b/course/module-5/main.py @@ -1,4 +1,4 @@ -import logger_utils +import core.logger_utils as logger_utils from inference_pipeline import LLMTwin logger = logger_utils.get_logger(__name__) diff --git a/course/module-5/rag/retriever.py b/course/module-5/rag/retriever.py index 89235e1..8779bab 100644 --- a/course/module-5/rag/retriever.py +++ b/course/module-5/rag/retriever.py @@ -1,6 +1,6 @@ import concurrent.futures -import logger_utils +import core.logger_utils as logger_utils import utils from db.qdrant import QdrantDatabaseConnector from qdrant_client import models diff --git a/docker-bake.hcl b/docker-bake.hcl new file mode 100644 index 0000000..47aa27f --- /dev/null +++ b/docker-bake.hcl @@ -0,0 +1,13 @@ +group "default" { + targets = ["bytewax", "cdc"] +} + +target "bytewax" { + context = "." + dockerfile = ".docker/Dockerfile.bytewax" +} + +target "cdc" { + context = "." + dockerfile = ".docker/Dockerfile.cdc" +} diff --git a/docker-compose.yml b/docker-compose.yml index 6b0896f..19a5816 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,114 @@ version: '3.8' services: - mongo: - image: mongo - container_name: "decodingml_mongo" - logging: - options: - max-size: 1g - environment: - MONGO_INITDB_ROOT_USERNAME: "decodingml" - MONGO_INITDB_ROOT_PASSWORD: "decodingml" + mongo1: + image: mongo:5 + container_name: llm-twin-mongo1 + command: ["--replSet", "my-replica-set", "--bind_ip_all", "--port", "30001"] + volumes: + - mongo-replica-1-data:/data/db ports: - - '27017:27017' + - "30001:30001" + healthcheck: + test: test $$(echo "rs.initiate({_id:'my-replica-set',members:[{_id:0,host:\"mongo1:30001\"},{_id:1,host:\"mongo2:30002\"},{_id:2,host:\"mongo3:30003\"}]}).ok || rs.status().ok" | mongo --port 30001 --quiet) -eq 1 + interval: 10s + start_period: 30s + restart: always + + mongo2: + image: mongo:5 + container_name: llm-twin-mongo2 + command: ["--replSet", "my-replica-set", "--bind_ip_all", "--port", "30002"] volumes: - - mongo_data:/data/db - networks: - - local + - mongo-replica-2-data:/data/db + ports: + - "30002:30002" restart: always -volumes: - mongo_data: + mongo3: + image: mongo:5 + container_name: llm-twin-mongo3 + command: ["--replSet", "my-replica-set", "--bind_ip_all", "--port", "30003"] + volumes: + - mongo-replica-3-data:/data/db + ports: + - "30003:30003" + restart: always -networks: - local: - driver: bridge \ No newline at end of file + mq: + image: rabbitmq:3-management-alpine + container_name: llm-twin-mq + ports: + - "5673:5672" + - "15673:15672" + volumes: + - ~/rabbitmq/data/:/var/lib/rabbitmq/ + - ~/rabbitmq/log/:/var/log/rabbitmq + restart: always + + qdrant: + image: qdrant/qdrant:latest + container_name: llm-twin-qdrant + ports: + - "6333:6333" + - "6334:6334" + expose: + - "6333" + - "6334" + - "6335" + volumes: + - qdrant-data:/qdrant_data + restart: always + + crawler: + image: "llm-twin-crawler" + container_name: llm-twin-crawler + platform: "linux/amd64" + build: + context: . + dockerfile: .docker/Dockerfile.crawlers + env_file: + - .env + ports: + - "9010:8080" + depends_on: + - mongo1 + - mongo2 + - mongo3 + + cdc: + image: "llm-twin-cdc" + container_name: llm-twin-cdc + build: + context: . + dockerfile: .docker/Dockerfile.cdc + env_file: + - .env + depends_on: + - mongo1 + - mongo2 + - mongo3 + - mq + + bytewax: + image: "llm-twin-bytewax" + container_name: llm-twin-bytewax + build: + context: . + dockerfile: .docker/Dockerfile.bytewax + environment: + BYTEWAX_PYTHON_FILE_PATH: "main:flow" + DEBUG: "false" + BYTEWAX_KEEP_CONTAINER_ALIVE: "true" + env_file: + - .env + depends_on: + - mq + - qdrant + restart: on-failure + +volumes: + mongo-replica-1-data: + mongo-replica-2-data: + mongo-replica-3-data: + qdrant-data: diff --git a/ops/components/ecs/cluster.ts b/ops/components/ecs/cluster.ts new file mode 100644 index 0000000..581069c --- /dev/null +++ b/ops/components/ecs/cluster.ts @@ -0,0 +1,62 @@ +import * as pulumi from "@pulumi/pulumi"; +import * as aws from "@pulumi/aws"; + + +export interface ECSClusterProps { + vpcId: pulumi.Input +} + +export class ECSCluster extends pulumi.ComponentResource { + name: pulumi.Output + + constructor ( + name: string, + props: ECSClusterProps, + opts?: pulumi.ComponentResourceOptions, + ) { + super("decodingml:main:ECSCluster", name, {}, opts); + + const cluster = new aws.ecs.Cluster(`${name}-cluster`, { + name: `${name}-cluster`, + }, {parent: this}) + + this.name = cluster.name + + const securityGroup = new aws.ec2.SecurityGroup(`${name}-sg`, { + name: `${name}-ecs-host-sg`, + description: 'Access to the ECS hosts that run containers', + vpcId: props.vpcId, + ingress: [ + { + description: "Ingress from other containers in the same security group", + fromPort: 0, + toPort: 0, + protocol: "-1", + self: true, + } + ], + egress: [ + { + cidrBlocks: ['0.0.0.0/0'], + description: "Allow all outbound traffic by default", + protocol: "-1", + fromPort: 0, + toPort: 0, + }, + ], + tags: { + Name: `${name}-ecs-host-sg` + } + }, {parent: this}) + + new aws.servicediscovery.PrivateDnsNamespace(`${name}-private-dns-namespace`, { + name: `${name}.internal`, + vpc: props.vpcId, + }, {parent: this}) + + this.registerOutputs({ + name: this.name + }) + + } +} \ No newline at end of file diff --git a/ops/components/ecs/iam.ts b/ops/components/ecs/iam.ts new file mode 100644 index 0000000..b442bf7 --- /dev/null +++ b/ops/components/ecs/iam.ts @@ -0,0 +1,69 @@ +import * as aws from "@pulumi/aws"; + + +export const ecsRole = new aws.iam.Role("ecs-role", { + name: `ecs-role`, + assumeRolePolicy: aws.iam.assumeRolePolicyForPrincipal({ Service: "ecs.amazonaws.com" }), + path: "/", + inlinePolicies: [{ + name: "ecs-service", + policy: JSON.stringify({ + Statement: [{ + Action: [ + 'ec2:AttachNetworkInterface', + 'ec2:CreateNetworkInterface', + 'ec2:CreateNetworkInterfacePermission', + 'ec2:DeleteNetworkInterface', + 'ec2:DeleteNetworkInterfacePermission', + 'ec2:Describe*', + 'ec2:DetachNetworkInterface', + 'elasticloadbalancing:DeregisterInstancesFromLoadBalancer', + 'elasticloadbalancing:DeregisterTargets', + 'elasticloadbalancing:Describe*', + 'elasticloadbalancing:RegisterInstancesWithLoadBalancer', + 'elasticloadbalancing:RegisterTargets' + ], + Effect: 'Allow', + Resource: '*' + }], + Version: '2012-10-17', + } as aws.iam.PolicyDocument) + }] +}) + + +export const ecsTaskExecutionRole = new aws.iam.Role("ecs-task-execution-role", { + name: `ecs-task-execution-role`, + assumeRolePolicy: aws.iam.assumeRolePolicyForPrincipal({ Service: "ecs-tasks.amazonaws.com" }), + path: "/", + inlinePolicies: [ + { + name: "ecs-logs", + policy: JSON.stringify({ + Statement: [{ + Action: [ + 'logs:CreateLogGroup' + ], + Effect: 'Allow', + Resource: '*' + }] + } as aws.iam.PolicyDocument), + }, + { + name: "ecs-ssm", + policy: JSON.stringify({ + Statement: [{ + Sid: "readEnvironmentParameters", + Action: [ + 'ssm:GetParameters' + ], + Effect: 'Allow', + Resource: "*" + }] + } as aws.iam.PolicyDocument), + } + ], + managedPolicyArns: [ + 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy' + ] +}) \ No newline at end of file diff --git a/ops/components/ecs/service.ts b/ops/components/ecs/service.ts new file mode 100644 index 0000000..f36ec8c --- /dev/null +++ b/ops/components/ecs/service.ts @@ -0,0 +1,128 @@ +import * as pulumi from "@pulumi/pulumi"; +import * as aws from "@pulumi/aws"; + +export interface ContainerSecrets { + name: pulumi.Input; + parameter: pulumi.Input; +} + +export interface ServiceProps { + vpcId: pulumi.Input + + cluster: pulumi.Input; + environment?: pulumi.Input>; + secrets: ContainerSecrets[]; + + command?: pulumi.Input; + imageTag?: pulumi.Input; + containerPort: pulumi.Input; + containerCpu?: pulumi.Input; + containerMemory?: pulumi.Input; + + deploymentController?: pulumi.Input; + + desiredCount?: pulumi.Input; + role?: pulumi.Input; +} + +export class Service extends pulumi.ComponentResource { + constructor ( + name: string, + props: ServiceProps, + opts?: pulumi.ComponentResourceOptions, + ) { + + super("decodingml:main:Service", name, {}, opts); + + const accountId = pulumi.output(aws.getCallerIdentity()).accountId; + const region = pulumi.output(aws.getRegion()).name; + + const imageUrl = pulumi.interpolate`${accountId}.dkr.ecr.${region}.amazonaws.com/chamberlain:latest` + + const containerSecrets = props.secrets.map(secret => { + return { + name: secret.name, + valueFrom: pulumi.interpolate`arn:aws:ssm:${region}:${accountId}:parameter/${secret.parameter}` + } as aws.ecs.Secret; + }) + + const logGroup = new aws.cloudwatch.LogGroup(`log-group`, { + name: `/ecs/${props.cluster}/${name}`, + retentionInDays: 90, + tags: { + Name: `${props.cluster}-${name}-cluster-log-group` + } + }) + + const taskDefinition = new aws.ecs.TaskDefinition(`${name}-ecs-task-definition`, { + family: name, + networkMode: 'awsvpc', + requiresCompatibilities: ["FARGATE"], + cpu: props.containerCpu || "512", + memory: props.containerMemory || "1024", + executionRoleArn: pulumi.output(aws.iam.getRole({name: `ecs-task-execution-role`})).arn, + taskRoleArn: props.role, + containerDefinitions: pulumi + .all([imageUrl, props.logGroup, props.environment, containerSecrets]) + .apply(([image,logGroup,environment, secrets]) => + JSON.stringify([{ + name: name, + image: image, + portMappings: [{ + containerPort: props.containerPort, + }], + command: props.command, + environment: environment, + secrets: secrets, + logConfiguration: { + logDriver: "awslogs", + options: { + "awslogs-group": logGroup, + "awslogs-create-group": "true", + "awslogs-region": "eu-central-1", + "awslogs-stream-prefix": name, + }, + }, + } as aws.ecs.ContainerDefinition]) + ) + }, {parent: this}) + + const serviceDiscovery = new aws.servicediscovery.Service(`${name}-service-discovery`, { + name: name, + description: `Service discovery for ${name}`, + dnsConfig: { + routingPolicy: "MULTIVALUE", + dnsRecords: [{ type: "A", ttl: 60 }], + namespaceId: pulumi.output(aws.servicediscovery.getDnsNamespace({ + name: `streaming.internal`, + type: 'DNS_PRIVATE', + })).id, + }, + healthCheckCustomConfig: { + failureThreshold: 1 + }, + }, {parent: this}) + + new aws.ecs.Service(`${name}-ecs-service`, { + name: `${name}-service`, + cluster: props.cluster, + launchType: 'FARGATE', + deploymentController: { + type: props.deploymentController || "ECS", + }, + desiredCount: props.desiredCount || 1, + taskDefinition: taskDefinition.arn, + serviceRegistries: { + registryArn: serviceDiscovery.arn, + containerName: `${name}`, + }, + networkConfiguration: { + assignPublicIp: false, + securityGroups: pulumi.output(aws.ec2.getSecurityGroups({ + tags: {Name: `ecs-host-sg`} + })).ids, + subnets: pulumi.output(aws.ec2.getSubnets({tags: {Type: 'private'}})).ids + } + }, {parent: this}) + } +} \ No newline at end of file diff --git a/ops/components/mq.ts b/ops/components/mq.ts index e69de29..3b300c8 100644 --- a/ops/components/mq.ts +++ b/ops/components/mq.ts @@ -0,0 +1,115 @@ +import * as pulumi from "@pulumi/pulumi"; +import * as aws from "@pulumi/aws"; + + +export interface MessageQueueBrokerProps { + vpcId: pulumi.Input + + engineVersion?: pulumi.Input + instanceType?: pulumi.Input + +} + +export class MessageQueueBroker extends pulumi.ComponentResource { + + constructor( + name: string, + props: MessageQueueBrokerProps, + opts?: pulumi.ComponentResourceOptions, + ) { + super("decodingml:main:MessageQueueBroker", name, {}, opts); + + const accountId = pulumi.output(aws.getCallerIdentity()).accountId; + const region = pulumi.output(aws.getRegion()).name; + + const securityGroup = new aws.ec2.SecurityGroup(`${name}-mq-sg`, { + name: `${name}-mq-sg`, + description: "Message Queue broker access", + vpcId: props.vpcId, + ingress: [ + { + description: "Ingress from AMPQS protocol", + fromPort: 5671, + toPort: 5671, + protocol: "tcp", + }, + { + description: "Ingress from HTTPS protocol", + fromPort: 443, + toPort: 443, + protocol: "tcp", + }, + ], + egress: [{ + protocol: "-1", + description: "Allow all outbound traffic by default", + fromPort: 0, + toPort: 0, + cidrBlocks: ["0.0.0.0/0"], + }], + tags: { + Name: `${name}-mq-sg` + }, + }, {parent: this}) + + const broker = new aws.mq.Broker(`${name}-mq-broker`, { + brokerName: `${name}-mq-broker`, + engineType: "RabbitMQ", + engineVersion: props.engineVersion || "3.11.20", + hostInstanceType: props.instanceType || "mq.t3.micro", + securityGroups: [securityGroup.id], + deploymentMode: "SINGLE_INSTANCE", + logs: { + general: true, + }, + publiclyAccessible: true, + subnetIds: pulumi.output(aws.ec2.getSubnets({tags: {Type: 'public'}})).ids, + users: pulumi.all([ + this.getSecretValue(`arn:aws:secretsmanager:${region}:${accountId}:secret:/${name}/broker/admin`), + this.getSecretValue(`arn:aws:secretsmanager:${region}:${accountId}:secret:/${name}/broker/replication-user`) + ]).apply(([adminSecret, replicationUserSecret]) => [ + { + username: JSON.parse(adminSecret).username, + password: JSON.parse(adminSecret).password, + consoleAccess: true, + }, + { + username: JSON.parse(replicationUserSecret).username, + password: JSON.parse(replicationUserSecret).password, + consoleAccess: true, + replicationUser: true + } + ]), + tags: { + Name: `${name}-mq-sg` + }, + }, {parent: this}) + + const hostSSMParameter = new aws.ssm.Parameter(`${name}-mq-broker-host-ssm-parameter`, { + name: `/${name}/broker/host`, + type: aws.ssm.ParameterType.String, + description: `RabbitMQ cluster host for ${name}-mq-broker`, + value: broker.instances[0].endpoints[0].apply(endpoint => { + return endpoint.split(":")[0]; + }), + }, {parent: this}) + + const portSSMParameter = new aws.ssm.Parameter(`${name}-mq-broker-port-ssm-parameter`, { + name: `/${name}/broker/port`, + type: aws.ssm.ParameterType.String, + description: `RabbitMQ cluster port for ${name}-mq-broker`, + value: "5671", + }, {parent: this}) + } + + private async getSecretValue(secretName: string): Promise> { + return pulumi.output(aws.secretsmanager.getSecretVersion({ + secretId: secretName, + }, { async: true })).apply(secretVersion => { + if (!secretVersion.secretString) { + throw new Error("Secret version contains no string data"); + } + return secretVersion.secretString; + }); + } +} \ No newline at end of file diff --git a/ops/index.ts b/ops/index.ts index 92ce247..500afda 100644 --- a/ops/index.ts +++ b/ops/index.ts @@ -2,6 +2,8 @@ import * as pulumi from "@pulumi/pulumi"; import {Vpc} from "./components/vpc"; import {DocumentDBCluster} from "./components/docdb"; import {Crawler} from "./components/crawler"; +import {ECSCluster} from "./components/ecs/cluster"; +import {Service} from "./components/ecs/service"; const vpc= new Vpc("network-overlay", {}) @@ -16,4 +18,53 @@ const lambda = new Crawler("crawler", { memory: 3008 }) +const cluster = new ECSCluster("streaming", { + vpcId: vpc.id +}) + +const bytewaxWorker = new Service("bytewax-worker", { + vpcId: vpc.id, + cluster: cluster.name, + containerPort: 9000, + secrets: [ + { + name: "MONGO_DATABASE_HOST", + parameter: "database/host", + }, + { + name: "OPENAI_API_KEY", + parameter: "database/host", + }, + { + name: "QDRANT_DATABASE_HOST", + parameter: "database/username", + }, + { + name: "QDRANT_DATABASE_PORT", + parameter: "database/host", + }, + { + name: "QDRANT_APIKEY", + parameter: "database/username", + }, + { + name: "RABBITMQ_HOST", + parameter: "database/host", + }, + { + name: "RABBITMQ_PORT", + parameter: "database/username", + }, + { + name: "RABBITMQ_DEFAULT_USERNAME", + parameter: "database/host", + }, + { + name: "RABBITMQ_DEFAULT_PASSWORD", + parameter: "database/username", + }, + ] +}) + + export const VpcID: pulumi.Output = vpc.id diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..de65a19 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,5973 @@ +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. + +[[package]] +name = "accelerate" +version = "0.30.1" +description = "Accelerate" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "accelerate-0.30.1-py3-none-any.whl", hash = "sha256:8dd4edd532a4dac72558c5fe6fe8cb70d0c8ec9e8733f48db97d51ee41cbe763"}, + {file = "accelerate-0.30.1.tar.gz", hash = "sha256:96779c618889646b86dc928c9e55e86e50a7ccab59e1692e22096481977ae682"}, +] + +[package.dependencies] +huggingface-hub = "*" +numpy = ">=1.17" +packaging = ">=20.0" +psutil = "*" +pyyaml = "*" +safetensors = ">=0.3.1" +torch = ">=1.10.0" + +[package.extras] +deepspeed = ["deepspeed (<=0.14.0)"] +dev = ["bitsandbytes", "black (>=23.1,<24.0)", "datasets", "diffusers", "evaluate", "hf-doc-builder (>=0.3.0)", "parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "pytest-xdist", "rich", "ruff (>=0.2.1,<0.3.0)", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] +quality = ["black (>=23.1,<24.0)", "hf-doc-builder (>=0.3.0)", "ruff (>=0.2.1,<0.3.0)"] +rich = ["rich"] +sagemaker = ["sagemaker"] +test-dev = ["bitsandbytes", "datasets", "diffusers", "evaluate", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] +test-prod = ["parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "pytest-xdist"] +test-trackers = ["comet-ml", "dvclive", "tensorboard", "wandb"] +testing = ["bitsandbytes", "datasets", "diffusers", "evaluate", "parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "pytest-xdist", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] + +[[package]] +name = "aiohttp" +version = "3.9.5" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "arrow" +version = "1.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "aws-lambda-powertools" +version = "2.39.1" +description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." +optional = false +python-versions = "<4.0.0,>=3.8" +files = [ + {file = "aws_lambda_powertools-2.39.1-py3-none-any.whl", hash = "sha256:92529ab5efd79d0d313c4f303c5ad3671a00a8e477c19404f11af64b3ba233e0"}, + {file = "aws_lambda_powertools-2.39.1.tar.gz", hash = "sha256:122b5b03949efc4cb88981be356e70d8fecbf8b40185d1e7cba52fa8e0d3115a"}, +] + +[package.dependencies] +jmespath = ">=1.0.1,<2.0.0" +typing-extensions = ">=4.11.0,<5.0.0" + +[package.extras] +all = ["aws-xray-sdk (>=2.8.0,<3.0.0)", "fastjsonschema (>=2.14.5,<3.0.0)", "pydantic (>=1.8.2,<2.0.0)"] +aws-sdk = ["boto3 (>=1.26.164,<2.0.0)"] +datadog = ["datadog-lambda (>=4.77,<7.0)"] +datamasking = ["aws-encryption-sdk (>=3.1.1,<4.0.0)", "jsonpath-ng (>=1.6.0,<2.0.0)"] +parser = ["pydantic (>=1.8.2,<2.0.0)"] +redis = ["redis (>=4.4,<6.0)"] +tracer = ["aws-xray-sdk (>=2.8.0,<3.0.0)"] +validation = ["fastjsonschema (>=2.14.5,<3.0.0)"] + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "binaryornot" +version = "0.4.4" +description = "Ultra-lightweight pure Python package to check if a file is binary or text." +optional = false +python-versions = "*" +files = [ + {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, + {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, +] + +[package.dependencies] +chardet = ">=3.0.2" + +[[package]] +name = "bitsandbytes" +version = "0.42.0" +description = "k-bit optimizers and matrix multiplication routines." +optional = false +python-versions = "*" +files = [ + {file = "bitsandbytes-0.42.0-py3-none-any.whl", hash = "sha256:63798680912cc63bb77b535a2d0860af024e290a52e157f777ad2a52e2585967"}, + {file = "bitsandbytes-0.42.0.tar.gz", hash = "sha256:fc1505f184f0d275766f2a6c663f1a43b734c1409b5c5a406f3a6073d9f329fd"}, +] + +[package.dependencies] +scipy = "*" + +[[package]] +name = "bytewax" +version = "0.18.2" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "bytewax-0.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9b19b1c61440cab8a7e7ed558406621206d53029d6b008e516f2cfb10250b35d"}, + {file = "bytewax-0.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2205159f3bf95376dbfbf7db683ec054517ccdb77fed322cd91f72d3346adf35"}, + {file = "bytewax-0.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2431300d0751e7c60c259b35aa4989d38cb09697e7ec60099bea20ce6f6df71"}, + {file = "bytewax-0.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:65db1873b3578eeb087fabb384a8aa091a4e5e2f141af51a229d34eb2a27354c"}, + {file = "bytewax-0.18.2-cp310-cp310-manylinux_2_27_x86_64.whl", hash = "sha256:a48ec39bc437108ff55c2505a8678042d34b533e9f6d1b1111ab9506002bca3c"}, + {file = "bytewax-0.18.2-cp310-cp310-manylinux_2_31_x86_64.whl", hash = "sha256:2e9aa1a321934a25304fb8a413506a75879cbeab91cd350f9621da707c857b37"}, + {file = "bytewax-0.18.2-cp310-none-win_amd64.whl", hash = "sha256:75f9e780d42791265d41ba54ca20c21c0ed580209aeefef64a9b69967109a9b5"}, + {file = "bytewax-0.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c4a7c1053f59aab99f165f3749ee46d1d62a0734aa3b9181caba2fc704bf2107"}, + {file = "bytewax-0.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64bcdaa9d32cc1db1afaaff458856792364ec9fa1f6220552a55ab436f3eb72a"}, + {file = "bytewax-0.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3695eaa4a626e26a102abae4cc2cedf345013224a0137e53d680240ca1f55d4d"}, + {file = "bytewax-0.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e19f2d4a8df3b1510b277e186f898c34699a60298b963609ec5d64cb931e5d9"}, + {file = "bytewax-0.18.2-cp311-cp311-manylinux_2_27_x86_64.whl", hash = "sha256:f7db1227be644d74604f8c77077088cb9a0ce3d5a4ea90085d6a9505750d4f6c"}, + {file = "bytewax-0.18.2-cp311-cp311-manylinux_2_31_x86_64.whl", hash = "sha256:d08204bb157cc0725e1d79518f9a95d197ca5b49ceacf8b467f3530bc5581090"}, + {file = "bytewax-0.18.2-cp311-none-win_amd64.whl", hash = "sha256:ae0bf36bdf76ec07503e7a90c779873eca177ffbc2dc4526d1bc6818aaf2cfa0"}, + {file = "bytewax-0.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:6f19e71242cc364fcfdac0d58c263a7620030be7600fa0d71d403db167dfb939"}, + {file = "bytewax-0.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:acec71f9bb15c392d05352b539ca5d5cfae9a038e954291f981801e8c6c9b795"}, + {file = "bytewax-0.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:864856902bc02763caa031bd0af0e64ec0aba257f693c05122266b3d1e1ad103"}, + {file = "bytewax-0.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7605bb9ecd12c4bc7a2888a5bec0b17ded9e376ea9bd87d739ea3389f83d86f3"}, + {file = "bytewax-0.18.2-cp38-cp38-manylinux_2_27_x86_64.whl", hash = "sha256:58ff54593aea261639dad4d0b4bd589a7259d411458096fd4fe2417d3a6d54ab"}, + {file = "bytewax-0.18.2-cp38-cp38-manylinux_2_31_x86_64.whl", hash = "sha256:c014e4c75b2fc7eb85fddcc188b970d9385a62e5c056dee2e1ee594bdeb2ef93"}, + {file = "bytewax-0.18.2-cp38-none-win_amd64.whl", hash = "sha256:cfdceb7ebbd633963cc8dbcfb10b72d004312fbf63fb8d2d20b3d64eeefe8d67"}, + {file = "bytewax-0.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:7cb772028cb28553840f6f74f4e16c6ea4c016dab3d0f1dcdcc4d921fcfc5233"}, + {file = "bytewax-0.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:67b70ed859d2a582daf9374b8d2bbc1e1f7040eb50cd9a11b67aead0e883bbd3"}, + {file = "bytewax-0.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0668e0b6a55c259a8b42b9733bc3e8698a81f43eba8f6ebb2119f4f094f8ec2"}, + {file = "bytewax-0.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32682a710903bf46882bc7ce79ff02a78684e6ce7ae73d51f17a095b2c2933d8"}, + {file = "bytewax-0.18.2-cp39-cp39-manylinux_2_27_x86_64.whl", hash = "sha256:b767e24ce45838d87181051d0709dd0eb8006c472e480294769a2233588405e2"}, + {file = "bytewax-0.18.2-cp39-cp39-manylinux_2_31_x86_64.whl", hash = "sha256:54187bc2c7677244962ae070aee5fb11e67dfd02b9114947ed2c001a73ed4337"}, + {file = "bytewax-0.18.2-cp39-none-win_amd64.whl", hash = "sha256:3b685de4482cbaf5ed4636763b82f81b108278882bc6613324ccdf313adc79ac"}, +] + +[package.dependencies] +jsonpickle = ">=3" +typing_extensions = ">=4" + +[package.extras] +cbfmt = ["ruff (==0.1.8)"] +dev = ["bytewax[cbfmt,docs,kafka,test]", "pre-commit (==2.19.0)", "ruff (==0.1.8)", "vermin (==1.5.2)"] +docs = ["pdoc3 (==0.10.0)"] +kafka = ["confluent-kafka (<=2.0.2)", "fastavro (>=1.8)", "requests (>=2.0)"] +test = ["myst-docutils (==0.17.0)", "pytest (==7.1.0)"] + +[[package]] +name = "cachetools" +version = "5.3.3" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, +] + +[[package]] +name = "certifi" +version = "2024.6.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "chevron" +version = "0.14.0" +description = "Mustache templating language renderer" +optional = false +python-versions = "*" +files = [ + {file = "chevron-0.14.0-py3-none-any.whl", hash = "sha256:fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443"}, + {file = "chevron-0.14.0.tar.gz", hash = "sha256:87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comet-llm" +version = "2.2.4" +description = "Comet logger for LLM" +optional = false +python-versions = ">=3.6" +files = [ + {file = "comet_llm-2.2.4-py3-none-any.whl", hash = "sha256:ff8a50b66cceae04d9914f6eea0e4822ec39946525be8b13012d4b2fd6671e6f"}, + {file = "comet_llm-2.2.4.tar.gz", hash = "sha256:f8c02cb273218fcfaf92dd4c1948e1af8eaa31eb914c7b9959f9e843e2449df7"}, +] + +[package.dependencies] +comet-ml = ">=3.40.0" +flatten-dict = "*" +requests = "*" +types-requests = "*" + +[[package]] +name = "comet-ml" +version = "3.43.1" +description = "Supercharging Machine Learning" +optional = false +python-versions = ">=3.6" +files = [ + {file = "comet_ml-3.43.1-py3-none-any.whl", hash = "sha256:659d7ee9e0a8ae9f7b4bb14fc3adb496660080613c35cca30ff3f1cbb0409d59"}, +] + +[package.dependencies] +dulwich = {version = ">=0.20.6,<0.20.33 || >0.20.33", markers = "python_version >= \"3.0\""} +everett = {version = ">=1.0.1,<3.2.0", extras = ["ini"]} +jsonschema = ">=2.6.0,<3.1.0 || >3.1.0" +psutil = ">=5.6.3" +python-box = "<7.0.0" +requests = ">=2.18.4" +requests-toolbelt = ">=0.8.0" +rich = {version = ">=13.3.2", markers = "python_version >= \"3.7.0\""} +semantic-version = ">=2.8.0" +sentry-sdk = ">=1.1.0" +simplejson = "*" +urllib3 = ">=1.21.1" +wrapt = ">=1.11.2" +wurlitzer = ">=1.0.2" + +[[package]] +name = "configobj" +version = "5.0.8" +description = "Config file reading, writing and validation." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "configobj-5.0.8-py2.py3-none-any.whl", hash = "sha256:a7a8c6ab7daade85c3f329931a807c8aee750a2494363934f8ea84d8a54c87ea"}, + {file = "configobj-5.0.8.tar.gz", hash = "sha256:6f704434a07dc4f4dc7c9a745172c1cad449feb548febd9f7fe362629c627a97"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "cookiecutter" +version = "2.6.0" +description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cookiecutter-2.6.0-py3-none-any.whl", hash = "sha256:a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d"}, + {file = "cookiecutter-2.6.0.tar.gz", hash = "sha256:db21f8169ea4f4fdc2408d48ca44859349de2647fbe494a9d6c3edfc0542c21c"}, +] + +[package.dependencies] +arrow = "*" +binaryornot = ">=0.4.4" +click = ">=7.0,<9.0.0" +Jinja2 = ">=2.7,<4.0.0" +python-slugify = ">=4.0.0" +pyyaml = ">=5.3.1" +requests = ">=2.23.0" +rich = "*" + +[[package]] +name = "croniter" +version = "1.4.1" +description = "croniter provides iteration for datetime object with cron like format" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "croniter-1.4.1-py2.py3-none-any.whl", hash = "sha256:9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128"}, + {file = "croniter-1.4.1.tar.gz", hash = "sha256:1a6df60eacec3b7a0aa52a8f2ef251ae3dd2a7c7c8b9874e73e791636d55a361"}, +] + +[package.dependencies] +python-dateutil = "*" + +[[package]] +name = "dacite" +version = "1.8.1" +description = "Simple creation of data classes from dictionaries." +optional = false +python-versions = ">=3.6" +files = [ + {file = "dacite-1.8.1-py3-none-any.whl", hash = "sha256:cc31ad6fdea1f49962ea42db9421772afe01ac5442380d9a99fcf3d188c61afe"}, +] + +[package.extras] +dev = ["black", "coveralls", "mypy", "pre-commit", "pylint", "pytest (>=5)", "pytest-benchmark", "pytest-cov"] + +[[package]] +name = "dataclasses-json" +version = "0.6.7" +description = "Easily serialize dataclasses to and from JSON." +optional = false +python-versions = "<4.0,>=3.7" +files = [ + {file = "dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a"}, + {file = "dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0"}, +] + +[package.dependencies] +marshmallow = ">=3.18.0,<4.0.0" +typing-inspect = ">=0.4.0,<1" + +[[package]] +name = "datasets" +version = "2.20.0" +description = "HuggingFace community-driven open-source library of datasets" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "datasets-2.20.0-py3-none-any.whl", hash = "sha256:76ac02e3bdfff824492e20678f0b6b1b6d080515957fe834b00c2ba8d6b18e5e"}, + {file = "datasets-2.20.0.tar.gz", hash = "sha256:3c4dbcd27e0f642b9d41d20ff2efa721a5e04b32b2ca4009e0fc9139e324553f"}, +] + +[package.dependencies] +aiohttp = "*" +dill = ">=0.3.0,<0.3.9" +filelock = "*" +fsspec = {version = ">=2023.1.0,<=2024.5.0", extras = ["http"]} +huggingface-hub = ">=0.21.2" +multiprocess = "*" +numpy = ">=1.17" +packaging = "*" +pandas = "*" +pyarrow = ">=15.0.0" +pyarrow-hotfix = "*" +pyyaml = ">=5.1" +requests = ">=2.32.2" +tqdm = ">=4.66.3" +xxhash = "*" + +[package.extras] +apache-beam = ["apache-beam (>=2.26.0)"] +audio = ["librosa", "soundfile (>=0.12.1)"] +benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] +dev = ["Pillow (>=9.4.0)", "absl-py", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] +docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"] +jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] +metrics-tests = ["Werkzeug (>=1.0.1)", "accelerate", "bert-score (>=0.3.6)", "jiwer", "langdetect", "mauve-text", "nltk", "requests-file (>=1.5.1)", "rouge-score", "sacrebleu", "sacremoses", "scikit-learn", "scipy", "sentencepiece", "seqeval", "six (>=1.15.0,<1.16.0)", "spacy (>=3.0.0)", "texttable (>=1.6.3)", "tldextract", "tldextract (>=3.1.0)", "toml (>=0.10.1)", "typer (<0.5.0)"] +quality = ["ruff (>=0.3.0)"] +s3 = ["s3fs"] +tensorflow = ["tensorflow (>=2.6.0)"] +tensorflow-gpu = ["tensorflow (>=2.6.0)"] +tests = ["Pillow (>=9.4.0)", "absl-py", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] +torch = ["torch"] +vision = ["Pillow (>=9.4.0)"] + +[[package]] +name = "deepdiff" +version = "7.0.1" +description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." +optional = false +python-versions = ">=3.8" +files = [ + {file = "deepdiff-7.0.1-py3-none-any.whl", hash = "sha256:447760081918216aa4fd4ca78a4b6a848b81307b2ea94c810255334b759e1dc3"}, + {file = "deepdiff-7.0.1.tar.gz", hash = "sha256:260c16f052d4badbf60351b4f77e8390bee03a0b516246f6839bc813fb429ddf"}, +] + +[package.dependencies] +ordered-set = ">=4.1.0,<4.2.0" + +[package.extras] +cli = ["click (==8.1.7)", "pyyaml (==6.0.1)"] +optimize = ["orjson"] + +[[package]] +name = "dependency-injector" +version = "4.41.0" +description = "Dependency injection framework for Python" +optional = false +python-versions = "*" +files = [ + {file = "dependency-injector-4.41.0.tar.gz", hash = "sha256:939dfc657104bc3e66b67afd3fb2ebb0850c9a1e73d0d26066f2bbdd8735ff9c"}, + {file = "dependency_injector-4.41.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2381a251b04244125148298212550750e6e1403e9b2850cc62e0e829d050ad3"}, + {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75280dfa23f7c88e1bf56c3920d58a43516816de6f6ab2a6650bb8a0f27d5c2c"}, + {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63bfba21f8bff654a80e9b9d06dd6c43a442990b73bf89cd471314c11c541ec2"}, + {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3535d06416251715b45f8412482b58ec1c6196a4a3baa207f947f0b03a7c4b44"}, + {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d09c08c944a25dabfb454238c1a889acd85102b93ae497de523bf9ab7947b28a"}, + {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:586a0821720b15932addbefb00f7370fbcd5831d6ebbd6494d774b44ff96d23a"}, + {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7fa4970f12a3fc95d8796938b11c41276ad1ff4c447b0e589212eab3fc527a90"}, + {file = "dependency_injector-4.41.0-cp310-cp310-win32.whl", hash = "sha256:d557e40673de984f78dab13ebd68d27fbb2f16d7c4e3b663ea2fa2f9fae6765b"}, + {file = "dependency_injector-4.41.0-cp310-cp310-win_amd64.whl", hash = "sha256:3744c327d18408e74781bd6d8b7738745ee80ef89f2c8daecf9ebd098cb84972"}, + {file = "dependency_injector-4.41.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:89c67edffe7007cf33cee79ecbca38f48efcc2add5c280717af434db6c789377"}, + {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:786f7aac592e191c9caafc47732161d807bad65c62f260cd84cd73c7e2d67d6d"}, + {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b61a15bc46a3aa7b29bd8a7384b650aa3a7ef943491e93c49a0540a0b3dda4"}, + {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4f113e5d4c3070973ad76e5bda7317e500abae6083d78689f0b6e37cf403abf"}, + {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fa3ed8f0700e47a0e7363f949b4525ffa8277aa1c5b10ca5b41fce4dea61bb9"}, + {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e15ea0f2b14c1127e8b0d1597fef13f98845679f63bf670ba12dbfc12a16ef"}, + {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3055b3fc47a0d6e5f27defb4166c0d37543a4967c279549b154afaf506ce6efc"}, + {file = "dependency_injector-4.41.0-cp311-cp311-win32.whl", hash = "sha256:37d5954026e3831663518d78bdf4be9c2dbfea691edcb73c813aa3093aa4363a"}, + {file = "dependency_injector-4.41.0-cp311-cp311-win_amd64.whl", hash = "sha256:f89a507e389b7e4d4892dd9a6f5f4da25849e24f73275478634ac594d621ab3f"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ac79f3c05747f9724bd56c06985e78331fc6c85eb50f3e3f1a35e0c60f9977e9"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75e7a733b372db3144a34020c4233f6b94db2c6342d6d16bc5245b1b941ee2bd"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40936d9384363331910abd59dd244158ec3572abf9d37322f15095315ac99893"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a31d9d60be4b585585081109480cfb2ef564d3b851cb32a139bf8408411a93a"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:953bfac819d32dc72b963767589e0ed372e5e9e78b03fb6b89419d0500d34bbe"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8f0090ff14038f17a026ca408a3a0b0e7affb6aa7498b2b59d670f40ac970fbe"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:6b29abac56ce347d2eb58a560723e1663ee2125cf5cc38866ed92b84319927ec"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-win32.whl", hash = "sha256:059fbb48333148143e8667a5323d162628dfe27c386bd0ed3deeecfc390338bf"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-win_amd64.whl", hash = "sha256:16de2797dcfcc2263b8672bf0751166f7c7b369ca2ff9246ceb67b65f8e1d802"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c71d30b6708438050675f338edb9a25bea6c258478dbe5ec8405286756a2d347"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d283aee588a72072439e6721cb64aa6cba5bc18c576ef0ab28285a6ec7a9d655"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc852da612c7e347f2fcf921df2eca2718697a49f648a28a63db3ab504fd9510"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02620454ee8101f77a317f3229935ce687480883d72a40858ff4b0c87c935cce"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7a92680bea1c260e5c0d2d6cd60b0c913cba76a456a147db5ac047ecfcfcc758"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:168334cba3f1cbf55299ef38f0f2e31879115cc767b780c859f7814a52d80abb"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:48b6886a87b4ceb9b9f78550f77b2a5c7d2ce33bc83efd886556ad468cc9c85a"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-win32.whl", hash = "sha256:87be84084a1b922c4ba15e2e5aa900ee24b78a5467997cb7aec0a1d6cdb4a00b"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8b8cf1c6c56f5c18bdbd9f5e93b52ca29cb4d99606d4056e91f0c761eef496dc"}, + {file = "dependency_injector-4.41.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8686fa330c83251c75c8238697686f7a0e0f6d40658538089165dc72df9bcff"}, + {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d670a844268dcd758195e58e9a5b39fc74bb8648aba99a13135a4a10ec9cfac"}, + {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3b9d41e0eff4c8e16fea1e33de66ff0030fe51137ca530f3c52ce110447914"}, + {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a724e0a737baadb4378f5dc1b079867cc3a88552fcca719b3dba84716828b2"}, + {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3588bd887b051d16b8bcabaae1127eb14059a0719a8fe34c8a75ba59321b352c"}, + {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:409441122f40e1b4b8582845fdd76deb9dc5c9d6eb74a057b85736ef9e9c671f"}, + {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7dcba8665cafec825b7095d5dd80afb5cf14404450eca3fe8b66e1edbf4dbc10"}, + {file = "dependency_injector-4.41.0-cp38-cp38-win32.whl", hash = "sha256:8b51efeaebacaf79ef68edfc65e9687699ccffb3538c4a3ab30d0d77e2db7189"}, + {file = "dependency_injector-4.41.0-cp38-cp38-win_amd64.whl", hash = "sha256:1662e2ef60ac6e681b9e11b5d8b7c17a0f733688916cf695f9540f8f50a61b1e"}, + {file = "dependency_injector-4.41.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:51217cb384b468d7cc355544cec20774859f00812f9a1a71ed7fa701c957b2a7"}, + {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3890a12423ae3a9eade035093beba487f8d092ee6c6cb8706f4e7080a56e819"}, + {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99ed73b1521bf249e2823a08a730c9f9413a58f4b4290da022e0ad4fb333ba3d"}, + {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:300838e9d4f3fbf539892a5a4072851728e23b37a1f467afcf393edd994d88f0"}, + {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56d37b9d2f50a18f059d9abdbea7669a7518bd42b81603c21a27910a2b3f1657"}, + {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4a44ca3ce5867513a70b31855b218be3d251f5068ce1c480cc3a4ad24ffd3280"}, + {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:67b369592c57549ccdcad0d5fef1ddb9d39af7fed8083d76e789ab0111fc6389"}, + {file = "dependency_injector-4.41.0-cp39-cp39-win32.whl", hash = "sha256:740a8e8106a04d3f44b52b25b80570fdac96a8a3934423de7c9202c5623e7936"}, + {file = "dependency_injector-4.41.0-cp39-cp39-win_amd64.whl", hash = "sha256:22b11dbf696e184f0b3d5ac4e5418aeac3c379ba4ea758c04a83869b7e5d1cbf"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b365a8548e9a49049fa6acb24d3cd939f619eeb8e300ca3e156e44402dcc07ec"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5168dc59808317dc4cdd235aa5d7d556d33e5600156acaf224cead236b48a3e8"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3229d83e99e255451605d5276604386e06ad948e3d60f31ddd796781c77f76f"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1baee908f21190bdc46a65ce4c417a5175e9397ca62354928694fce218f84487"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b37f36ecb0c1227f697e1d4a029644e3eda8dd0f0716aa63ad04d96dbb15bbbb"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b0c9c966ff66c77364a2d43d08de9968aff7e3903938fe912ba49796b2133344"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12e91ac0333e7e589421943ff6c6bf9cf0d9ac9703301cec37ccff3723406332"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2440b32474d4e747209528ca3ae48f42563b2fbe3d74dbfe949c11dfbfef7c4"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54032d62610cf2f4421c9d92cef52957215aaa0bca403cda580c58eb3f726eda"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:76b94c8310929e54136f3cb3de3adc86d1a657b3984299f40bf1cd2ba0bae548"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6ee9810841c6e0599356cb884d16453bfca6ab739d0e4f0248724ed8f9ee0d79"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b98945edae88e777091bf0848f869fb94bd76dfa4066d7c870a5caa933391d0"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a2dee5d4abdd21f1a30a51d46645c095be9dcc404c7c6e9f81d0a01415a49e64"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d03f5fa0fa98a18bd0dfce846db80e2798607f0b861f1f99c97f441f7669d7a2"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f2842e15bae664a9f69932e922b02afa055c91efec959cb1896f6c499bf68180"}, +] + +[package.dependencies] +six = ">=1.7.0,<=1.16.0" + +[package.extras] +aiohttp = ["aiohttp"] +flask = ["flask"] +pydantic = ["pydantic"] +yaml = ["pyyaml"] + +[[package]] +name = "dill" +version = "0.3.8" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "dnspython" +version = "2.6.1" +description = "DNS toolkit" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, +] + +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=41)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + +[[package]] +name = "dulwich" +version = "0.22.1" +description = "Python Git Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dulwich-0.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:892914dc2e80403d16e59a3b440044f6092fde5ffd4ec1fdf36d6ff20a8e624d"}, + {file = "dulwich-0.22.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b03092399f0f5d3e112405b890128afdb9e1f203eafb812f5d9105b0f5fac9d4"}, + {file = "dulwich-0.22.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a2c790517ed884bc1b1590806222ab44989eeb7e7f14dfa915561c7ee3b9ac73"}, + {file = "dulwich-0.22.1-cp310-cp310-win32.whl", hash = "sha256:524d3497a86f79959c9c1d729715d60d8171ed3f71621d45afb4faee5a47e8a1"}, + {file = "dulwich-0.22.1-cp310-cp310-win_amd64.whl", hash = "sha256:d3146843b972f744aed551e8ac9fac5714baa864393e480586d467b7b4488426"}, + {file = "dulwich-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:82f26e592e9a36ab33bcdb419c7d53320e26c85dfc254cdb84f5f561a2fcaabf"}, + {file = "dulwich-0.22.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e90b8a2f24149c5803b733a24f1a016a2943b1f5a9ab2360db545e4638354c35"}, + {file = "dulwich-0.22.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b069639757b2f287f9cd0daf6765b536558c5e28263bbbb28e3d1925bce75400"}, + {file = "dulwich-0.22.1-cp311-cp311-win32.whl", hash = "sha256:3ae006498fea11515027a417e6e68b82e1c195d3516188ba2cc08210e3022d14"}, + {file = "dulwich-0.22.1-cp311-cp311-win_amd64.whl", hash = "sha256:a18d1392eabd02f337dcba23d723a4dcca87274ce8693cf88e6320f38bc3fdcd"}, + {file = "dulwich-0.22.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:12482e318895da9acabea7c0cc70b35d36833e7cb2def511ab3a63617f5c1af3"}, + {file = "dulwich-0.22.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dc42afedc8cda4f2fd15a06d2e9e41281074a02cdf31bb2e0dde4d80766a408"}, + {file = "dulwich-0.22.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3c7774232a2c9b195bde4fb72ad71455e877a9e4e9c0b17a57b1d9bd478838c"}, + {file = "dulwich-0.22.1-cp312-cp312-win32.whl", hash = "sha256:41dfc52db29a06fe23a5029abc3bc13503e28233b1c3a9614bc1e5c4d6adc1ce"}, + {file = "dulwich-0.22.1-cp312-cp312-win_amd64.whl", hash = "sha256:9d19f04ecd4628a0e4587b4c4e98e040b87924c1362ae5aa27420435f05d5dd8"}, + {file = "dulwich-0.22.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0d72a88c7af8fafa14c8743e8923c8d46bd0b850a0b7f5e34eb49201f1ead88e"}, + {file = "dulwich-0.22.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e36c8a3bb09db5730b3d5014d087bce977e878825cdd7ba8285abcd81c43bc0"}, + {file = "dulwich-0.22.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd51e77ff1b4ca08bc9b09b85646a3e77f275827b7b30180d76d769ce608e64d"}, + {file = "dulwich-0.22.1-cp37-cp37m-win32.whl", hash = "sha256:739ef91aeb13fa2aa187d0efd46d0ac168301f54a6ef748565c42876b4b3ce71"}, + {file = "dulwich-0.22.1-cp37-cp37m-win_amd64.whl", hash = "sha256:91966b7b48ec939e5083b03c9154fc450508056f01650ecb58724095307427f5"}, + {file = "dulwich-0.22.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:86be1e283d78cc3f7daee1dcd0254122160cde71ca8c5348315156045f8ac2bb"}, + {file = "dulwich-0.22.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926d671654a2f8cfa0b2fcb6b0c46833af95b5265d27a5c56c49c5a10f3ff3ba"}, + {file = "dulwich-0.22.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:467ff87fc4c61a23424b32acd952476ba17e7f7eeb8090e5957f68129784a35f"}, + {file = "dulwich-0.22.1-cp38-cp38-win32.whl", hash = "sha256:f9e10678fe0692c5167553981d97cbe342ed055c49016aef10da336e2962b1f2"}, + {file = "dulwich-0.22.1-cp38-cp38-win_amd64.whl", hash = "sha256:6386165c64ba5f61c416301f7f32bb899f8200ca575d76888697a42fda8a92d2"}, + {file = "dulwich-0.22.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:84db8aef08df6431b017cc3abe57b3d6885fd7436eec8d715603c309353b233c"}, + {file = "dulwich-0.22.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:155124219e6ce4b116d30ed1b9cc63c88021966b29ce761d3ce3caba064f9a13"}, + {file = "dulwich-0.22.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7579429e89deac6659b4ea70eb3de9063bb40508fd4a8a020fa67b02e0b59f4f"}, + {file = "dulwich-0.22.1-cp39-cp39-win32.whl", hash = "sha256:454d073e628043dde4f9bd34517736c1889dbe6417099bbae2119873b8d4d5da"}, + {file = "dulwich-0.22.1-cp39-cp39-win_amd64.whl", hash = "sha256:e1b51d26108a832f151da8856a93676cc1a5cd8dd0bc20f06f4aee5774a7f0f9"}, + {file = "dulwich-0.22.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4c509e8172b9438536946097768413f297229b03eff064e4e06749cf5c28df78"}, + {file = "dulwich-0.22.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64eebe1d709539d6e80440fa1185f1eeb260d53bcb6435b1f753b4ce90a65e82"}, + {file = "dulwich-0.22.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52a8ddd1d9b5681de216a7af718720f5202d3c093ecc10dd4dfac6d25da605a6"}, + {file = "dulwich-0.22.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7244b796dd7e191753b822ac0ca871a4b9139b0b850770ac5bd347d5f8c76768"}, + {file = "dulwich-0.22.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7798e842ec506d25f21e825259b70109325ac1c9b43c2e287aad7559455951b"}, + {file = "dulwich-0.22.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9fcf7c5cf1e9d0bcc643672f81bf43ec81f6495b99809649f5bfcdff633ab0"}, + {file = "dulwich-0.22.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e346c1b86c5e5f175ca8f87f3873eea8b2e0eeb5d52033b475cf85641cb200c2"}, + {file = "dulwich-0.22.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b2054e1f2c7041857ce129443bde23298ca37592ce82f0fb5ed5704d5f3708dd"}, + {file = "dulwich-0.22.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3ad3462d070b678fe61d3bdd7c6ac3fdbd25cca66f32b6edf589dd88fff251d2"}, + {file = "dulwich-0.22.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc6575476539c0b4924abab3896fc76be2f413d5baa6b083c4dfc4abc59329e"}, + {file = "dulwich-0.22.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3de7a2eba26ff13a79670f78f73fc86fb8c87100508119f3b6bd61451bfdd4bf"}, + {file = "dulwich-0.22.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b2c3186cf76d598a9d42b35e09ef35d499118b4197624ba5bba1b3a39ac6a75f"}, + {file = "dulwich-0.22.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a366cdba24b8df31ad70b82bae55baa696c453678c1346da8390396a1d5cce4"}, + {file = "dulwich-0.22.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fb61891b2675664dc89d486eb5199e3659179ae04fc0a863ffc7e16b782b624"}, + {file = "dulwich-0.22.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ea4c5feedd35e8bde175a9ab91ef6705c3cef5ee209eeb2f67dd0b59ff1825f"}, + {file = "dulwich-0.22.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:20f61f6dc0b075ca6459acbfb9527ee0e1ee02dccbed126dc492600bb7310d86"}, + {file = "dulwich-0.22.1.tar.gz", hash = "sha256:e36d85967cfbf25da1c7bc3d6921adc5baa976969d926aaf1582bd5fd7e94758"}, +] + +[package.dependencies] +urllib3 = ">=1.25" + +[package.extras] +fastimport = ["fastimport"] +https = ["urllib3 (>=1.24.1)"] +paramiko = ["paramiko"] +pgp = ["gpg"] + +[[package]] +name = "ecdsa" +version = "0.19.0" +description = "ECDSA cryptographic signature library (pure python)" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.6" +files = [ + {file = "ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a"}, + {file = "ecdsa-0.19.0.tar.gz", hash = "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8"}, +] + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +gmpy = ["gmpy"] +gmpy2 = ["gmpy2"] + +[[package]] +name = "emoji" +version = "2.12.1" +description = "Emoji for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "emoji-2.12.1-py3-none-any.whl", hash = "sha256:a00d62173bdadc2510967a381810101624a2f0986145b8da0cffa42e29430235"}, + {file = "emoji-2.12.1.tar.gz", hash = "sha256:4aa0488817691aa58d83764b6c209f8a27c0b3ab3f89d1b8dceca1a62e4973eb"}, +] + +[package.dependencies] +typing-extensions = ">=4.7.0" + +[package.extras] +dev = ["coverage", "pytest (>=7.4.4)"] + +[[package]] +name = "everett" +version = "3.1.0" +description = "Configuration library for Python applications" +optional = false +python-versions = "*" +files = [ + {file = "everett-3.1.0-py2.py3-none-any.whl", hash = "sha256:db13891b849e45e54faea93ee79881d12458c5378f5b9b7f806eeff03ce1de3c"}, + {file = "everett-3.1.0.tar.gz", hash = "sha256:46175da5bcb06c193aa129e59714bca981344ff067c3a8bc2e625bc0b3dc01f6"}, +] + +[package.dependencies] +configobj = {version = "*", optional = true, markers = "extra == \"ini\""} + +[package.extras] +ini = ["configobj"] +yaml = ["PyYAML"] + +[[package]] +name = "exceptiongroup" +version = "1.2.1" +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"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "filelock" +version = "3.15.3" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.15.3-py3-none-any.whl", hash = "sha256:0151273e5b5d6cf753a61ec83b3a9b7d8821c39ae9af9d7ecf2f9e2f17404103"}, + {file = "filelock-3.15.3.tar.gz", hash = "sha256:e1199bf5194a2277273dacd50269f0d87d0682088a3c561c15674ea9005d8635"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "filetype" +version = "1.2.0" +description = "Infer file type and MIME type of any file/buffer. No external dependencies." +optional = false +python-versions = "*" +files = [ + {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"}, + {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, +] + +[[package]] +name = "flatten-dict" +version = "0.4.2" +description = "A flexible utility for flattening and unflattening dict-like objects in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "flatten-dict-0.4.2.tar.gz", hash = "sha256:506a96b6e6f805b81ae46a0f9f31290beb5fa79ded9d80dbe1b7fa236ab43076"}, + {file = "flatten_dict-0.4.2-py2.py3-none-any.whl", hash = "sha256:7e245b20c4c718981212210eec4284a330c9f713e632e98765560e05421e48ad"}, +] + +[package.dependencies] +six = ">=1.12,<2.0" + +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "fsspec" +version = "2024.5.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.5.0-py3-none-any.whl", hash = "sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c"}, + {file = "fsspec-2024.5.0.tar.gz", hash = "sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a"}, +] + +[package.dependencies] +aiohttp = {version = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1", optional = true, markers = "extra == \"http\""} + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +tqdm = ["tqdm"] + +[[package]] +name = "gdown" +version = "5.2.0" +description = "Google Drive Public File/Folder Downloader" +optional = false +python-versions = ">=3.8" +files = [ + {file = "gdown-5.2.0-py3-none-any.whl", hash = "sha256:33083832d82b1101bdd0e9df3edd0fbc0e1c5f14c9d8c38d2a35bf1683b526d6"}, + {file = "gdown-5.2.0.tar.gz", hash = "sha256:2145165062d85520a3cd98b356c9ed522c5e7984d408535409fd46f94defc787"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +filelock = "*" +requests = {version = "*", extras = ["socks"]} +tqdm = "*" + +[package.extras] +test = ["build", "mypy", "pytest", "pytest-xdist", "ruff", "twine", "types-requests", "types-setuptools"] + +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.43" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] + +[[package]] +name = "google-api-core" +version = "2.19.0" +description = "Google API client core library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, + {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, +] + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-auth" +version = "2.30.0" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, + {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "google-cloud-core" +version = "2.4.1" +description = "Google Cloud API client core library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-core-2.4.1.tar.gz", hash = "sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073"}, + {file = "google_cloud_core-2.4.1-py2.py3-none-any.whl", hash = "sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61"}, +] + +[package.dependencies] +google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" + +[package.extras] +grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] + +[[package]] +name = "google-cloud-storage" +version = "2.14.0" +description = "Google Cloud Storage API client library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-storage-2.14.0.tar.gz", hash = "sha256:2d23fcf59b55e7b45336729c148bb1c464468c69d5efbaee30f7201dd90eb97e"}, + {file = "google_cloud_storage-2.14.0-py2.py3-none-any.whl", hash = "sha256:8641243bbf2a2042c16a6399551fbb13f062cbc9a2de38d6c0bb5426962e9dbd"}, +] + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" +google-auth = ">=2.23.3,<3.0dev" +google-cloud-core = ">=2.3.0,<3.0dev" +google-crc32c = ">=1.0,<2.0dev" +google-resumable-media = ">=2.6.0" +requests = ">=2.18.0,<3.0.0dev" + +[package.extras] +protobuf = ["protobuf (<5.0.0dev)"] + +[[package]] +name = "google-crc32c" +version = "1.5.0" +description = "A python wrapper of the C library 'Google CRC32C'" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, + {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13"}, + {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c"}, + {file = "google_crc32c-1.5.0-cp310-cp310-win32.whl", hash = "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee"}, + {file = "google_crc32c-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289"}, + {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273"}, + {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c"}, + {file = "google_crc32c-1.5.0-cp311-cp311-win32.whl", hash = "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709"}, + {file = "google_crc32c-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-win32.whl", hash = "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740"}, + {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8"}, + {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-win32.whl", hash = "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4"}, + {file = "google_crc32c-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c"}, + {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7"}, + {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61"}, + {file = "google_crc32c-1.5.0-cp39-cp39-win32.whl", hash = "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c"}, + {file = "google_crc32c-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93"}, +] + +[package.extras] +testing = ["pytest"] + +[[package]] +name = "google-resumable-media" +version = "2.7.1" +description = "Utilities for Google Media Downloads and Resumable Uploads" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-resumable-media-2.7.1.tar.gz", hash = "sha256:eae451a7b2e2cdbaaa0fd2eb00cc8a1ee5e95e16b55597359cbc3d27d7d90e33"}, + {file = "google_resumable_media-2.7.1-py2.py3-none-any.whl", hash = "sha256:103ebc4ba331ab1bfdac0250f8033627a2cd7cde09e7ccff9181e31ba4315b2c"}, +] + +[package.dependencies] +google-crc32c = ">=1.0,<2.0dev" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "google-auth (>=1.22.0,<2.0dev)"] +requests = ["requests (>=2.18.0,<3.0.0dev)"] + +[[package]] +name = "googleapis-common-protos" +version = "1.63.1" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"}, + {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"}, +] + +[package.dependencies] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + +[[package]] +name = "greenlet" +version = "3.0.3" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + +[[package]] +name = "grpcio" +version = "1.64.1" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.8" +files = [ + {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, + {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, + {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, + {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, + {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, + {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, + {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, + {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, + {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, + {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, + {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, + {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, + {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, + {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, + {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, + {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, + {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, + {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, + {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, + {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, + {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.64.1)"] + +[[package]] +name = "grpcio-tools" +version = "1.62.2" +description = "Protobuf code generator for gRPC" +optional = false +python-versions = ">=3.7" +files = [ + {file = "grpcio-tools-1.62.2.tar.gz", hash = "sha256:5fd5e1582b678e6b941ee5f5809340be5e0724691df5299aae8226640f94e18f"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:1679b4903aed2dc5bd8cb22a452225b05dc8470a076f14fd703581efc0740cdb"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:9d41e0e47dd075c075bb8f103422968a65dd0d8dc8613288f573ae91eb1053ba"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:987e774f74296842bbffd55ea8826370f70c499e5b5f71a8cf3103838b6ee9c3"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40cd4eeea4b25bcb6903b82930d579027d034ba944393c4751cdefd9c49e6989"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6746bc823958499a3cf8963cc1de00072962fb5e629f26d658882d3f4c35095"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2ed775e844566ce9ce089be9a81a8b928623b8ee5820f5e4d58c1a9d33dfc5ae"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bdc5dd3f57b5368d5d661d5d3703bcaa38bceca59d25955dff66244dbc987271"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-win32.whl", hash = "sha256:3a8d6f07e64c0c7756f4e0c4781d9d5a2b9cc9cbd28f7032a6fb8d4f847d0445"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-win_amd64.whl", hash = "sha256:e33b59fb3efdddeb97ded988a871710033e8638534c826567738d3edce528752"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:472505d030135d73afe4143b0873efe0dcb385bd6d847553b4f3afe07679af00"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:ec674b4440ef4311ac1245a709e87b36aca493ddc6850eebe0b278d1f2b6e7d1"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:184b4174d4bd82089d706e8223e46c42390a6ebac191073b9772abc77308f9fa"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c195d74fe98541178ece7a50dad2197d43991e0f77372b9a88da438be2486f12"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a34d97c62e61bfe9e6cff0410fe144ac8cca2fc979ad0be46b7edf026339d161"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cbb8453ae83a1db2452b7fe0f4b78e4a8dd32be0f2b2b73591ae620d4d784d3d"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f989e5cebead3ae92c6abf6bf7b19949e1563a776aea896ac5933f143f0c45d"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-win32.whl", hash = "sha256:c48fabe40b9170f4e3d7dd2c252e4f1ff395dc24e49ac15fc724b1b6f11724da"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c616d0ad872e3780693fce6a3ac8ef00fc0963e6d7815ce9dcfae68ba0fc287"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:10cc3321704ecd17c93cf68c99c35467a8a97ffaaed53207e9b2da6ae0308ee1"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:9be84ff6d47fd61462be7523b49d7ba01adf67ce4e1447eae37721ab32464dd8"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:d82f681c9a9d933a9d8068e8e382977768e7779ddb8870fa0cf918d8250d1532"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04c607029ae3660fb1624ed273811ffe09d57d84287d37e63b5b802a35897329"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72b61332f1b439c14cbd3815174a8f1d35067a02047c32decd406b3a09bb9890"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8214820990d01b52845f9fbcb92d2b7384a0c321b303e3ac614c219dc7d1d3af"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:462e0ab8dd7c7b70bfd6e3195eebc177549ede5cf3189814850c76f9a340d7ce"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-win32.whl", hash = "sha256:fa107460c842e4c1a6266150881694fefd4f33baa544ea9489601810c2210ef8"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-win_amd64.whl", hash = "sha256:759c60f24c33a181bbbc1232a6752f9b49fbb1583312a4917e2b389fea0fb0f2"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:45db5da2bcfa88f2b86b57ef35daaae85c60bd6754a051d35d9449c959925b57"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:ab84bae88597133f6ea7a2bdc57b2fda98a266fe8d8d4763652cbefd20e73ad7"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:7a49bccae1c7d154b78e991885c3111c9ad8c8fa98e91233de425718f47c6139"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7e439476b29d6dac363b321781a113794397afceeb97dad85349db5f1cb5e9a"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ea369c4d1567d1acdf69c8ea74144f4ccad9e545df7f9a4fc64c94fa7684ba3"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4f955702dc4b530696375251319d05223b729ed24e8673c2129f7a75d2caefbb"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3708a747aa4b6b505727282ca887041174e146ae030ebcadaf4c1d346858df62"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-win_amd64.whl", hash = "sha256:2ce149ea55eadb486a7fb75a20f63ef3ac065ee6a0240ed25f3549ce7954c653"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:58cbb24b3fa6ae35aa9c210fcea3a51aa5fef0cd25618eb4fd94f746d5a9b703"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:6413581e14a80e0b4532577766cf0586de4dd33766a31b3eb5374a746771c07d"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:47117c8a7e861382470d0e22d336e5a91fdc5f851d1db44fa784b9acea190d87"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f1ba79a253df9e553d20319c615fa2b429684580fa042dba618d7f6649ac7e4"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04a394cf5e51ba9be412eb9f6c482b6270bd81016e033e8eb7d21b8cc28fe8b5"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3c53b221378b035ae2f1881cbc3aca42a6075a8e90e1a342c2f205eb1d1aa6a1"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c384c838b34d1b67068e51b5bbe49caa6aa3633acd158f1ab16b5da8d226bc53"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-win32.whl", hash = "sha256:19ea69e41c3565932aa28a202d1875ec56786aea46a2eab54a3b28e8a27f9517"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-win_amd64.whl", hash = "sha256:1d768a5c07279a4c461ebf52d0cec1c6ca85c6291c71ec2703fe3c3e7e28e8c4"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:5b07b5874187e170edfbd7aa2ca3a54ebf3b2952487653e8c0b0d83601c33035"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:d58389fe8be206ddfb4fa703db1e24c956856fcb9a81da62b13577b3a8f7fda7"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:7d8b4e00c3d7237b92260fc18a561cd81f1da82e8be100db1b7d816250defc66"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe08d2038f2b7c53259b5c49e0ad08c8e0ce2b548d8185993e7ef67e8592cca"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19216e1fb26dbe23d12a810517e1b3fbb8d4f98b1a3fbebeec9d93a79f092de4"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b8574469ecc4ff41d6bb95f44e0297cdb0d95bade388552a9a444db9cd7485cd"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4f6f32d39283ea834a493fccf0ebe9cfddee7577bdcc27736ad4be1732a36399"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-win32.whl", hash = "sha256:76eb459bdf3fb666e01883270beee18f3f11ed44488486b61cd210b4e0e17cc1"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-win_amd64.whl", hash = "sha256:217c2ee6a7ce519a55958b8622e21804f6fdb774db08c322f4c9536c35fdce7c"}, +] + +[package.dependencies] +grpcio = ">=1.62.2" +protobuf = ">=4.21.6,<5.0dev" +setuptools = "*" + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "h2" +version = "4.1.0" +description = "HTTP/2 State-Machine based protocol implementation" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, + {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, +] + +[package.dependencies] +hpack = ">=4.0,<5" +hyperframe = ">=6.0,<7" + +[[package]] +name = "hpack" +version = "4.0.0" +description = "Pure-Python HPACK header compression" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, + {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +h2 = {version = ">=3,<5", optional = true, markers = "extra == \"http2\""} +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "huggingface-hub" +version = "0.23.4" +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"}, +] + +[package.dependencies] +filelock = "*" +fsspec = ">=2023.5.0" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +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)"] +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)"] +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)"] +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"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] + +[[package]] +name = "hyperframe" +version = "6.0.1" +description = "HTTP/2 framing layer for Python" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, + {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, +] + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "install" +version = "1.3.5" +description = "Install packages from within code" +optional = false +python-versions = ">=2.7, >=3.5" +files = [ + {file = "install-1.3.5-py3-none-any.whl", hash = "sha256:0d3fadf4aa62c95efe8d34757c8507eb46177f86c016c21c6551eafc6a53d5a9"}, + {file = "install-1.3.5.tar.gz", hash = "sha256:e67c8a0be5ccf8cb4ffa17d090f3a61b6e820e6a7e21cd1d2c0f7bc59b18e647"}, +] + +[[package]] +name = "instructorembedding" +version = "1.0.1" +description = "Text embedding tool" +optional = false +python-versions = "*" +files = [ + {file = "InstructorEmbedding-1.0.1-py2.py3-none-any.whl", hash = "sha256:c8d0c11d0bab3ede023104e1f3de6a3471bf71208cc272d1ef72bae771e7d1a3"}, + {file = "InstructorEmbedding-1.0.1.tar.gz", hash = "sha256:886495ddd561bad57e8e7d5e8ee44c4243b1d80b538a25d32d37350f6082ee62"}, +] + +[[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" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpath-python" +version = "1.0.6" +description = "A more powerful JSONPath implementation in modern python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "jsonpath-python-1.0.6.tar.gz", hash = "sha256:dd5be4a72d8a2995c3f583cf82bf3cd1a9544cfdabf2d22595b67aff07349666"}, + {file = "jsonpath_python-1.0.6-py3-none-any.whl", hash = "sha256:1e3b78df579f5efc23565293612decee04214609208a2335884b3ee3f786b575"}, +] + +[[package]] +name = "jsonpickle" +version = "3.2.2" +description = "Python library for serializing arbitrary object graphs into JSON" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpickle-3.2.2-py3-none-any.whl", hash = "sha256:87cd82d237fd72c5a34970e7222dddc0accc13fddf49af84111887ed9a9445aa"}, + {file = "jsonpickle-3.2.2.tar.gz", hash = "sha256:d425fd2b8afe9f5d7d57205153403fbf897782204437882a477e8eed60930f8c"}, +] + +[package.extras] +docs = ["furo", "rst.linker (>=1.9)", "sphinx"] +packaging = ["build", "twine"] +testing = ["bson", "ecdsa", "feedparser", "gmpy2", "numpy", "pandas", "pymongo", "pytest (>=3.5,!=3.7.3)", "pytest-benchmark", "pytest-benchmark[histogram]", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-ruff (>=0.2.1)", "scikit-learn", "scipy", "scipy (>=1.9.3)", "simplejson", "sqlalchemy", "ujson"] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.22.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, + {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "langchain" +version = "0.1.20" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain-0.1.20-py3-none-any.whl", hash = "sha256:09991999fbd6c3421a12db3c7d1f52d55601fc41d9b2a3ef51aab2e0e9c38da9"}, + {file = "langchain-0.1.20.tar.gz", hash = "sha256:f35c95eed8c8375e02dce95a34f2fd4856a4c98269d6dc34547a23dba5beab7e"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} +dataclasses-json = ">=0.5.7,<0.7" +langchain-community = ">=0.0.38,<0.1" +langchain-core = ">=0.1.52,<0.2.0" +langchain-text-splitters = ">=0.0.1,<0.1" +langsmith = ">=0.1.17,<0.2.0" +numpy = ">=1,<2" +pydantic = ">=1,<3" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-textanalytics (>=5.3.0,<6.0.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b8)", "openai (<2)"] +clarifai = ["clarifai (>=9.1.0)"] +cli = ["typer (>=0.9.0,<0.10.0)"] +cohere = ["cohere (>=4,<6)"] +docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] +embeddings = ["sentence-transformers (>=2,<3)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<6)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.0.2,<0.1)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] +javascript = ["esprima (>=4.0.1,<5.0.0)"] +llms = ["clarifai (>=9.1.0)", "cohere (>=4,<6)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (<2)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] +openai = ["openai (<2)", "tiktoken (>=0.3.2,<0.6.0)"] +qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] +text-helpers = ["chardet (>=5.1.0,<6.0.0)"] + +[[package]] +name = "langchain-community" +version = "0.0.38" +description = "Community contributed LangChain integrations." +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_community-0.0.38-py3-none-any.whl", hash = "sha256:ecb48660a70a08c90229be46b0cc5f6bc9f38f2833ee44c57dfab9bf3a2c121a"}, + {file = "langchain_community-0.0.38.tar.gz", hash = "sha256:127fc4b75bc67b62fe827c66c02e715a730fef8fe69bd2023d466bab06b5810d"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +dataclasses-json = ">=0.5.7,<0.7" +langchain-core = ">=0.1.52,<0.2.0" +langsmith = ">=0.1.0,<0.2.0" +numpy = ">=1,<2" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +cli = ["typer (>=0.9.0,<0.10.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "azure-identity (>=1.15.0,<2.0.0)", "azure-search-documents (==11.4.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.6,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cloudpickle (>=2.0.0)", "cohere (>=4,<5)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "friendli-client (>=1.2.4,<2.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "httpx (>=0.24.1,<0.25.0)", "httpx-sse (>=0.4.0,<0.5.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "nvidia-riva-client (>=2.14.0,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "oracledb (>=2.2.0,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "premai (>=0.3.25,<0.4.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pyjwt (>=2.8.0,<3.0.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tidb-vector (>=0.0.3,<1.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "tree-sitter (>=0.20.2,<0.21.0)", "tree-sitter-languages (>=1.8.0,<2.0.0)", "upstash-redis (>=0.15.0,<0.16.0)", "vdms (>=0.0.20,<0.0.21)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] + +[[package]] +name = "langchain-core" +version = "0.1.52" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_core-0.1.52-py3-none-any.whl", hash = "sha256:62566749c92e8a1181c255c788548dc16dbc319d896cd6b9c95dc17af9b2a6db"}, + {file = "langchain_core-0.1.52.tar.gz", hash = "sha256:084c3fc452f5a6966c28ab3ec5dbc8b8d26fc3f63378073928f4e29d90b6393f"}, +] + +[package.dependencies] +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.1.0,<0.2.0" +packaging = ">=23.2,<24.0" +pydantic = ">=1,<3" +PyYAML = ">=5.3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +extended-testing = ["jinja2 (>=3,<4)"] + +[[package]] +name = "langchain-openai" +version = "0.1.7" +description = "An integration package connecting OpenAI and LangChain" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_openai-0.1.7-py3-none-any.whl", hash = "sha256:39c3cb22bb739900ae8294d4d9939a6138c0ca7ad11198e57038eb14c08d04ec"}, + {file = "langchain_openai-0.1.7.tar.gz", hash = "sha256:fd7e1c33ba8e2cab4b2154f3a2fd4a0d9cc6518b41cf49bb87255f9f732a4896"}, +] + +[package.dependencies] +langchain-core = ">=0.1.46,<0.3" +openai = ">=1.24.0,<2.0.0" +tiktoken = ">=0.7,<1" + +[[package]] +name = "langchain-text-splitters" +version = "0.0.2" +description = "LangChain text splitting utilities" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_text_splitters-0.0.2-py3-none-any.whl", hash = "sha256:13887f32705862c1e1454213cb7834a63aae57c26fcd80346703a1d09c46168d"}, + {file = "langchain_text_splitters-0.0.2.tar.gz", hash = "sha256:ac8927dc0ba08eba702f6961c9ed7df7cead8de19a9f7101ab2b5ea34201b3c1"}, +] + +[package.dependencies] +langchain-core = ">=0.1.28,<0.3" + +[package.extras] +extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"] + +[[package]] +name = "langdetect" +version = "1.0.9" +description = "Language detection library ported from Google's language-detection." +optional = false +python-versions = "*" +files = [ + {file = "langdetect-1.0.9-py2-none-any.whl", hash = "sha256:7cbc0746252f19e76f77c0b1690aadf01963be835ef0cd4b56dddf2a8f1dfc2a"}, + {file = "langdetect-1.0.9.tar.gz", hash = "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "langsmith" +version = "0.1.81" +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.81-py3-none-any.whl", hash = "sha256:3251d823225eef23ee541980b9d9e506367eabbb7f985a086b5d09e8f78ba7e9"}, + {file = "langsmith-0.1.81.tar.gz", hash = "sha256:585ef3a2251380bd2843a664c9a28da4a7d28432e3ee8bcebf291ffb8e1f0af0"}, +] + +[package.dependencies] +orjson = ">=3.9.14,<4.0.0" +pydantic = ">=1,<3" +requests = ">=2,<3" + +[[package]] +name = "lxml" +version = "5.2.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, + {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, + {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, + {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, + {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, + {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, + {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, + {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, + {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, + {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, + {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, + {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, + {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, + {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, + {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, + {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, + {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, + {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, + {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.10)"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "marshmallow" +version = "3.21.3" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "marshmallow-3.21.3-py3-none-any.whl", hash = "sha256:86ce7fb914aa865001a4b2092c4c2872d13bc347f3d42673272cabfdbad386f1"}, + {file = "marshmallow-3.21.3.tar.gz", hash = "sha256:4f57c5e050a54d66361e826f94fba213eb10b67b2fdb02c3e0343ce207ba1662"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] +docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.3.7)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "marshmallow-dataclass" +version = "8.6.1" +description = "Python library to convert dataclasses into marshmallow schemas." +optional = false +python-versions = ">=3.6" +files = [ + {file = "marshmallow_dataclass-8.6.1-py3-none-any.whl", hash = "sha256:d941137bcb480729a14810e5f10d9bb79a498fb5b57c875aad6be37e97b98a5f"}, + {file = "marshmallow_dataclass-8.6.1.tar.gz", hash = "sha256:dca312c841f73f8f665b4434d23b3204e8cfbf50b8cbb57bb76f41a6ee8184c8"}, +] + +[package.dependencies] +marshmallow = ">=3.13.0,<4.0" +typing-extensions = {version = ">=4.2.0", markers = "python_version < \"3.11\" and python_version >= \"3.7\""} +typing-inspect = ">=0.8.0,<1.0" + +[package.extras] +dev = ["marshmallow (>=3.18.0,<4.0)", "marshmallow-enum", "pre-commit (>=2.17,<3.0)", "pytest (>=5.4)", "pytest-mypy-plugins (>=1.2.0)", "sphinx", "typeguard (>=2.4.1,<4.0.0)"] +docs = ["sphinx"] +enum = ["marshmallow (>=3.18.0,<4.0)", "marshmallow-enum"] +lint = ["pre-commit (>=2.17,<3.0)"] +tests = ["pytest (>=5.4)", "pytest-mypy-plugins (>=1.2.0)"] +union = ["typeguard (>=2.4.1,<4.0.0)"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[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" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + +[[package]] +name = "multiprocess" +version = "0.70.16" +description = "better multiprocessing and multithreading in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"}, + {file = "multiprocess-0.70.16-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec"}, + {file = "multiprocess-0.70.16-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37b55f71c07e2d741374998c043b9520b626a8dddc8b3129222ca4f1a06ef67a"}, + {file = "multiprocess-0.70.16-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba8c31889abf4511c7308a8c52bb4a30b9d590e7f58523302ba00237702ca054"}, + {file = "multiprocess-0.70.16-pp39-pypy39_pp73-macosx_10_13_x86_64.whl", hash = "sha256:0dfd078c306e08d46d7a8d06fb120313d87aa43af60d66da43ffff40b44d2f41"}, + {file = "multiprocess-0.70.16-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e7b9d0f307cd9bd50851afaac0dba2cb6c44449efff697df7c7645f7d3f2be3a"}, + {file = "multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02"}, + {file = "multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a"}, + {file = "multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e"}, + {file = "multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435"}, + {file = "multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3"}, + {file = "multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1"}, +] + +[package.dependencies] +dill = ">=0.3.8" + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "networkx" +version = "3.3" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +files = [ + {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, + {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, +] + +[package.extras] +default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "nltk" +version = "3.8.1" +description = "Natural Language Toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, + {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, +] + +[package.dependencies] +click = "*" +joblib = "*" +regex = ">=2021.8.3" +tqdm = "*" + +[package.extras] +all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] +corenlp = ["requests"] +machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "8.9.2.26" +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"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.20.5" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01"}, + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.5.40" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d9714f27c1d0f0895cd8915c07a87a1d0029a0aa36acaf9156952ec2a8a12189"}, + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-win_amd64.whl", hash = "sha256:c3401dc8543b52d3a8158007a0c1ab4e9c768fcbd24153a48c86972102197ddd"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, +] + +[[package]] +name = "openai" +version = "1.35.1" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-1.35.1-py3-none-any.whl", hash = "sha256:53ef8935cf916dc7ece67fee5a8a09fc4db5aadf4d6e95b5b7f767f3c4432e4d"}, + {file = "openai-1.35.1.tar.gz", hash = "sha256:d85973adc2f4fbb11ba20bfd948e3340b8352f6b8a02f1fa1c387c8eefac8d9d"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.7,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + +[[package]] +name = "ordered-set" +version = "4.1.0" +description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, + {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, +] + +[package.extras] +dev = ["black", "mypy", "pytest"] + +[[package]] +name = "orjson" +version = "3.10.5" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, + {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, + {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, + {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, + {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, + {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, + {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, + {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, + {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, + {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, + {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, + {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, + {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, + {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, + {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, + {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, +] + +[[package]] +name = "outcome" +version = "1.3.0.post0" +description = "Capture the outcome of Python function calls." +optional = false +python-versions = ">=3.7" +files = [ + {file = "outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b"}, + {file = "outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8"}, +] + +[package.dependencies] +attrs = ">=19.2.0" + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pandas" +version = "2.2.2" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, + {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, + {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, + {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, + {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, + {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "peft" +version = "0.11.1" +description = "Parameter-Efficient Fine-Tuning (PEFT)" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "peft-0.11.1-py3-none-any.whl", hash = "sha256:76f2d2a4c9e0644e2741465663b8a02097775e9725d26d7b41551e6f1e72e7dd"}, + {file = "peft-0.11.1.tar.gz", hash = "sha256:c1a04462e589a1305a06f7c118be0b8602b829f9bfc2104b5c6514c7678c2310"}, +] + +[package.dependencies] +accelerate = ">=0.21.0" +huggingface-hub = ">=0.17.0" +numpy = ">=1.17" +packaging = ">=20.0" +psutil = "*" +pyyaml = "*" +safetensors = "*" +torch = ">=1.13.0" +tqdm = "*" +transformers = "*" + +[package.extras] +dev = ["black", "hf-doc-builder", "ruff (>=0.2.1,<0.3.0)"] +docs-specific = ["black", "hf-doc-builder"] +quality = ["black", "hf-doc-builder", "ruff (>=0.2.1,<0.3.0)"] +test = ["black", "datasets", "diffusers (<0.21.0)", "hf-doc-builder", "parameterized", "pytest", "pytest-cov", "pytest-xdist", "ruff (>=0.2.1,<0.3.0)", "scipy"] + +[[package]] +name = "pika" +version = "1.3.2" +description = "Pika Python AMQP Client Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pika-1.3.2-py3-none-any.whl", hash = "sha256:0779a7c1fafd805672796085560d290213a465e4f6f76a6fb19e378d8041a14f"}, + {file = "pika-1.3.2.tar.gz", hash = "sha256:b2a327ddddf8570b4965b3576ac77091b850262d34ce8c1d8cb4e4146aa4145f"}, +] + +[package.extras] +gevent = ["gevent"] +tornado = ["tornado"] +twisted = ["twisted"] + +[[package]] +name = "pillow" +version = "10.3.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "pip" +version = "24.0" +description = "The PyPA recommended tool for installing Python packages." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pip-24.0-py3-none-any.whl", hash = "sha256:ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc"}, + {file = "pip-24.0.tar.gz", hash = "sha256:ea9bd1a847e8c5774a5777bb398c19e80bcd4e2aa16a4b301b718fe6f593aba2"}, +] + +[[package]] +name = "portalocker" +version = "2.8.2" +description = "Wraps the portalocker recipe for easy usage" +optional = false +python-versions = ">=3.8" +files = [ + {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, + {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, +] + +[package.dependencies] +pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} + +[package.extras] +docs = ["sphinx (>=1.7.1)"] +redis = ["redis"] +tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] + +[[package]] +name = "proto-plus" +version = "1.24.0" +description = "Beautiful, Pythonic protocol buffers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "proto-plus-1.24.0.tar.gz", hash = "sha256:30b72a5ecafe4406b0d339db35b56c4059064e69227b8c3bda7462397f966445"}, + {file = "proto_plus-1.24.0-py3-none-any.whl", hash = "sha256:402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<6.0.0dev" + +[package.extras] +testing = ["google-api-core (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "4.25.3" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, +] + +[[package]] +name = "psutil" +version = "6.0.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "pyarrow" +version = "16.1.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyarrow-16.1.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:17e23b9a65a70cc733d8b738baa6ad3722298fa0c81d88f63ff94bf25eaa77b9"}, + {file = "pyarrow-16.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4740cc41e2ba5d641071d0ab5e9ef9b5e6e8c7611351a5cb7c1d175eaf43674a"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98100e0268d04e0eec47b73f20b39c45b4006f3c4233719c3848aa27a03c1aef"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f68f409e7b283c085f2da014f9ef81e885d90dcd733bd648cfba3ef265961848"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:a8914cd176f448e09746037b0c6b3a9d7688cef451ec5735094055116857580c"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:48be160782c0556156d91adbdd5a4a7e719f8d407cb46ae3bb4eaee09b3111bd"}, + {file = "pyarrow-16.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cf389d444b0f41d9fe1444b70650fea31e9d52cfcb5f818b7888b91b586efff"}, + {file = "pyarrow-16.1.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:d0ebea336b535b37eee9eee31761813086d33ed06de9ab6fc6aaa0bace7b250c"}, + {file = "pyarrow-16.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e73cfc4a99e796727919c5541c65bb88b973377501e39b9842ea71401ca6c1c"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf9251264247ecfe93e5f5a0cd43b8ae834f1e61d1abca22da55b20c788417f6"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddf5aace92d520d3d2a20031d8b0ec27b4395cab9f74e07cc95edf42a5cc0147"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:25233642583bf658f629eb230b9bb79d9af4d9f9229890b3c878699c82f7d11e"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a33a64576fddfbec0a44112eaf844c20853647ca833e9a647bfae0582b2ff94b"}, + {file = "pyarrow-16.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:185d121b50836379fe012753cf15c4ba9638bda9645183ab36246923875f8d1b"}, + {file = "pyarrow-16.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:2e51ca1d6ed7f2e9d5c3c83decf27b0d17bb207a7dea986e8dc3e24f80ff7d6f"}, + {file = "pyarrow-16.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06ebccb6f8cb7357de85f60d5da50e83507954af617d7b05f48af1621d331c9a"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b04707f1979815f5e49824ce52d1dceb46e2f12909a48a6a753fe7cafbc44a0c"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d32000693deff8dc5df444b032b5985a48592c0697cb6e3071a5d59888714e2"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8785bb10d5d6fd5e15d718ee1d1f914fe768bf8b4d1e5e9bf253de8a26cb1628"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e1369af39587b794873b8a307cc6623a3b1194e69399af0efd05bb202195a5a7"}, + {file = "pyarrow-16.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:febde33305f1498f6df85e8020bca496d0e9ebf2093bab9e0f65e2b4ae2b3444"}, + {file = "pyarrow-16.1.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b5f5705ab977947a43ac83b52ade3b881eb6e95fcc02d76f501d549a210ba77f"}, + {file = "pyarrow-16.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0d27bf89dfc2576f6206e9cd6cf7a107c9c06dc13d53bbc25b0bd4556f19cf5f"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d07de3ee730647a600037bc1d7b7994067ed64d0eba797ac74b2bc77384f4c2"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbef391b63f708e103df99fbaa3acf9f671d77a183a07546ba2f2c297b361e83"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19741c4dbbbc986d38856ee7ddfdd6a00fc3b0fc2d928795b95410d38bb97d15"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f2c5fb249caa17b94e2b9278b36a05ce03d3180e6da0c4c3b3ce5b2788f30eed"}, + {file = "pyarrow-16.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:e6b6d3cd35fbb93b70ade1336022cc1147b95ec6af7d36906ca7fe432eb09710"}, + {file = "pyarrow-16.1.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:18da9b76a36a954665ccca8aa6bd9f46c1145f79c0bb8f4f244f5f8e799bca55"}, + {file = "pyarrow-16.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:99f7549779b6e434467d2aa43ab2b7224dd9e41bdde486020bae198978c9e05e"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f07fdffe4fd5b15f5ec15c8b64584868d063bc22b86b46c9695624ca3505b7b4"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddfe389a08ea374972bd4065d5f25d14e36b43ebc22fc75f7b951f24378bf0b5"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3b20bd67c94b3a2ea0a749d2a5712fc845a69cb5d52e78e6449bbd295611f3aa"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ba8ac20693c0bb0bf4b238751d4409e62852004a8cf031c73b0e0962b03e45e3"}, + {file = "pyarrow-16.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:31a1851751433d89a986616015841977e0a188662fcffd1a5677453f1df2de0a"}, + {file = "pyarrow-16.1.0.tar.gz", hash = "sha256:15fbb22ea96d11f0b5768504a3f961edab25eaf4197c341720c4a387f6c60315"}, +] + +[package.dependencies] +numpy = ">=1.16.6" + +[[package]] +name = "pyarrow-hotfix" +version = "0.6" +description = "" +optional = false +python-versions = ">=3.5" +files = [ + {file = "pyarrow_hotfix-0.6-py3-none-any.whl", hash = "sha256:dcc9ae2d220dff0083be6a9aa8e0cdee5182ad358d4931fce825c545e5c89178"}, + {file = "pyarrow_hotfix-0.6.tar.gz", hash = "sha256:79d3e030f7ff890d408a100ac16d6f00b14d44a502d7897cd9fc3e3a534e9945"}, +] + +[[package]] +name = "pyasn1" +version = "0.6.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.0" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.7.0" + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydantic" +version = "2.7.4" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, + {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.18.4" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.18.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, + {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, + {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, + {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, + {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, + {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, + {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, + {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, + {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, + {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, + {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, + {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, + {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, + {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.3.3" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.3.3-py3-none-any.whl", hash = "sha256:e4ed62ad851670975ec11285141db888fd24947f9440bd4380d7d8788d4965de"}, + {file = "pydantic_settings-2.3.3.tar.gz", hash = "sha256:87fda838b64b5039b970cd47c3e8a1ee460ce136278ff672980af21516f6e6ce"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" + +[package.extras] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pymongo" +version = "4.7.3" +description = "Python driver for MongoDB " +optional = false +python-versions = ">=3.7" +files = [ + {file = "pymongo-4.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e9580b4537b3cc5d412070caabd1dabdf73fdce249793598792bac5782ecf2eb"}, + {file = "pymongo-4.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:517243b2b189c98004570dd8fc0e89b1a48363d5578b3b99212fa2098b2ea4b8"}, + {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23b1e9dabd61da1c7deb54d888f952f030e9e35046cebe89309b28223345b3d9"}, + {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03e0f9901ad66c6fb7da0d303461377524d61dab93a4e4e5af44164c5bb4db76"}, + {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a870824aa54453aee030bac08c77ebcf2fe8999400f0c2a065bebcbcd46b7f8"}, + {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd7b3d3f4261bddbb74a332d87581bc523353e62bb9da4027cc7340f6fcbebc"}, + {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d719a643ea6da46d215a3ba51dac805a773b611c641319558d8576cbe31cef8"}, + {file = "pymongo-4.7.3-cp310-cp310-win32.whl", hash = "sha256:d8b1e06f361f3c66ee694cb44326e1a2e4f93bc9c3a4849ae8547889fca71154"}, + {file = "pymongo-4.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:c450ab2f9397e2d5caa7fddeb4feb30bf719c47c13ae02c0bbb3b71bf4099c1c"}, + {file = "pymongo-4.7.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79cc6459209e885ba097779eaa0fe7f2fa049db39ab43b1731cf8d065a4650e8"}, + {file = "pymongo-4.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e2287f1e2cc35e73cd74a4867e398a97962c5578a3991c730ef78d276ca8e46"}, + {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:413506bd48d8c31ee100645192171e4773550d7cb940b594d5175ac29e329ea1"}, + {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cc1febf17646d52b7561caa762f60bdfe2cbdf3f3e70772f62eb624269f9c05"}, + {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8dfcf18a49955d50a16c92b39230bd0668ffc9c164ccdfe9d28805182b48fa72"}, + {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89872041196c008caddf905eb59d3dc2d292ae6b0282f1138418e76f3abd3ad6"}, + {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3ed97b89de62ea927b672ad524de0d23f3a6b4a01c8d10e3d224abec973fbc3"}, + {file = "pymongo-4.7.3-cp311-cp311-win32.whl", hash = "sha256:d2f52b38151e946011d888a8441d3d75715c663fc5b41a7ade595e924e12a90a"}, + {file = "pymongo-4.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:4a4cc91c28e81c0ce03d3c278e399311b0af44665668a91828aec16527082676"}, + {file = "pymongo-4.7.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cb30c8a78f5ebaca98640943447b6a0afcb146f40b415757c9047bf4a40d07b4"}, + {file = "pymongo-4.7.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9cf2069f5d37c398186453589486ea98bb0312214c439f7d320593b61880dc05"}, + {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3564f423958fced8a8c90940fd2f543c27adbcd6c7c6ed6715d847053f6200a0"}, + {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a8af8a38fa6951fff73e6ff955a6188f829b29fed7c5a1b739a306b4aa56fe8"}, + {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a0e81c8dba6d825272867d487f18764cfed3c736d71d7d4ff5b79642acbed42"}, + {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88fc1d146feabac4385ea8ddb1323e584922922641303c8bf392fe1c36803463"}, + {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4225100b2c5d1f7393d7c5d256ceb8b20766830eecf869f8ae232776347625a6"}, + {file = "pymongo-4.7.3-cp312-cp312-win32.whl", hash = "sha256:5f3569ed119bf99c0f39ac9962fb5591eff02ca210fe80bb5178d7a1171c1b1e"}, + {file = "pymongo-4.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:eb383c54c0c8ba27e7712b954fcf2a0905fee82a929d277e2e94ad3a5ba3c7db"}, + {file = "pymongo-4.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a46cffe91912570151617d866a25d07b9539433a32231ca7e7cf809b6ba1745f"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c3cba427dac50944c050c96d958c5e643c33a457acee03bae27c8990c5b9c16"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a5fd893edbeb7fa982f8d44b6dd0186b6cd86c89e23f6ef95049ff72bffe46"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c168a2fadc8b19071d0a9a4f85fe38f3029fe22163db04b4d5c046041c0b14bd"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c59c2c9e70f63a7f18a31e367898248c39c068c639b0579623776f637e8f482"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d08165fd82c89d372e82904c3268bd8fe5de44f92a00e97bb1db1785154397d9"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:397fed21afec4fdaecf72f9c4344b692e489756030a9c6d864393e00c7e80491"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f903075f8625e2d228f1b9b9a0cf1385f1c41e93c03fd7536c91780a0fb2e98f"}, + {file = "pymongo-4.7.3-cp37-cp37m-win32.whl", hash = "sha256:8ed1132f58c38add6b6138b771d0477a3833023c015c455d9a6e26f367f9eb5c"}, + {file = "pymongo-4.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8d00a5d8fc1043a4f641cbb321da766699393f1b6f87c70fae8089d61c9c9c54"}, + {file = "pymongo-4.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9377b868c38700c7557aac1bc4baae29f47f1d279cc76b60436e547fd643318c"}, + {file = "pymongo-4.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:da4a6a7b4f45329bb135aa5096823637bd5f760b44d6224f98190ee367b6b5dd"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:487e2f9277f8a63ac89335ec4f1699ae0d96ebd06d239480d69ed25473a71b2c"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db3d608d541a444c84f0bfc7bad80b0b897e0f4afa580a53f9a944065d9b633"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e90af2ad3a8a7c295f4d09a2fbcb9a350c76d6865f787c07fe843b79c6e821d1"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e28feb18dc559d50ededba27f9054c79f80c4edd70a826cecfe68f3266807b3"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f21ecddcba2d9132d5aebd8e959de8d318c29892d0718420447baf2b9bccbb19"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:26140fbb3f6a9a74bd73ed46d0b1f43d5702e87a6e453a31b24fad9c19df9358"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:94baa5fc7f7d22c3ce2ac7bd92f7e03ba7a6875f2480e3b97a400163d6eaafc9"}, + {file = "pymongo-4.7.3-cp38-cp38-win32.whl", hash = "sha256:92dd247727dd83d1903e495acc743ebd757f030177df289e3ba4ef8a8c561fad"}, + {file = "pymongo-4.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:1c90c848a5e45475731c35097f43026b88ef14a771dfd08f20b67adc160a3f79"}, + {file = "pymongo-4.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f598be401b416319a535c386ac84f51df38663f7a9d1071922bda4d491564422"}, + {file = "pymongo-4.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:35ba90477fae61c65def6e7d09e8040edfdd3b7fd47c3c258b4edded60c4d625"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9aa8735955c70892634d7e61b0ede9b1eefffd3cd09ccabee0ffcf1bdfe62254"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82a97d8f7f138586d9d0a0cff804a045cdbbfcfc1cd6bba542b151e284fbbec5"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de3b9db558930efab5eaef4db46dcad8bf61ac3ddfd5751b3e5ac6084a25e366"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0e149217ef62812d3c2401cf0e2852b0c57fd155297ecc4dcd67172c4eca402"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3a8a1ef4a824f5feb793b3231526d0045eadb5eb01080e38435dfc40a26c3e5"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d14e5e89a4be1f10efc3d9dcb13eb7a3b2334599cb6bb5d06c6a9281b79c8e22"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6bfa29f032fd4fd7b129520f8cdb51ab71d88c2ba0567cccd05d325f963acb5"}, + {file = "pymongo-4.7.3-cp39-cp39-win32.whl", hash = "sha256:1421d0bd2ce629405f5157bd1aaa9b83f12d53a207cf68a43334f4e4ee312b66"}, + {file = "pymongo-4.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:f7ee974f8b9370a998919c55b1050889f43815ab588890212023fecbc0402a6d"}, + {file = "pymongo-4.7.3.tar.gz", hash = "sha256:6354a66b228f2cd399be7429685fb68e07f19110a3679782ecb4fdb68da03831"}, +] + +[package.dependencies] +dnspython = ">=1.16.0,<3.0.0" + +[package.extras] +aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"] +encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.6.0,<2.0.0)"] +gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] +ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] +snappy = ["python-snappy"] +test = ["pytest (>=7)"] +zstd = ["zstandard"] + +[[package]] +name = "pypdf" +version = "4.2.0" +description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pypdf-4.2.0-py3-none-any.whl", hash = "sha256:dc035581664e0ad717e3492acebc1a5fc23dba759e788e3d4a9fc9b1a32e72c1"}, + {file = "pypdf-4.2.0.tar.gz", hash = "sha256:fe63f3f7d1dcda1c9374421a94c1bba6c6f8c4a62173a59b64ffd52058f846b1"}, +] + +[package.dependencies] +typing_extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +crypto = ["PyCryptodome", "cryptography"] +dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "pytest-socket", "pytest-timeout", "pytest-xdist", "wheel"] +docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] +full = ["Pillow (>=8.0.0)", "PyCryptodome", "cryptography"] +image = ["Pillow (>=8.0.0)"] + +[[package]] +name = "pysocks" +version = "1.7.1" +description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, + {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, + {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, +] + +[[package]] +name = "python-box" +version = "6.1.0" +description = "Advanced Python dictionaries with dot notation access" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-box-6.1.0.tar.gz", hash = "sha256:6e7c243b356cb36e2c0f0e5ed7850969fede6aa812a7f501de7768996c7744d7"}, + {file = "python_box-6.1.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:c14aa4e72bf30f4d573e62ff8030a86548603a100c3fb534561dbedf4a83f454"}, + {file = "python_box-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab13208b053525ef154a36a4a52873b98a12b18b946edd4c939a4d5080e9a218"}, + {file = "python_box-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:d199cd289b4f4d053770eadd70217c76214aac30b92a23adfb9627fd8558d300"}, + {file = "python_box-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ac44b3b85714a4575cc273b5dbd39ef739f938ef6c522d6757704a29e7797d16"}, + {file = "python_box-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f0036f91e13958d2b37d2bc74c1197aa36ffd66755342eb64910f63d8a2990f"}, + {file = "python_box-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:af6bcee7e1abe9251e9a41ca9ab677e1f679f6059321cfbae7e78a3831e0b736"}, + {file = "python_box-6.1.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:11cbe62f0dace8a6e2a10d210a5e87b99ad1a1286865568862516794c923a988"}, + {file = "python_box-6.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa4696b5e09ccf695bf05c16bb5ca1fcc95a141a71a31eb262eee8e2ac07189a"}, + {file = "python_box-6.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3638d3559f19ece7fa29f6a6550bc64696cd3b65e3d4154df07a3d06982252ff"}, + {file = "python_box-6.1.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:53998c3b95e31d1f31e46279ef1d27ac30b137746927260901ee61457f8468a0"}, + {file = "python_box-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:594b0363b187df855ff8649488b1301dddbbeea769629b7caeb584efe779b841"}, + {file = "python_box-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:1d29eafaa287857751e27fbe9a08dd856480f0037fe988b221eba4dac33e5852"}, + {file = "python_box-6.1.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:9dbd92b67c443a97326273c9239fce04d3b6958be815d293f96ab65bc4a9dae7"}, + {file = "python_box-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed6d7fe47d756dc2d9dea448702cea103716580a2efee7c859954929295fe28e"}, + {file = "python_box-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:7b73f26e40a7adc57b9e39f5687d026dfa8a336f48aefaf852a223b4e37392ad"}, + {file = "python_box-6.1.0-py3-none-any.whl", hash = "sha256:bdec0a5f5a17b01fc538d292602a077aa8c641fb121e1900dff0591791af80e8"}, +] + +[package.extras] +all = ["msgpack", "ruamel.yaml (>=0.17)", "toml"] +msgpack = ["msgpack"] +pyyaml = ["PyYAML"] +ruamel-yaml = ["ruamel.yaml (>=0.17)"] +toml = ["toml"] +tomli = ["tomli", "tomli-w"] +yaml = ["ruamel.yaml (>=0.17)"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-iso639" +version = "2024.4.27" +description = "ISO 639 language codes, names, and other associated information" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python_iso639-2024.4.27-py3-none-any.whl", hash = "sha256:27526a84cebc4c4d53fea9d1ebbc7209c8d279bebaa343e6765a1fc8780565ab"}, + {file = "python_iso639-2024.4.27.tar.gz", hash = "sha256:97e63b5603e085c6a56a12a95740010e75d9134e0aab767e0978b53fd8824f13"}, +] + +[package.extras] +dev = ["black (==24.4.2)", "build (==1.2.1)", "flake8 (==7.0.0)", "pytest (==8.1.2)", "requests (==2.31.0)", "twine (==5.0.0)"] + +[[package]] +name = "python-jose" +version = "3.3.0" +description = "JOSE implementation in Python" +optional = false +python-versions = "*" +files = [ + {file = "python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a"}, + {file = "python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"}, +] + +[package.dependencies] +ecdsa = "!=0.15" +pyasn1 = "*" +rsa = "*" + +[package.extras] +cryptography = ["cryptography (>=3.4.0)"] +pycrypto = ["pyasn1", "pycrypto (>=2.6.0,<2.7.0)"] +pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"] + +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + +[[package]] +name = "python-magic" +version = "0.4.27" +description = "File type identification using libmagic" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b"}, + {file = "python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"}, +] + +[[package]] +name = "python-slugify" +version = "8.0.4" +description = "A Python slugify application that also handles Unicode" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, + {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, +] + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +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_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {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"}, +] + +[[package]] +name = "qdrant-client" +version = "1.9.2" +description = "Client library for the Qdrant vector search engine" +optional = false +python-versions = ">=3.8" +files = [ + {file = "qdrant_client-1.9.2-py3-none-any.whl", hash = "sha256:0f49a4a6a47f62bc2c9afc69f9e1fb7790e4861ffe083d2de78dda30eb477d0e"}, + {file = "qdrant_client-1.9.2.tar.gz", hash = "sha256:35ba55a8484a4b817f985749d11fe6b5d2acf617fec07dd8bc01f3e9b4e9fa79"}, +] + +[package.dependencies] +grpcio = ">=1.41.0" +grpcio-tools = ">=1.41.0" +httpx = {version = ">=0.20.0", extras = ["http2"]} +numpy = {version = ">=1.21", markers = "python_version >= \"3.8\" and python_version < \"3.12\""} +portalocker = ">=2.7.0,<3.0.0" +pydantic = ">=1.10.8" +urllib3 = ">=1.26.14,<3" + +[package.extras] +fastembed = ["fastembed (==0.2.7)"] +fastembed-gpu = ["fastembed-gpu (==0.2.7)"] + +[[package]] +name = "qwak-core" +version = "0.4.45" +description = "Qwak Core contains the necessary objects and communication tools for using the Qwak Platform" +optional = false +python-versions = "<3.12,>=3.7.1" +files = [ + {file = "qwak_core-0.4.45-py3-none-any.whl", hash = "sha256:611f28a5d39289982291b52d9cd2a310a74c112033c484dac424e8e39ffa6033"}, + {file = "qwak_core-0.4.45.tar.gz", hash = "sha256:283af7dbecb044dce90ba7220b5a13ef696eabde7e1ae523c367280d64e7074f"}, +] + +[package.dependencies] +chevron = "0.14.0" +dacite = "1.8.1" +dependency-injector = ">=4.0" +grpcio = ">=1.57.0" +joblib = ">=1.3.2,<2.0.0" +marshmallow-dataclass = ">=8.5.8,<9.0.0" +protobuf = {version = ">=4.21.6", markers = "python_version >= \"3.10\""} +python-jose = "*" +python-json-logger = ">=2.0.2" +PyYAML = "*" +requests = "*" +retrying = "1.3.4" +typeguard = ">=2,<3" + +[package.extras] +feature-store = ["cloudpickle (==2.2.1)", "pyarrow (>=6.0.0)", "pyathena (>=2.2.0,!=2.18.0)"] + +[[package]] +name = "qwak-inference" +version = "0.1.18" +description = "Qwak Inference is a Python library for running predictions again Qwak Models." +optional = false +python-versions = "<3.12,>=3.7.1" +files = [ + {file = "qwak_inference-0.1.18-py3-none-any.whl", hash = "sha256:82d5ece0745ae07447de84276be17d1cb98562cae289c83038c244b0caab3801"}, + {file = "qwak_inference-0.1.18.tar.gz", hash = "sha256:f32feb3c1d4eefcdd09d09cc950ca5afc7f4a5b6309e26e92a5b393218d9eb2f"}, +] + +[package.dependencies] +google-cloud-storage = "2.14.0" +numpy = {version = ">=1.24.0", markers = "python_version >= \"3.10\""} +requests = ">=2.0.0,<3.0.0" + +[package.extras] +batch = ["boto3 (>=1.24.89,<2.0.0)", "joblib (>=1.1.0,<2.0.0)", "pandas (<1.4)", "pandas (>=1.4.0)", "pyarrow (>=6.0.0,<11.0.0)", "qwak-core (>=0.3.134)"] +feedback = ["boto3 (>=1.24.89,<2.0.0)", "joblib (>=1.1.0,<2.0.0)", "pandas (<1.4)", "pandas (>=1.4.0)", "qwak-core (>=0.3.134)"] + +[[package]] +name = "qwak-sdk" +version = "0.5.74" +description = "Qwak SDK and CLI for qwak models" +optional = false +python-versions = "<3.12,>=3.7.1" +files = [ + {file = "qwak_sdk-0.5.74-py3-none-any.whl", hash = "sha256:50931d8165a5879fe8bd5d57dd957f88184a027cb1feb834adf66340b62a30c3"}, + {file = "qwak_sdk-0.5.74.tar.gz", hash = "sha256:1a3d177b29357b9b935a3f6a058344513e5db8d362572e6f2bf756c22c04c989"}, +] + +[package.dependencies] +cookiecutter = "*" +croniter = "1.4.1" +gitpython = ">=2.1.0" +numpy = {version = ">=1.24.0", markers = "python_version >= \"3.10\""} +python-json-logger = ">=2.0.2" +qwak-core = "0.4.45" +qwak-inference = ">=0.1.16,<0.2.0" +rich = ">=13.0.0" +tabulate = ">=0.8.0" +yaspin = ">=2.0.0" + +[package.extras] +batch = ["boto3 (>=1.24.116,<2.0.0)", "joblib (>=1.1.0,<2.0.0)", "pandas (<1.4)", "pandas (>1.0)", "pandas (>1.1.3)", "pandas (>=1.4.0)", "pyarrow (>=6.0.0,<11.0.0)"] +feedback = ["boto3 (>=1.24.116,<2.0.0)", "joblib (>=1.1.0,<2.0.0)", "pandas (<1.4)", "pandas (>1.0)", "pandas (>1.1.3)", "pandas (>=1.4.0)"] +local-deployment = ["boto3 (>=1.24.116,<2.0.0)"] + +[[package]] +name = "rapidfuzz" +version = "3.9.3" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rapidfuzz-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdb8c5b8e29238ec80727c2ba3b301efd45aa30c6a7001123a6647b8e6f77ea4"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3bd0d9632088c63a241f217742b1cf86e2e8ae573e01354775bd5016d12138c"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:153f23c03d4917f6a1fc2fb56d279cc6537d1929237ff08ee7429d0e40464a18"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a96c5225e840f1587f1bac8fa6f67562b38e095341576e82b728a82021f26d62"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b777cd910ceecd738adc58593d6ed42e73f60ad04ecdb4a841ae410b51c92e0e"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53e06e4b81f552da04940aa41fc556ba39dee5513d1861144300c36c33265b76"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7ca5b6050f18fdcacdada2dc5fb7619ff998cd9aba82aed2414eee74ebe6cd"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:87bb8d84cb41446a808c4b5f746e29d8a53499381ed72f6c4e456fe0f81c80a8"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:959a15186d18425d19811bea86a8ffbe19fd48644004d29008e636631420a9b7"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a24603dd05fb4e3c09d636b881ce347e5f55f925a6b1b4115527308a323b9f8e"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d055da0e801c71dd74ba81d72d41b2fa32afa182b9fea6b4b199d2ce937450d"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:875b581afb29a7213cf9d98cb0f98df862f1020bce9d9b2e6199b60e78a41d14"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-win32.whl", hash = "sha256:6073a46f61479a89802e3f04655267caa6c14eb8ac9d81a635a13805f735ebc1"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:119c010e20e561249b99ca2627f769fdc8305b07193f63dbc07bca0a6c27e892"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-win_arm64.whl", hash = "sha256:790b0b244f3213581d42baa2fed8875f9ee2b2f9b91f94f100ec80d15b140ba9"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f57e8305c281e8c8bc720515540e0580355100c0a7a541105c6cafc5de71daae"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a4fc7b784cf987dbddc300cef70e09a92ed1bce136f7bb723ea79d7e297fe76d"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b422c0a6fe139d5447a0766268e68e6a2a8c2611519f894b1f31f0a392b9167"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f50fed4a9b0c9825ff37cf0bccafd51ff5792090618f7846a7650f21f85579c9"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b80eb7cbe62348c61d3e67e17057cddfd6defab168863028146e07d5a8b24a89"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f45be77ec82da32ce5709a362e236ccf801615cc7163b136d1778cf9e31b14"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd84b7f652a5610733400307dc732f57c4a907080bef9520412e6d9b55bc9adc"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e6d27dad8c990218b8cd4a5c99cbc8834f82bb46ab965a7265d5aa69fc7ced7"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:05ee0696ebf0dfe8f7c17f364d70617616afc7dafe366532730ca34056065b8a"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2bc8391749e5022cd9e514ede5316f86e332ffd3cfceeabdc0b17b7e45198a8c"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:93981895602cf5944d89d317ae3b1b4cc684d175a8ae2a80ce5b65615e72ddd0"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:754b719a4990735f66653c9e9261dcf52fd4d925597e43d6b9069afcae700d21"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-win32.whl", hash = "sha256:14c9f268ade4c88cf77ab007ad0fdf63699af071ee69378de89fff7aa3cae134"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc1991b4cde6c9d3c0bbcb83d5581dc7621bec8c666c095c65b4277233265a82"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-win_arm64.whl", hash = "sha256:0c34139df09a61b1b557ab65782ada971b4a3bce7081d1b2bee45b0a52231adb"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d6a210347d6e71234af5c76d55eeb0348b026c9bb98fe7c1cca89bac50fb734"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b300708c917ce52f6075bdc6e05b07c51a085733650f14b732c087dc26e0aaad"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83ea7ca577d76778250421de61fb55a719e45b841deb769351fc2b1740763050"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8319838fb5b7b5f088d12187d91d152b9386ce3979ed7660daa0ed1bff953791"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:505d99131afd21529293a9a7b91dfc661b7e889680b95534756134dc1cc2cd86"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c52970f7784518d7c82b07a62a26e345d2de8c2bd8ed4774e13342e4b3ff4200"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:143caf7247449055ecc3c1e874b69e42f403dfc049fc2f3d5f70e1daf21c1318"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b8ab0fa653d9225195a8ff924f992f4249c1e6fa0aea563f685e71b81b9fcccf"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57e7c5bf7b61c7320cfa5dde1e60e678d954ede9bb7da8e763959b2138391401"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:51fa1ba84653ab480a2e2044e2277bd7f0123d6693051729755addc0d015c44f"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:17ff7f7eecdb169f9236e3b872c96dbbaf116f7787f4d490abd34b0116e3e9c8"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afe7c72d3f917b066257f7ff48562e5d462d865a25fbcabf40fca303a9fa8d35"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-win32.whl", hash = "sha256:e53ed2e9b32674ce96eed80b3b572db9fd87aae6742941fb8e4705e541d861ce"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:35b7286f177e4d8ba1e48b03612f928a3c4bdac78e5651379cec59f95d8651e6"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-win_arm64.whl", hash = "sha256:e6e4b9380ed4758d0cb578b0d1970c3f32dd9e87119378729a5340cb3169f879"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a39890013f6d5b056cc4bfdedc093e322462ece1027a57ef0c636537bdde7531"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b5bc0fdbf419493163c5c9cb147c5fbe95b8e25844a74a8807dcb1a125e630cf"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efe6e200a75a792d37b960457904c4fce7c928a96ae9e5d21d2bd382fe39066e"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de077c468c225d4c18f7188c47d955a16d65f21aab121cbdd98e3e2011002c37"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f917eaadf5388466a95f6a236f678a1588d231e52eda85374077101842e794e"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:858ba57c05afd720db8088a8707079e8d024afe4644001fe0dbd26ef7ca74a65"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d36447d21b05f90282a6f98c5a33771805f9222e5d0441d03eb8824e33e5bbb4"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:acbe4b6f1ccd5b90c29d428e849aa4242e51bb6cab0448d5f3c022eb9a25f7b1"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:53c7f27cdf899e94712972237bda48cfd427646aa6f5d939bf45d084780e4c16"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:6175682a829c6dea4d35ed707f1dadc16513270ef64436568d03b81ccb6bdb74"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5276df395bd8497397197fca2b5c85f052d2e6a66ffc3eb0544dd9664d661f95"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:77b5c4f3e72924d7845f0e189c304270066d0f49635cf8a3938e122c437e58de"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-win32.whl", hash = "sha256:8add34061e5cd561c72ed4febb5c15969e7b25bda2bb5102d02afc3abc1f52d0"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:604e0502a39cf8e67fa9ad239394dddad4cdef6d7008fdb037553817d420e108"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21047f55d674614eb4b0ab34e35c3dc66f36403b9fbfae645199c4a19d4ed447"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a56da3aff97cb56fe85d9ca957d1f55dbac7c27da927a86a2a86d8a7e17f80aa"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:964c08481aec2fe574f0062e342924db2c6b321391aeb73d68853ed42420fd6d"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e2b827258beefbe5d3f958243caa5a44cf46187eff0c20e0b2ab62d1550327a"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6e65a301fcd19fbfbee3a514cc0014ff3f3b254b9fd65886e8a9d6957fb7bca"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbe93ba1725a8d47d2b9dca6c1f435174859427fbc054d83de52aea5adc65729"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca21c0a34adee582775da997a600283e012a608a107398d80a42f9a57ad323d"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:256e07d3465173b2a91c35715a2277b1ee3ae0b9bbab4e519df6af78570741d0"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:802ca2cc8aa6b8b34c6fdafb9e32540c1ba05fca7ad60b3bbd7ec89ed1797a87"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:dd789100fc852cffac1449f82af0da139d36d84fd9faa4f79fc4140a88778343"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:5d0abbacdb06e27ff803d7ae0bd0624020096802758068ebdcab9bd49cf53115"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:378d1744828e27490a823fc6fe6ebfb98c15228d54826bf4e49e4b76eb5f5579"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-win32.whl", hash = "sha256:5d0cb272d43e6d3c0dedefdcd9d00007471f77b52d2787a4695e9dd319bb39d2"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:15e4158ac4b3fb58108072ec35b8a69165f651ba1c8f43559a36d518dbf9fb3f"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-win_arm64.whl", hash = "sha256:58c6a4936190c558d5626b79fc9e16497e5df7098589a7e80d8bff68148ff096"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5410dc848c947a603792f4f51b904a3331cf1dc60621586bfbe7a6de72da1091"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:282d55700a1a3d3a7980746eb2fcd48c9bbc1572ebe0840d0340d548a54d01fe"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc1037507810833646481f5729901a154523f98cbebb1157ba3a821012e16402"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e33f779391caedcba2ba3089fb6e8e557feab540e9149a5c3f7fea7a3a7df37"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41a81a9f311dc83d22661f9b1a1de983b201322df0c4554042ffffd0f2040c37"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a93250bd8fae996350c251e1752f2c03335bb8a0a5b0c7e910a593849121a435"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3617d1aa7716c57d120b6adc8f7c989f2d65bc2b0cbd5f9288f1fc7bf469da11"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:ad04a3f5384b82933213bba2459f6424decc2823df40098920856bdee5fd6e88"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8709918da8a88ad73c9d4dd0ecf24179a4f0ceba0bee21efc6ea21a8b5290349"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b770f85eab24034e6ef7df04b2bfd9a45048e24f8a808e903441aa5abde8ecdd"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930b4e6fdb4d914390141a2b99a6f77a52beacf1d06aa4e170cba3a98e24c1bc"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c8444e921bfc3757c475c4f4d7416a7aa69b2d992d5114fe55af21411187ab0d"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c1d3ef3878f871abe6826e386c3d61b5292ef5f7946fe646f4206b85836b5da"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d861bf326ee7dabc35c532a40384541578cd1ec1e1b7db9f9ecbba56eb76ca22"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cde6b9d9ba5007077ee321ec722fa714ebc0cbd9a32ccf0f4dd3cc3f20952d71"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bb6546e7b6bed1aefbe24f68a5fb9b891cc5aef61bca6c1a7b1054b7f0359bb"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d8a57261ef7996d5ced7c8cba9189ada3fbeffd1815f70f635e4558d93766cb"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:67201c02efc596923ad950519e0b75ceb78d524177ea557134d6567b9ac2c283"}, + {file = "rapidfuzz-3.9.3.tar.gz", hash = "sha256:b398ea66e8ed50451bce5997c430197d5e4b06ac4aa74602717f792d8d8d06e2"}, +] + +[package.extras] +full = ["numpy"] + +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "regex" +version = "2024.5.15" +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"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +PySocks = {version = ">=1.5.6,<1.5.7 || >1.5.7", optional = true, markers = "extra == \"socks\""} +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "retrying" +version = "1.3.4" +description = "Retrying" +optional = false +python-versions = "*" +files = [ + {file = "retrying-1.3.4-py3-none-any.whl", hash = "sha256:8cc4d43cb8e1125e0ff3344e9de678fefd85db3b750b81b2240dc0183af37b35"}, + {file = "retrying-1.3.4.tar.gz", hash = "sha256:345da8c5765bd982b1d1915deb9102fd3d1f7ad16bd84a9700b85f64d24e8f3e"}, +] + +[package.dependencies] +six = ">=1.7.0" + +[[package]] +name = "rich" +version = "13.7.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rpds-py" +version = "0.18.1" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, +] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "ruff" +version = "0.4.9" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.4.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b262ed08d036ebe162123170b35703aaf9daffecb698cd367a8d585157732991"}, + {file = "ruff-0.4.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:98ec2775fd2d856dc405635e5ee4ff177920f2141b8e2d9eb5bd6efd50e80317"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4555056049d46d8a381f746680db1c46e67ac3b00d714606304077682832998e"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e91175fbe48f8a2174c9aad70438fe9cb0a5732c4159b2a10a3565fea2d94cde"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e8e7b95673f22e0efd3571fb5b0cf71a5eaaa3cc8a776584f3b2cc878e46bff"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2d45ddc6d82e1190ea737341326ecbc9a61447ba331b0a8962869fcada758505"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78de3fdb95c4af084087628132336772b1c5044f6e710739d440fc0bccf4d321"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06b60f91bfa5514bb689b500a25ba48e897d18fea14dce14b48a0c40d1635893"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88bffe9c6a454bf8529f9ab9091c99490578a593cc9f9822b7fc065ee0712a06"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:673bddb893f21ab47a8334c8e0ea7fd6598ecc8e698da75bcd12a7b9d0a3206e"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8c1aff58c31948cc66d0b22951aa19edb5af0a3af40c936340cd32a8b1ab7438"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:784d3ec9bd6493c3b720a0b76f741e6c2d7d44f6b2be87f5eef1ae8cc1d54c84"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:732dd550bfa5d85af8c3c6cbc47ba5b67c6aed8a89e2f011b908fc88f87649db"}, + {file = "ruff-0.4.9-py3-none-win32.whl", hash = "sha256:8064590fd1a50dcf4909c268b0e7c2498253273309ad3d97e4a752bb9df4f521"}, + {file = "ruff-0.4.9-py3-none-win_amd64.whl", hash = "sha256:e0a22c4157e53d006530c902107c7f550b9233e9706313ab57b892d7197d8e52"}, + {file = "ruff-0.4.9-py3-none-win_arm64.whl", hash = "sha256:5d5460f789ccf4efd43f265a58538a2c24dbce15dbf560676e430375f20a8198"}, + {file = "ruff-0.4.9.tar.gz", hash = "sha256:f1cb0828ac9533ba0135d148d214e284711ede33640465e706772645483427e3"}, +] + +[[package]] +name = "safetensors" +version = "0.4.3" +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"}, +] + +[package.extras] +all = ["safetensors[jax]", "safetensors[numpy]", "safetensors[paddlepaddle]", "safetensors[pinned-tf]", "safetensors[quality]", "safetensors[testing]", "safetensors[torch]"] +dev = ["safetensors[all]"] +jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "safetensors[numpy]"] +mlx = ["mlx (>=0.0.9)"] +numpy = ["numpy (>=1.21.6)"] +paddlepaddle = ["paddlepaddle (>=2.4.1)", "safetensors[numpy]"] +pinned-tf = ["safetensors[numpy]", "tensorflow (==2.11.0)"] +quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] +tensorflow = ["safetensors[numpy]", "tensorflow (>=2.11.0)"] +testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools-rust (>=1.5.2)"] +torch = ["safetensors[numpy]", "torch (>=1.10)"] + +[[package]] +name = "scikit-learn" +version = "1.5.0" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.9" +files = [ + {file = "scikit_learn-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12e40ac48555e6b551f0a0a5743cc94cc5a765c9513fe708e01f0aa001da2801"}, + {file = "scikit_learn-1.5.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f405c4dae288f5f6553b10c4ac9ea7754d5180ec11e296464adb5d6ac68b6ef5"}, + {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df8ccabbf583315f13160a4bb06037bde99ea7d8211a69787a6b7c5d4ebb6fc3"}, + {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c75ea812cd83b1385bbfa94ae971f0d80adb338a9523f6bbcb5e0b0381151d4"}, + {file = "scikit_learn-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:a90c5da84829a0b9b4bf00daf62754b2be741e66b5946911f5bdfaa869fcedd6"}, + {file = "scikit_learn-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a65af2d8a6cce4e163a7951a4cfbfa7fceb2d5c013a4b593686c7f16445cf9d"}, + {file = "scikit_learn-1.5.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:4c0c56c3005f2ec1db3787aeaabefa96256580678cec783986836fc64f8ff622"}, + {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f77547165c00625551e5c250cefa3f03f2fc92c5e18668abd90bfc4be2e0bff"}, + {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:118a8d229a41158c9f90093e46b3737120a165181a1b58c03461447aa4657415"}, + {file = "scikit_learn-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:a03b09f9f7f09ffe8c5efffe2e9de1196c696d811be6798ad5eddf323c6f4d40"}, + {file = "scikit_learn-1.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:460806030c666addee1f074788b3978329a5bfdc9b7d63e7aad3f6d45c67a210"}, + {file = "scikit_learn-1.5.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:1b94d6440603752b27842eda97f6395f570941857456c606eb1d638efdb38184"}, + {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d82c2e573f0f2f2f0be897e7a31fcf4e73869247738ab8c3ce7245549af58ab8"}, + {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3a10e1d9e834e84d05e468ec501a356226338778769317ee0b84043c0d8fb06"}, + {file = "scikit_learn-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:855fc5fa8ed9e4f08291203af3d3e5fbdc4737bd617a371559aaa2088166046e"}, + {file = "scikit_learn-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:40fb7d4a9a2db07e6e0cae4dc7bdbb8fada17043bac24104d8165e10e4cff1a2"}, + {file = "scikit_learn-1.5.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:47132440050b1c5beb95f8ba0b2402bbd9057ce96ec0ba86f2f445dd4f34df67"}, + {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174beb56e3e881c90424e21f576fa69c4ffcf5174632a79ab4461c4c960315ac"}, + {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261fe334ca48f09ed64b8fae13f9b46cc43ac5f580c4a605cbb0a517456c8f71"}, + {file = "scikit_learn-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:057b991ac64b3e75c9c04b5f9395eaf19a6179244c089afdebaad98264bff37c"}, + {file = "scikit_learn-1.5.0.tar.gz", hash = "sha256:789e3db01c750ed6d496fa2db7d50637857b451e57bcae863bff707c1247bef7"}, +] + +[package.dependencies] +joblib = ">=1.2.0" +numpy = ">=1.19.5" +scipy = ">=1.6.0" +threadpoolctl = ">=3.1.0" + +[package.extras] +benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] +build = ["cython (>=3.0.10)", "meson-python (>=0.15.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.15.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] +install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] +maintenance = ["conda-lock (==2.5.6)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] + +[[package]] +name = "scipy" +version = "1.13.1" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"}, + {file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"}, + {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989"}, + {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f"}, + {file = "scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94"}, + {file = "scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54"}, + {file = "scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9"}, + {file = "scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326"}, + {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299"}, + {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa"}, + {file = "scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59"}, + {file = "scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b"}, + {file = "scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1"}, + {file = "scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d"}, + {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627"}, + {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884"}, + {file = "scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16"}, + {file = "scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949"}, + {file = "scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5"}, + {file = "scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24"}, + {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004"}, + {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d"}, + {file = "scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c"}, + {file = "scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2"}, + {file = "scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c"}, +] + +[package.dependencies] +numpy = ">=1.22.4,<2.3" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] +test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "selenium" +version = "4.21.0" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "selenium-4.21.0-py3-none-any.whl", hash = "sha256:4770ffe5a5264e609de7dc914be6b89987512040d5a8efb2abb181330d097993"}, + {file = "selenium-4.21.0.tar.gz", hash = "sha256:650dbfa5159895ff00ad16e5ddb6ceecb86b90c7ed2012b3f041f64e6e4904fe"}, +] + +[package.dependencies] +certifi = ">=2021.10.8" +trio = ">=0.17,<1.0" +trio-websocket = ">=0.9,<1.0" +typing_extensions = ">=4.9.0" +urllib3 = {version = ">=1.26,<3", extras = ["socks"]} + +[[package]] +name = "semantic-version" +version = "2.10.0" +description = "A library implementing the 'SemVer' scheme." +optional = false +python-versions = ">=2.7" +files = [ + {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"}, + {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"}, +] + +[package.extras] +dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1)", "coverage", "flake8", "nose2", "readme-renderer (<25.0)", "tox", "wheel", "zest.releaser[recommended]"] +doc = ["Sphinx", "sphinx-rtd-theme"] + +[[package]] +name = "sentence-transformers" +version = "2.7.0" +description = "Multilingual text embeddings" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "sentence_transformers-2.7.0-py3-none-any.whl", hash = "sha256:6a7276b05a95931581bbfa4ba49d780b2cf6904fa4a171ec7fd66c343f761c98"}, + {file = "sentence_transformers-2.7.0.tar.gz", hash = "sha256:2f7df99d1c021dded471ed2d079e9d1e4fc8e30ecb06f957be060511b36f24ea"}, +] + +[package.dependencies] +huggingface-hub = ">=0.15.1" +numpy = "*" +Pillow = "*" +scikit-learn = "*" +scipy = "*" +torch = ">=1.11.0" +tqdm = "*" +transformers = ">=4.34.0,<5.0.0" + +[package.extras] +dev = ["pre-commit", "pytest", "ruff (>=0.3.0)"] + +[[package]] +name = "sentry-sdk" +version = "2.6.0" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sentry_sdk-2.6.0-py2.py3-none-any.whl", hash = "sha256:422b91cb49378b97e7e8d0e8d5a1069df23689d45262b86f54988a7db264e874"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.26.11" + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] +chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +huggingface-hub = ["huggingface-hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] +loguru = ["loguru (>=0.5)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] +pure-eval = ["asttokens", "executing", "pure-eval"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +tornado = ["tornado (>=5)"] + +[[package]] +name = "setuptools" +version = "70.1.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-70.1.0-py3-none-any.whl", hash = "sha256:d9b8b771455a97c8a9f3ab3448ebe0b29b5e105f1228bba41028be116985a267"}, + {file = "setuptools-70.1.0.tar.gz", hash = "sha256:01a1e793faa5bd89abc851fa15d0a0db26f160890c7102cd8dce643e886b47f5"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "simplejson" +version = "3.19.2" +description = "Simple, fast, extensible JSON encoder/decoder for Python" +optional = false +python-versions = ">=2.5, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "simplejson-3.19.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3471e95110dcaf901db16063b2e40fb394f8a9e99b3fe9ee3acc6f6ef72183a2"}, + {file = "simplejson-3.19.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3194cd0d2c959062b94094c0a9f8780ffd38417a5322450a0db0ca1a23e7fbd2"}, + {file = "simplejson-3.19.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:8a390e56a7963e3946ff2049ee1eb218380e87c8a0e7608f7f8790ba19390867"}, + {file = "simplejson-3.19.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1537b3dd62d8aae644f3518c407aa8469e3fd0f179cdf86c5992792713ed717a"}, + {file = "simplejson-3.19.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a8617625369d2d03766413bff9e64310feafc9fc4f0ad2b902136f1a5cd8c6b0"}, + {file = "simplejson-3.19.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:2c433a412e96afb9a3ce36fa96c8e61a757af53e9c9192c97392f72871e18e69"}, + {file = "simplejson-3.19.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:f1c70249b15e4ce1a7d5340c97670a95f305ca79f376887759b43bb33288c973"}, + {file = "simplejson-3.19.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:287e39ba24e141b046812c880f4619d0ca9e617235d74abc27267194fc0c7835"}, + {file = "simplejson-3.19.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6f0a0b41dd05eefab547576bed0cf066595f3b20b083956b1405a6f17d1be6ad"}, + {file = "simplejson-3.19.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f98d918f7f3aaf4b91f2b08c0c92b1774aea113334f7cde4fe40e777114dbe6"}, + {file = "simplejson-3.19.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d74beca677623481810c7052926365d5f07393c72cbf62d6cce29991b676402"}, + {file = "simplejson-3.19.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f2398361508c560d0bf1773af19e9fe644e218f2a814a02210ac2c97ad70db0"}, + {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ad331349b0b9ca6da86064a3599c425c7a21cd41616e175ddba0866da32df48"}, + {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:332c848f02d71a649272b3f1feccacb7e4f7e6de4a2e6dc70a32645326f3d428"}, + {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25785d038281cd106c0d91a68b9930049b6464288cea59ba95b35ee37c2d23a5"}, + {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18955c1da6fc39d957adfa346f75226246b6569e096ac9e40f67d102278c3bcb"}, + {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:11cc3afd8160d44582543838b7e4f9aa5e97865322844b75d51bf4e0e413bb3e"}, + {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b01fda3e95d07a6148702a641e5e293b6da7863f8bc9b967f62db9461330562c"}, + {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:778331444917108fa8441f59af45886270d33ce8a23bfc4f9b192c0b2ecef1b3"}, + {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9eb117db8d7ed733a7317c4215c35993b815bf6aeab67523f1f11e108c040672"}, + {file = "simplejson-3.19.2-cp310-cp310-win32.whl", hash = "sha256:39b6d79f5cbfa3eb63a869639cfacf7c41d753c64f7801efc72692c1b2637ac7"}, + {file = "simplejson-3.19.2-cp310-cp310-win_amd64.whl", hash = "sha256:5675e9d8eeef0aa06093c1ff898413ade042d73dc920a03e8cea2fb68f62445a"}, + {file = "simplejson-3.19.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed628c1431100b0b65387419551e822987396bee3c088a15d68446d92f554e0c"}, + {file = "simplejson-3.19.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:adcb3332979cbc941b8fff07181f06d2b608625edc0a4d8bc3ffc0be414ad0c4"}, + {file = "simplejson-3.19.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08889f2f597ae965284d7b52a5c3928653a9406d88c93e3161180f0abc2433ba"}, + {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7938a78447174e2616be223f496ddccdbf7854f7bf2ce716dbccd958cc7d13"}, + {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a970a2e6d5281d56cacf3dc82081c95c1f4da5a559e52469287457811db6a79b"}, + {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554313db34d63eac3b3f42986aa9efddd1a481169c12b7be1e7512edebff8eaf"}, + {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d36081c0b1c12ea0ed62c202046dca11438bee48dd5240b7c8de8da62c620e9"}, + {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a3cd18e03b0ee54ea4319cdcce48357719ea487b53f92a469ba8ca8e39df285e"}, + {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:66e5dc13bfb17cd6ee764fc96ccafd6e405daa846a42baab81f4c60e15650414"}, + {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:972a7833d4a1fcf7a711c939e315721a88b988553fc770a5b6a5a64bd6ebeba3"}, + {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3e74355cb47e0cd399ead3477e29e2f50e1540952c22fb3504dda0184fc9819f"}, + {file = "simplejson-3.19.2-cp311-cp311-win32.whl", hash = "sha256:1dd4f692304854352c3e396e9b5f0a9c9e666868dd0bdc784e2ac4c93092d87b"}, + {file = "simplejson-3.19.2-cp311-cp311-win_amd64.whl", hash = "sha256:9300aee2a8b5992d0f4293d88deb59c218989833e3396c824b69ba330d04a589"}, + {file = "simplejson-3.19.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b8d940fd28eb34a7084877747a60873956893e377f15a32ad445fe66c972c3b8"}, + {file = "simplejson-3.19.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4969d974d9db826a2c07671273e6b27bc48e940738d768fa8f33b577f0978378"}, + {file = "simplejson-3.19.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c594642d6b13d225e10df5c16ee15b3398e21a35ecd6aee824f107a625690374"}, + {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2f5a398b5e77bb01b23d92872255e1bcb3c0c719a3be40b8df146570fe7781a"}, + {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176a1b524a3bd3314ed47029a86d02d5a95cc0bee15bd3063a1e1ec62b947de6"}, + {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3c7363a8cb8c5238878ec96c5eb0fc5ca2cb11fc0c7d2379863d342c6ee367a"}, + {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:346820ae96aa90c7d52653539a57766f10f33dd4be609206c001432b59ddf89f"}, + {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de9a2792612ec6def556d1dc621fd6b2073aff015d64fba9f3e53349ad292734"}, + {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1c768e7584c45094dca4b334af361e43b0aaa4844c04945ac7d43379eeda9bc2"}, + {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:9652e59c022e62a5b58a6f9948b104e5bb96d3b06940c6482588176f40f4914b"}, + {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9c1a4393242e321e344213a90a1e3bf35d2f624aa8b8f6174d43e3c6b0e8f6eb"}, + {file = "simplejson-3.19.2-cp312-cp312-win32.whl", hash = "sha256:7cb98be113911cb0ad09e5523d0e2a926c09a465c9abb0784c9269efe4f95917"}, + {file = "simplejson-3.19.2-cp312-cp312-win_amd64.whl", hash = "sha256:6779105d2fcb7fcf794a6a2a233787f6bbd4731227333a072d8513b252ed374f"}, + {file = "simplejson-3.19.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:061e81ea2d62671fa9dea2c2bfbc1eec2617ae7651e366c7b4a2baf0a8c72cae"}, + {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4280e460e51f86ad76dc456acdbfa9513bdf329556ffc8c49e0200878ca57816"}, + {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11c39fbc4280d7420684494373b7c5904fa72a2b48ef543a56c2d412999c9e5d"}, + {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bccb3e88ec26ffa90f72229f983d3a5d1155e41a1171190fa723d4135523585b"}, + {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bb5b50dc6dd671eb46a605a3e2eb98deb4a9af787a08fcdddabe5d824bb9664"}, + {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d94245caa3c61f760c4ce4953cfa76e7739b6f2cbfc94cc46fff6c050c2390c5"}, + {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d0e5ffc763678d48ecc8da836f2ae2dd1b6eb2d27a48671066f91694e575173c"}, + {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d222a9ed082cd9f38b58923775152003765016342a12f08f8c123bf893461f28"}, + {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8434dcdd347459f9fd9c526117c01fe7ca7b016b6008dddc3c13471098f4f0dc"}, + {file = "simplejson-3.19.2-cp36-cp36m-win32.whl", hash = "sha256:c9ac1c2678abf9270e7228133e5b77c6c3c930ad33a3c1dfbdd76ff2c33b7b50"}, + {file = "simplejson-3.19.2-cp36-cp36m-win_amd64.whl", hash = "sha256:92c4a4a2b1f4846cd4364855cbac83efc48ff5a7d7c06ba014c792dd96483f6f"}, + {file = "simplejson-3.19.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0d551dc931638e2102b8549836a1632e6e7cf620af3d093a7456aa642bff601d"}, + {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73a8a4653f2e809049999d63530180d7b5a344b23a793502413ad1ecea9a0290"}, + {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40847f617287a38623507d08cbcb75d51cf9d4f9551dd6321df40215128325a3"}, + {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be893258d5b68dd3a8cba8deb35dc6411db844a9d35268a8d3793b9d9a256f80"}, + {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9eb3cff1b7d71aa50c89a0536f469cb8d6dcdd585d8f14fb8500d822f3bdee4"}, + {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d0f402e787e6e7ee7876c8b05e2fe6464820d9f35ba3f172e95b5f8b699f6c7f"}, + {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fbbcc6b0639aa09b9649f36f1bcb347b19403fe44109948392fbb5ea69e48c3e"}, + {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:2fc697be37585eded0c8581c4788fcfac0e3f84ca635b73a5bf360e28c8ea1a2"}, + {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b0a3eb6dd39cce23801a50c01a0976971498da49bc8a0590ce311492b82c44b"}, + {file = "simplejson-3.19.2-cp37-cp37m-win32.whl", hash = "sha256:49f9da0d6cd17b600a178439d7d2d57c5ef01f816b1e0e875e8e8b3b42db2693"}, + {file = "simplejson-3.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c87c22bd6a987aca976e3d3e23806d17f65426191db36d40da4ae16a6a494cbc"}, + {file = "simplejson-3.19.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e4c166f743bb42c5fcc60760fb1c3623e8fda94f6619534217b083e08644b46"}, + {file = "simplejson-3.19.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0a48679310e1dd5c9f03481799311a65d343748fe86850b7fb41df4e2c00c087"}, + {file = "simplejson-3.19.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0521e0f07cb56415fdb3aae0bbd8701eb31a9dfef47bb57206075a0584ab2a2"}, + {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d2d5119b1d7a1ed286b8af37357116072fc96700bce3bec5bb81b2e7057ab41"}, + {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c1467d939932901a97ba4f979e8f2642415fcf02ea12f53a4e3206c9c03bc17"}, + {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49aaf4546f6023c44d7e7136be84a03a4237f0b2b5fb2b17c3e3770a758fc1a0"}, + {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60848ab779195b72382841fc3fa4f71698a98d9589b0a081a9399904487b5832"}, + {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0436a70d8eb42bea4fe1a1c32d371d9bb3b62c637969cb33970ad624d5a3336a"}, + {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:49e0e3faf3070abdf71a5c80a97c1afc059b4f45a5aa62de0c2ca0444b51669b"}, + {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ff836cd4041e16003549449cc0a5e372f6b6f871eb89007ab0ee18fb2800fded"}, + {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3848427b65e31bea2c11f521b6fc7a3145d6e501a1038529da2391aff5970f2f"}, + {file = "simplejson-3.19.2-cp38-cp38-win32.whl", hash = "sha256:3f39bb1f6e620f3e158c8b2eaf1b3e3e54408baca96a02fe891794705e788637"}, + {file = "simplejson-3.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:0405984f3ec1d3f8777c4adc33eac7ab7a3e629f3b1c05fdded63acc7cf01137"}, + {file = "simplejson-3.19.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:445a96543948c011a3a47c8e0f9d61e9785df2544ea5be5ab3bc2be4bd8a2565"}, + {file = "simplejson-3.19.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4a8c3cc4f9dfc33220246760358c8265dad6e1104f25f0077bbca692d616d358"}, + {file = "simplejson-3.19.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af9c7e6669c4d0ad7362f79cb2ab6784d71147503e62b57e3d95c4a0f222c01c"}, + {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:064300a4ea17d1cd9ea1706aa0590dcb3be81112aac30233823ee494f02cb78a"}, + {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9453419ea2ab9b21d925d0fd7e3a132a178a191881fab4169b6f96e118cc25bb"}, + {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e038c615b3906df4c3be8db16b3e24821d26c55177638ea47b3f8f73615111c"}, + {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16ca9c90da4b1f50f089e14485db8c20cbfff2d55424062791a7392b5a9b3ff9"}, + {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1018bd0d70ce85f165185d2227c71e3b1e446186f9fa9f971b69eee223e1e3cd"}, + {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e8dd53a8706b15bc0e34f00e6150fbefb35d2fd9235d095b4f83b3c5ed4fa11d"}, + {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:2d022b14d7758bfb98405672953fe5c202ea8a9ccf9f6713c5bd0718eba286fd"}, + {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:febffa5b1eda6622d44b245b0685aff6fb555ce0ed734e2d7b1c3acd018a2cff"}, + {file = "simplejson-3.19.2-cp39-cp39-win32.whl", hash = "sha256:4edcd0bf70087b244ba77038db23cd98a1ace2f91b4a3ecef22036314d77ac23"}, + {file = "simplejson-3.19.2-cp39-cp39-win_amd64.whl", hash = "sha256:aad7405c033d32c751d98d3a65801e2797ae77fac284a539f6c3a3e13005edc4"}, + {file = "simplejson-3.19.2-py3-none-any.whl", hash = "sha256:bcedf4cae0d47839fee7de344f96b5694ca53c786f28b5f773d4f0b265a159eb"}, + {file = "simplejson-3.19.2.tar.gz", hash = "sha256:9eb442a2442ce417801c912df68e1f6ccfcd41577ae7274953ab3ad24ef7d82c"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.31" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"}, + {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"}, + {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "structlog" +version = "24.2.0" +description = "Structured Logging for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "structlog-24.2.0-py3-none-any.whl", hash = "sha256:983bd49f70725c5e1e3867096c0c09665918936b3db27341b41d294283d7a48a"}, + {file = "structlog-24.2.0.tar.gz", hash = "sha256:0e3fe74924a6d8857d3f612739efb94c72a7417d7c7c008d12276bca3b5bf13b"}, +] + +[package.extras] +dev = ["freezegun (>=0.2.8)", "mypy (>=1.4)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "rich", "simplejson", "twisted"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "sphinxext-opengraph", "twisted"] +tests = ["freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"] +typing = ["mypy (>=1.4)", "rich", "twisted"] + +[[package]] +name = "sympy" +version = "1.12.1" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12.1-py3-none-any.whl", hash = "sha256:9b2cbc7f1a640289430e13d2a56f02f867a1da0190f2f99d8968c2f74da0e515"}, + {file = "sympy-1.12.1.tar.gz", hash = "sha256:2877b03f998cd8c08f07cd0de5b767119cd3ef40d09f41c30d722f6686b0fb88"}, +] + +[package.dependencies] +mpmath = ">=1.1.0,<1.4.0" + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[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.4.1" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tenacity-8.4.1-py3-none-any.whl", hash = "sha256:28522e692eda3e1b8f5e99c51464efcc0b9fc86933da92415168bc1c4e2308fa"}, + {file = "tenacity-8.4.1.tar.gz", hash = "sha256:54b1412b878ddf7e1f1577cd49527bad8cdef32421bd599beac0c6c3f10582fd"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "termcolor" +version = "2.3.0" +description = "ANSI color formatting for output in terminal" +optional = false +python-versions = ">=3.7" +files = [ + {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, + {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +optional = false +python-versions = "*" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] + +[[package]] +name = "threadpoolctl" +version = "3.5.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.8" +files = [ + {file = "threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467"}, + {file = "threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107"}, +] + +[[package]] +name = "tiktoken" +version = "0.7.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + +[[package]] +name = "tokenizers" +version = "0.19.1" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" + +[package.extras] +dev = ["tokenizers[testing]"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] + +[[package]] +name = "torch" +version = "2.3.1" +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"}, +] + +[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-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\""} +nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +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\""} +typing-extensions = ">=4.8.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.9.1)"] + +[[package]] +name = "tqdm" +version = "4.66.4" +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"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "transformers" +version = "4.41.2" +description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "transformers-4.41.2-py3-none-any.whl", hash = "sha256:05555d20e43f808de1ef211ab64803cdb513170cef70d29a888b589caebefc67"}, + {file = "transformers-4.41.2.tar.gz", hash = "sha256:80a4db216533d573e9cc7388646c31ed9480918feb7c55eb211249cb23567f87"}, +] + +[package.dependencies] +filelock = "*" +huggingface-hub = ">=0.23.0,<1.0" +numpy = ">=1.17" +packaging = ">=20.0" +pyyaml = ">=5.1" +regex = "!=2019.12.17" +requests = "*" +safetensors = ">=0.4.1" +tokenizers = ">=0.19,<0.20" +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", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.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.1.5)", "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.1.5)", "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", "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.1.5)", "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.1.5)", "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", "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"] +integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] +ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +modelcreation = ["cookiecutter (==1.7.3)"] +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.1.5)", "urllib3 (<2.0.0)"] +ray = ["ray[tune] (>=2.7.0)"] +retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +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.1.5)", "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 (<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +timm = ["timm"] +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.0,<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 = "trio" +version = "0.25.1" +description = "A friendly Python library for async concurrency and I/O" +optional = false +python-versions = ">=3.8" +files = [ + {file = "trio-0.25.1-py3-none-any.whl", hash = "sha256:e42617ba091e7b2e50c899052e83a3c403101841de925187f61e7b7eaebdf3fb"}, + {file = "trio-0.25.1.tar.gz", hash = "sha256:9f5314f014ea3af489e77b001861c535005c3858d38ec46b6b071ebfa339d7fb"}, +] + +[package.dependencies] +attrs = ">=23.2.0" +cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = "*" +outcome = "*" +sniffio = ">=1.3.0" +sortedcontainers = "*" + +[[package]] +name = "trio-websocket" +version = "0.11.1" +description = "WebSocket library for Trio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "trio-websocket-0.11.1.tar.gz", hash = "sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f"}, + {file = "trio_websocket-0.11.1-py3-none-any.whl", hash = "sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638"}, +] + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +trio = ">=0.11" +wsproto = ">=0.14" + +[[package]] +name = "triton" +version = "2.3.1" +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"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)", "torch"] +tutorials = ["matplotlib", "pandas", "tabulate", "torch"] + +[[package]] +name = "typeguard" +version = "2.13.3" +description = "Run-time type checker for Python" +optional = false +python-versions = ">=3.5.3" +files = [ + {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"}, + {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"}, +] + +[package.extras] +doc = ["sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["mypy", "pytest", "typing-extensions"] + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20240316" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, + {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, +] + +[[package]] +name = "types-requests" +version = "2.32.0.20240602" +description = "Typing stubs for requests" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-requests-2.32.0.20240602.tar.gz", hash = "sha256:3f98d7bbd0dd94ebd10ff43a7fbe20c3b8528acace6d8efafef0b6a184793f06"}, + {file = "types_requests-2.32.0.20240602-py3-none-any.whl", hash = "sha256:ed3946063ea9fbc6b5fc0c44fa279188bae42d582cb63760be6cb4b9d06c3de8"}, +] + +[package.dependencies] +urllib3 = ">=2" + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "unstructured" +version = "0.14.6" +description = "A library that prepares raw documents for downstream ML tasks." +optional = false +python-versions = "<3.13,>=3.9.0" +files = [ + {file = "unstructured-0.14.6-py3-none-any.whl", hash = "sha256:ab7d83016e46d3c221f6dae8b1040492ee69f7a97cb53c0f2109b54f0b764d19"}, + {file = "unstructured-0.14.6.tar.gz", hash = "sha256:5dddf44908faa0f5250c02f41768fd4ce3792496d3e00258fd33f68c24b902c1"}, +] + +[package.dependencies] +backoff = "*" +beautifulsoup4 = "*" +chardet = "*" +dataclasses-json = "*" +emoji = "*" +filetype = "*" +langdetect = "*" +lxml = "*" +nltk = "*" +numpy = "*" +python-iso639 = "*" +python-magic = "*" +rapidfuzz = "*" +requests = "*" +tabulate = "*" +tqdm = "*" +typing-extensions = "*" +unstructured-client = "*" +wrapt = "*" + +[package.extras] +airtable = ["pyairtable"] +all-docs = ["effdet", "google-cloud-vision", "markdown", "networkx", "onnx", "openpyxl", "pandas", "pdf2image", "pdfminer.six", "pikepdf", "pillow-heif", "pypandoc", "pypdf", "pytesseract", "python-docx (>=1.1.2)", "python-oxmsg", "python-pptx (<=0.6.23)", "unstructured-inference (==0.7.35)", "unstructured.pytesseract (>=0.3.12)", "xlrd"] +astra = ["astrapy"] +azure = ["adlfs", "fsspec"] +azure-cognitive-search = ["azure-search-documents"] +bedrock = ["boto3", "langchain-community"] +biomed = ["bs4"] +box = ["boxfs", "fsspec"] +chroma = ["chromadb", "importlib-metadata (>=7.1.0)", "typer (<=0.9.0)"] +clarifai = ["clarifai"] +confluence = ["atlassian-python-api"] +csv = ["pandas"] +databricks-volumes = ["databricks-sdk"] +delta-table = ["deltalake", "fsspec"] +discord = ["discord-py"] +doc = ["python-docx (>=1.1.2)"] +docx = ["python-docx (>=1.1.2)"] +dropbox = ["dropboxdrivefs", "fsspec"] +elasticsearch = ["elasticsearch"] +embed-huggingface = ["huggingface", "langchain-community", "sentence-transformers"] +embed-octoai = ["openai", "tiktoken"] +embed-vertexai = ["langchain", "langchain-community", "langchain-google-vertexai"] +embed-voyageai = ["langchain", "langchain-voyageai"] +epub = ["pypandoc"] +gcs = ["bs4", "fsspec", "gcsfs"] +github = ["pygithub (>1.58.0)"] +gitlab = ["python-gitlab"] +google-drive = ["google-api-python-client"] +hubspot = ["hubspot-api-client", "urllib3"] +huggingface = ["langdetect", "sacremoses", "sentencepiece", "torch", "transformers"] +image = ["effdet", "google-cloud-vision", "onnx", "pdf2image", "pdfminer.six", "pikepdf", "pillow-heif", "pypdf", "pytesseract", "unstructured-inference (==0.7.35)", "unstructured.pytesseract (>=0.3.12)"] +jira = ["atlassian-python-api"] +local-inference = ["effdet", "google-cloud-vision", "markdown", "networkx", "onnx", "openpyxl", "pandas", "pdf2image", "pdfminer.six", "pikepdf", "pillow-heif", "pypandoc", "pypdf", "pytesseract", "python-docx (>=1.1.2)", "python-oxmsg", "python-pptx (<=0.6.23)", "unstructured-inference (==0.7.35)", "unstructured.pytesseract (>=0.3.12)", "xlrd"] +md = ["markdown"] +mongodb = ["pymongo"] +msg = ["python-oxmsg"] +notion = ["htmlBuilder", "notion-client"] +odt = ["pypandoc", "python-docx (>=1.1.2)"] +onedrive = ["Office365-REST-Python-Client", "bs4", "msal"] +openai = ["langchain-community", "openai", "tiktoken"] +opensearch = ["opensearch-py"] +org = ["pypandoc"] +outlook = ["Office365-REST-Python-Client", "msal"] +paddleocr = ["unstructured.paddleocr (==2.6.1.3)"] +pdf = ["effdet", "google-cloud-vision", "onnx", "pdf2image", "pdfminer.six", "pikepdf", "pillow-heif", "pypdf", "pytesseract", "unstructured-inference (==0.7.35)", "unstructured.pytesseract (>=0.3.12)"] +pinecone = ["pinecone-client (>=3.7.1)"] +postgres = ["psycopg2-binary"] +ppt = ["python-pptx (<=0.6.23)"] +pptx = ["python-pptx (<=0.6.23)"] +qdrant = ["qdrant-client"] +reddit = ["praw"] +rst = ["pypandoc"] +rtf = ["pypandoc"] +s3 = ["fsspec", "s3fs"] +salesforce = ["simple-salesforce"] +sftp = ["fsspec", "paramiko"] +sharepoint = ["Office365-REST-Python-Client", "msal"] +slack = ["slack-sdk"] +tsv = ["pandas"] +weaviate = ["weaviate-client"] +wikipedia = ["wikipedia"] +xlsx = ["networkx", "openpyxl", "pandas", "xlrd"] + +[[package]] +name = "unstructured-client" +version = "0.23.7" +description = "Python Client SDK for Unstructured API" +optional = false +python-versions = ">=3.8" +files = [ + {file = "unstructured-client-0.23.7.tar.gz", hash = "sha256:9161ca25365764712b66cbb50e7cb22bc59a89a613de2bb2e2b171ef7b17e5b0"}, + {file = "unstructured_client-0.23.7-py3-none-any.whl", hash = "sha256:95df14697b1f79cc2a4580c7f143bd463d3dd5fab605220d2e4888321342decb"}, +] + +[package.dependencies] +certifi = ">=2023.7.22" +charset-normalizer = ">=3.2.0" +dataclasses-json = ">=0.6.4" +deepdiff = ">=6.0" +httpx = ">=0.27.0" +idna = ">=3.4" +jsonpath-python = ">=1.0.6" +marshmallow = ">=3.19.0" +mypy-extensions = ">=1.0.0" +nest-asyncio = ">=1.6.0" +packaging = ">=23.1" +pypdf = ">=4.0" +python-dateutil = ">=2.8.2" +requests = ">=2.31.0" +requests-toolbelt = ">=1.0.0" +six = ">=1.16.0" +typing-extensions = ">=4.7.1" +typing-inspect = ">=0.9.0" +urllib3 = ">=1.26.18" + +[package.extras] +dev = ["pylint (==3.1.0)"] + +[[package]] +name = "urllib3" +version = "2.2.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, +] + +[package.dependencies] +pysocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + +[[package]] +name = "wsproto" +version = "1.2.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, + {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, +] + +[package.dependencies] +h11 = ">=0.9.0,<1" + +[[package]] +name = "wurlitzer" +version = "3.1.1" +description = "Capture C-level output in context managers" +optional = false +python-versions = ">=3.5" +files = [ + {file = "wurlitzer-3.1.1-py3-none-any.whl", hash = "sha256:0b2749c2cde3ef640bf314a9f94b24d929fe1ca476974719a6909dfc568c3aac"}, + {file = "wurlitzer-3.1.1.tar.gz", hash = "sha256:bfb9144ab9f02487d802b9ff89dbd3fa382d08f73e12db8adc4c2fb00cd39bd9"}, +] + +[[package]] +name = "xxhash" +version = "3.4.1" +description = "Python binding for xxHash" +optional = false +python-versions = ">=3.7" +files = [ + {file = "xxhash-3.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91dbfa55346ad3e18e738742236554531a621042e419b70ad8f3c1d9c7a16e7f"}, + {file = "xxhash-3.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:665a65c2a48a72068fcc4d21721510df5f51f1142541c890491afc80451636d2"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb11628470a6004dc71a09fe90c2f459ff03d611376c1debeec2d648f44cb693"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bef2a7dc7b4f4beb45a1edbba9b9194c60a43a89598a87f1a0226d183764189"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c0f7b2d547d72c7eda7aa817acf8791f0146b12b9eba1d4432c531fb0352228"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00f2fdef6b41c9db3d2fc0e7f94cb3db86693e5c45d6de09625caad9a469635b"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23cfd9ca09acaf07a43e5a695143d9a21bf00f5b49b15c07d5388cadf1f9ce11"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6a9ff50a3cf88355ca4731682c168049af1ca222d1d2925ef7119c1a78e95b3b"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f1d7c69a1e9ca5faa75546fdd267f214f63f52f12692f9b3a2f6467c9e67d5e7"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:672b273040d5d5a6864a36287f3514efcd1d4b1b6a7480f294c4b1d1ee1b8de0"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4178f78d70e88f1c4a89ff1ffe9f43147185930bb962ee3979dba15f2b1cc799"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9804b9eb254d4b8cc83ab5a2002128f7d631dd427aa873c8727dba7f1f0d1c2b"}, + {file = "xxhash-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c09c49473212d9c87261d22c74370457cfff5db2ddfc7fd1e35c80c31a8c14ce"}, + {file = "xxhash-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ebbb1616435b4a194ce3466d7247df23499475c7ed4eb2681a1fa42ff766aff6"}, + {file = "xxhash-3.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:25dc66be3db54f8a2d136f695b00cfe88018e59ccff0f3b8f545869f376a8a46"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ad4457644c91a966f6fe137d7467636bdc51a6ce10a1d04f365c70d6a16d7e"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:248d3e83d119770f96003271fe41e049dd4ae52da2feb8f832b7a20e791d2920"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2070b6d5bbef5ee031666cf21d4953c16e92c2f8a24a94b5c240f8995ba3b1d0"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2746035f518f0410915e247877f7df43ef3372bf36cfa52cc4bc33e85242641"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ba6181514681c2591840d5632fcf7356ab287d4aff1c8dea20f3c78097088"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aac5010869240e95f740de43cd6a05eae180c59edd182ad93bf12ee289484fa"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4cb11d8debab1626181633d184b2372aaa09825bde709bf927704ed72765bed1"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b29728cff2c12f3d9f1d940528ee83918d803c0567866e062683f300d1d2eff3"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a15cbf3a9c40672523bdb6ea97ff74b443406ba0ab9bca10ceccd9546414bd84"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e66df260fed01ed8ea790c2913271641c58481e807790d9fca8bfd5a3c13844"}, + {file = "xxhash-3.4.1-cp311-cp311-win32.whl", hash = "sha256:e867f68a8f381ea12858e6d67378c05359d3a53a888913b5f7d35fbf68939d5f"}, + {file = "xxhash-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:200a5a3ad9c7c0c02ed1484a1d838b63edcf92ff538770ea07456a3732c577f4"}, + {file = "xxhash-3.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:1d03f1c0d16d24ea032e99f61c552cb2b77d502e545187338bea461fde253583"}, + {file = "xxhash-3.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4bbba9b182697a52bc0c9f8ec0ba1acb914b4937cd4a877ad78a3b3eeabefb3"}, + {file = "xxhash-3.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9fd28a9da300e64e434cfc96567a8387d9a96e824a9be1452a1e7248b7763b78"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6066d88c9329ab230e18998daec53d819daeee99d003955c8db6fc4971b45ca3"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93805bc3233ad89abf51772f2ed3355097a5dc74e6080de19706fc447da99cd3"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64da57d5ed586ebb2ecdde1e997fa37c27fe32fe61a656b77fabbc58e6fbff6e"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a97322e9a7440bf3c9805cbaac090358b43f650516486746f7fa482672593df"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe750d512982ee7d831838a5dee9e9848f3fb440e4734cca3f298228cc957a6"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fd79d4087727daf4d5b8afe594b37d611ab95dc8e29fe1a7517320794837eb7d"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:743612da4071ff9aa4d055f3f111ae5247342931dedb955268954ef7201a71ff"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b41edaf05734092f24f48c0958b3c6cbaaa5b7e024880692078c6b1f8247e2fc"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a90356ead70d715fe64c30cd0969072de1860e56b78adf7c69d954b43e29d9fa"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac56eebb364e44c85e1d9e9cc5f6031d78a34f0092fea7fc80478139369a8b4a"}, + {file = "xxhash-3.4.1-cp312-cp312-win32.whl", hash = "sha256:911035345932a153c427107397c1518f8ce456f93c618dd1c5b54ebb22e73747"}, + {file = "xxhash-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:f31ce76489f8601cc7b8713201ce94b4bd7b7ce90ba3353dccce7e9e1fee71fa"}, + {file = "xxhash-3.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:b5beb1c6a72fdc7584102f42c4d9df232ee018ddf806e8c90906547dfb43b2da"}, + {file = "xxhash-3.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6d42b24d1496deb05dee5a24ed510b16de1d6c866c626c2beb11aebf3be278b9"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b685fab18876b14a8f94813fa2ca80cfb5ab6a85d31d5539b7cd749ce9e3624"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419ffe34c17ae2df019a4685e8d3934d46b2e0bbe46221ab40b7e04ed9f11137"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e041ce5714f95251a88670c114b748bca3bf80cc72400e9f23e6d0d59cf2681"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc860d887c5cb2f524899fb8338e1bb3d5789f75fac179101920d9afddef284b"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:312eba88ffe0a05e332e3a6f9788b73883752be63f8588a6dc1261a3eaaaf2b2"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e01226b6b6a1ffe4e6bd6d08cfcb3ca708b16f02eb06dd44f3c6e53285f03e4f"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9f3025a0d5d8cf406a9313cd0d5789c77433ba2004b1c75439b67678e5136537"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:6d3472fd4afef2a567d5f14411d94060099901cd8ce9788b22b8c6f13c606a93"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:43984c0a92f06cac434ad181f329a1445017c33807b7ae4f033878d860a4b0f2"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a55e0506fdb09640a82ec4f44171273eeabf6f371a4ec605633adb2837b5d9d5"}, + {file = "xxhash-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:faec30437919555b039a8bdbaba49c013043e8f76c999670aef146d33e05b3a0"}, + {file = "xxhash-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c9e1b646af61f1fc7083bb7b40536be944f1ac67ef5e360bca2d73430186971a"}, + {file = "xxhash-3.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:961d948b7b1c1b6c08484bbce3d489cdf153e4122c3dfb07c2039621243d8795"}, + {file = "xxhash-3.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:719a378930504ab159f7b8e20fa2aa1896cde050011af838af7e7e3518dd82de"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74fb5cb9406ccd7c4dd917f16630d2e5e8cbbb02fc2fca4e559b2a47a64f4940"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5dab508ac39e0ab988039bc7f962c6ad021acd81fd29145962b068df4148c476"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c59f3e46e7daf4c589e8e853d700ef6607afa037bfad32c390175da28127e8c"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cc07256eff0795e0f642df74ad096f8c5d23fe66bc138b83970b50fc7f7f6c5"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9f749999ed80f3955a4af0eb18bb43993f04939350b07b8dd2f44edc98ffee9"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7688d7c02149a90a3d46d55b341ab7ad1b4a3f767be2357e211b4e893efbaaf6"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a8b4977963926f60b0d4f830941c864bed16aa151206c01ad5c531636da5708e"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8106d88da330f6535a58a8195aa463ef5281a9aa23b04af1848ff715c4398fb4"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4c76a77dbd169450b61c06fd2d5d436189fc8ab7c1571d39265d4822da16df22"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11f11357c86d83e53719c592021fd524efa9cf024dc7cb1dfb57bbbd0d8713f2"}, + {file = "xxhash-3.4.1-cp38-cp38-win32.whl", hash = "sha256:0c786a6cd74e8765c6809892a0d45886e7c3dc54de4985b4a5eb8b630f3b8e3b"}, + {file = "xxhash-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:aabf37fb8fa27430d50507deeab2ee7b1bcce89910dd10657c38e71fee835594"}, + {file = "xxhash-3.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6127813abc1477f3a83529b6bbcfeddc23162cece76fa69aee8f6a8a97720562"}, + {file = "xxhash-3.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef2e194262f5db16075caea7b3f7f49392242c688412f386d3c7b07c7733a70a"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71be94265b6c6590f0018bbf73759d21a41c6bda20409782d8117e76cd0dfa8b"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10e0a619cdd1c0980e25eb04e30fe96cf8f4324758fa497080af9c21a6de573f"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa122124d2e3bd36581dd78c0efa5f429f5220313479fb1072858188bc2d5ff1"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17032f5a4fea0a074717fe33477cb5ee723a5f428de7563e75af64bfc1b1e10"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca7783b20e3e4f3f52f093538895863f21d18598f9a48211ad757680c3bd006f"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d77d09a1113899fad5f354a1eb4f0a9afcf58cefff51082c8ad643ff890e30cf"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:21287bcdd299fdc3328cc0fbbdeaa46838a1c05391264e51ddb38a3f5b09611f"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dfd7a6cc483e20b4ad90224aeb589e64ec0f31e5610ab9957ff4314270b2bf31"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:543c7fcbc02bbb4840ea9915134e14dc3dc15cbd5a30873a7a5bf66039db97ec"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fe0a98d990e433013f41827b62be9ab43e3cf18e08b1483fcc343bda0d691182"}, + {file = "xxhash-3.4.1-cp39-cp39-win32.whl", hash = "sha256:b9097af00ebf429cc7c0e7d2fdf28384e4e2e91008130ccda8d5ae653db71e54"}, + {file = "xxhash-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:d699b921af0dcde50ab18be76c0d832f803034d80470703700cb7df0fbec2832"}, + {file = "xxhash-3.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:2be491723405e15cc099ade1280133ccfbf6322d2ef568494fb7d07d280e7eee"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:431625fad7ab5649368c4849d2b49a83dc711b1f20e1f7f04955aab86cd307bc"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc6dbd5fc3c9886a9e041848508b7fb65fd82f94cc793253990f81617b61fe49"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ff8dbd0ec97aec842476cb8ccc3e17dd288cd6ce3c8ef38bff83d6eb927817"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef73a53fe90558a4096e3256752268a8bdc0322f4692ed928b6cd7ce06ad4fe3"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:450401f42bbd274b519d3d8dcf3c57166913381a3d2664d6609004685039f9d3"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a162840cf4de8a7cd8720ff3b4417fbc10001eefdd2d21541a8226bb5556e3bb"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b736a2a2728ba45017cb67785e03125a79d246462dfa892d023b827007412c52"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0ae4c2e7698adef58710d6e7a32ff518b66b98854b1c68e70eee504ad061d8"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6322c4291c3ff174dcd104fae41500e75dad12be6f3085d119c2c8a80956c51"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:dd59ed668801c3fae282f8f4edadf6dc7784db6d18139b584b6d9677ddde1b6b"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92693c487e39523a80474b0394645b393f0ae781d8db3474ccdcead0559ccf45"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4603a0f642a1e8d7f3ba5c4c25509aca6a9c1cc16f85091004a7028607ead663"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa45e8cbfbadb40a920fe9ca40c34b393e0b067082d94006f7f64e70c7490a6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:595b252943b3552de491ff51e5bb79660f84f033977f88f6ca1605846637b7c6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:562d8b8f783c6af969806aaacf95b6c7b776929ae26c0cd941d54644ea7ef51e"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:41ddeae47cf2828335d8d991f2d2b03b0bdc89289dc64349d712ff8ce59d0647"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c44d584afdf3c4dbb3277e32321d1a7b01d6071c1992524b6543025fb8f4206f"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7bddb3a5b86213cc3f2c61500c16945a1b80ecd572f3078ddbbe68f9dabdfb"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ecb6c987b62437c2f99c01e97caf8d25660bf541fe79a481d05732e5236719c"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:696b4e18b7023527d5c50ed0626ac0520edac45a50ec7cf3fc265cd08b1f4c03"}, + {file = "xxhash-3.4.1.tar.gz", hash = "sha256:0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9"}, +] + +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "yaspin" +version = "3.0.2" +description = "Yet Another Terminal Spinner" +optional = false +python-versions = "<4.0,>=3.9" +files = [ + {file = "yaspin-3.0.2-py3-none-any.whl", hash = "sha256:5c9b6549b84c8aa7f92426272b670e1302941d72f0275caf32d2ea7db3c269f9"}, + {file = "yaspin-3.0.2.tar.gz", hash = "sha256:35cae59c682506794a218310445e8326cd8fec410879d1c44953b494b1121e77"}, +] + +[package.dependencies] +termcolor = "2.3.0" + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10, <3.12" +content-hash = "e15bf50b3c318b9beb13a808ad4379dc2e53776a5344ec8cf0df87494ac9fad7" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..3252743 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,62 @@ +[tool.poetry] +name = "rag-system" +description = "" +version = "0.1.0" +authors = [ + "Vlad Adumitracesei ", + "Paul Iusztin ", + "Alex Vesa ", + "Rares Istoc " +] +readme = "README.md" + +[tool.ruff] +line-length = 88 +select = [ + "F401", + "F403", +] + + +[tool.poetry.dependencies] +python = ">=3.10, <3.12" +pydantic = "^2.6.3" +pydantic-settings = "^2.1.0" +pika = "^1.3.2" +qdrant-client = "^1.8.0" +langchain = "^0.1.13" +aws-lambda-powertools = "^2.38.1" +selenium = "^4.21.0" +instructorembedding = "^1.0.1" +numpy = "^1.26.4" +langchain-openai = "^0.1.3" +gdown = "^5.1.0" +pymongo = "^4.7.1" +structlog = "^24.1.0" +rich = "^13.7.1" +pip = "^24.0" +install = "^1.3.5" +comet-ml = "^3.41.0" +ruff = "^0.4.3" +pandas = "^2.2.2" +datasets = "^2.19.1" +transformers = "^4.40.2" +safetensors = "^0.4.3" +bitsandbytes = "^0.42.0" +scikit-learn = "^1.4.2" +unstructured = "^0.14.2" + +[tool.poetry.group.3-feature-pipeline.dependencies] +bytewax = "0.18.2" + +[tool.poetry.group.ml.dependencies] +qwak-inference = "^0.1.17" +comet-llm = "^2.2.4" +qwak-sdk = "^0.5.69" +peft = "^0.11.1" +sentence-transformers = "^2.6.1" +accelerate = "^0.30.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5f4ed54 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2972 @@ +accelerate==0.30.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:8dd4edd532a4dac72558c5fe6fe8cb70d0c8ec9e8733f48db97d51ee41cbe763 \ + --hash=sha256:96779c618889646b86dc928c9e55e86e50a7ccab59e1692e22096481977ae682 +aiohttp==3.9.5 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8 \ + --hash=sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c \ + --hash=sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475 \ + --hash=sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed \ + --hash=sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf \ + --hash=sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372 \ + --hash=sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81 \ + --hash=sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f \ + --hash=sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1 \ + --hash=sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd \ + --hash=sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a \ + --hash=sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb \ + --hash=sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46 \ + --hash=sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de \ + --hash=sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78 \ + --hash=sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c \ + --hash=sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771 \ + --hash=sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb \ + --hash=sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430 \ + --hash=sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233 \ + --hash=sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156 \ + --hash=sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9 \ + --hash=sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59 \ + --hash=sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888 \ + --hash=sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c \ + --hash=sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c \ + --hash=sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da \ + --hash=sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424 \ + --hash=sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2 \ + --hash=sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb \ + --hash=sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8 \ + --hash=sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a \ + --hash=sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10 \ + --hash=sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0 \ + --hash=sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09 \ + --hash=sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031 \ + --hash=sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4 \ + --hash=sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3 \ + --hash=sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa \ + --hash=sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a \ + --hash=sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe \ + --hash=sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a \ + --hash=sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2 \ + --hash=sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1 \ + --hash=sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323 \ + --hash=sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b \ + --hash=sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b \ + --hash=sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106 \ + --hash=sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac \ + --hash=sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6 \ + --hash=sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832 \ + --hash=sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75 \ + --hash=sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6 \ + --hash=sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d \ + --hash=sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72 \ + --hash=sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db \ + --hash=sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a \ + --hash=sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da \ + --hash=sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678 \ + --hash=sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b \ + --hash=sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24 \ + --hash=sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed \ + --hash=sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f \ + --hash=sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e \ + --hash=sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58 \ + --hash=sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a \ + --hash=sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342 \ + --hash=sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558 \ + --hash=sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2 \ + --hash=sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551 \ + --hash=sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595 \ + --hash=sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee \ + --hash=sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11 \ + --hash=sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d \ + --hash=sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7 \ + --hash=sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f +aiosignal==1.3.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc \ + --hash=sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17 +annotated-types==0.7.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ + --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 +anyio==4.4.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94 \ + --hash=sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7 +arrow==1.3.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 \ + --hash=sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85 +async-timeout==4.0.3 ; python_version >= "3.10" and python_version < "3.11" \ + --hash=sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f \ + --hash=sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028 +attrs==23.2.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 +aws-lambda-powertools==2.39.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:122b5b03949efc4cb88981be356e70d8fecbf8b40185d1e7cba52fa8e0d3115a \ + --hash=sha256:92529ab5efd79d0d313c4f303c5ad3671a00a8e477c19404f11af64b3ba233e0 +backoff==2.2.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba \ + --hash=sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8 +beautifulsoup4==4.12.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051 \ + --hash=sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed +binaryornot==0.4.4 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061 \ + --hash=sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4 +bitsandbytes==0.42.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:63798680912cc63bb77b535a2d0860af024e290a52e157f777ad2a52e2585967 \ + --hash=sha256:fc1505f184f0d275766f2a6c663f1a43b734c1409b5c5a406f3a6073d9f329fd +cachetools==5.3.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945 \ + --hash=sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105 +certifi==2024.6.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ + --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 +cffi==1.16.0 ; os_name == "nt" and implementation_name != "pypy" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ + --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ + --hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \ + --hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \ + --hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \ + --hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \ + --hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \ + --hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \ + --hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \ + --hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \ + --hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \ + --hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \ + --hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \ + --hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \ + --hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \ + --hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \ + --hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \ + --hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \ + --hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \ + --hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \ + --hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \ + --hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \ + --hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \ + --hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \ + --hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \ + --hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \ + --hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \ + --hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \ + --hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \ + --hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \ + --hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \ + --hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \ + --hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \ + --hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \ + --hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \ + --hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \ + --hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \ + --hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \ + --hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \ + --hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \ + --hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \ + --hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \ + --hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \ + --hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \ + --hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \ + --hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \ + --hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \ + --hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \ + --hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \ + --hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \ + --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ + --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 +chardet==5.2.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7 \ + --hash=sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970 +charset-normalizer==3.3.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ + --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ + --hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \ + --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \ + --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \ + --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \ + --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \ + --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \ + --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \ + --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \ + --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \ + --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \ + --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \ + --hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \ + --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \ + --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \ + --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \ + --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \ + --hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \ + --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \ + --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \ + --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \ + --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \ + --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \ + --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \ + --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \ + --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \ + --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \ + --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \ + --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \ + --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \ + --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \ + --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \ + --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \ + --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \ + --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \ + --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \ + --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \ + --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \ + --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \ + --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \ + --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \ + --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \ + --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \ + --hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \ + --hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \ + --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \ + --hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \ + --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \ + --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \ + --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \ + --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \ + --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \ + --hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \ + --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \ + --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \ + --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \ + --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \ + --hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \ + --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \ + --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \ + --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \ + --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \ + --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \ + --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \ + --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \ + --hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \ + --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \ + --hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \ + --hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \ + --hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \ + --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \ + --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \ + --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \ + --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \ + --hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \ + --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \ + --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \ + --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \ + --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \ + --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \ + --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \ + --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \ + --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \ + --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \ + --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \ + --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \ + --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \ + --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ + --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 +chevron==0.14.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf \ + --hash=sha256:fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443 +click==8.1.7 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ + --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de +colorama==0.4.6 ; python_version >= "3.10" and python_version < "3.12" and platform_system == "Windows" \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +comet-llm==2.2.4 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:f8c02cb273218fcfaf92dd4c1948e1af8eaa31eb914c7b9959f9e843e2449df7 \ + --hash=sha256:ff8a50b66cceae04d9914f6eea0e4822ec39946525be8b13012d4b2fd6671e6f +comet-ml==3.43.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:659d7ee9e0a8ae9f7b4bb14fc3adb496660080613c35cca30ff3f1cbb0409d59 +configobj==5.0.8 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:6f704434a07dc4f4dc7c9a745172c1cad449feb548febd9f7fe362629c627a97 \ + --hash=sha256:a7a8c6ab7daade85c3f329931a807c8aee750a2494363934f8ea84d8a54c87ea +cookiecutter==2.6.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d \ + --hash=sha256:db21f8169ea4f4fdc2408d48ca44859349de2647fbe494a9d6c3edfc0542c21c +croniter==1.4.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:1a6df60eacec3b7a0aa52a8f2ef251ae3dd2a7c7c8b9874e73e791636d55a361 \ + --hash=sha256:9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128 +dacite==1.8.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:cc31ad6fdea1f49962ea42db9421772afe01ac5442380d9a99fcf3d188c61afe +dataclasses-json==0.6.7 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a \ + --hash=sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0 +datasets==2.20.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:3c4dbcd27e0f642b9d41d20ff2efa721a5e04b32b2ca4009e0fc9139e324553f \ + --hash=sha256:76ac02e3bdfff824492e20678f0b6b1b6d080515957fe834b00c2ba8d6b18e5e +deepdiff==7.0.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:260c16f052d4badbf60351b4f77e8390bee03a0b516246f6839bc813fb429ddf \ + --hash=sha256:447760081918216aa4fd4ca78a4b6a848b81307b2ea94c810255334b759e1dc3 +dependency-injector==4.41.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:02620454ee8101f77a317f3229935ce687480883d72a40858ff4b0c87c935cce \ + --hash=sha256:059fbb48333148143e8667a5323d162628dfe27c386bd0ed3deeecfc390338bf \ + --hash=sha256:05e15ea0f2b14c1127e8b0d1597fef13f98845679f63bf670ba12dbfc12a16ef \ + --hash=sha256:12e91ac0333e7e589421943ff6c6bf9cf0d9ac9703301cec37ccff3723406332 \ + --hash=sha256:1662e2ef60ac6e681b9e11b5d8b7c17a0f733688916cf695f9540f8f50a61b1e \ + --hash=sha256:168334cba3f1cbf55299ef38f0f2e31879115cc767b780c859f7814a52d80abb \ + --hash=sha256:16de2797dcfcc2263b8672bf0751166f7c7b369ca2ff9246ceb67b65f8e1d802 \ + --hash=sha256:1baee908f21190bdc46a65ce4c417a5175e9397ca62354928694fce218f84487 \ + --hash=sha256:22b11dbf696e184f0b3d5ac4e5418aeac3c379ba4ea758c04a83869b7e5d1cbf \ + --hash=sha256:300838e9d4f3fbf539892a5a4072851728e23b37a1f467afcf393edd994d88f0 \ + --hash=sha256:3055b3fc47a0d6e5f27defb4166c0d37543a4967c279549b154afaf506ce6efc \ + --hash=sha256:33a724e0a737baadb4378f5dc1b079867cc3a88552fcca719b3dba84716828b2 \ + --hash=sha256:3535d06416251715b45f8412482b58ec1c6196a4a3baa207f947f0b03a7c4b44 \ + --hash=sha256:3588bd887b051d16b8bcabaae1127eb14059a0719a8fe34c8a75ba59321b352c \ + --hash=sha256:3744c327d18408e74781bd6d8b7738745ee80ef89f2c8daecf9ebd098cb84972 \ + --hash=sha256:37d5954026e3831663518d78bdf4be9c2dbfea691edcb73c813aa3093aa4363a \ + --hash=sha256:40936d9384363331910abd59dd244158ec3572abf9d37322f15095315ac99893 \ + --hash=sha256:409441122f40e1b4b8582845fdd76deb9dc5c9d6eb74a057b85736ef9e9c671f \ + --hash=sha256:48b6886a87b4ceb9b9f78550f77b2a5c7d2ce33bc83efd886556ad468cc9c85a \ + --hash=sha256:4a31d9d60be4b585585081109480cfb2ef564d3b851cb32a139bf8408411a93a \ + --hash=sha256:4a44ca3ce5867513a70b31855b218be3d251f5068ce1c480cc3a4ad24ffd3280 \ + --hash=sha256:51217cb384b468d7cc355544cec20774859f00812f9a1a71ed7fa701c957b2a7 \ + --hash=sha256:5168dc59808317dc4cdd235aa5d7d556d33e5600156acaf224cead236b48a3e8 \ + --hash=sha256:54032d62610cf2f4421c9d92cef52957215aaa0bca403cda580c58eb3f726eda \ + --hash=sha256:56d37b9d2f50a18f059d9abdbea7669a7518bd42b81603c21a27910a2b3f1657 \ + --hash=sha256:586a0821720b15932addbefb00f7370fbcd5831d6ebbd6494d774b44ff96d23a \ + --hash=sha256:5fa3ed8f0700e47a0e7363f949b4525ffa8277aa1c5b10ca5b41fce4dea61bb9 \ + --hash=sha256:63bfba21f8bff654a80e9b9d06dd6c43a442990b73bf89cd471314c11c541ec2 \ + --hash=sha256:67b369592c57549ccdcad0d5fef1ddb9d39af7fed8083d76e789ab0111fc6389 \ + --hash=sha256:6b29abac56ce347d2eb58a560723e1663ee2125cf5cc38866ed92b84319927ec \ + --hash=sha256:6b98945edae88e777091bf0848f869fb94bd76dfa4066d7c870a5caa933391d0 \ + --hash=sha256:6ee9810841c6e0599356cb884d16453bfca6ab739d0e4f0248724ed8f9ee0d79 \ + --hash=sha256:740a8e8106a04d3f44b52b25b80570fdac96a8a3934423de7c9202c5623e7936 \ + --hash=sha256:75280dfa23f7c88e1bf56c3920d58a43516816de6f6ab2a6650bb8a0f27d5c2c \ + --hash=sha256:75e7a733b372db3144a34020c4233f6b94db2c6342d6d16bc5245b1b941ee2bd \ + --hash=sha256:76b94c8310929e54136f3cb3de3adc86d1a657b3984299f40bf1cd2ba0bae548 \ + --hash=sha256:786f7aac592e191c9caafc47732161d807bad65c62f260cd84cd73c7e2d67d6d \ + --hash=sha256:7a92680bea1c260e5c0d2d6cd60b0c913cba76a456a147db5ac047ecfcfcc758 \ + --hash=sha256:7dcba8665cafec825b7095d5dd80afb5cf14404450eca3fe8b66e1edbf4dbc10 \ + --hash=sha256:7fa4970f12a3fc95d8796938b11c41276ad1ff4c447b0e589212eab3fc527a90 \ + --hash=sha256:87be84084a1b922c4ba15e2e5aa900ee24b78a5467997cb7aec0a1d6cdb4a00b \ + --hash=sha256:89c67edffe7007cf33cee79ecbca38f48efcc2add5c280717af434db6c789377 \ + --hash=sha256:8b51efeaebacaf79ef68edfc65e9687699ccffb3538c4a3ab30d0d77e2db7189 \ + --hash=sha256:8b8cf1c6c56f5c18bdbd9f5e93b52ca29cb4d99606d4056e91f0c761eef496dc \ + --hash=sha256:8d670a844268dcd758195e58e9a5b39fc74bb8648aba99a13135a4a10ec9cfac \ + --hash=sha256:8f0090ff14038f17a026ca408a3a0b0e7affb6aa7498b2b59d670f40ac970fbe \ + --hash=sha256:939dfc657104bc3e66b67afd3fb2ebb0850c9a1e73d0d26066f2bbdd8735ff9c \ + --hash=sha256:953bfac819d32dc72b963767589e0ed372e5e9e78b03fb6b89419d0500d34bbe \ + --hash=sha256:99ed73b1521bf249e2823a08a730c9f9413a58f4b4290da022e0ad4fb333ba3d \ + --hash=sha256:9e3b9d41e0eff4c8e16fea1e33de66ff0030fe51137ca530f3c52ce110447914 \ + --hash=sha256:a2381a251b04244125148298212550750e6e1403e9b2850cc62e0e829d050ad3 \ + --hash=sha256:a2dee5d4abdd21f1a30a51d46645c095be9dcc404c7c6e9f81d0a01415a49e64 \ + --hash=sha256:a4f113e5d4c3070973ad76e5bda7317e500abae6083d78689f0b6e37cf403abf \ + --hash=sha256:a8686fa330c83251c75c8238697686f7a0e0f6d40658538089165dc72df9bcff \ + --hash=sha256:ac79f3c05747f9724bd56c06985e78331fc6c85eb50f3e3f1a35e0c60f9977e9 \ + --hash=sha256:b0c9c966ff66c77364a2d43d08de9968aff7e3903938fe912ba49796b2133344 \ + --hash=sha256:b2440b32474d4e747209528ca3ae48f42563b2fbe3d74dbfe949c11dfbfef7c4 \ + --hash=sha256:b365a8548e9a49049fa6acb24d3cd939f619eeb8e300ca3e156e44402dcc07ec \ + --hash=sha256:b37f36ecb0c1227f697e1d4a029644e3eda8dd0f0716aa63ad04d96dbb15bbbb \ + --hash=sha256:b3890a12423ae3a9eade035093beba487f8d092ee6c6cb8706f4e7080a56e819 \ + --hash=sha256:b8b61a15bc46a3aa7b29bd8a7384b650aa3a7ef943491e93c49a0540a0b3dda4 \ + --hash=sha256:bc852da612c7e347f2fcf921df2eca2718697a49f648a28a63db3ab504fd9510 \ + --hash=sha256:c71d30b6708438050675f338edb9a25bea6c258478dbe5ec8405286756a2d347 \ + --hash=sha256:d03f5fa0fa98a18bd0dfce846db80e2798607f0b861f1f99c97f441f7669d7a2 \ + --hash=sha256:d09c08c944a25dabfb454238c1a889acd85102b93ae497de523bf9ab7947b28a \ + --hash=sha256:d283aee588a72072439e6721cb64aa6cba5bc18c576ef0ab28285a6ec7a9d655 \ + --hash=sha256:d557e40673de984f78dab13ebd68d27fbb2f16d7c4e3b663ea2fa2f9fae6765b \ + --hash=sha256:e3229d83e99e255451605d5276604386e06ad948e3d60f31ddd796781c77f76f \ + --hash=sha256:f2842e15bae664a9f69932e922b02afa055c91efec959cb1896f6c499bf68180 \ + --hash=sha256:f89a507e389b7e4d4892dd9a6f5f4da25849e24f73275478634ac594d621ab3f +dill==0.3.8 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca \ + --hash=sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7 +distro==1.9.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed \ + --hash=sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2 +dnspython==2.6.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50 \ + --hash=sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc +dulwich==0.22.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0d72a88c7af8fafa14c8743e8923c8d46bd0b850a0b7f5e34eb49201f1ead88e \ + --hash=sha256:0ea4c5feedd35e8bde175a9ab91ef6705c3cef5ee209eeb2f67dd0b59ff1825f \ + --hash=sha256:12482e318895da9acabea7c0cc70b35d36833e7cb2def511ab3a63617f5c1af3 \ + --hash=sha256:155124219e6ce4b116d30ed1b9cc63c88021966b29ce761d3ce3caba064f9a13 \ + --hash=sha256:1bc6575476539c0b4924abab3896fc76be2f413d5baa6b083c4dfc4abc59329e \ + --hash=sha256:20f61f6dc0b075ca6459acbfb9527ee0e1ee02dccbed126dc492600bb7310d86 \ + --hash=sha256:3a366cdba24b8df31ad70b82bae55baa696c453678c1346da8390396a1d5cce4 \ + --hash=sha256:3ad3462d070b678fe61d3bdd7c6ac3fdbd25cca66f32b6edf589dd88fff251d2 \ + --hash=sha256:3ae006498fea11515027a417e6e68b82e1c195d3516188ba2cc08210e3022d14 \ + --hash=sha256:3de7a2eba26ff13a79670f78f73fc86fb8c87100508119f3b6bd61451bfdd4bf \ + --hash=sha256:3fb61891b2675664dc89d486eb5199e3659179ae04fc0a863ffc7e16b782b624 \ + --hash=sha256:41dfc52db29a06fe23a5029abc3bc13503e28233b1c3a9614bc1e5c4d6adc1ce \ + --hash=sha256:454d073e628043dde4f9bd34517736c1889dbe6417099bbae2119873b8d4d5da \ + --hash=sha256:467ff87fc4c61a23424b32acd952476ba17e7f7eeb8090e5957f68129784a35f \ + --hash=sha256:4c509e8172b9438536946097768413f297229b03eff064e4e06749cf5c28df78 \ + --hash=sha256:524d3497a86f79959c9c1d729715d60d8171ed3f71621d45afb4faee5a47e8a1 \ + --hash=sha256:52a8ddd1d9b5681de216a7af718720f5202d3c093ecc10dd4dfac6d25da605a6 \ + --hash=sha256:5e36c8a3bb09db5730b3d5014d087bce977e878825cdd7ba8285abcd81c43bc0 \ + --hash=sha256:6386165c64ba5f61c416301f7f32bb899f8200ca575d76888697a42fda8a92d2 \ + --hash=sha256:64eebe1d709539d6e80440fa1185f1eeb260d53bcb6435b1f753b4ce90a65e82 \ + --hash=sha256:6dc42afedc8cda4f2fd15a06d2e9e41281074a02cdf31bb2e0dde4d80766a408 \ + --hash=sha256:7244b796dd7e191753b822ac0ca871a4b9139b0b850770ac5bd347d5f8c76768 \ + --hash=sha256:739ef91aeb13fa2aa187d0efd46d0ac168301f54a6ef748565c42876b4b3ce71 \ + --hash=sha256:7579429e89deac6659b4ea70eb3de9063bb40508fd4a8a020fa67b02e0b59f4f \ + --hash=sha256:82f26e592e9a36ab33bcdb419c7d53320e26c85dfc254cdb84f5f561a2fcaabf \ + --hash=sha256:84db8aef08df6431b017cc3abe57b3d6885fd7436eec8d715603c309353b233c \ + --hash=sha256:86be1e283d78cc3f7daee1dcd0254122160cde71ca8c5348315156045f8ac2bb \ + --hash=sha256:892914dc2e80403d16e59a3b440044f6092fde5ffd4ec1fdf36d6ff20a8e624d \ + --hash=sha256:91966b7b48ec939e5083b03c9154fc450508056f01650ecb58724095307427f5 \ + --hash=sha256:926d671654a2f8cfa0b2fcb6b0c46833af95b5265d27a5c56c49c5a10f3ff3ba \ + --hash=sha256:9d19f04ecd4628a0e4587b4c4e98e040b87924c1362ae5aa27420435f05d5dd8 \ + --hash=sha256:a18d1392eabd02f337dcba23d723a4dcca87274ce8693cf88e6320f38bc3fdcd \ + --hash=sha256:a2c790517ed884bc1b1590806222ab44989eeb7e7f14dfa915561c7ee3b9ac73 \ + --hash=sha256:ac9fcf7c5cf1e9d0bcc643672f81bf43ec81f6495b99809649f5bfcdff633ab0 \ + --hash=sha256:b03092399f0f5d3e112405b890128afdb9e1f203eafb812f5d9105b0f5fac9d4 \ + --hash=sha256:b069639757b2f287f9cd0daf6765b536558c5e28263bbbb28e3d1925bce75400 \ + --hash=sha256:b2054e1f2c7041857ce129443bde23298ca37592ce82f0fb5ed5704d5f3708dd \ + --hash=sha256:b2c3186cf76d598a9d42b35e09ef35d499118b4197624ba5bba1b3a39ac6a75f \ + --hash=sha256:d3146843b972f744aed551e8ac9fac5714baa864393e480586d467b7b4488426 \ + --hash=sha256:e1b51d26108a832f151da8856a93676cc1a5cd8dd0bc20f06f4aee5774a7f0f9 \ + --hash=sha256:e346c1b86c5e5f175ca8f87f3873eea8b2e0eeb5d52033b475cf85641cb200c2 \ + --hash=sha256:e36d85967cfbf25da1c7bc3d6921adc5baa976969d926aaf1582bd5fd7e94758 \ + --hash=sha256:e3c7774232a2c9b195bde4fb72ad71455e877a9e4e9c0b17a57b1d9bd478838c \ + --hash=sha256:e7798e842ec506d25f21e825259b70109325ac1c9b43c2e287aad7559455951b \ + --hash=sha256:e90b8a2f24149c5803b733a24f1a016a2943b1f5a9ab2360db545e4638354c35 \ + --hash=sha256:f9e10678fe0692c5167553981d97cbe342ed055c49016aef10da336e2962b1f2 \ + --hash=sha256:fd51e77ff1b4ca08bc9b09b85646a3e77f275827b7b30180d76d769ce608e64d +ecdsa==0.19.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a \ + --hash=sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8 +emoji==2.12.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:4aa0488817691aa58d83764b6c209f8a27c0b3ab3f89d1b8dceca1a62e4973eb \ + --hash=sha256:a00d62173bdadc2510967a381810101624a2f0986145b8da0cffa42e29430235 +everett[ini]==3.1.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:46175da5bcb06c193aa129e59714bca981344ff067c3a8bc2e625bc0b3dc01f6 \ + --hash=sha256:db13891b849e45e54faea93ee79881d12458c5378f5b9b7f806eeff03ce1de3c +exceptiongroup==1.2.1 ; python_version >= "3.10" and python_version < "3.11" \ + --hash=sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad \ + --hash=sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16 +filelock==3.15.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8 \ + --hash=sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac +filetype==1.2.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb \ + --hash=sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25 +flatten-dict==0.4.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:506a96b6e6f805b81ae46a0f9f31290beb5fa79ded9d80dbe1b7fa236ab43076 \ + --hash=sha256:7e245b20c4c718981212210eec4284a330c9f713e632e98765560e05421e48ad +frozenlist==1.4.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7 \ + --hash=sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98 \ + --hash=sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad \ + --hash=sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5 \ + --hash=sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae \ + --hash=sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e \ + --hash=sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a \ + --hash=sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701 \ + --hash=sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d \ + --hash=sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6 \ + --hash=sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6 \ + --hash=sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106 \ + --hash=sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75 \ + --hash=sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868 \ + --hash=sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a \ + --hash=sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0 \ + --hash=sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1 \ + --hash=sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826 \ + --hash=sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec \ + --hash=sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6 \ + --hash=sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950 \ + --hash=sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19 \ + --hash=sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0 \ + --hash=sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8 \ + --hash=sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a \ + --hash=sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09 \ + --hash=sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86 \ + --hash=sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c \ + --hash=sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5 \ + --hash=sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b \ + --hash=sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b \ + --hash=sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d \ + --hash=sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0 \ + --hash=sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea \ + --hash=sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776 \ + --hash=sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a \ + --hash=sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897 \ + --hash=sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7 \ + --hash=sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09 \ + --hash=sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9 \ + --hash=sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe \ + --hash=sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd \ + --hash=sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742 \ + --hash=sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09 \ + --hash=sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0 \ + --hash=sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932 \ + --hash=sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1 \ + --hash=sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a \ + --hash=sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49 \ + --hash=sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d \ + --hash=sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7 \ + --hash=sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480 \ + --hash=sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89 \ + --hash=sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e \ + --hash=sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b \ + --hash=sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82 \ + --hash=sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb \ + --hash=sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068 \ + --hash=sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8 \ + --hash=sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b \ + --hash=sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb \ + --hash=sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2 \ + --hash=sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11 \ + --hash=sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b \ + --hash=sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc \ + --hash=sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0 \ + --hash=sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497 \ + --hash=sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17 \ + --hash=sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0 \ + --hash=sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2 \ + --hash=sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439 \ + --hash=sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5 \ + --hash=sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac \ + --hash=sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825 \ + --hash=sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887 \ + --hash=sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced \ + --hash=sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74 +fsspec==2024.5.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a \ + --hash=sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c +fsspec[http]==2024.5.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a \ + --hash=sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c +gdown==5.2.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:2145165062d85520a3cd98b356c9ed522c5e7984d408535409fd46f94defc787 \ + --hash=sha256:33083832d82b1101bdd0e9df3edd0fbc0e1c5f14c9d8c38d2a35bf1683b526d6 +gitdb==4.0.11 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4 \ + --hash=sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b +gitpython==3.1.43 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c \ + --hash=sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff +google-api-core==2.19.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251 \ + --hash=sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10 +google-auth==2.30.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5 \ + --hash=sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688 +google-cloud-core==2.4.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073 \ + --hash=sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61 +google-cloud-storage==2.14.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:2d23fcf59b55e7b45336729c148bb1c464468c69d5efbaee30f7201dd90eb97e \ + --hash=sha256:8641243bbf2a2042c16a6399551fbb13f062cbc9a2de38d6c0bb5426962e9dbd +google-crc32c==1.5.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a \ + --hash=sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876 \ + --hash=sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c \ + --hash=sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289 \ + --hash=sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298 \ + --hash=sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02 \ + --hash=sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f \ + --hash=sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2 \ + --hash=sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a \ + --hash=sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb \ + --hash=sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210 \ + --hash=sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5 \ + --hash=sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee \ + --hash=sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c \ + --hash=sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a \ + --hash=sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314 \ + --hash=sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd \ + --hash=sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65 \ + --hash=sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37 \ + --hash=sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4 \ + --hash=sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13 \ + --hash=sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894 \ + --hash=sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31 \ + --hash=sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e \ + --hash=sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709 \ + --hash=sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740 \ + --hash=sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc \ + --hash=sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d \ + --hash=sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c \ + --hash=sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c \ + --hash=sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d \ + --hash=sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906 \ + --hash=sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61 \ + --hash=sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57 \ + --hash=sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c \ + --hash=sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a \ + --hash=sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438 \ + --hash=sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946 \ + --hash=sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7 \ + --hash=sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96 \ + --hash=sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091 \ + --hash=sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae \ + --hash=sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d \ + --hash=sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88 \ + --hash=sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2 \ + --hash=sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd \ + --hash=sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541 \ + --hash=sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728 \ + --hash=sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178 \ + --hash=sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968 \ + --hash=sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346 \ + --hash=sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8 \ + --hash=sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93 \ + --hash=sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7 \ + --hash=sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273 \ + --hash=sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462 \ + --hash=sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94 \ + --hash=sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd \ + --hash=sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e \ + --hash=sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57 \ + --hash=sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b \ + --hash=sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9 \ + --hash=sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a \ + --hash=sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100 \ + --hash=sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325 \ + --hash=sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183 \ + --hash=sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556 \ + --hash=sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4 +google-resumable-media==2.7.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:103ebc4ba331ab1bfdac0250f8033627a2cd7cde09e7ccff9181e31ba4315b2c \ + --hash=sha256:eae451a7b2e2cdbaaa0fd2eb00cc8a1ee5e95e16b55597359cbc3d27d7d90e33 +googleapis-common-protos==1.63.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877 \ + --hash=sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a +greenlet==3.0.3 ; python_version < "3.12" and (platform_machine == "aarch64" or platform_machine == "ppc64le" or platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "AMD64" or platform_machine == "win32" or platform_machine == "WIN32") and python_version >= "3.10" \ + --hash=sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67 \ + --hash=sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6 \ + --hash=sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257 \ + --hash=sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4 \ + --hash=sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676 \ + --hash=sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61 \ + --hash=sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc \ + --hash=sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca \ + --hash=sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7 \ + --hash=sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728 \ + --hash=sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305 \ + --hash=sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6 \ + --hash=sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379 \ + --hash=sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414 \ + --hash=sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04 \ + --hash=sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a \ + --hash=sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf \ + --hash=sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491 \ + --hash=sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559 \ + --hash=sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e \ + --hash=sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274 \ + --hash=sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb \ + --hash=sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b \ + --hash=sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9 \ + --hash=sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b \ + --hash=sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be \ + --hash=sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506 \ + --hash=sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405 \ + --hash=sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113 \ + --hash=sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f \ + --hash=sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5 \ + --hash=sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230 \ + --hash=sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d \ + --hash=sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f \ + --hash=sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a \ + --hash=sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e \ + --hash=sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61 \ + --hash=sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6 \ + --hash=sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d \ + --hash=sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71 \ + --hash=sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22 \ + --hash=sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2 \ + --hash=sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3 \ + --hash=sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067 \ + --hash=sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc \ + --hash=sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881 \ + --hash=sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3 \ + --hash=sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e \ + --hash=sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac \ + --hash=sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53 \ + --hash=sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0 \ + --hash=sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b \ + --hash=sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83 \ + --hash=sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41 \ + --hash=sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c \ + --hash=sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf \ + --hash=sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da \ + --hash=sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33 +grpcio-tools==1.62.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:04a394cf5e51ba9be412eb9f6c482b6270bd81016e033e8eb7d21b8cc28fe8b5 \ + --hash=sha256:04c607029ae3660fb1624ed273811ffe09d57d84287d37e63b5b802a35897329 \ + --hash=sha256:10cc3321704ecd17c93cf68c99c35467a8a97ffaaed53207e9b2da6ae0308ee1 \ + --hash=sha256:1679b4903aed2dc5bd8cb22a452225b05dc8470a076f14fd703581efc0740cdb \ + --hash=sha256:184b4174d4bd82089d706e8223e46c42390a6ebac191073b9772abc77308f9fa \ + --hash=sha256:19216e1fb26dbe23d12a810517e1b3fbb8d4f98b1a3fbebeec9d93a79f092de4 \ + --hash=sha256:19ea69e41c3565932aa28a202d1875ec56786aea46a2eab54a3b28e8a27f9517 \ + --hash=sha256:1d768a5c07279a4c461ebf52d0cec1c6ca85c6291c71ec2703fe3c3e7e28e8c4 \ + --hash=sha256:1fe08d2038f2b7c53259b5c49e0ad08c8e0ce2b548d8185993e7ef67e8592cca \ + --hash=sha256:217c2ee6a7ce519a55958b8622e21804f6fdb774db08c322f4c9536c35fdce7c \ + --hash=sha256:2ce149ea55eadb486a7fb75a20f63ef3ac065ee6a0240ed25f3549ce7954c653 \ + --hash=sha256:2ed775e844566ce9ce089be9a81a8b928623b8ee5820f5e4d58c1a9d33dfc5ae \ + --hash=sha256:3708a747aa4b6b505727282ca887041174e146ae030ebcadaf4c1d346858df62 \ + --hash=sha256:3a8d6f07e64c0c7756f4e0c4781d9d5a2b9cc9cbd28f7032a6fb8d4f847d0445 \ + --hash=sha256:3c53b221378b035ae2f1881cbc3aca42a6075a8e90e1a342c2f205eb1d1aa6a1 \ + --hash=sha256:40cd4eeea4b25bcb6903b82930d579027d034ba944393c4751cdefd9c49e6989 \ + --hash=sha256:45db5da2bcfa88f2b86b57ef35daaae85c60bd6754a051d35d9449c959925b57 \ + --hash=sha256:462e0ab8dd7c7b70bfd6e3195eebc177549ede5cf3189814850c76f9a340d7ce \ + --hash=sha256:47117c8a7e861382470d0e22d336e5a91fdc5f851d1db44fa784b9acea190d87 \ + --hash=sha256:472505d030135d73afe4143b0873efe0dcb385bd6d847553b4f3afe07679af00 \ + --hash=sha256:4f6f32d39283ea834a493fccf0ebe9cfddee7577bdcc27736ad4be1732a36399 \ + --hash=sha256:4f955702dc4b530696375251319d05223b729ed24e8673c2129f7a75d2caefbb \ + --hash=sha256:4f989e5cebead3ae92c6abf6bf7b19949e1563a776aea896ac5933f143f0c45d \ + --hash=sha256:58cbb24b3fa6ae35aa9c210fcea3a51aa5fef0cd25618eb4fd94f746d5a9b703 \ + --hash=sha256:5b07b5874187e170edfbd7aa2ca3a54ebf3b2952487653e8c0b0d83601c33035 \ + --hash=sha256:5fd5e1582b678e6b941ee5f5809340be5e0724691df5299aae8226640f94e18f \ + --hash=sha256:6413581e14a80e0b4532577766cf0586de4dd33766a31b3eb5374a746771c07d \ + --hash=sha256:72b61332f1b439c14cbd3815174a8f1d35067a02047c32decd406b3a09bb9890 \ + --hash=sha256:759c60f24c33a181bbbc1232a6752f9b49fbb1583312a4917e2b389fea0fb0f2 \ + --hash=sha256:76eb459bdf3fb666e01883270beee18f3f11ed44488486b61cd210b4e0e17cc1 \ + --hash=sha256:7a49bccae1c7d154b78e991885c3111c9ad8c8fa98e91233de425718f47c6139 \ + --hash=sha256:7d8b4e00c3d7237b92260fc18a561cd81f1da82e8be100db1b7d816250defc66 \ + --hash=sha256:7ea369c4d1567d1acdf69c8ea74144f4ccad9e545df7f9a4fc64c94fa7684ba3 \ + --hash=sha256:8214820990d01b52845f9fbcb92d2b7384a0c321b303e3ac614c219dc7d1d3af \ + --hash=sha256:8c616d0ad872e3780693fce6a3ac8ef00fc0963e6d7815ce9dcfae68ba0fc287 \ + --hash=sha256:987e774f74296842bbffd55ea8826370f70c499e5b5f71a8cf3103838b6ee9c3 \ + --hash=sha256:9be84ff6d47fd61462be7523b49d7ba01adf67ce4e1447eae37721ab32464dd8 \ + --hash=sha256:9d41e0e47dd075c075bb8f103422968a65dd0d8dc8613288f573ae91eb1053ba \ + --hash=sha256:9f1ba79a253df9e553d20319c615fa2b429684580fa042dba618d7f6649ac7e4 \ + --hash=sha256:a34d97c62e61bfe9e6cff0410fe144ac8cca2fc979ad0be46b7edf026339d161 \ + --hash=sha256:a7e439476b29d6dac363b321781a113794397afceeb97dad85349db5f1cb5e9a \ + --hash=sha256:ab84bae88597133f6ea7a2bdc57b2fda98a266fe8d8d4763652cbefd20e73ad7 \ + --hash=sha256:b6746bc823958499a3cf8963cc1de00072962fb5e629f26d658882d3f4c35095 \ + --hash=sha256:b8574469ecc4ff41d6bb95f44e0297cdb0d95bade388552a9a444db9cd7485cd \ + --hash=sha256:bdc5dd3f57b5368d5d661d5d3703bcaa38bceca59d25955dff66244dbc987271 \ + --hash=sha256:c195d74fe98541178ece7a50dad2197d43991e0f77372b9a88da438be2486f12 \ + --hash=sha256:c384c838b34d1b67068e51b5bbe49caa6aa3633acd158f1ab16b5da8d226bc53 \ + --hash=sha256:c48fabe40b9170f4e3d7dd2c252e4f1ff395dc24e49ac15fc724b1b6f11724da \ + --hash=sha256:cbb8453ae83a1db2452b7fe0f4b78e4a8dd32be0f2b2b73591ae620d4d784d3d \ + --hash=sha256:d58389fe8be206ddfb4fa703db1e24c956856fcb9a81da62b13577b3a8f7fda7 \ + --hash=sha256:d82f681c9a9d933a9d8068e8e382977768e7779ddb8870fa0cf918d8250d1532 \ + --hash=sha256:e33b59fb3efdddeb97ded988a871710033e8638534c826567738d3edce528752 \ + --hash=sha256:ec674b4440ef4311ac1245a709e87b36aca493ddc6850eebe0b278d1f2b6e7d1 \ + --hash=sha256:fa107460c842e4c1a6266150881694fefd4f33baa544ea9489601810c2210ef8 +grpcio==1.64.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040 \ + --hash=sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122 \ + --hash=sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9 \ + --hash=sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f \ + --hash=sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd \ + --hash=sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d \ + --hash=sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33 \ + --hash=sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762 \ + --hash=sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294 \ + --hash=sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650 \ + --hash=sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b \ + --hash=sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad \ + --hash=sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1 \ + --hash=sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff \ + --hash=sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59 \ + --hash=sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4 \ + --hash=sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027 \ + --hash=sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502 \ + --hash=sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae \ + --hash=sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61 \ + --hash=sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb \ + --hash=sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa \ + --hash=sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5 \ + --hash=sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1 \ + --hash=sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9 \ + --hash=sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90 \ + --hash=sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b \ + --hash=sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179 \ + --hash=sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e \ + --hash=sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a \ + --hash=sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489 \ + --hash=sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d \ + --hash=sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a \ + --hash=sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2 \ + --hash=sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd \ + --hash=sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb \ + --hash=sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61 \ + --hash=sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca \ + --hash=sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6 \ + --hash=sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602 \ + --hash=sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367 \ + --hash=sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62 \ + --hash=sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d \ + --hash=sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd \ + --hash=sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22 \ + --hash=sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309 +h11==0.14.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ + --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 +h2==4.1.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d \ + --hash=sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb +hpack==4.0.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c \ + --hash=sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095 +httpcore==1.0.5 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61 \ + --hash=sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5 +httpx==0.27.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5 \ + --hash=sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5 +httpx[http2]==0.27.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5 \ + --hash=sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5 +huggingface-hub==0.23.4 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:35d99016433900e44ae7efe1c209164a5a81dbbcd53a52f99c281dcd7ce22431 \ + --hash=sha256:3a0b957aa87150addf0cc7bd71b4d954b78e749850e1e7fb29ebbd2db64ca037 +hyperframe==6.0.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15 \ + --hash=sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914 +idna==3.7 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ + --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 +install==1.3.5 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0d3fadf4aa62c95efe8d34757c8507eb46177f86c016c21c6551eafc6a53d5a9 \ + --hash=sha256:e67c8a0be5ccf8cb4ffa17d090f3a61b6e820e6a7e21cd1d2c0f7bc59b18e647 +instructorembedding==1.0.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:886495ddd561bad57e8e7d5e8ee44c4243b1d80b538a25d32d37350f6082ee62 \ + --hash=sha256:c8d0c11d0bab3ede023104e1f3de6a3471bf71208cc272d1ef72bae771e7d1a3 +intel-openmp==2021.4.0 ; python_version >= "3.10" and python_version < "3.12" and platform_system == "Windows" \ + --hash=sha256:3b921236a38384e2016f0f3d65af6732cf2c12918087128a9163225451e776f2 \ + --hash=sha256:41c01e266a7fdb631a7609191709322da2bbf24b252ba763f125dd651bcc7675 \ + --hash=sha256:6e863d8fd3d7e8ef389d52cf97a50fe2afe1a19247e8c0d168ce021546f96fc9 \ + --hash=sha256:e2240ab8d01472fed04f3544a878cda5da16c26232b7ea1b59132dbfb48b186e \ + --hash=sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f +jinja2==3.1.4 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d +jmespath==1.0.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980 \ + --hash=sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe +joblib==1.4.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6 \ + --hash=sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e +jsonpatch==1.33 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade \ + --hash=sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c +jsonpath-python==1.0.6 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:1e3b78df579f5efc23565293612decee04214609208a2335884b3ee3f786b575 \ + --hash=sha256:dd5be4a72d8a2995c3f583cf82bf3cd1a9544cfdabf2d22595b67aff07349666 +jsonpointer==3.0.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942 \ + --hash=sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef +jsonschema-specifications==2023.12.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc \ + --hash=sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c +jsonschema==4.22.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7 \ + --hash=sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802 +langchain-community==0.0.38 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:127fc4b75bc67b62fe827c66c02e715a730fef8fe69bd2023d466bab06b5810d \ + --hash=sha256:ecb48660a70a08c90229be46b0cc5f6bc9f38f2833ee44c57dfab9bf3a2c121a +langchain-core==0.1.52 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:084c3fc452f5a6966c28ab3ec5dbc8b8d26fc3f63378073928f4e29d90b6393f \ + --hash=sha256:62566749c92e8a1181c255c788548dc16dbc319d896cd6b9c95dc17af9b2a6db +langchain-openai==0.1.7 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:39c3cb22bb739900ae8294d4d9939a6138c0ca7ad11198e57038eb14c08d04ec \ + --hash=sha256:fd7e1c33ba8e2cab4b2154f3a2fd4a0d9cc6518b41cf49bb87255f9f732a4896 +langchain-text-splitters==0.0.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:13887f32705862c1e1454213cb7834a63aae57c26fcd80346703a1d09c46168d \ + --hash=sha256:ac8927dc0ba08eba702f6961c9ed7df7cead8de19a9f7101ab2b5ea34201b3c1 +langchain==0.1.20 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:09991999fbd6c3421a12db3c7d1f52d55601fc41d9b2a3ef51aab2e0e9c38da9 \ + --hash=sha256:f35c95eed8c8375e02dce95a34f2fd4856a4c98269d6dc34547a23dba5beab7e +langdetect==1.0.9 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:7cbc0746252f19e76f77c0b1690aadf01963be835ef0cd4b56dddf2a8f1dfc2a \ + --hash=sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0 +langsmith==0.1.80 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:951fc29576b52afd8378d41f6db343090fea863e3620f0ca97e83b221f93c94d \ + --hash=sha256:a29b1dde27612308beee424f1388ad844c8e7e375bf2ac8bdf4da174013f279d +lxml==5.2.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3 \ + --hash=sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a \ + --hash=sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0 \ + --hash=sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b \ + --hash=sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f \ + --hash=sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6 \ + --hash=sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73 \ + --hash=sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d \ + --hash=sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad \ + --hash=sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b \ + --hash=sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a \ + --hash=sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5 \ + --hash=sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab \ + --hash=sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316 \ + --hash=sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6 \ + --hash=sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df \ + --hash=sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca \ + --hash=sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264 \ + --hash=sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8 \ + --hash=sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f \ + --hash=sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b \ + --hash=sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3 \ + --hash=sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5 \ + --hash=sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed \ + --hash=sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab \ + --hash=sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5 \ + --hash=sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726 \ + --hash=sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d \ + --hash=sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632 \ + --hash=sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706 \ + --hash=sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8 \ + --hash=sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472 \ + --hash=sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835 \ + --hash=sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf \ + --hash=sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db \ + --hash=sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d \ + --hash=sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545 \ + --hash=sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9 \ + --hash=sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be \ + --hash=sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe \ + --hash=sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905 \ + --hash=sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438 \ + --hash=sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db \ + --hash=sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776 \ + --hash=sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c \ + --hash=sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed \ + --hash=sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd \ + --hash=sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484 \ + --hash=sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d \ + --hash=sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6 \ + --hash=sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30 \ + --hash=sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182 \ + --hash=sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61 \ + --hash=sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425 \ + --hash=sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb \ + --hash=sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1 \ + --hash=sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511 \ + --hash=sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e \ + --hash=sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207 \ + --hash=sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b \ + --hash=sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585 \ + --hash=sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56 \ + --hash=sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391 \ + --hash=sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85 \ + --hash=sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147 \ + --hash=sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18 \ + --hash=sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1 \ + --hash=sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa \ + --hash=sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48 \ + --hash=sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3 \ + --hash=sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184 \ + --hash=sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67 \ + --hash=sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7 \ + --hash=sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34 \ + --hash=sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706 \ + --hash=sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8 \ + --hash=sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c \ + --hash=sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115 \ + --hash=sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009 \ + --hash=sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466 \ + --hash=sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526 \ + --hash=sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d \ + --hash=sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525 \ + --hash=sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14 \ + --hash=sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3 \ + --hash=sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0 \ + --hash=sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b \ + --hash=sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1 \ + --hash=sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f \ + --hash=sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf \ + --hash=sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf \ + --hash=sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0 \ + --hash=sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b \ + --hash=sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff \ + --hash=sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88 \ + --hash=sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2 \ + --hash=sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40 \ + --hash=sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716 \ + --hash=sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2 \ + --hash=sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2 \ + --hash=sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a \ + --hash=sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734 \ + --hash=sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87 \ + --hash=sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48 \ + --hash=sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36 \ + --hash=sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b \ + --hash=sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07 \ + --hash=sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c \ + --hash=sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573 \ + --hash=sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001 \ + --hash=sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9 \ + --hash=sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3 \ + --hash=sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce \ + --hash=sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3 \ + --hash=sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04 \ + --hash=sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927 \ + --hash=sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083 \ + --hash=sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d \ + --hash=sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32 \ + --hash=sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9 \ + --hash=sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f \ + --hash=sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2 \ + --hash=sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c \ + --hash=sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d \ + --hash=sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393 \ + --hash=sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8 \ + --hash=sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6 \ + --hash=sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66 \ + --hash=sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5 \ + --hash=sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97 \ + --hash=sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196 \ + --hash=sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836 \ + --hash=sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae \ + --hash=sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297 \ + --hash=sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421 \ + --hash=sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6 \ + --hash=sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981 \ + --hash=sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30 \ + --hash=sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30 \ + --hash=sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f \ + --hash=sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324 \ + --hash=sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b +markdown-it-py==3.0.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ + --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb +markupsafe==2.1.5 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ + --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ + --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ + --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ + --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ + --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ + --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ + --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ + --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ + --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ + --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ + --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ + --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ + --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ + --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ + --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ + --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ + --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ + --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ + --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ + --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ + --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ + --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ + --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ + --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ + --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ + --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ + --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ + --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ + --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ + --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ + --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ + --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ + --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ + --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ + --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ + --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ + --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ + --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ + --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ + --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ + --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ + --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ + --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ + --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ + --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ + --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ + --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ + --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ + --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ + --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ + --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ + --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ + --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ + --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ + --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ + --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ + --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ + --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ + --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 +marshmallow-dataclass==8.6.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:d941137bcb480729a14810e5f10d9bb79a498fb5b57c875aad6be37e97b98a5f \ + --hash=sha256:dca312c841f73f8f665b4434d23b3204e8cfbf50b8cbb57bb76f41a6ee8184c8 +marshmallow==3.21.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:4f57c5e050a54d66361e826f94fba213eb10b67b2fdb02c3e0343ce207ba1662 \ + --hash=sha256:86ce7fb914aa865001a4b2092c4c2872d13bc347f3d42673272cabfdbad386f1 +mdurl==0.1.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba +mkl==2021.4.0 ; python_version >= "3.10" and python_version < "3.12" and platform_system == "Windows" \ + --hash=sha256:398dbf2b0d12acaf54117a5210e8f191827f373d362d796091d161f610c1ebfb \ + --hash=sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8 \ + --hash=sha256:636d07d90e68ccc9630c654d47ce9fdeb036bb46e2b193b3a9ac8cfea683cce5 \ + --hash=sha256:67460f5cd7e30e405b54d70d1ed3ca78118370b65f7327d495e9c8847705e2fb \ + --hash=sha256:ceef3cafce4c009dd25f65d7ad0d833a0fbadc3d8903991ec92351fe5de1e718 +mpmath==1.3.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f \ + --hash=sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c +multidict==6.0.5 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556 \ + --hash=sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c \ + --hash=sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29 \ + --hash=sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b \ + --hash=sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8 \ + --hash=sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7 \ + --hash=sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd \ + --hash=sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40 \ + --hash=sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6 \ + --hash=sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3 \ + --hash=sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c \ + --hash=sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9 \ + --hash=sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5 \ + --hash=sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae \ + --hash=sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442 \ + --hash=sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9 \ + --hash=sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc \ + --hash=sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c \ + --hash=sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea \ + --hash=sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5 \ + --hash=sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50 \ + --hash=sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182 \ + --hash=sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453 \ + --hash=sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e \ + --hash=sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600 \ + --hash=sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733 \ + --hash=sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda \ + --hash=sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241 \ + --hash=sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461 \ + --hash=sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e \ + --hash=sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e \ + --hash=sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b \ + --hash=sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e \ + --hash=sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7 \ + --hash=sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386 \ + --hash=sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd \ + --hash=sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9 \ + --hash=sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf \ + --hash=sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee \ + --hash=sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5 \ + --hash=sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a \ + --hash=sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271 \ + --hash=sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54 \ + --hash=sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4 \ + --hash=sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496 \ + --hash=sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb \ + --hash=sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319 \ + --hash=sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3 \ + --hash=sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f \ + --hash=sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527 \ + --hash=sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed \ + --hash=sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604 \ + --hash=sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef \ + --hash=sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8 \ + --hash=sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5 \ + --hash=sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5 \ + --hash=sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626 \ + --hash=sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c \ + --hash=sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d \ + --hash=sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c \ + --hash=sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc \ + --hash=sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc \ + --hash=sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b \ + --hash=sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38 \ + --hash=sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450 \ + --hash=sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1 \ + --hash=sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f \ + --hash=sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3 \ + --hash=sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755 \ + --hash=sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226 \ + --hash=sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a \ + --hash=sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046 \ + --hash=sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf \ + --hash=sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479 \ + --hash=sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e \ + --hash=sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1 \ + --hash=sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a \ + --hash=sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83 \ + --hash=sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929 \ + --hash=sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93 \ + --hash=sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a \ + --hash=sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c \ + --hash=sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44 \ + --hash=sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89 \ + --hash=sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba \ + --hash=sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e \ + --hash=sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da \ + --hash=sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24 \ + --hash=sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423 \ + --hash=sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef +multiprocess==0.70.16 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0dfd078c306e08d46d7a8d06fb120313d87aa43af60d66da43ffff40b44d2f41 \ + --hash=sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1 \ + --hash=sha256:37b55f71c07e2d741374998c043b9520b626a8dddc8b3129222ca4f1a06ef67a \ + --hash=sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee \ + --hash=sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3 \ + --hash=sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435 \ + --hash=sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a \ + --hash=sha256:ba8c31889abf4511c7308a8c52bb4a30b9d590e7f58523302ba00237702ca054 \ + --hash=sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02 \ + --hash=sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec \ + --hash=sha256:e7b9d0f307cd9bd50851afaac0dba2cb6c44449efff697df7c7645f7d3f2be3a \ + --hash=sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e +mypy-extensions==1.0.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ + --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 +nest-asyncio==1.6.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe \ + --hash=sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c +networkx==3.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9 \ + --hash=sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 +nltk==3.8.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3 \ + --hash=sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5 +numpy==1.26.4 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b \ + --hash=sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818 \ + --hash=sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20 \ + --hash=sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0 \ + --hash=sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010 \ + --hash=sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a \ + --hash=sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea \ + --hash=sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c \ + --hash=sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71 \ + --hash=sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110 \ + --hash=sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be \ + --hash=sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a \ + --hash=sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a \ + --hash=sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5 \ + --hash=sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed \ + --hash=sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd \ + --hash=sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c \ + --hash=sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e \ + --hash=sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0 \ + --hash=sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c \ + --hash=sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a \ + --hash=sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b \ + --hash=sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0 \ + --hash=sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6 \ + --hash=sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2 \ + --hash=sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a \ + --hash=sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30 \ + --hash=sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218 \ + --hash=sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5 \ + --hash=sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07 \ + --hash=sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2 \ + --hash=sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4 \ + --hash=sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764 \ + --hash=sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef \ + --hash=sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3 \ + --hash=sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f +nvidia-cublas-cu12==12.1.3.1 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906 \ + --hash=sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728 +nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4 \ + --hash=sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e +nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed \ + --hash=sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2 +nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40 \ + --hash=sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344 +nvidia-cudnn-cu12==8.9.2.26 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9 +nvidia-cufft-cu12==11.0.2.54 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56 \ + --hash=sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253 +nvidia-curand-cu12==10.3.2.106 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a \ + --hash=sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0 +nvidia-cusolver-cu12==11.4.5.107 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5 \ + --hash=sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd +nvidia-cusparse-cu12==12.1.0.106 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a \ + --hash=sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c +nvidia-nccl-cu12==2.20.5 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56 \ + --hash=sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01 +nvidia-nvjitlink-cu12==12.5.40 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:c3401dc8543b52d3a8158007a0c1ab4e9c768fcbd24153a48c86972102197ddd \ + --hash=sha256:d9714f27c1d0f0895cd8915c07a87a1d0029a0aa36acaf9156952ec2a8a12189 +nvidia-nvtx-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82 \ + --hash=sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5 +openai==1.34.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:018623c2f795424044675c6230fa3bfbf98d9e0aab45d8fd116f2efb2cfb6b7e \ + --hash=sha256:95c8e2da4acd6958e626186957d656597613587195abd0fb2527566a93e76770 +ordered-set==4.1.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562 \ + --hash=sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8 +orjson==3.10.5 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01 \ + --hash=sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa \ + --hash=sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5 \ + --hash=sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04 \ + --hash=sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d \ + --hash=sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e \ + --hash=sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b \ + --hash=sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b \ + --hash=sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268 \ + --hash=sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211 \ + --hash=sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c \ + --hash=sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c \ + --hash=sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969 \ + --hash=sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a \ + --hash=sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f \ + --hash=sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932 \ + --hash=sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26 \ + --hash=sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6 \ + --hash=sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214 \ + --hash=sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2 \ + --hash=sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f \ + --hash=sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96 \ + --hash=sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a \ + --hash=sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d \ + --hash=sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38 \ + --hash=sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807 \ + --hash=sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09 \ + --hash=sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6 \ + --hash=sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e \ + --hash=sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5 \ + --hash=sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86 \ + --hash=sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63 \ + --hash=sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2 \ + --hash=sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4 \ + --hash=sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595 \ + --hash=sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228 \ + --hash=sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9 \ + --hash=sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7 \ + --hash=sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40 \ + --hash=sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3 \ + --hash=sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139 \ + --hash=sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1 \ + --hash=sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b \ + --hash=sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47 \ + --hash=sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1 \ + --hash=sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca +outcome==1.3.0.post0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8 \ + --hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b +packaging==23.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ + --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 +pandas==2.2.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863 \ + --hash=sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2 \ + --hash=sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1 \ + --hash=sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad \ + --hash=sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db \ + --hash=sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76 \ + --hash=sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51 \ + --hash=sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32 \ + --hash=sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08 \ + --hash=sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b \ + --hash=sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4 \ + --hash=sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921 \ + --hash=sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288 \ + --hash=sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee \ + --hash=sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0 \ + --hash=sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24 \ + --hash=sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99 \ + --hash=sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151 \ + --hash=sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd \ + --hash=sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce \ + --hash=sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57 \ + --hash=sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef \ + --hash=sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54 \ + --hash=sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a \ + --hash=sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238 \ + --hash=sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23 \ + --hash=sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772 \ + --hash=sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce \ + --hash=sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad +peft==0.11.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:76f2d2a4c9e0644e2741465663b8a02097775e9725d26d7b41551e6f1e72e7dd \ + --hash=sha256:c1a04462e589a1305a06f7c118be0b8602b829f9bfc2104b5c6514c7678c2310 +pika==1.3.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0779a7c1fafd805672796085560d290213a465e4f6f76a6fb19e378d8041a14f \ + --hash=sha256:b2a327ddddf8570b4965b3576ac77091b850262d34ce8c1d8cb4e4146aa4145f +pillow==10.3.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c \ + --hash=sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2 \ + --hash=sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb \ + --hash=sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d \ + --hash=sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa \ + --hash=sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3 \ + --hash=sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1 \ + --hash=sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a \ + --hash=sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd \ + --hash=sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8 \ + --hash=sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999 \ + --hash=sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599 \ + --hash=sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936 \ + --hash=sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375 \ + --hash=sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d \ + --hash=sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b \ + --hash=sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60 \ + --hash=sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572 \ + --hash=sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3 \ + --hash=sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced \ + --hash=sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f \ + --hash=sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b \ + --hash=sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19 \ + --hash=sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f \ + --hash=sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d \ + --hash=sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383 \ + --hash=sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795 \ + --hash=sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355 \ + --hash=sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57 \ + --hash=sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09 \ + --hash=sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b \ + --hash=sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462 \ + --hash=sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf \ + --hash=sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f \ + --hash=sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a \ + --hash=sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad \ + --hash=sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9 \ + --hash=sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d \ + --hash=sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45 \ + --hash=sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994 \ + --hash=sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d \ + --hash=sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338 \ + --hash=sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463 \ + --hash=sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451 \ + --hash=sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591 \ + --hash=sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c \ + --hash=sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd \ + --hash=sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32 \ + --hash=sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9 \ + --hash=sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf \ + --hash=sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5 \ + --hash=sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828 \ + --hash=sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3 \ + --hash=sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5 \ + --hash=sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2 \ + --hash=sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b \ + --hash=sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2 \ + --hash=sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475 \ + --hash=sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3 \ + --hash=sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb \ + --hash=sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef \ + --hash=sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015 \ + --hash=sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002 \ + --hash=sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170 \ + --hash=sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84 \ + --hash=sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57 \ + --hash=sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f \ + --hash=sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27 \ + --hash=sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a +pip==24.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc \ + --hash=sha256:ea9bd1a847e8c5774a5777bb398c19e80bcd4e2aa16a4b301b718fe6f593aba2 +portalocker==2.8.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33 \ + --hash=sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e +proto-plus==1.23.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2 \ + --hash=sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c +protobuf==4.25.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4 \ + --hash=sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8 \ + --hash=sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c \ + --hash=sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d \ + --hash=sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4 \ + --hash=sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa \ + --hash=sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c \ + --hash=sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019 \ + --hash=sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9 \ + --hash=sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c \ + --hash=sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2 +psutil==6.0.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35 \ + --hash=sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0 \ + --hash=sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c \ + --hash=sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1 \ + --hash=sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 \ + --hash=sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c \ + --hash=sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd \ + --hash=sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3 \ + --hash=sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0 \ + --hash=sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2 \ + --hash=sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6 \ + --hash=sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d \ + --hash=sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c \ + --hash=sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 \ + --hash=sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132 \ + --hash=sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14 \ + --hash=sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 +pyarrow-hotfix==0.6 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:79d3e030f7ff890d408a100ac16d6f00b14d44a502d7897cd9fc3e3a534e9945 \ + --hash=sha256:dcc9ae2d220dff0083be6a9aa8e0cdee5182ad358d4931fce825c545e5c89178 +pyarrow==16.1.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:06ebccb6f8cb7357de85f60d5da50e83507954af617d7b05f48af1621d331c9a \ + --hash=sha256:0d07de3ee730647a600037bc1d7b7994067ed64d0eba797ac74b2bc77384f4c2 \ + --hash=sha256:0d27bf89dfc2576f6206e9cd6cf7a107c9c06dc13d53bbc25b0bd4556f19cf5f \ + --hash=sha256:0d32000693deff8dc5df444b032b5985a48592c0697cb6e3071a5d59888714e2 \ + --hash=sha256:15fbb22ea96d11f0b5768504a3f961edab25eaf4197c341720c4a387f6c60315 \ + --hash=sha256:17e23b9a65a70cc733d8b738baa6ad3722298fa0c81d88f63ff94bf25eaa77b9 \ + --hash=sha256:185d121b50836379fe012753cf15c4ba9638bda9645183ab36246923875f8d1b \ + --hash=sha256:18da9b76a36a954665ccca8aa6bd9f46c1145f79c0bb8f4f244f5f8e799bca55 \ + --hash=sha256:19741c4dbbbc986d38856ee7ddfdd6a00fc3b0fc2d928795b95410d38bb97d15 \ + --hash=sha256:25233642583bf658f629eb230b9bb79d9af4d9f9229890b3c878699c82f7d11e \ + --hash=sha256:2e51ca1d6ed7f2e9d5c3c83decf27b0d17bb207a7dea986e8dc3e24f80ff7d6f \ + --hash=sha256:2e73cfc4a99e796727919c5541c65bb88b973377501e39b9842ea71401ca6c1c \ + --hash=sha256:31a1851751433d89a986616015841977e0a188662fcffd1a5677453f1df2de0a \ + --hash=sha256:3b20bd67c94b3a2ea0a749d2a5712fc845a69cb5d52e78e6449bbd295611f3aa \ + --hash=sha256:4740cc41e2ba5d641071d0ab5e9ef9b5e6e8c7611351a5cb7c1d175eaf43674a \ + --hash=sha256:48be160782c0556156d91adbdd5a4a7e719f8d407cb46ae3bb4eaee09b3111bd \ + --hash=sha256:8785bb10d5d6fd5e15d718ee1d1f914fe768bf8b4d1e5e9bf253de8a26cb1628 \ + --hash=sha256:98100e0268d04e0eec47b73f20b39c45b4006f3c4233719c3848aa27a03c1aef \ + --hash=sha256:99f7549779b6e434467d2aa43ab2b7224dd9e41bdde486020bae198978c9e05e \ + --hash=sha256:9cf389d444b0f41d9fe1444b70650fea31e9d52cfcb5f818b7888b91b586efff \ + --hash=sha256:a33a64576fddfbec0a44112eaf844c20853647ca833e9a647bfae0582b2ff94b \ + --hash=sha256:a8914cd176f448e09746037b0c6b3a9d7688cef451ec5735094055116857580c \ + --hash=sha256:b04707f1979815f5e49824ce52d1dceb46e2f12909a48a6a753fe7cafbc44a0c \ + --hash=sha256:b5f5705ab977947a43ac83b52ade3b881eb6e95fcc02d76f501d549a210ba77f \ + --hash=sha256:ba8ac20693c0bb0bf4b238751d4409e62852004a8cf031c73b0e0962b03e45e3 \ + --hash=sha256:bf9251264247ecfe93e5f5a0cd43b8ae834f1e61d1abca22da55b20c788417f6 \ + --hash=sha256:d0ebea336b535b37eee9eee31761813086d33ed06de9ab6fc6aaa0bace7b250c \ + --hash=sha256:ddf5aace92d520d3d2a20031d8b0ec27b4395cab9f74e07cc95edf42a5cc0147 \ + --hash=sha256:ddfe389a08ea374972bd4065d5f25d14e36b43ebc22fc75f7b951f24378bf0b5 \ + --hash=sha256:e1369af39587b794873b8a307cc6623a3b1194e69399af0efd05bb202195a5a7 \ + --hash=sha256:e6b6d3cd35fbb93b70ade1336022cc1147b95ec6af7d36906ca7fe432eb09710 \ + --hash=sha256:f07fdffe4fd5b15f5ec15c8b64584868d063bc22b86b46c9695624ca3505b7b4 \ + --hash=sha256:f2c5fb249caa17b94e2b9278b36a05ce03d3180e6da0c4c3b3ce5b2788f30eed \ + --hash=sha256:f68f409e7b283c085f2da014f9ef81e885d90dcd733bd648cfba3ef265961848 \ + --hash=sha256:fbef391b63f708e103df99fbaa3acf9f671d77a183a07546ba2f2c297b361e83 \ + --hash=sha256:febde33305f1498f6df85e8020bca496d0e9ebf2093bab9e0f65e2b4ae2b3444 +pyasn1-modules==0.4.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6 \ + --hash=sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b +pyasn1==0.6.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c \ + --hash=sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473 +pycparser==2.22 ; os_name == "nt" and implementation_name != "pypy" and python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc +pydantic-core==2.18.4 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3 \ + --hash=sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8 \ + --hash=sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8 \ + --hash=sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30 \ + --hash=sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a \ + --hash=sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8 \ + --hash=sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d \ + --hash=sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc \ + --hash=sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2 \ + --hash=sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab \ + --hash=sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077 \ + --hash=sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e \ + --hash=sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9 \ + --hash=sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9 \ + --hash=sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef \ + --hash=sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1 \ + --hash=sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507 \ + --hash=sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528 \ + --hash=sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558 \ + --hash=sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b \ + --hash=sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154 \ + --hash=sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724 \ + --hash=sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695 \ + --hash=sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9 \ + --hash=sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851 \ + --hash=sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805 \ + --hash=sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a \ + --hash=sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5 \ + --hash=sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94 \ + --hash=sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c \ + --hash=sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d \ + --hash=sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef \ + --hash=sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26 \ + --hash=sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2 \ + --hash=sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c \ + --hash=sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0 \ + --hash=sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2 \ + --hash=sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4 \ + --hash=sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d \ + --hash=sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2 \ + --hash=sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce \ + --hash=sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34 \ + --hash=sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f \ + --hash=sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d \ + --hash=sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b \ + --hash=sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07 \ + --hash=sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312 \ + --hash=sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057 \ + --hash=sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d \ + --hash=sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af \ + --hash=sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb \ + --hash=sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd \ + --hash=sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78 \ + --hash=sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b \ + --hash=sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223 \ + --hash=sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a \ + --hash=sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4 \ + --hash=sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5 \ + --hash=sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23 \ + --hash=sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a \ + --hash=sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4 \ + --hash=sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8 \ + --hash=sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d \ + --hash=sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443 \ + --hash=sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e \ + --hash=sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f \ + --hash=sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e \ + --hash=sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d \ + --hash=sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc \ + --hash=sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443 \ + --hash=sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be \ + --hash=sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2 \ + --hash=sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee \ + --hash=sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f \ + --hash=sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae \ + --hash=sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864 \ + --hash=sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4 \ + --hash=sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951 \ + --hash=sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc +pydantic-settings==2.3.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:87fda838b64b5039b970cd47c3e8a1ee460ce136278ff672980af21516f6e6ce \ + --hash=sha256:e4ed62ad851670975ec11285141db888fd24947f9440bd4380d7d8788d4965de +pydantic==2.7.4 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52 \ + --hash=sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0 +pygments==2.18.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ + --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a +pymongo==4.7.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:03e0f9901ad66c6fb7da0d303461377524d61dab93a4e4e5af44164c5bb4db76 \ + --hash=sha256:1421d0bd2ce629405f5157bd1aaa9b83f12d53a207cf68a43334f4e4ee312b66 \ + --hash=sha256:1c90c848a5e45475731c35097f43026b88ef14a771dfd08f20b67adc160a3f79 \ + --hash=sha256:1cc1febf17646d52b7561caa762f60bdfe2cbdf3f3e70772f62eb624269f9c05 \ + --hash=sha256:23b1e9dabd61da1c7deb54d888f952f030e9e35046cebe89309b28223345b3d9 \ + --hash=sha256:26140fbb3f6a9a74bd73ed46d0b1f43d5702e87a6e453a31b24fad9c19df9358 \ + --hash=sha256:2c59c2c9e70f63a7f18a31e367898248c39c068c639b0579623776f637e8f482 \ + --hash=sha256:3564f423958fced8a8c90940fd2f543c27adbcd6c7c6ed6715d847053f6200a0 \ + --hash=sha256:35ba90477fae61c65def6e7d09e8040edfdd3b7fd47c3c258b4edded60c4d625 \ + --hash=sha256:397fed21afec4fdaecf72f9c4344b692e489756030a9c6d864393e00c7e80491 \ + --hash=sha256:3a0e81c8dba6d825272867d487f18764cfed3c736d71d7d4ff5b79642acbed42 \ + --hash=sha256:413506bd48d8c31ee100645192171e4773550d7cb940b594d5175ac29e329ea1 \ + --hash=sha256:4225100b2c5d1f7393d7c5d256ceb8b20766830eecf869f8ae232776347625a6 \ + --hash=sha256:487e2f9277f8a63ac89335ec4f1699ae0d96ebd06d239480d69ed25473a71b2c \ + --hash=sha256:4a4cc91c28e81c0ce03d3c278e399311b0af44665668a91828aec16527082676 \ + --hash=sha256:4c3cba427dac50944c050c96d958c5e643c33a457acee03bae27c8990c5b9c16 \ + --hash=sha256:4d719a643ea6da46d215a3ba51dac805a773b611c641319558d8576cbe31cef8 \ + --hash=sha256:517243b2b189c98004570dd8fc0e89b1a48363d5578b3b99212fa2098b2ea4b8 \ + --hash=sha256:5f3569ed119bf99c0f39ac9962fb5591eff02ca210fe80bb5178d7a1171c1b1e \ + --hash=sha256:6354a66b228f2cd399be7429685fb68e07f19110a3679782ecb4fdb68da03831 \ + --hash=sha256:6db3d608d541a444c84f0bfc7bad80b0b897e0f4afa580a53f9a944065d9b633 \ + --hash=sha256:6e2287f1e2cc35e73cd74a4867e398a97962c5578a3991c730ef78d276ca8e46 \ + --hash=sha256:79cc6459209e885ba097779eaa0fe7f2fa049db39ab43b1731cf8d065a4650e8 \ + --hash=sha256:7a8af8a38fa6951fff73e6ff955a6188f829b29fed7c5a1b739a306b4aa56fe8 \ + --hash=sha256:82a97d8f7f138586d9d0a0cff804a045cdbbfcfc1cd6bba542b151e284fbbec5 \ + --hash=sha256:88fc1d146feabac4385ea8ddb1323e584922922641303c8bf392fe1c36803463 \ + --hash=sha256:89872041196c008caddf905eb59d3dc2d292ae6b0282f1138418e76f3abd3ad6 \ + --hash=sha256:8d00a5d8fc1043a4f641cbb321da766699393f1b6f87c70fae8089d61c9c9c54 \ + --hash=sha256:8dfcf18a49955d50a16c92b39230bd0668ffc9c164ccdfe9d28805182b48fa72 \ + --hash=sha256:8e28feb18dc559d50ededba27f9054c79f80c4edd70a826cecfe68f3266807b3 \ + --hash=sha256:8ed1132f58c38add6b6138b771d0477a3833023c015c455d9a6e26f367f9eb5c \ + --hash=sha256:92dd247727dd83d1903e495acc743ebd757f030177df289e3ba4ef8a8c561fad \ + --hash=sha256:9377b868c38700c7557aac1bc4baae29f47f1d279cc76b60436e547fd643318c \ + --hash=sha256:94baa5fc7f7d22c3ce2ac7bd92f7e03ba7a6875f2480e3b97a400163d6eaafc9 \ + --hash=sha256:9a870824aa54453aee030bac08c77ebcf2fe8999400f0c2a065bebcbcd46b7f8 \ + --hash=sha256:9aa8735955c70892634d7e61b0ede9b1eefffd3cd09ccabee0ffcf1bdfe62254 \ + --hash=sha256:9cf2069f5d37c398186453589486ea98bb0312214c439f7d320593b61880dc05 \ + --hash=sha256:a46cffe91912570151617d866a25d07b9539433a32231ca7e7cf809b6ba1745f \ + --hash=sha256:a7a5fd893edbeb7fa982f8d44b6dd0186b6cd86c89e23f6ef95049ff72bffe46 \ + --hash=sha256:b3a8a1ef4a824f5feb793b3231526d0045eadb5eb01080e38435dfc40a26c3e5 \ + --hash=sha256:c168a2fadc8b19071d0a9a4f85fe38f3029fe22163db04b4d5c046041c0b14bd \ + --hash=sha256:c450ab2f9397e2d5caa7fddeb4feb30bf719c47c13ae02c0bbb3b71bf4099c1c \ + --hash=sha256:c6bfa29f032fd4fd7b129520f8cdb51ab71d88c2ba0567cccd05d325f963acb5 \ + --hash=sha256:cb30c8a78f5ebaca98640943447b6a0afcb146f40b415757c9047bf4a40d07b4 \ + --hash=sha256:d08165fd82c89d372e82904c3268bd8fe5de44f92a00e97bb1db1785154397d9 \ + --hash=sha256:d14e5e89a4be1f10efc3d9dcb13eb7a3b2334599cb6bb5d06c6a9281b79c8e22 \ + --hash=sha256:d2f52b38151e946011d888a8441d3d75715c663fc5b41a7ade595e924e12a90a \ + --hash=sha256:d3ed97b89de62ea927b672ad524de0d23f3a6b4a01c8d10e3d224abec973fbc3 \ + --hash=sha256:d8b1e06f361f3c66ee694cb44326e1a2e4f93bc9c3a4849ae8547889fca71154 \ + --hash=sha256:da4a6a7b4f45329bb135aa5096823637bd5f760b44d6224f98190ee367b6b5dd \ + --hash=sha256:de3b9db558930efab5eaef4db46dcad8bf61ac3ddfd5751b3e5ac6084a25e366 \ + --hash=sha256:dfd7b3d3f4261bddbb74a332d87581bc523353e62bb9da4027cc7340f6fcbebc \ + --hash=sha256:e90af2ad3a8a7c295f4d09a2fbcb9a350c76d6865f787c07fe843b79c6e821d1 \ + --hash=sha256:e9580b4537b3cc5d412070caabd1dabdf73fdce249793598792bac5782ecf2eb \ + --hash=sha256:eb383c54c0c8ba27e7712b954fcf2a0905fee82a929d277e2e94ad3a5ba3c7db \ + --hash=sha256:f0e149217ef62812d3c2401cf0e2852b0c57fd155297ecc4dcd67172c4eca402 \ + --hash=sha256:f21ecddcba2d9132d5aebd8e959de8d318c29892d0718420447baf2b9bccbb19 \ + --hash=sha256:f598be401b416319a535c386ac84f51df38663f7a9d1071922bda4d491564422 \ + --hash=sha256:f7ee974f8b9370a998919c55b1050889f43815ab588890212023fecbc0402a6d \ + --hash=sha256:f903075f8625e2d228f1b9b9a0cf1385f1c41e93c03fd7536c91780a0fb2e98f +pypdf==4.2.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:dc035581664e0ad717e3492acebc1a5fc23dba759e788e3d4a9fc9b1a32e72c1 \ + --hash=sha256:fe63f3f7d1dcda1c9374421a94c1bba6c6f8c4a62173a59b64ffd52058f846b1 +pysocks==1.7.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299 \ + --hash=sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 \ + --hash=sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0 +python-box==6.1.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:11cbe62f0dace8a6e2a10d210a5e87b99ad1a1286865568862516794c923a988 \ + --hash=sha256:1d29eafaa287857751e27fbe9a08dd856480f0037fe988b221eba4dac33e5852 \ + --hash=sha256:3638d3559f19ece7fa29f6a6550bc64696cd3b65e3d4154df07a3d06982252ff \ + --hash=sha256:3f0036f91e13958d2b37d2bc74c1197aa36ffd66755342eb64910f63d8a2990f \ + --hash=sha256:53998c3b95e31d1f31e46279ef1d27ac30b137746927260901ee61457f8468a0 \ + --hash=sha256:594b0363b187df855ff8649488b1301dddbbeea769629b7caeb584efe779b841 \ + --hash=sha256:6e7c243b356cb36e2c0f0e5ed7850969fede6aa812a7f501de7768996c7744d7 \ + --hash=sha256:7b73f26e40a7adc57b9e39f5687d026dfa8a336f48aefaf852a223b4e37392ad \ + --hash=sha256:9dbd92b67c443a97326273c9239fce04d3b6958be815d293f96ab65bc4a9dae7 \ + --hash=sha256:ab13208b053525ef154a36a4a52873b98a12b18b946edd4c939a4d5080e9a218 \ + --hash=sha256:ac44b3b85714a4575cc273b5dbd39ef739f938ef6c522d6757704a29e7797d16 \ + --hash=sha256:af6bcee7e1abe9251e9a41ca9ab677e1f679f6059321cfbae7e78a3831e0b736 \ + --hash=sha256:bdec0a5f5a17b01fc538d292602a077aa8c641fb121e1900dff0591791af80e8 \ + --hash=sha256:c14aa4e72bf30f4d573e62ff8030a86548603a100c3fb534561dbedf4a83f454 \ + --hash=sha256:d199cd289b4f4d053770eadd70217c76214aac30b92a23adfb9627fd8558d300 \ + --hash=sha256:ed6d7fe47d756dc2d9dea448702cea103716580a2efee7c859954929295fe28e \ + --hash=sha256:fa4696b5e09ccf695bf05c16bb5ca1fcc95a141a71a31eb262eee8e2ac07189a +python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 +python-dotenv==1.0.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca \ + --hash=sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a +python-iso639==2024.4.27 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:27526a84cebc4c4d53fea9d1ebbc7209c8d279bebaa343e6765a1fc8780565ab \ + --hash=sha256:97e63b5603e085c6a56a12a95740010e75d9134e0aab767e0978b53fd8824f13 +python-jose==3.3.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a \ + --hash=sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a +python-json-logger==2.0.7 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c \ + --hash=sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd +python-magic==0.4.27 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b \ + --hash=sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3 +python-slugify==8.0.4 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8 \ + --hash=sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856 +pytz==2024.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \ + --hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 +pywin32==306 ; python_version >= "3.10" and python_version < "3.12" and platform_system == "Windows" \ + --hash=sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d \ + --hash=sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65 \ + --hash=sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e \ + --hash=sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b \ + --hash=sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4 \ + --hash=sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040 \ + --hash=sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a \ + --hash=sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36 \ + --hash=sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8 \ + --hash=sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e \ + --hash=sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802 \ + --hash=sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a \ + --hash=sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407 \ + --hash=sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0 +pyyaml==6.0.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ + --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ + --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ + --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ + --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ + --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ + --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ + --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ + --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ + --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ + --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ + --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ + --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ + --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ + --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ + --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ + --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ + --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ + --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ + --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ + --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ + --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ + --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ + --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ + --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ + --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ + --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ + --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ + --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ + --hash=sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef \ + --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ + --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ + --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ + --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ + --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ + --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ + --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ + --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ + --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ + --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ + --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ + --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ + --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ + --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ + --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ + --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ + --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ + --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ + --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ + --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ + --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f +qdrant-client==1.9.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:186b9c31d95aefe8f2db84b7746402d7365bd63b305550e530e31bde2002ce79 \ + --hash=sha256:b9b7e0e5c1a51410d8bb5106a869a51e12f92ab45a99030f27aba790553bd2c8 +qwak-core==0.4.45 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:283af7dbecb044dce90ba7220b5a13ef696eabde7e1ae523c367280d64e7074f \ + --hash=sha256:611f28a5d39289982291b52d9cd2a310a74c112033c484dac424e8e39ffa6033 +qwak-inference==0.1.18 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:82d5ece0745ae07447de84276be17d1cb98562cae289c83038c244b0caab3801 \ + --hash=sha256:f32feb3c1d4eefcdd09d09cc950ca5afc7f4a5b6309e26e92a5b393218d9eb2f +qwak-sdk==0.5.74 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:1a3d177b29357b9b935a3f6a058344513e5db8d362572e6f2bf756c22c04c989 \ + --hash=sha256:50931d8165a5879fe8bd5d57dd957f88184a027cb1feb834adf66340b62a30c3 +rapidfuzz==3.9.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:05ee0696ebf0dfe8f7c17f364d70617616afc7dafe366532730ca34056065b8a \ + --hash=sha256:0c34139df09a61b1b557ab65782ada971b4a3bce7081d1b2bee45b0a52231adb \ + --hash=sha256:0d055da0e801c71dd74ba81d72d41b2fa32afa182b9fea6b4b199d2ce937450d \ + --hash=sha256:119c010e20e561249b99ca2627f769fdc8305b07193f63dbc07bca0a6c27e892 \ + --hash=sha256:143caf7247449055ecc3c1e874b69e42f403dfc049fc2f3d5f70e1daf21c1318 \ + --hash=sha256:14c9f268ade4c88cf77ab007ad0fdf63699af071ee69378de89fff7aa3cae134 \ + --hash=sha256:153f23c03d4917f6a1fc2fb56d279cc6537d1929237ff08ee7429d0e40464a18 \ + --hash=sha256:15e4158ac4b3fb58108072ec35b8a69165f651ba1c8f43559a36d518dbf9fb3f \ + --hash=sha256:17ff7f7eecdb169f9236e3b872c96dbbaf116f7787f4d490abd34b0116e3e9c8 \ + --hash=sha256:21047f55d674614eb4b0ab34e35c3dc66f36403b9fbfae645199c4a19d4ed447 \ + --hash=sha256:256e07d3465173b2a91c35715a2277b1ee3ae0b9bbab4e519df6af78570741d0 \ + --hash=sha256:282d55700a1a3d3a7980746eb2fcd48c9bbc1572ebe0840d0340d548a54d01fe \ + --hash=sha256:2bc8391749e5022cd9e514ede5316f86e332ffd3cfceeabdc0b17b7e45198a8c \ + --hash=sha256:2c1d3ef3878f871abe6826e386c3d61b5292ef5f7946fe646f4206b85836b5da \ + --hash=sha256:35b7286f177e4d8ba1e48b03612f928a3c4bdac78e5651379cec59f95d8651e6 \ + --hash=sha256:3617d1aa7716c57d120b6adc8f7c989f2d65bc2b0cbd5f9288f1fc7bf469da11 \ + --hash=sha256:378d1744828e27490a823fc6fe6ebfb98c15228d54826bf4e49e4b76eb5f5579 \ + --hash=sha256:3bb6546e7b6bed1aefbe24f68a5fb9b891cc5aef61bca6c1a7b1054b7f0359bb \ + --hash=sha256:3d8a57261ef7996d5ced7c8cba9189ada3fbeffd1815f70f635e4558d93766cb \ + --hash=sha256:3e6d27dad8c990218b8cd4a5c99cbc8834f82bb46ab965a7265d5aa69fc7ced7 \ + --hash=sha256:41a81a9f311dc83d22661f9b1a1de983b201322df0c4554042ffffd0f2040c37 \ + --hash=sha256:505d99131afd21529293a9a7b91dfc661b7e889680b95534756134dc1cc2cd86 \ + --hash=sha256:51fa1ba84653ab480a2e2044e2277bd7f0123d6693051729755addc0d015c44f \ + --hash=sha256:5276df395bd8497397197fca2b5c85f052d2e6a66ffc3eb0544dd9664d661f95 \ + --hash=sha256:53c7f27cdf899e94712972237bda48cfd427646aa6f5d939bf45d084780e4c16 \ + --hash=sha256:53e06e4b81f552da04940aa41fc556ba39dee5513d1861144300c36c33265b76 \ + --hash=sha256:5410dc848c947a603792f4f51b904a3331cf1dc60621586bfbe7a6de72da1091 \ + --hash=sha256:57e7c5bf7b61c7320cfa5dde1e60e678d954ede9bb7da8e763959b2138391401 \ + --hash=sha256:58c6a4936190c558d5626b79fc9e16497e5df7098589a7e80d8bff68148ff096 \ + --hash=sha256:5b422c0a6fe139d5447a0766268e68e6a2a8c2611519f894b1f31f0a392b9167 \ + --hash=sha256:5c7ca5b6050f18fdcacdada2dc5fb7619ff998cd9aba82aed2414eee74ebe6cd \ + --hash=sha256:5d0abbacdb06e27ff803d7ae0bd0624020096802758068ebdcab9bd49cf53115 \ + --hash=sha256:5d0cb272d43e6d3c0dedefdcd9d00007471f77b52d2787a4695e9dd319bb39d2 \ + --hash=sha256:5d6a210347d6e71234af5c76d55eeb0348b026c9bb98fe7c1cca89bac50fb734 \ + --hash=sha256:5e2b827258beefbe5d3f958243caa5a44cf46187eff0c20e0b2ab62d1550327a \ + --hash=sha256:5e33f779391caedcba2ba3089fb6e8e557feab540e9149a5c3f7fea7a3a7df37 \ + --hash=sha256:604e0502a39cf8e67fa9ad239394dddad4cdef6d7008fdb037553817d420e108 \ + --hash=sha256:6073a46f61479a89802e3f04655267caa6c14eb8ac9d81a635a13805f735ebc1 \ + --hash=sha256:6175682a829c6dea4d35ed707f1dadc16513270ef64436568d03b81ccb6bdb74 \ + --hash=sha256:65f45be77ec82da32ce5709a362e236ccf801615cc7163b136d1778cf9e31b14 \ + --hash=sha256:67201c02efc596923ad950519e0b75ceb78d524177ea557134d6567b9ac2c283 \ + --hash=sha256:754b719a4990735f66653c9e9261dcf52fd4d925597e43d6b9069afcae700d21 \ + --hash=sha256:77b5c4f3e72924d7845f0e189c304270066d0f49635cf8a3938e122c437e58de \ + --hash=sha256:790b0b244f3213581d42baa2fed8875f9ee2b2f9b91f94f100ec80d15b140ba9 \ + --hash=sha256:802ca2cc8aa6b8b34c6fdafb9e32540c1ba05fca7ad60b3bbd7ec89ed1797a87 \ + --hash=sha256:8319838fb5b7b5f088d12187d91d152b9386ce3979ed7660daa0ed1bff953791 \ + --hash=sha256:83ea7ca577d76778250421de61fb55a719e45b841deb769351fc2b1740763050 \ + --hash=sha256:858ba57c05afd720db8088a8707079e8d024afe4644001fe0dbd26ef7ca74a65 \ + --hash=sha256:8709918da8a88ad73c9d4dd0ecf24179a4f0ceba0bee21efc6ea21a8b5290349 \ + --hash=sha256:875b581afb29a7213cf9d98cb0f98df862f1020bce9d9b2e6199b60e78a41d14 \ + --hash=sha256:87bb8d84cb41446a808c4b5f746e29d8a53499381ed72f6c4e456fe0f81c80a8 \ + --hash=sha256:8add34061e5cd561c72ed4febb5c15969e7b25bda2bb5102d02afc3abc1f52d0 \ + --hash=sha256:8f917eaadf5388466a95f6a236f678a1588d231e52eda85374077101842e794e \ + --hash=sha256:930b4e6fdb4d914390141a2b99a6f77a52beacf1d06aa4e170cba3a98e24c1bc \ + --hash=sha256:93981895602cf5944d89d317ae3b1b4cc684d175a8ae2a80ce5b65615e72ddd0 \ + --hash=sha256:959a15186d18425d19811bea86a8ffbe19fd48644004d29008e636631420a9b7 \ + --hash=sha256:964c08481aec2fe574f0062e342924db2c6b321391aeb73d68853ed42420fd6d \ + --hash=sha256:a24603dd05fb4e3c09d636b881ce347e5f55f925a6b1b4115527308a323b9f8e \ + --hash=sha256:a39890013f6d5b056cc4bfdedc093e322462ece1027a57ef0c636537bdde7531 \ + --hash=sha256:a4fc7b784cf987dbddc300cef70e09a92ed1bce136f7bb723ea79d7e297fe76d \ + --hash=sha256:a56da3aff97cb56fe85d9ca957d1f55dbac7c27da927a86a2a86d8a7e17f80aa \ + --hash=sha256:a93250bd8fae996350c251e1752f2c03335bb8a0a5b0c7e910a593849121a435 \ + --hash=sha256:a96c5225e840f1587f1bac8fa6f67562b38e095341576e82b728a82021f26d62 \ + --hash=sha256:aca21c0a34adee582775da997a600283e012a608a107398d80a42f9a57ad323d \ + --hash=sha256:acbe4b6f1ccd5b90c29d428e849aa4242e51bb6cab0448d5f3c022eb9a25f7b1 \ + --hash=sha256:ad04a3f5384b82933213bba2459f6424decc2823df40098920856bdee5fd6e88 \ + --hash=sha256:afe7c72d3f917b066257f7ff48562e5d462d865a25fbcabf40fca303a9fa8d35 \ + --hash=sha256:b300708c917ce52f6075bdc6e05b07c51a085733650f14b732c087dc26e0aaad \ + --hash=sha256:b398ea66e8ed50451bce5997c430197d5e4b06ac4aa74602717f792d8d8d06e2 \ + --hash=sha256:b3bd0d9632088c63a241f217742b1cf86e2e8ae573e01354775bd5016d12138c \ + --hash=sha256:b5bc0fdbf419493163c5c9cb147c5fbe95b8e25844a74a8807dcb1a125e630cf \ + --hash=sha256:b770f85eab24034e6ef7df04b2bfd9a45048e24f8a808e903441aa5abde8ecdd \ + --hash=sha256:b777cd910ceecd738adc58593d6ed42e73f60ad04ecdb4a841ae410b51c92e0e \ + --hash=sha256:b80eb7cbe62348c61d3e67e17057cddfd6defab168863028146e07d5a8b24a89 \ + --hash=sha256:b8ab0fa653d9225195a8ff924f992f4249c1e6fa0aea563f685e71b81b9fcccf \ + --hash=sha256:bc1991b4cde6c9d3c0bbcb83d5581dc7621bec8c666c095c65b4277233265a82 \ + --hash=sha256:bdb8c5b8e29238ec80727c2ba3b301efd45aa30c6a7001123a6647b8e6f77ea4 \ + --hash=sha256:c52970f7784518d7c82b07a62a26e345d2de8c2bd8ed4774e13342e4b3ff4200 \ + --hash=sha256:c6e65a301fcd19fbfbee3a514cc0014ff3f3b254b9fd65886e8a9d6957fb7bca \ + --hash=sha256:c8444e921bfc3757c475c4f4d7416a7aa69b2d992d5114fe55af21411187ab0d \ + --hash=sha256:cbe93ba1725a8d47d2b9dca6c1f435174859427fbc054d83de52aea5adc65729 \ + --hash=sha256:cde6b9d9ba5007077ee321ec722fa714ebc0cbd9a32ccf0f4dd3cc3f20952d71 \ + --hash=sha256:d36447d21b05f90282a6f98c5a33771805f9222e5d0441d03eb8824e33e5bbb4 \ + --hash=sha256:d861bf326ee7dabc35c532a40384541578cd1ec1e1b7db9f9ecbba56eb76ca22 \ + --hash=sha256:dc1037507810833646481f5729901a154523f98cbebb1157ba3a821012e16402 \ + --hash=sha256:dd789100fc852cffac1449f82af0da139d36d84fd9faa4f79fc4140a88778343 \ + --hash=sha256:de077c468c225d4c18f7188c47d955a16d65f21aab121cbdd98e3e2011002c37 \ + --hash=sha256:e53ed2e9b32674ce96eed80b3b572db9fd87aae6742941fb8e4705e541d861ce \ + --hash=sha256:e6e4b9380ed4758d0cb578b0d1970c3f32dd9e87119378729a5340cb3169f879 \ + --hash=sha256:efe6e200a75a792d37b960457904c4fce7c928a96ae9e5d21d2bd382fe39066e \ + --hash=sha256:f50fed4a9b0c9825ff37cf0bccafd51ff5792090618f7846a7650f21f85579c9 \ + --hash=sha256:f57e8305c281e8c8bc720515540e0580355100c0a7a541105c6cafc5de71daae \ + --hash=sha256:fd84b7f652a5610733400307dc732f57c4a907080bef9520412e6d9b55bc9adc +referencing==0.35.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c \ + --hash=sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de +regex==2024.5.15 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649 \ + --hash=sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35 \ + --hash=sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb \ + --hash=sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68 \ + --hash=sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5 \ + --hash=sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133 \ + --hash=sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0 \ + --hash=sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d \ + --hash=sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da \ + --hash=sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f \ + --hash=sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d \ + --hash=sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53 \ + --hash=sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa \ + --hash=sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a \ + --hash=sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890 \ + --hash=sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67 \ + --hash=sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c \ + --hash=sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2 \ + --hash=sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced \ + --hash=sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741 \ + --hash=sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f \ + --hash=sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa \ + --hash=sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf \ + --hash=sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4 \ + --hash=sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5 \ + --hash=sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2 \ + --hash=sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384 \ + --hash=sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7 \ + --hash=sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014 \ + --hash=sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704 \ + --hash=sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5 \ + --hash=sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2 \ + --hash=sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49 \ + --hash=sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1 \ + --hash=sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694 \ + --hash=sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629 \ + --hash=sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6 \ + --hash=sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435 \ + --hash=sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c \ + --hash=sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835 \ + --hash=sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e \ + --hash=sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201 \ + --hash=sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62 \ + --hash=sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5 \ + --hash=sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16 \ + --hash=sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f \ + --hash=sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1 \ + --hash=sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f \ + --hash=sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f \ + --hash=sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145 \ + --hash=sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3 \ + --hash=sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed \ + --hash=sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143 \ + --hash=sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca \ + --hash=sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9 \ + --hash=sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa \ + --hash=sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850 \ + --hash=sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80 \ + --hash=sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe \ + --hash=sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656 \ + --hash=sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388 \ + --hash=sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1 \ + --hash=sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294 \ + --hash=sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3 \ + --hash=sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d \ + --hash=sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b \ + --hash=sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40 \ + --hash=sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600 \ + --hash=sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c \ + --hash=sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569 \ + --hash=sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456 \ + --hash=sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9 \ + --hash=sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb \ + --hash=sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e \ + --hash=sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f \ + --hash=sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d \ + --hash=sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a \ + --hash=sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a \ + --hash=sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796 +requests-toolbelt==1.0.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \ + --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 +requests==2.32.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 +requests[socks]==2.32.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 +retrying==1.3.4 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:345da8c5765bd982b1d1915deb9102fd3d1f7ad16bd84a9700b85f64d24e8f3e \ + --hash=sha256:8cc4d43cb8e1125e0ff3344e9de678fefd85db3b750b81b2240dc0183af37b35 +rich==13.7.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222 \ + --hash=sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432 +rpds-py==0.18.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee \ + --hash=sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc \ + --hash=sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc \ + --hash=sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944 \ + --hash=sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20 \ + --hash=sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7 \ + --hash=sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4 \ + --hash=sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6 \ + --hash=sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6 \ + --hash=sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93 \ + --hash=sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633 \ + --hash=sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0 \ + --hash=sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360 \ + --hash=sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8 \ + --hash=sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139 \ + --hash=sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7 \ + --hash=sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a \ + --hash=sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9 \ + --hash=sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26 \ + --hash=sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724 \ + --hash=sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72 \ + --hash=sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b \ + --hash=sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09 \ + --hash=sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100 \ + --hash=sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3 \ + --hash=sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261 \ + --hash=sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3 \ + --hash=sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9 \ + --hash=sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b \ + --hash=sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3 \ + --hash=sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de \ + --hash=sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d \ + --hash=sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e \ + --hash=sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8 \ + --hash=sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff \ + --hash=sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5 \ + --hash=sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c \ + --hash=sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e \ + --hash=sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e \ + --hash=sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4 \ + --hash=sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8 \ + --hash=sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922 \ + --hash=sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338 \ + --hash=sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d \ + --hash=sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8 \ + --hash=sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2 \ + --hash=sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72 \ + --hash=sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80 \ + --hash=sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644 \ + --hash=sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae \ + --hash=sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163 \ + --hash=sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104 \ + --hash=sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d \ + --hash=sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60 \ + --hash=sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a \ + --hash=sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d \ + --hash=sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07 \ + --hash=sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49 \ + --hash=sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10 \ + --hash=sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f \ + --hash=sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2 \ + --hash=sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8 \ + --hash=sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7 \ + --hash=sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88 \ + --hash=sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65 \ + --hash=sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0 \ + --hash=sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909 \ + --hash=sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8 \ + --hash=sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c \ + --hash=sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184 \ + --hash=sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397 \ + --hash=sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a \ + --hash=sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346 \ + --hash=sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590 \ + --hash=sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333 \ + --hash=sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb \ + --hash=sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74 \ + --hash=sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e \ + --hash=sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d \ + --hash=sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa \ + --hash=sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f \ + --hash=sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53 \ + --hash=sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1 \ + --hash=sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac \ + --hash=sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0 \ + --hash=sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd \ + --hash=sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611 \ + --hash=sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f \ + --hash=sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c \ + --hash=sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5 \ + --hash=sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab \ + --hash=sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc \ + --hash=sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43 \ + --hash=sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da \ + --hash=sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac \ + --hash=sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843 \ + --hash=sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e \ + --hash=sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89 \ + --hash=sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64 +rsa==4.9 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ + --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 +ruff==0.4.9 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:06b60f91bfa5514bb689b500a25ba48e897d18fea14dce14b48a0c40d1635893 \ + --hash=sha256:0e8e7b95673f22e0efd3571fb5b0cf71a5eaaa3cc8a776584f3b2cc878e46bff \ + --hash=sha256:2d45ddc6d82e1190ea737341326ecbc9a61447ba331b0a8962869fcada758505 \ + --hash=sha256:4555056049d46d8a381f746680db1c46e67ac3b00d714606304077682832998e \ + --hash=sha256:5d5460f789ccf4efd43f265a58538a2c24dbce15dbf560676e430375f20a8198 \ + --hash=sha256:673bddb893f21ab47a8334c8e0ea7fd6598ecc8e698da75bcd12a7b9d0a3206e \ + --hash=sha256:732dd550bfa5d85af8c3c6cbc47ba5b67c6aed8a89e2f011b908fc88f87649db \ + --hash=sha256:784d3ec9bd6493c3b720a0b76f741e6c2d7d44f6b2be87f5eef1ae8cc1d54c84 \ + --hash=sha256:78de3fdb95c4af084087628132336772b1c5044f6e710739d440fc0bccf4d321 \ + --hash=sha256:8064590fd1a50dcf4909c268b0e7c2498253273309ad3d97e4a752bb9df4f521 \ + --hash=sha256:88bffe9c6a454bf8529f9ab9091c99490578a593cc9f9822b7fc065ee0712a06 \ + --hash=sha256:8c1aff58c31948cc66d0b22951aa19edb5af0a3af40c936340cd32a8b1ab7438 \ + --hash=sha256:98ec2775fd2d856dc405635e5ee4ff177920f2141b8e2d9eb5bd6efd50e80317 \ + --hash=sha256:b262ed08d036ebe162123170b35703aaf9daffecb698cd367a8d585157732991 \ + --hash=sha256:e0a22c4157e53d006530c902107c7f550b9233e9706313ab57b892d7197d8e52 \ + --hash=sha256:e91175fbe48f8a2174c9aad70438fe9cb0a5732c4159b2a10a3565fea2d94cde \ + --hash=sha256:f1cb0828ac9533ba0135d148d214e284711ede33640465e706772645483427e3 +safetensors==0.4.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:018b691383026a2436a22b648873ed11444a364324e7088b99cd2503dd828400 \ + --hash=sha256:01e4b22e3284cd866edeabe4f4d896229495da457229408d2e1e4810c5187121 \ + --hash=sha256:01feb3089e5932d7e662eda77c3ecc389f97c0883c4a12b5cfdc32b589a811c3 \ + --hash=sha256:02318f01e332cc23ffb4f6716e05a492c5f18b1d13e343c49265149396284a44 \ + --hash=sha256:02ef3a24face643456020536591fbd3c717c5abaa2737ec428ccbbc86dffa7a4 \ + --hash=sha256:03a4447c784917c9bf01d8f2ac5080bc15c41692202cd5f406afba16629e84d6 \ + --hash=sha256:084fc436e317f83f7071fc6a62ca1c513b2103db325cd09952914b50f51cf78f \ + --hash=sha256:0bf4f9d6323d9f86eef5567eabd88f070691cf031d4c0df27a40d3b4aaee755b \ + --hash=sha256:0d52c958dc210265157573f81d34adf54e255bc2b59ded6218500c9b15a750eb \ + --hash=sha256:0d5ffc6a80f715c30af253e0e288ad1cd97a3d0086c9c87995e5093ebc075e50 \ + --hash=sha256:0d9cd8e1560dfc514b6d7859247dc6a86ad2f83151a62c577428d5102d872721 \ + --hash=sha256:0dd37306546b58d3043eb044c8103a02792cc024b51d1dd16bd3dd1f334cb3ed \ + --hash=sha256:1139eb436fd201c133d03c81209d39ac57e129f5e74e34bb9ab60f8d9b726270 \ + --hash=sha256:19bbdf95de2cf64f25cd614c5236c8b06eb2cfa47cbf64311f4b5d80224623a3 \ + --hash=sha256:1ab6527a20586d94291c96e00a668fa03f86189b8a9defa2cdd34a1a01acc7d5 \ + --hash=sha256:1b89381517891a7bb7d1405d828b2bf5d75528299f8231e9346b8eba092227f9 \ + --hash=sha256:1f598b713cc1a4eb31d3b3203557ac308acf21c8f41104cdd74bf640c6e538e3 \ + --hash=sha256:22d21760dc6ebae42e9c058d75aa9907d9f35e38f896e3c69ba0e7b213033856 \ + --hash=sha256:22f3b5d65e440cec0de8edaa672efa888030802e11c09b3d6203bff60ebff05a \ + --hash=sha256:2a0deb16a1d3ea90c244ceb42d2c6c276059616be21a19ac7101aa97da448faf \ + --hash=sha256:2a1f4430cc0c9d6afa01214a4b3919d0a029637df8e09675ceef1ca3f0dfa0df \ + --hash=sha256:2d603846a8585b9432a0fd415db1d4c57c0f860eb4aea21f92559ff9902bae4d \ + --hash=sha256:2f85fc50c4e07a21e95c24e07460fe6f7e2859d0ce88092838352b798ce711c2 \ + --hash=sha256:309b10dbcab63269ecbf0e2ca10ce59223bb756ca5d431ce9c9eeabd446569da \ + --hash=sha256:3615a96dd2dcc30eb66d82bc76cda2565f4f7bfa89fcb0e31ba3cea8a1a9ecbb \ + --hash=sha256:38e2a8666178224a51cca61d3cb4c88704f696eac8f72a49a598a93bbd8a4af9 \ + --hash=sha256:393e6e391467d1b2b829c77e47d726f3b9b93630e6a045b1d1fca67dc78bf632 \ + --hash=sha256:3f9cdca09052f585e62328c1c2923c70f46814715c795be65f0b93f57ec98a02 \ + --hash=sha256:41a727a7f5e6ad9f1db6951adee21bbdadc632363d79dc434876369a17de6ad6 \ + --hash=sha256:420a98f593ff9930f5822560d14c395ccbc57342ddff3b463bc0b3d6b1951550 \ + --hash=sha256:446e9fe52c051aeab12aac63d1017e0f68a02a92a027b901c4f8e931b24e5397 \ + --hash=sha256:455d538aa1aae4a8b279344a08136d3f16334247907b18a5c3c7fa88ef0d3c46 \ + --hash=sha256:4f9bac020faba7f5dc481e881b14b6425265feabb5bfc552551d21189c0eddc3 \ + --hash=sha256:53c4879b9c6bd7cd25d114ee0ef95420e2812e676314300624594940a8d6a91f \ + --hash=sha256:5757e4688f20df083e233b47de43845d1adb7e17b6cf7da5f8444416fc53828d \ + --hash=sha256:585c9ae13a205807b63bef8a37994f30c917ff800ab8a1ca9c9b5d73024f97ee \ + --hash=sha256:5d07cbca5b99babb692d76d8151bec46f461f8ad8daafbfd96b2fca40cadae65 \ + --hash=sha256:5fc6775529fb9f0ce2266edd3e5d3f10aab068e49f765e11f6f2a63b5367021d \ + --hash=sha256:622afd28968ef3e9786562d352659a37de4481a4070f4ebac883f98c5836563e \ + --hash=sha256:6f9568f380f513a60139971169c4a358b8731509cc19112369902eddb33faa4d \ + --hash=sha256:70a5319ef409e7f88686a46607cbc3c428271069d8b770076feaf913664a07ac \ + --hash=sha256:74707624b81f1b7f2b93f5619d4a9f00934d5948005a03f2c1845ffbfff42212 \ + --hash=sha256:7c4fa560ebd4522adddb71dcd25d09bf211b5634003f015a4b815b7647d62ebe \ + --hash=sha256:7de32d0d34b6623bb56ca278f90db081f85fb9c5d327e3c18fd23ac64f465768 \ + --hash=sha256:840b7ac0eff5633e1d053cc9db12fdf56b566e9403b4950b2dc85393d9b88d67 \ + --hash=sha256:840caf38d86aa7014fe37ade5d0d84e23dcfbc798b8078015831996ecbc206a3 \ + --hash=sha256:8651c7299cbd8b4161a36cd6a322fa07d39cd23535b144d02f1c1972d0c62f3c \ + --hash=sha256:868ad1b6fc41209ab6bd12f63923e8baeb1a086814cb2e81a65ed3d497e0cf8f \ + --hash=sha256:88887f69f7a00cf02b954cdc3034ffb383b2303bc0ab481d4716e2da51ddc10e \ + --hash=sha256:89f9f17b0dacb913ed87d57afbc8aad85ea42c1085bd5de2f20d83d13e9fc4b2 \ + --hash=sha256:8c496c5401c1b9c46d41a7688e8ff5b0310a3b9bae31ce0f0ae870e1ea2b8caf \ + --hash=sha256:8cf18888606dad030455d18f6c381720e57fc6a4170ee1966adb7ebc98d4d6a3 \ + --hash=sha256:8d22c1a10dff3f64d0d68abb8298a3fd88ccff79f408a3e15b3e7f637ef5c980 \ + --hash=sha256:90964917f5b0fa0fa07e9a051fbef100250c04d150b7026ccbf87a34a54012e0 \ + --hash=sha256:9bfb92f82574d9e58401d79c70c716985dc049b635fef6eecbb024c79b2c46ad \ + --hash=sha256:9c6ad011c1b4e3acff058d6b090f1da8e55a332fbf84695cf3100c649cc452d1 \ + --hash=sha256:a11c374eb63a9c16c5ed146457241182f310902bd2a9c18255781bb832b6748b \ + --hash=sha256:a7cef55929dcbef24af3eb40bedec35d82c3c2fa46338bb13ecf3c5720af8a61 \ + --hash=sha256:a844cdb5d7cbc22f5f16c7e2a0271170750763c4db08381b7f696dbd2c78a361 \ + --hash=sha256:ae7613a119a71a497d012ccc83775c308b9c1dab454806291427f84397d852fd \ + --hash=sha256:b1648568667f820b8c48317c7006221dc40aced1869908c187f493838a1362bc \ + --hash=sha256:b1e31be7945f66be23f4ec1682bb47faa3df34cb89fc68527de6554d3c4258a4 \ + --hash=sha256:b277482120df46e27a58082df06a15aebda4481e30a1c21eefd0921ae7e03f65 \ + --hash=sha256:b7ffba80aa49bd09195145a7fd233a7781173b422eeb995096f2b30591639517 \ + --hash=sha256:b852e47eb08475c2c1bd8131207b405793bfc20d6f45aff893d3baaad449ed14 \ + --hash=sha256:bb4f8c5d0358a31e9a08daeebb68f5e161cdd4018855426d3f0c23bb51087055 \ + --hash=sha256:bbae3b4b9d997971431c346edbfe6e41e98424a097860ee872721e176040a893 \ + --hash=sha256:befdf0167ad626f22f6aac6163477fcefa342224a22f11fdd05abb3995c1783c \ + --hash=sha256:c0acbe31340ab150423347e5b9cc595867d814244ac14218932a5cf1dd38eb39 \ + --hash=sha256:c41e1893d1206aa7054029681778d9a58b3529d4c807002c156d58426c225173 \ + --hash=sha256:c59d51f182c729f47e841510b70b967b0752039f79f1de23bcdd86462a9b09ee \ + --hash=sha256:cd6fff9e56df398abc5866b19a32124815b656613c1c5ec0f9350906fd798aac \ + --hash=sha256:cdd0a3b5da66e7f377474599814dbf5cbf135ff059cc73694de129b58a5e8a2c \ + --hash=sha256:cf476bca34e1340ee3294ef13e2c625833f83d096cfdf69a5342475602004f95 \ + --hash=sha256:d0dd4a1db09db2dba0f94d15addc7e7cd3a7b0d393aa4c7518c39ae7374623c3 \ + --hash=sha256:d1456f814655b224d4bf6e7915c51ce74e389b413be791203092b7ff78c936dd \ + --hash=sha256:d14d30c25897b2bf19b6fb5ff7e26cc40006ad53fd4a88244fdf26517d852dd7 \ + --hash=sha256:d244bcafeb1bc06d47cfee71727e775bca88a8efda77a13e7306aae3813fa7e4 \ + --hash=sha256:d8815b5e1dac85fc534a97fd339e12404db557878c090f90442247e87c8aeaea \ + --hash=sha256:d88b33980222085dd6001ae2cad87c6068e0991d4f5ccf44975d216db3b57376 \ + --hash=sha256:d8c5093206ef4b198600ae484230402af6713dab1bd5b8e231905d754022bec7 \ + --hash=sha256:d9c289f140a9ae4853fc2236a2ffc9a9f2d5eae0cb673167e0f1b8c18c0961ac \ + --hash=sha256:dcf5705cab159ce0130cd56057f5f3425023c407e170bca60b4868048bae64fd \ + --hash=sha256:e011cc162503c19f4b1fd63dfcddf73739c7a243a17dac09b78e57a00983ab35 \ + --hash=sha256:e066e8861eef6387b7c772344d1fe1f9a72800e04ee9a54239d460c400c72aab \ + --hash=sha256:e0b2104df1579d6ba9052c0ae0e3137c9698b2d85b0645507e6fd1813b70931a \ + --hash=sha256:e375d975159ac534c7161269de24ddcd490df2157b55c1a6eeace6cbb56903f0 \ + --hash=sha256:e4119532cd10dba04b423e0f86aecb96cfa5a602238c0aa012f70c3a40c44b50 \ + --hash=sha256:e7dbbde64b6c534548696808a0e01276d28ea5773bc9a2dfb97a88cd3dffe3df \ + --hash=sha256:e9afd5358719f1b2cf425fad638fc3c887997d6782da317096877e5b15b2ce93 \ + --hash=sha256:ec4b52ce9a396260eb9731eb6aea41a7320de22ed73a1042c2230af0212758ce \ + --hash=sha256:edb5698a7bc282089f64c96c477846950358a46ede85a1c040e0230344fdde10 \ + --hash=sha256:ee463219d9ec6c2be1d331ab13a8e0cd50d2f32240a81d498266d77d07b7e71e \ + --hash=sha256:efcc860be094b8d19ac61b452ec635c7acb9afa77beb218b1d7784c6d41fe8ad \ + --hash=sha256:f5e6883af9a68c0028f70a4c19d5a6ab6238a379be36ad300a22318316c00cb0 \ + --hash=sha256:f9650713b2cfa9537a2baf7dd9fee458b24a0aaaa6cafcea8bdd5fb2b8efdc34 \ + --hash=sha256:faefeb3b81bdfb4e5a55b9bbdf3d8d8753f65506e1d67d03f5c851a6c87150e9 \ + --hash=sha256:fb9c65bd82f9ef3ce4970dc19ee86be5f6f93d032159acf35e663c6bea02b237 \ + --hash=sha256:fe746d03ed8d193674a26105e4f0fe6c726f5bb602ffc695b409eaf02f04763d \ + --hash=sha256:fef5d70683643618244a4f5221053567ca3e77c2531e42ad48ae05fae909f542 +scikit-learn==1.5.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:057b991ac64b3e75c9c04b5f9395eaf19a6179244c089afdebaad98264bff37c \ + --hash=sha256:118a8d229a41158c9f90093e46b3737120a165181a1b58c03461447aa4657415 \ + --hash=sha256:12e40ac48555e6b551f0a0a5743cc94cc5a765c9513fe708e01f0aa001da2801 \ + --hash=sha256:174beb56e3e881c90424e21f576fa69c4ffcf5174632a79ab4461c4c960315ac \ + --hash=sha256:1b94d6440603752b27842eda97f6395f570941857456c606eb1d638efdb38184 \ + --hash=sha256:1f77547165c00625551e5c250cefa3f03f2fc92c5e18668abd90bfc4be2e0bff \ + --hash=sha256:261fe334ca48f09ed64b8fae13f9b46cc43ac5f580c4a605cbb0a517456c8f71 \ + --hash=sha256:2a65af2d8a6cce4e163a7951a4cfbfa7fceb2d5c013a4b593686c7f16445cf9d \ + --hash=sha256:2c75ea812cd83b1385bbfa94ae971f0d80adb338a9523f6bbcb5e0b0381151d4 \ + --hash=sha256:40fb7d4a9a2db07e6e0cae4dc7bdbb8fada17043bac24104d8165e10e4cff1a2 \ + --hash=sha256:460806030c666addee1f074788b3978329a5bfdc9b7d63e7aad3f6d45c67a210 \ + --hash=sha256:47132440050b1c5beb95f8ba0b2402bbd9057ce96ec0ba86f2f445dd4f34df67 \ + --hash=sha256:4c0c56c3005f2ec1db3787aeaabefa96256580678cec783986836fc64f8ff622 \ + --hash=sha256:789e3db01c750ed6d496fa2db7d50637857b451e57bcae863bff707c1247bef7 \ + --hash=sha256:855fc5fa8ed9e4f08291203af3d3e5fbdc4737bd617a371559aaa2088166046e \ + --hash=sha256:a03b09f9f7f09ffe8c5efffe2e9de1196c696d811be6798ad5eddf323c6f4d40 \ + --hash=sha256:a3a10e1d9e834e84d05e468ec501a356226338778769317ee0b84043c0d8fb06 \ + --hash=sha256:a90c5da84829a0b9b4bf00daf62754b2be741e66b5946911f5bdfaa869fcedd6 \ + --hash=sha256:d82c2e573f0f2f2f0be897e7a31fcf4e73869247738ab8c3ce7245549af58ab8 \ + --hash=sha256:df8ccabbf583315f13160a4bb06037bde99ea7d8211a69787a6b7c5d4ebb6fc3 \ + --hash=sha256:f405c4dae288f5f6553b10c4ac9ea7754d5180ec11e296464adb5d6ac68b6ef5 +scipy==1.13.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d \ + --hash=sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c \ + --hash=sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca \ + --hash=sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9 \ + --hash=sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54 \ + --hash=sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16 \ + --hash=sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2 \ + --hash=sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5 \ + --hash=sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59 \ + --hash=sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326 \ + --hash=sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b \ + --hash=sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1 \ + --hash=sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d \ + --hash=sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24 \ + --hash=sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627 \ + --hash=sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c \ + --hash=sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa \ + --hash=sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949 \ + --hash=sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989 \ + --hash=sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004 \ + --hash=sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f \ + --hash=sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884 \ + --hash=sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299 \ + --hash=sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94 \ + --hash=sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f +selenium==4.21.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:4770ffe5a5264e609de7dc914be6b89987512040d5a8efb2abb181330d097993 \ + --hash=sha256:650dbfa5159895ff00ad16e5ddb6ceecb86b90c7ed2012b3f041f64e6e4904fe +semantic-version==2.10.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c \ + --hash=sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177 +sentence-transformers==2.7.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:2f7df99d1c021dded471ed2d079e9d1e4fc8e30ecb06f957be060511b36f24ea \ + --hash=sha256:6a7276b05a95931581bbfa4ba49d780b2cf6904fa4a171ec7fd66c343f761c98 +sentry-sdk==2.6.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:422b91cb49378b97e7e8d0e8d5a1069df23689d45262b86f54988a7db264e874 +setuptools==70.1.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:01a1e793faa5bd89abc851fa15d0a0db26f160890c7102cd8dce643e886b47f5 \ + --hash=sha256:d9b8b771455a97c8a9f3ab3448ebe0b29b5e105f1228bba41028be116985a267 +simplejson==3.19.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0405984f3ec1d3f8777c4adc33eac7ab7a3e629f3b1c05fdded63acc7cf01137 \ + --hash=sha256:0436a70d8eb42bea4fe1a1c32d371d9bb3b62c637969cb33970ad624d5a3336a \ + --hash=sha256:061e81ea2d62671fa9dea2c2bfbc1eec2617ae7651e366c7b4a2baf0a8c72cae \ + --hash=sha256:064300a4ea17d1cd9ea1706aa0590dcb3be81112aac30233823ee494f02cb78a \ + --hash=sha256:08889f2f597ae965284d7b52a5c3928653a9406d88c93e3161180f0abc2433ba \ + --hash=sha256:0a48679310e1dd5c9f03481799311a65d343748fe86850b7fb41df4e2c00c087 \ + --hash=sha256:0b0a3eb6dd39cce23801a50c01a0976971498da49bc8a0590ce311492b82c44b \ + --hash=sha256:0d2d5119b1d7a1ed286b8af37357116072fc96700bce3bec5bb81b2e7057ab41 \ + --hash=sha256:0d551dc931638e2102b8549836a1632e6e7cf620af3d093a7456aa642bff601d \ + --hash=sha256:1018bd0d70ce85f165185d2227c71e3b1e446186f9fa9f971b69eee223e1e3cd \ + --hash=sha256:11c39fbc4280d7420684494373b7c5904fa72a2b48ef543a56c2d412999c9e5d \ + --hash=sha256:11cc3afd8160d44582543838b7e4f9aa5e97865322844b75d51bf4e0e413bb3e \ + --hash=sha256:1537b3dd62d8aae644f3518c407aa8469e3fd0f179cdf86c5992792713ed717a \ + --hash=sha256:16ca9c90da4b1f50f089e14485db8c20cbfff2d55424062791a7392b5a9b3ff9 \ + --hash=sha256:176a1b524a3bd3314ed47029a86d02d5a95cc0bee15bd3063a1e1ec62b947de6 \ + --hash=sha256:18955c1da6fc39d957adfa346f75226246b6569e096ac9e40f67d102278c3bcb \ + --hash=sha256:1bb5b50dc6dd671eb46a605a3e2eb98deb4a9af787a08fcdddabe5d824bb9664 \ + --hash=sha256:1c768e7584c45094dca4b334af361e43b0aaa4844c04945ac7d43379eeda9bc2 \ + --hash=sha256:1dd4f692304854352c3e396e9b5f0a9c9e666868dd0bdc784e2ac4c93092d87b \ + --hash=sha256:25785d038281cd106c0d91a68b9930049b6464288cea59ba95b35ee37c2d23a5 \ + --hash=sha256:287e39ba24e141b046812c880f4619d0ca9e617235d74abc27267194fc0c7835 \ + --hash=sha256:2c1467d939932901a97ba4f979e8f2642415fcf02ea12f53a4e3206c9c03bc17 \ + --hash=sha256:2c433a412e96afb9a3ce36fa96c8e61a757af53e9c9192c97392f72871e18e69 \ + --hash=sha256:2d022b14d7758bfb98405672953fe5c202ea8a9ccf9f6713c5bd0718eba286fd \ + --hash=sha256:2f98d918f7f3aaf4b91f2b08c0c92b1774aea113334f7cde4fe40e777114dbe6 \ + --hash=sha256:2fc697be37585eded0c8581c4788fcfac0e3f84ca635b73a5bf360e28c8ea1a2 \ + --hash=sha256:3194cd0d2c959062b94094c0a9f8780ffd38417a5322450a0db0ca1a23e7fbd2 \ + --hash=sha256:332c848f02d71a649272b3f1feccacb7e4f7e6de4a2e6dc70a32645326f3d428 \ + --hash=sha256:346820ae96aa90c7d52653539a57766f10f33dd4be609206c001432b59ddf89f \ + --hash=sha256:3471e95110dcaf901db16063b2e40fb394f8a9e99b3fe9ee3acc6f6ef72183a2 \ + --hash=sha256:3848427b65e31bea2c11f521b6fc7a3145d6e501a1038529da2391aff5970f2f \ + --hash=sha256:39b6d79f5cbfa3eb63a869639cfacf7c41d753c64f7801efc72692c1b2637ac7 \ + --hash=sha256:3e74355cb47e0cd399ead3477e29e2f50e1540952c22fb3504dda0184fc9819f \ + --hash=sha256:3f39bb1f6e620f3e158c8b2eaf1b3e3e54408baca96a02fe891794705e788637 \ + --hash=sha256:40847f617287a38623507d08cbcb75d51cf9d4f9551dd6321df40215128325a3 \ + --hash=sha256:4280e460e51f86ad76dc456acdbfa9513bdf329556ffc8c49e0200878ca57816 \ + --hash=sha256:445a96543948c011a3a47c8e0f9d61e9785df2544ea5be5ab3bc2be4bd8a2565 \ + --hash=sha256:4969d974d9db826a2c07671273e6b27bc48e940738d768fa8f33b577f0978378 \ + --hash=sha256:49aaf4546f6023c44d7e7136be84a03a4237f0b2b5fb2b17c3e3770a758fc1a0 \ + --hash=sha256:49e0e3faf3070abdf71a5c80a97c1afc059b4f45a5aa62de0c2ca0444b51669b \ + --hash=sha256:49f9da0d6cd17b600a178439d7d2d57c5ef01f816b1e0e875e8e8b3b42db2693 \ + --hash=sha256:4a8c3cc4f9dfc33220246760358c8265dad6e1104f25f0077bbca692d616d358 \ + --hash=sha256:4d36081c0b1c12ea0ed62c202046dca11438bee48dd5240b7c8de8da62c620e9 \ + --hash=sha256:4edcd0bf70087b244ba77038db23cd98a1ace2f91b4a3ecef22036314d77ac23 \ + --hash=sha256:554313db34d63eac3b3f42986aa9efddd1a481169c12b7be1e7512edebff8eaf \ + --hash=sha256:5675e9d8eeef0aa06093c1ff898413ade042d73dc920a03e8cea2fb68f62445a \ + --hash=sha256:60848ab779195b72382841fc3fa4f71698a98d9589b0a081a9399904487b5832 \ + --hash=sha256:66e5dc13bfb17cd6ee764fc96ccafd6e405daa846a42baab81f4c60e15650414 \ + --hash=sha256:6779105d2fcb7fcf794a6a2a233787f6bbd4731227333a072d8513b252ed374f \ + --hash=sha256:6ad331349b0b9ca6da86064a3599c425c7a21cd41616e175ddba0866da32df48 \ + --hash=sha256:6f0a0b41dd05eefab547576bed0cf066595f3b20b083956b1405a6f17d1be6ad \ + --hash=sha256:73a8a4653f2e809049999d63530180d7b5a344b23a793502413ad1ecea9a0290 \ + --hash=sha256:778331444917108fa8441f59af45886270d33ce8a23bfc4f9b192c0b2ecef1b3 \ + --hash=sha256:7cb98be113911cb0ad09e5523d0e2a926c09a465c9abb0784c9269efe4f95917 \ + --hash=sha256:7d74beca677623481810c7052926365d5f07393c72cbf62d6cce29991b676402 \ + --hash=sha256:7f2398361508c560d0bf1773af19e9fe644e218f2a814a02210ac2c97ad70db0 \ + --hash=sha256:8434dcdd347459f9fd9c526117c01fe7ca7b016b6008dddc3c13471098f4f0dc \ + --hash=sha256:8a390e56a7963e3946ff2049ee1eb218380e87c8a0e7608f7f8790ba19390867 \ + --hash=sha256:92c4a4a2b1f4846cd4364855cbac83efc48ff5a7d7c06ba014c792dd96483f6f \ + --hash=sha256:9300aee2a8b5992d0f4293d88deb59c218989833e3396c824b69ba330d04a589 \ + --hash=sha256:9453419ea2ab9b21d925d0fd7e3a132a178a191881fab4169b6f96e118cc25bb \ + --hash=sha256:9652e59c022e62a5b58a6f9948b104e5bb96d3b06940c6482588176f40f4914b \ + --hash=sha256:972a7833d4a1fcf7a711c939e315721a88b988553fc770a5b6a5a64bd6ebeba3 \ + --hash=sha256:9c1a4393242e321e344213a90a1e3bf35d2f624aa8b8f6174d43e3c6b0e8f6eb \ + --hash=sha256:9e038c615b3906df4c3be8db16b3e24821d26c55177638ea47b3f8f73615111c \ + --hash=sha256:9e4c166f743bb42c5fcc60760fb1c3623e8fda94f6619534217b083e08644b46 \ + --hash=sha256:9eb117db8d7ed733a7317c4215c35993b815bf6aeab67523f1f11e108c040672 \ + --hash=sha256:9eb442a2442ce417801c912df68e1f6ccfcd41577ae7274953ab3ad24ef7d82c \ + --hash=sha256:a3cd18e03b0ee54ea4319cdcce48357719ea487b53f92a469ba8ca8e39df285e \ + --hash=sha256:a8617625369d2d03766413bff9e64310feafc9fc4f0ad2b902136f1a5cd8c6b0 \ + --hash=sha256:a970a2e6d5281d56cacf3dc82081c95c1f4da5a559e52469287457811db6a79b \ + --hash=sha256:aad7405c033d32c751d98d3a65801e2797ae77fac284a539f6c3a3e13005edc4 \ + --hash=sha256:adcb3332979cbc941b8fff07181f06d2b608625edc0a4d8bc3ffc0be414ad0c4 \ + --hash=sha256:af9c7e6669c4d0ad7362f79cb2ab6784d71147503e62b57e3d95c4a0f222c01c \ + --hash=sha256:b01fda3e95d07a6148702a641e5e293b6da7863f8bc9b967f62db9461330562c \ + --hash=sha256:b8d940fd28eb34a7084877747a60873956893e377f15a32ad445fe66c972c3b8 \ + --hash=sha256:bccb3e88ec26ffa90f72229f983d3a5d1155e41a1171190fa723d4135523585b \ + --hash=sha256:bcedf4cae0d47839fee7de344f96b5694ca53c786f28b5f773d4f0b265a159eb \ + --hash=sha256:be893258d5b68dd3a8cba8deb35dc6411db844a9d35268a8d3793b9d9a256f80 \ + --hash=sha256:c0521e0f07cb56415fdb3aae0bbd8701eb31a9dfef47bb57206075a0584ab2a2 \ + --hash=sha256:c594642d6b13d225e10df5c16ee15b3398e21a35ecd6aee824f107a625690374 \ + --hash=sha256:c87c22bd6a987aca976e3d3e23806d17f65426191db36d40da4ae16a6a494cbc \ + --hash=sha256:c9ac1c2678abf9270e7228133e5b77c6c3c930ad33a3c1dfbdd76ff2c33b7b50 \ + --hash=sha256:d0e5ffc763678d48ecc8da836f2ae2dd1b6eb2d27a48671066f91694e575173c \ + --hash=sha256:d0f402e787e6e7ee7876c8b05e2fe6464820d9f35ba3f172e95b5f8b699f6c7f \ + --hash=sha256:d222a9ed082cd9f38b58923775152003765016342a12f08f8c123bf893461f28 \ + --hash=sha256:d94245caa3c61f760c4ce4953cfa76e7739b6f2cbfc94cc46fff6c050c2390c5 \ + --hash=sha256:de9a2792612ec6def556d1dc621fd6b2073aff015d64fba9f3e53349ad292734 \ + --hash=sha256:e2f5a398b5e77bb01b23d92872255e1bcb3c0c719a3be40b8df146570fe7781a \ + --hash=sha256:e8dd53a8706b15bc0e34f00e6150fbefb35d2fd9235d095b4f83b3c5ed4fa11d \ + --hash=sha256:e9eb3cff1b7d71aa50c89a0536f469cb8d6dcdd585d8f14fb8500d822f3bdee4 \ + --hash=sha256:ed628c1431100b0b65387419551e822987396bee3c088a15d68446d92f554e0c \ + --hash=sha256:ef7938a78447174e2616be223f496ddccdbf7854f7bf2ce716dbccd958cc7d13 \ + --hash=sha256:f1c70249b15e4ce1a7d5340c97670a95f305ca79f376887759b43bb33288c973 \ + --hash=sha256:f3c7363a8cb8c5238878ec96c5eb0fc5ca2cb11fc0c7d2379863d342c6ee367a \ + --hash=sha256:fbbcc6b0639aa09b9649f36f1bcb347b19403fe44109948392fbb5ea69e48c3e \ + --hash=sha256:febffa5b1eda6622d44b245b0685aff6fb555ce0ed734e2d7b1c3acd018a2cff \ + --hash=sha256:ff836cd4041e16003549449cc0a5e372f6b6f871eb89007ab0ee18fb2800fded +six==1.16.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 +smmap==5.0.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62 \ + --hash=sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da +sniffio==1.3.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \ + --hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc +sortedcontainers==2.4.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 +soupsieve==2.5 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690 \ + --hash=sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7 +sqlalchemy==2.0.31 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96 \ + --hash=sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396 \ + --hash=sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb \ + --hash=sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac \ + --hash=sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704 \ + --hash=sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca \ + --hash=sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe \ + --hash=sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808 \ + --hash=sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4 \ + --hash=sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42 \ + --hash=sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc \ + --hash=sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c \ + --hash=sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238 \ + --hash=sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f \ + --hash=sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740 \ + --hash=sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d \ + --hash=sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327 \ + --hash=sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4 \ + --hash=sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e \ + --hash=sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911 \ + --hash=sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac \ + --hash=sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c \ + --hash=sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e \ + --hash=sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58 \ + --hash=sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4 \ + --hash=sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88 \ + --hash=sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be \ + --hash=sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005 \ + --hash=sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc \ + --hash=sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443 \ + --hash=sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1 \ + --hash=sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484 \ + --hash=sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1 \ + --hash=sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67 \ + --hash=sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203 \ + --hash=sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05 \ + --hash=sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227 \ + --hash=sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3 \ + --hash=sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449 \ + --hash=sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109 \ + --hash=sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b \ + --hash=sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3 \ + --hash=sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9 \ + --hash=sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c \ + --hash=sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa \ + --hash=sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0 \ + --hash=sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298 \ + --hash=sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a \ + --hash=sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9 +structlog==24.2.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0e3fe74924a6d8857d3f612739efb94c72a7417d7c7c008d12276bca3b5bf13b \ + --hash=sha256:983bd49f70725c5e1e3867096c0c09665918936b3db27341b41d294283d7a48a +sympy==1.12.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:2877b03f998cd8c08f07cd0de5b767119cd3ef40d09f41c30d722f6686b0fb88 \ + --hash=sha256:9b2cbc7f1a640289430e13d2a56f02f867a1da0190f2f99d8968c2f74da0e515 +tabulate==0.9.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ + --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f +tbb==2021.12.0 ; python_version >= "3.10" and python_version < "3.12" and platform_system == "Windows" \ + --hash=sha256:a925e9a7c77d3a46ae31c34b0bb7f801c4118e857d137b68f68a8e458fcf2bd7 \ + --hash=sha256:b1725b30c174048edc8be70bd43bb95473f396ce895d91151a474d0fa9f450a8 \ + --hash=sha256:f2cc9a7f8ababaa506cbff796ce97c3bf91062ba521e15054394f773375d81d8 \ + --hash=sha256:fc2772d850229f2f3df85f1109c4844c495a2db7433d38200959ee9265b34789 +tenacity==8.4.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:28522e692eda3e1b8f5e99c51464efcc0b9fc86933da92415168bc1c4e2308fa \ + --hash=sha256:54b1412b878ddf7e1f1577cd49527bad8cdef32421bd599beac0c6c3f10582fd +termcolor==2.3.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475 \ + --hash=sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a +text-unidecode==1.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8 \ + --hash=sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93 +threadpoolctl==3.5.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107 \ + --hash=sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467 +tiktoken==0.7.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704 \ + --hash=sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f \ + --hash=sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410 \ + --hash=sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f \ + --hash=sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1 \ + --hash=sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6 \ + --hash=sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f \ + --hash=sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98 \ + --hash=sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311 \ + --hash=sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89 \ + --hash=sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702 \ + --hash=sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858 \ + --hash=sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9 \ + --hash=sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c \ + --hash=sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f \ + --hash=sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685 \ + --hash=sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c \ + --hash=sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908 \ + --hash=sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590 \ + --hash=sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b \ + --hash=sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e \ + --hash=sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992 \ + --hash=sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a \ + --hash=sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97 \ + --hash=sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25 \ + --hash=sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5 \ + --hash=sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6 \ + --hash=sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb \ + --hash=sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769 \ + --hash=sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7 \ + --hash=sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350 \ + --hash=sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4 \ + --hash=sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226 \ + --hash=sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf \ + --hash=sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225 \ + --hash=sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d +tokenizers==0.19.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57 \ + --hash=sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46 \ + --hash=sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52 \ + --hash=sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5 \ + --hash=sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26 \ + --hash=sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3 \ + --hash=sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d \ + --hash=sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1 \ + --hash=sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c \ + --hash=sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1 \ + --hash=sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b \ + --hash=sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975 \ + --hash=sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267 \ + --hash=sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3 \ + --hash=sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840 \ + --hash=sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e \ + --hash=sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d \ + --hash=sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334 \ + --hash=sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d \ + --hash=sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75 \ + --hash=sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642 \ + --hash=sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a \ + --hash=sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc \ + --hash=sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95 \ + --hash=sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7 \ + --hash=sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059 \ + --hash=sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb \ + --hash=sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153 \ + --hash=sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051 \ + --hash=sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22 \ + --hash=sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6 \ + --hash=sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1 \ + --hash=sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe \ + --hash=sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285 \ + --hash=sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d \ + --hash=sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439 \ + --hash=sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85 \ + --hash=sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6 \ + --hash=sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214 \ + --hash=sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3 \ + --hash=sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe \ + --hash=sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f \ + --hash=sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3 \ + --hash=sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98 \ + --hash=sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837 \ + --hash=sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77 \ + --hash=sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a \ + --hash=sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49 \ + --hash=sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6 \ + --hash=sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e \ + --hash=sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97 \ + --hash=sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c \ + --hash=sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266 \ + --hash=sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256 \ + --hash=sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea \ + --hash=sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af \ + --hash=sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2 \ + --hash=sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66 \ + --hash=sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1 \ + --hash=sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a \ + --hash=sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574 \ + --hash=sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d \ + --hash=sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d \ + --hash=sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227 \ + --hash=sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a \ + --hash=sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626 \ + --hash=sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf \ + --hash=sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1 \ + --hash=sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828 \ + --hash=sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403 \ + --hash=sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3 \ + --hash=sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478 \ + --hash=sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f \ + --hash=sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58 \ + --hash=sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda \ + --hash=sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba \ + --hash=sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022 \ + --hash=sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa \ + --hash=sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd \ + --hash=sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad \ + --hash=sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a \ + --hash=sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594 \ + --hash=sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876 \ + --hash=sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14 \ + --hash=sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc \ + --hash=sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe \ + --hash=sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4 \ + --hash=sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee \ + --hash=sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594 \ + --hash=sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a \ + --hash=sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b \ + --hash=sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2 \ + --hash=sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab \ + --hash=sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88 \ + --hash=sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3 \ + --hash=sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4 \ + --hash=sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc \ + --hash=sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f \ + --hash=sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256 \ + --hash=sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243 +torch==2.3.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:07e9ba746832b8d069cacb45f312cadd8ad02b81ea527ec9766c0e7404bb3feb \ + --hash=sha256:224259821fe3e4c6f7edf1528e4fe4ac779c77addaa74215eb0b63a5c474d66c \ + --hash=sha256:2bb5af780c55be68fe100feb0528d2edebace1d55cb2e351de735809ba7391eb \ + --hash=sha256:32b05fe0d1ada7f69c9f86c14ff69b0ef1957a5a54199bacba63d22d8fab720b \ + --hash=sha256:3c333dc2ebc189561514eda06e81df22bf8fb64e2384746b2cb9f04f96d1d4c8 \ + --hash=sha256:3d7a7f7ef21a7520510553dc3938b0c57c116a7daee20736a9e25cbc0e832bdc \ + --hash=sha256:462d1c07dbf6bb5d9d2f3316fee73a24f3d12cd8dacf681ad46ef6418f7f6626 \ + --hash=sha256:4777f6cefa0c2b5fa87223c213e7b6f417cf254a45e5829be4ccd1b2a4ee1011 \ + --hash=sha256:490cc3d917d1fe0bd027057dfe9941dc1d6d8e3cae76140f5dd9a7e5bc7130ab \ + --hash=sha256:5802530783bd465fe66c2df99123c9a54be06da118fbd785a25ab0a88123758a \ + --hash=sha256:605a25b23944be5ab7c3467e843580e1d888b8066e5aaf17ff7bf9cc30001cc3 \ + --hash=sha256:7c09a94362778428484bcf995f6004b04952106aee0ef45ff0b4bab484f5498d \ + --hash=sha256:a486c0b1976a118805fc7c9641d02df7afbb0c21e6b555d3bb985c9f9601b61a \ + --hash=sha256:a7dd4ed388ad1f3d502bf09453d5fe596c7b121de7e0cfaca1e2017782e9bbac \ + --hash=sha256:aaa872abde9a3d4f91580f6396d54888620f4a0b92e3976a6034759df4b961ad \ + --hash=sha256:b2ec81b61bb094ea4a9dee1cd3f7b76a44555375719ad29f05c0ca8ef596ad39 \ + --hash=sha256:bee0bd33dc58aa8fc8a7527876e9b9a0e812ad08122054a5bff2ce5abf005b10 \ + --hash=sha256:e5fdccbf6f1334b2203a61a0e03821d5845f1421defe311dabeae2fc8fbeac2d \ + --hash=sha256:f2357eb0965583a0954d6f9ad005bba0091f956aef879822274b1bcdb11bd308 \ + --hash=sha256:ff60bf7ce3de1d43ad3f6969983f321a31f0a45df3690921720bcad6a8596cc4 +tqdm==4.66.4 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644 \ + --hash=sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb +transformers==4.41.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:05555d20e43f808de1ef211ab64803cdb513170cef70d29a888b589caebefc67 \ + --hash=sha256:80a4db216533d573e9cc7388646c31ed9480918feb7c55eb211249cb23567f87 +trio-websocket==0.11.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f \ + --hash=sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638 +trio==0.25.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:9f5314f014ea3af489e77b001861c535005c3858d38ec46b6b071ebfa339d7fb \ + --hash=sha256:e42617ba091e7b2e50c899052e83a3c403101841de925187f61e7b7eaebdf3fb +triton==2.3.1 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version < "3.12" and python_version >= "3.10" \ + --hash=sha256:1d968264523c7a07911c8fb51b4e0d1b920204dae71491b1fe7b01b62a31e124 \ + --hash=sha256:3c84595cbe5e546b1b290d2a58b1494df5a2ef066dd890655e5b8a8a92205c33 \ + --hash=sha256:63381e35ded3304704ea867ffde3b7cfc42c16a55b3062d41e017ef510433d66 \ + --hash=sha256:b13bf35a2b659af7159bf78e92798dc62d877aa991de723937329e2d382f1991 \ + --hash=sha256:c9d64ae33bcb3a7a18081e3a746e8cf87ca8623ca13d2c362413ce7a486f893e \ + --hash=sha256:eaf80e8761a9e3498aa92e7bf83a085b31959c61f5e8ac14eedd018df6fccd10 +typeguard==2.13.3 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4 \ + --hash=sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1 +types-python-dateutil==2.9.0.20240316 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202 \ + --hash=sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b +types-requests==2.32.0.20240602 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:3f98d7bbd0dd94ebd10ff43a7fbe20c3b8528acace6d8efafef0b6a184793f06 \ + --hash=sha256:ed3946063ea9fbc6b5fc0c44fa279188bae42d582cb63760be6cb4b9d06c3de8 +typing-extensions==4.12.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 +typing-inspect==0.9.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f \ + --hash=sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78 +tzdata==2024.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd \ + --hash=sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252 +unstructured-client==0.23.7 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:9161ca25365764712b66cbb50e7cb22bc59a89a613de2bb2e2b171ef7b17e5b0 \ + --hash=sha256:95df14697b1f79cc2a4580c7f143bd463d3dd5fab605220d2e4888321342decb +unstructured==0.14.6 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:5dddf44908faa0f5250c02f41768fd4ce3792496d3e00258fd33f68c24b902c1 \ + --hash=sha256:ab7d83016e46d3c221f6dae8b1040492ee69f7a97cb53c0f2109b54f0b764d19 +urllib3==2.2.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ + --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 +urllib3[socks]==2.2.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ + --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 +wrapt==1.16.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc \ + --hash=sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81 \ + --hash=sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09 \ + --hash=sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e \ + --hash=sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca \ + --hash=sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0 \ + --hash=sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb \ + --hash=sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487 \ + --hash=sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40 \ + --hash=sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c \ + --hash=sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060 \ + --hash=sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202 \ + --hash=sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41 \ + --hash=sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9 \ + --hash=sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b \ + --hash=sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664 \ + --hash=sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d \ + --hash=sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362 \ + --hash=sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00 \ + --hash=sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc \ + --hash=sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1 \ + --hash=sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267 \ + --hash=sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956 \ + --hash=sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966 \ + --hash=sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1 \ + --hash=sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228 \ + --hash=sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72 \ + --hash=sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d \ + --hash=sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292 \ + --hash=sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0 \ + --hash=sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0 \ + --hash=sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36 \ + --hash=sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c \ + --hash=sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5 \ + --hash=sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f \ + --hash=sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73 \ + --hash=sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b \ + --hash=sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2 \ + --hash=sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593 \ + --hash=sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39 \ + --hash=sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389 \ + --hash=sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf \ + --hash=sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf \ + --hash=sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89 \ + --hash=sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c \ + --hash=sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c \ + --hash=sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f \ + --hash=sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440 \ + --hash=sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465 \ + --hash=sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136 \ + --hash=sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b \ + --hash=sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8 \ + --hash=sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3 \ + --hash=sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8 \ + --hash=sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6 \ + --hash=sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e \ + --hash=sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f \ + --hash=sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c \ + --hash=sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e \ + --hash=sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8 \ + --hash=sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2 \ + --hash=sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020 \ + --hash=sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35 \ + --hash=sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d \ + --hash=sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3 \ + --hash=sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537 \ + --hash=sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809 \ + --hash=sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d \ + --hash=sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a \ + --hash=sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4 +wsproto==1.2.0 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065 \ + --hash=sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736 +wurlitzer==3.1.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:0b2749c2cde3ef640bf314a9f94b24d929fe1ca476974719a6909dfc568c3aac \ + --hash=sha256:bfb9144ab9f02487d802b9ff89dbd3fa382d08f73e12db8adc4c2fb00cd39bd9 +xxhash==3.4.1 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:00f2fdef6b41c9db3d2fc0e7f94cb3db86693e5c45d6de09625caad9a469635b \ + --hash=sha256:0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9 \ + --hash=sha256:0aac5010869240e95f740de43cd6a05eae180c59edd182ad93bf12ee289484fa \ + --hash=sha256:0c786a6cd74e8765c6809892a0d45886e7c3dc54de4985b4a5eb8b630f3b8e3b \ + --hash=sha256:0e041ce5714f95251a88670c114b748bca3bf80cc72400e9f23e6d0d59cf2681 \ + --hash=sha256:10e0a619cdd1c0980e25eb04e30fe96cf8f4324758fa497080af9c21a6de573f \ + --hash=sha256:11f11357c86d83e53719c592021fd524efa9cf024dc7cb1dfb57bbbd0d8713f2 \ + --hash=sha256:1d03f1c0d16d24ea032e99f61c552cb2b77d502e545187338bea461fde253583 \ + --hash=sha256:1d0ae4c2e7698adef58710d6e7a32ff518b66b98854b1c68e70eee504ad061d8 \ + --hash=sha256:200a5a3ad9c7c0c02ed1484a1d838b63edcf92ff538770ea07456a3732c577f4 \ + --hash=sha256:2070b6d5bbef5ee031666cf21d4953c16e92c2f8a24a94b5c240f8995ba3b1d0 \ + --hash=sha256:21287bcdd299fdc3328cc0fbbdeaa46838a1c05391264e51ddb38a3f5b09611f \ + --hash=sha256:23cfd9ca09acaf07a43e5a695143d9a21bf00f5b49b15c07d5388cadf1f9ce11 \ + --hash=sha256:248d3e83d119770f96003271fe41e049dd4ae52da2feb8f832b7a20e791d2920 \ + --hash=sha256:25dc66be3db54f8a2d136f695b00cfe88018e59ccff0f3b8f545869f376a8a46 \ + --hash=sha256:2a8ba6181514681c2591840d5632fcf7356ab287d4aff1c8dea20f3c78097088 \ + --hash=sha256:2be491723405e15cc099ade1280133ccfbf6322d2ef568494fb7d07d280e7eee \ + --hash=sha256:312eba88ffe0a05e332e3a6f9788b73883752be63f8588a6dc1261a3eaaaf2b2 \ + --hash=sha256:36ad4457644c91a966f6fe137d7467636bdc51a6ce10a1d04f365c70d6a16d7e \ + --hash=sha256:3b685fab18876b14a8f94813fa2ca80cfb5ab6a85d31d5539b7cd749ce9e3624 \ + --hash=sha256:4178f78d70e88f1c4a89ff1ffe9f43147185930bb962ee3979dba15f2b1cc799 \ + --hash=sha256:419ffe34c17ae2df019a4685e8d3934d46b2e0bbe46221ab40b7e04ed9f11137 \ + --hash=sha256:41ddeae47cf2828335d8d991f2d2b03b0bdc89289dc64349d712ff8ce59d0647 \ + --hash=sha256:431625fad7ab5649368c4849d2b49a83dc711b1f20e1f7f04955aab86cd307bc \ + --hash=sha256:43984c0a92f06cac434ad181f329a1445017c33807b7ae4f033878d860a4b0f2 \ + --hash=sha256:450401f42bbd274b519d3d8dcf3c57166913381a3d2664d6609004685039f9d3 \ + --hash=sha256:4603a0f642a1e8d7f3ba5c4c25509aca6a9c1cc16f85091004a7028607ead663 \ + --hash=sha256:4c76a77dbd169450b61c06fd2d5d436189fc8ab7c1571d39265d4822da16df22 \ + --hash=sha256:4cb11d8debab1626181633d184b2372aaa09825bde709bf927704ed72765bed1 \ + --hash=sha256:543c7fcbc02bbb4840ea9915134e14dc3dc15cbd5a30873a7a5bf66039db97ec \ + --hash=sha256:562d8b8f783c6af969806aaacf95b6c7b776929ae26c0cd941d54644ea7ef51e \ + --hash=sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5 \ + --hash=sha256:595b252943b3552de491ff51e5bb79660f84f033977f88f6ca1605846637b7c6 \ + --hash=sha256:5bef2a7dc7b4f4beb45a1edbba9b9194c60a43a89598a87f1a0226d183764189 \ + --hash=sha256:5dab508ac39e0ab988039bc7f962c6ad021acd81fd29145962b068df4148c476 \ + --hash=sha256:6066d88c9329ab230e18998daec53d819daeee99d003955c8db6fc4971b45ca3 \ + --hash=sha256:6127813abc1477f3a83529b6bbcfeddc23162cece76fa69aee8f6a8a97720562 \ + --hash=sha256:64da57d5ed586ebb2ecdde1e997fa37c27fe32fe61a656b77fabbc58e6fbff6e \ + --hash=sha256:665a65c2a48a72068fcc4d21721510df5f51f1142541c890491afc80451636d2 \ + --hash=sha256:672b273040d5d5a6864a36287f3514efcd1d4b1b6a7480f294c4b1d1ee1b8de0 \ + --hash=sha256:696b4e18b7023527d5c50ed0626ac0520edac45a50ec7cf3fc265cd08b1f4c03 \ + --hash=sha256:6a9ff50a3cf88355ca4731682c168049af1ca222d1d2925ef7119c1a78e95b3b \ + --hash=sha256:6d3472fd4afef2a567d5f14411d94060099901cd8ce9788b22b8c6f13c606a93 \ + --hash=sha256:6d42b24d1496deb05dee5a24ed510b16de1d6c866c626c2beb11aebf3be278b9 \ + --hash=sha256:6e66df260fed01ed8ea790c2913271641c58481e807790d9fca8bfd5a3c13844 \ + --hash=sha256:6fa45e8cbfbadb40a920fe9ca40c34b393e0b067082d94006f7f64e70c7490a6 \ + --hash=sha256:719a378930504ab159f7b8e20fa2aa1896cde050011af838af7e7e3518dd82de \ + --hash=sha256:71be94265b6c6590f0018bbf73759d21a41c6bda20409782d8117e76cd0dfa8b \ + --hash=sha256:743612da4071ff9aa4d055f3f111ae5247342931dedb955268954ef7201a71ff \ + --hash=sha256:74fb5cb9406ccd7c4dd917f16630d2e5e8cbbb02fc2fca4e559b2a47a64f4940 \ + --hash=sha256:7688d7c02149a90a3d46d55b341ab7ad1b4a3f767be2357e211b4e893efbaaf6 \ + --hash=sha256:7a97322e9a7440bf3c9805cbaac090358b43f650516486746f7fa482672593df \ + --hash=sha256:8106d88da330f6535a58a8195aa463ef5281a9aa23b04af1848ff715c4398fb4 \ + --hash=sha256:8c59f3e46e7daf4c589e8e853d700ef6607afa037bfad32c390175da28127e8c \ + --hash=sha256:8cc07256eff0795e0f642df74ad096f8c5d23fe66bc138b83970b50fc7f7f6c5 \ + --hash=sha256:911035345932a153c427107397c1518f8ce456f93c618dd1c5b54ebb22e73747 \ + --hash=sha256:91dbfa55346ad3e18e738742236554531a621042e419b70ad8f3c1d9c7a16e7f \ + --hash=sha256:92693c487e39523a80474b0394645b393f0ae781d8db3474ccdcead0559ccf45 \ + --hash=sha256:93805bc3233ad89abf51772f2ed3355097a5dc74e6080de19706fc447da99cd3 \ + --hash=sha256:961d948b7b1c1b6c08484bbce3d489cdf153e4122c3dfb07c2039621243d8795 \ + --hash=sha256:9804b9eb254d4b8cc83ab5a2002128f7d631dd427aa873c8727dba7f1f0d1c2b \ + --hash=sha256:9c0f7b2d547d72c7eda7aa817acf8791f0146b12b9eba1d4432c531fb0352228 \ + --hash=sha256:9ecb6c987b62437c2f99c01e97caf8d25660bf541fe79a481d05732e5236719c \ + --hash=sha256:9f3025a0d5d8cf406a9313cd0d5789c77433ba2004b1c75439b67678e5136537 \ + --hash=sha256:9fd28a9da300e64e434cfc96567a8387d9a96e824a9be1452a1e7248b7763b78 \ + --hash=sha256:a15cbf3a9c40672523bdb6ea97ff74b443406ba0ab9bca10ceccd9546414bd84 \ + --hash=sha256:a162840cf4de8a7cd8720ff3b4417fbc10001eefdd2d21541a8226bb5556e3bb \ + --hash=sha256:a55e0506fdb09640a82ec4f44171273eeabf6f371a4ec605633adb2837b5d9d5 \ + --hash=sha256:a8b4977963926f60b0d4f830941c864bed16aa151206c01ad5c531636da5708e \ + --hash=sha256:a90356ead70d715fe64c30cd0969072de1860e56b78adf7c69d954b43e29d9fa \ + --hash=sha256:aabf37fb8fa27430d50507deeab2ee7b1bcce89910dd10657c38e71fee835594 \ + --hash=sha256:ac56eebb364e44c85e1d9e9cc5f6031d78a34f0092fea7fc80478139369a8b4a \ + --hash=sha256:b2746035f518f0410915e247877f7df43ef3372bf36cfa52cc4bc33e85242641 \ + --hash=sha256:b29728cff2c12f3d9f1d940528ee83918d803c0567866e062683f300d1d2eff3 \ + --hash=sha256:b41edaf05734092f24f48c0958b3c6cbaaa5b7e024880692078c6b1f8247e2fc \ + --hash=sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520 \ + --hash=sha256:b5beb1c6a72fdc7584102f42c4d9df232ee018ddf806e8c90906547dfb43b2da \ + --hash=sha256:b736a2a2728ba45017cb67785e03125a79d246462dfa892d023b827007412c52 \ + --hash=sha256:b9097af00ebf429cc7c0e7d2fdf28384e4e2e91008130ccda8d5ae653db71e54 \ + --hash=sha256:bb11628470a6004dc71a09fe90c2f459ff03d611376c1debeec2d648f44cb693 \ + --hash=sha256:bbe750d512982ee7d831838a5dee9e9848f3fb440e4734cca3f298228cc957a6 \ + --hash=sha256:c09c49473212d9c87261d22c74370457cfff5db2ddfc7fd1e35c80c31a8c14ce \ + --hash=sha256:c44d584afdf3c4dbb3277e32321d1a7b01d6071c1992524b6543025fb8f4206f \ + --hash=sha256:c4bbba9b182697a52bc0c9f8ec0ba1acb914b4937cd4a877ad78a3b3eeabefb3 \ + --hash=sha256:c9e1b646af61f1fc7083bb7b40536be944f1ac67ef5e360bca2d73430186971a \ + --hash=sha256:ca7783b20e3e4f3f52f093538895863f21d18598f9a48211ad757680c3bd006f \ + --hash=sha256:d6322c4291c3ff174dcd104fae41500e75dad12be6f3085d119c2c8a80956c51 \ + --hash=sha256:d699b921af0dcde50ab18be76c0d832f803034d80470703700cb7df0fbec2832 \ + --hash=sha256:d77d09a1113899fad5f354a1eb4f0a9afcf58cefff51082c8ad643ff890e30cf \ + --hash=sha256:dd59ed668801c3fae282f8f4edadf6dc7784db6d18139b584b6d9677ddde1b6b \ + --hash=sha256:dfd7a6cc483e20b4ad90224aeb589e64ec0f31e5610ab9957ff4314270b2bf31 \ + --hash=sha256:e01226b6b6a1ffe4e6bd6d08cfcb3ca708b16f02eb06dd44f3c6e53285f03e4f \ + --hash=sha256:e17032f5a4fea0a074717fe33477cb5ee723a5f428de7563e75af64bfc1b1e10 \ + --hash=sha256:e867f68a8f381ea12858e6d67378c05359d3a53a888913b5f7d35fbf68939d5f \ + --hash=sha256:e9f749999ed80f3955a4af0eb18bb43993f04939350b07b8dd2f44edc98ffee9 \ + --hash=sha256:ebbb1616435b4a194ce3466d7247df23499475c7ed4eb2681a1fa42ff766aff6 \ + --hash=sha256:ef2e194262f5db16075caea7b3f7f49392242c688412f386d3c7b07c7733a70a \ + --hash=sha256:ef73a53fe90558a4096e3256752268a8bdc0322f4692ed928b6cd7ce06ad4fe3 \ + --hash=sha256:f1d7c69a1e9ca5faa75546fdd267f214f63f52f12692f9b3a2f6467c9e67d5e7 \ + --hash=sha256:f31ce76489f8601cc7b8713201ce94b4bd7b7ce90ba3353dccce7e9e1fee71fa \ + --hash=sha256:f3ff8dbd0ec97aec842476cb8ccc3e17dd288cd6ce3c8ef38bff83d6eb927817 \ + --hash=sha256:fa122124d2e3bd36581dd78c0efa5f429f5220313479fb1072858188bc2d5ff1 \ + --hash=sha256:faec30437919555b039a8bdbaba49c013043e8f76c999670aef146d33e05b3a0 \ + --hash=sha256:fc6dbd5fc3c9886a9e041848508b7fb65fd82f94cc793253990f81617b61fe49 \ + --hash=sha256:fc860d887c5cb2f524899fb8338e1bb3d5789f75fac179101920d9afddef284b \ + --hash=sha256:fd79d4087727daf4d5b8afe594b37d611ab95dc8e29fe1a7517320794837eb7d \ + --hash=sha256:fd7bddb3a5b86213cc3f2c61500c16945a1b80ecd572f3078ddbbe68f9dabdfb \ + --hash=sha256:fe0a98d990e433013f41827b62be9ab43e3cf18e08b1483fcc343bda0d691182 +yarl==1.9.4 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51 \ + --hash=sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce \ + --hash=sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559 \ + --hash=sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0 \ + --hash=sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81 \ + --hash=sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc \ + --hash=sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4 \ + --hash=sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c \ + --hash=sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130 \ + --hash=sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136 \ + --hash=sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e \ + --hash=sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec \ + --hash=sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7 \ + --hash=sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1 \ + --hash=sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455 \ + --hash=sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099 \ + --hash=sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129 \ + --hash=sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10 \ + --hash=sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142 \ + --hash=sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98 \ + --hash=sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa \ + --hash=sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7 \ + --hash=sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525 \ + --hash=sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c \ + --hash=sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9 \ + --hash=sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c \ + --hash=sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8 \ + --hash=sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b \ + --hash=sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf \ + --hash=sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23 \ + --hash=sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd \ + --hash=sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27 \ + --hash=sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f \ + --hash=sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece \ + --hash=sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434 \ + --hash=sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec \ + --hash=sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff \ + --hash=sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78 \ + --hash=sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d \ + --hash=sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863 \ + --hash=sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53 \ + --hash=sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31 \ + --hash=sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15 \ + --hash=sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5 \ + --hash=sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b \ + --hash=sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57 \ + --hash=sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3 \ + --hash=sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1 \ + --hash=sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f \ + --hash=sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad \ + --hash=sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c \ + --hash=sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7 \ + --hash=sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2 \ + --hash=sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b \ + --hash=sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2 \ + --hash=sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b \ + --hash=sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9 \ + --hash=sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be \ + --hash=sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e \ + --hash=sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984 \ + --hash=sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4 \ + --hash=sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074 \ + --hash=sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2 \ + --hash=sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392 \ + --hash=sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91 \ + --hash=sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541 \ + --hash=sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf \ + --hash=sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572 \ + --hash=sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66 \ + --hash=sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575 \ + --hash=sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14 \ + --hash=sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5 \ + --hash=sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1 \ + --hash=sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e \ + --hash=sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551 \ + --hash=sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17 \ + --hash=sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead \ + --hash=sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0 \ + --hash=sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe \ + --hash=sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234 \ + --hash=sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0 \ + --hash=sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7 \ + --hash=sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34 \ + --hash=sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42 \ + --hash=sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385 \ + --hash=sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78 \ + --hash=sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be \ + --hash=sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958 \ + --hash=sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749 \ + --hash=sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec +yaspin==3.0.2 ; python_version >= "3.10" and python_version < "3.12" \ + --hash=sha256:35cae59c682506794a218310445e8326cd8fec410879d1c44953b494b1121e77 \ + --hash=sha256:5c9b6549b84c8aa7f92426272b670e1302941d72f0275caf32d2ea7db3c269f9 diff --git a/course/module-3/settings.py b/settings.py similarity index 92% rename from course/module-3/settings.py rename to settings.py index 6b8a85a..98b30d9 100644 --- a/course/module-3/settings.py +++ b/settings.py @@ -21,7 +21,6 @@ class AppSettings(BaseSettings): QDRANT_DATABASE_HOST: str = "localhost" QDRANT_DATABASE_PORT: int = 6333 QDRANT_DATABASE_URL: str = "http://localhost:6333" - QDRANT_CLOUD_URL: str = "str" USE_QDRANT_CLOUD: bool = False QDRANT_APIKEY: str | None = None @@ -37,5 +36,9 @@ class AppSettings(BaseSettings): COMET_WORKSPACE: str | None = None COMET_PROJECT: str | None = None + # LinkedIn credentials + LINKEDIN_USERNAME: str | None = None + LINKEDIN_PASSWORD: str | None = None + settings = AppSettings()