diff --git a/backend/Dockerfile b/backend/Dockerfile index b2aae4fcd..44500f2e3 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -6,9 +6,13 @@ COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.7.0 /lambda-adapter /opt WORKDIR /backend COPY ./pyproject.toml ./poetry.lock ./ -RUN pip install poetry --no-cache-dir && \ + +ENV POETRY_REQUESTS_TIMEOUT=10800 +RUN python -m pip install --upgrade pip && \ + pip install poetry --no-cache-dir && \ poetry config virtualenvs.create false && \ - poetry install --no-interaction --no-ansi + poetry install --no-interaction --no-ansi --only main && \ + poetry cache clear --all pypi COPY ./app ./app diff --git a/backend/app/agents/tools/knowledge.py b/backend/app/agents/tools/knowledge.py index cc69d1422..7e970ae80 100644 --- a/backend/app/agents/tools/knowledge.py +++ b/backend/app/agents/tools/knowledge.py @@ -134,8 +134,7 @@ def _run( search_results = dummy_search_results else: search_results = search_related_docs( - self.bot.id, - limit=self.bot.search_params.max_results, + self.bot, query=query, ) diff --git a/backend/app/bot_remove.py b/backend/app/bot_remove.py index e53f2289a..54ae0e29a 100644 --- a/backend/app/bot_remove.py +++ b/backend/app/bot_remove.py @@ -4,10 +4,14 @@ import boto3 import pg8000 -from app.repositories.apigateway import delete_api_key, find_usage_plan_by_id -from app.repositories.cloudformation import delete_stack_by_bot_id, find_stack_by_bot_id +from app.repositories.api_publication import delete_api_key, find_usage_plan_by_id +from app.repositories.api_publication import ( + delete_stack_by_bot_id, + find_stack_by_bot_id, +) from app.repositories.common import RecordNotFoundError, decompose_bot_id from aws_lambda_powertools.utilities import parameters +from app.repositories.custom_bot import find_public_bot_by_id DB_SECRETS_ARN = os.environ.get("DB_SECRETS_ARN", "") DOCUMENT_BUCKET = os.environ.get("DOCUMENT_BUCKET", "documents") @@ -43,6 +47,16 @@ def delete_from_postgres(bot_id: str): conn.close() +def delete_kb_stack_by_bot_id(bot_id: str): + client = boto3.client("cloudformation") + stack_name = f"BrChatKbStack{bot_id}" + try: + response = client.delete_stack(StackName=stack_name) + except client.exceptions.ClientError as e: + raise RecordNotFoundError() + return response + + def delete_from_s3(user_id: str, bot_id: str): """Delete all files in S3 bucket for the specified `user_id` and `bot_id`.""" prefix = f"{user_id}/{bot_id}/" @@ -90,14 +104,21 @@ def handler(event, context): user_id = pk bot_id = decompose_bot_id(sk) - delete_from_postgres(bot_id) delete_from_s3(user_id, bot_id) + try: + print(f"Remove Bedrock Knowledge Base Stack.") + # Remove Knowledge Base Stack + delete_kb_stack_by_bot_id(bot_id) + except RecordNotFoundError: + print(f"Remove records from PostgreSQL.") + delete_from_postgres(bot_id) + # Check if cloudformation stack exists try: stack = find_stack_by_bot_id(bot_id) except RecordNotFoundError: - print(f"Bot {bot_id} cloudformation stack not found. Skipping deletion.") + print(f"Bot {bot_id} api published stack not found. Skipping deletion.") return # Before delete cfn stack, delete all api keys diff --git a/backend/app/repositories/custom_bot.py b/backend/app/repositories/custom_bot.py index 2f8c91cd7..f25d3cf3c 100644 --- a/backend/app/repositories/custom_bot.py +++ b/backend/app/repositories/custom_bot.py @@ -25,12 +25,13 @@ BotMeta, BotMetaWithStackInfo, BotModel, + ConversationQuickStarterModel, EmbeddingParamsModel, GenerationParamsModel, KnowledgeModel, SearchParamsModel, - ConversationQuickStarterModel, ) +from app.repositories.models.custom_bot_kb import BedrockKnowledgeBaseModel from app.routes.schemas.bot import type_sync_status from app.utils import get_current_time from boto3.dynamodb.conditions import Attr, Key @@ -78,6 +79,8 @@ def store_bot(user_id: str, custom_bot: BotModel): starter.model_dump() for starter in custom_bot.conversation_quick_starters ], } + if custom_bot.bedrock_knowledge_base: + item["BedrockKnowledgeBase"] = custom_bot.bedrock_knowledge_base.model_dump() response = table.put_item(Item=item) return response @@ -98,6 +101,7 @@ def update_bot( sync_status_reason: str, display_retrieved_chunks: bool, conversation_quick_starters: list[ConversationQuickStarterModel], + bedrock_knowledge_base: BedrockKnowledgeBaseModel | None = None, ): """Update bot title, description, and instruction. NOTE: Use `update_bot_visibility` to update visibility. @@ -105,37 +109,48 @@ def update_bot( table = _get_table_client(user_id) logger.info(f"Updating bot: {bot_id}") + update_expression = ( + "SET Title = :title, " + "Description = :description, " + "Instruction = :instruction, " + "EmbeddingParams = :embedding_params, " + "AgentData = :agent_data, " + "Knowledge = :knowledge, " + "SyncStatus = :sync_status, " + "SyncStatusReason = :sync_status_reason, " + "GenerationParams = :generation_params, " + "SearchParams = :search_params, " + "DisplayRetrievedChunks = :display_retrieved_chunks, " + "ConversationQuickStarters = :conversation_quick_starters" + ) + + expression_attribute_values = { + ":title": title, + ":description": description, + ":instruction": instruction, + ":knowledge": knowledge.model_dump(), + ":agent_data": agent.model_dump(), + ":embedding_params": embedding_params.model_dump(), + ":sync_status": sync_status, + ":sync_status_reason": sync_status_reason, + ":display_retrieved_chunks": display_retrieved_chunks, + ":generation_params": generation_params.model_dump(), + ":search_params": search_params.model_dump(), + ":conversation_quick_starters": [ + starter.model_dump() for starter in conversation_quick_starters + ], + } + if bedrock_knowledge_base: + update_expression += ", BedrockKnowledgeBase = :bedrock_knowledge_base" + expression_attribute_values[":bedrock_knowledge_base"] = ( + bedrock_knowledge_base.model_dump() + ) + try: response = table.update_item( Key={"PK": user_id, "SK": compose_bot_id(user_id, bot_id)}, - UpdateExpression="SET Title = :title, " - "Description = :description, " - "Instruction = :instruction, " - "EmbeddingParams = :embedding_params, " - "AgentData = :agent_data, " # Note: `Agent` is reserved keyword - "Knowledge = :knowledge, " - "SyncStatus = :sync_status, " - "SyncStatusReason = :sync_status_reason, " - "GenerationParams = :generation_params, " - "SearchParams = :search_params, " - "DisplayRetrievedChunks = :display_retrieved_chunks, " - "ConversationQuickStarters = :conversation_quick_starters", - ExpressionAttributeValues={ - ":title": title, - ":description": description, - ":instruction": instruction, - ":knowledge": knowledge.model_dump(), - ":agent_data": agent.model_dump(), - ":embedding_params": embedding_params.model_dump(), - ":sync_status": sync_status, - ":sync_status_reason": sync_status_reason, - ":display_retrieved_chunks": display_retrieved_chunks, - ":generation_params": generation_params.model_dump(), - ":search_params": search_params.model_dump(), - ":conversation_quick_starters": [ - starter.model_dump() for starter in conversation_quick_starters - ], - }, + UpdateExpression=update_expression, + ExpressionAttributeValues=expression_attribute_values, ReturnValues="ALL_NEW", ConditionExpression="attribute_exists(PK) AND attribute_exists(SK)", ) @@ -249,6 +264,33 @@ def update_alias_pin_status(user_id: str, alias_id: str, pinned: bool): return response +def update_knowledge_base_id( + user_id: str, bot_id: str, knowledge_base_id: str, data_source_ids: list[str] +): + table = _get_table_client(user_id) + logger.info(f"Updating knowledge base id for bot: {bot_id}") + + try: + response = table.update_item( + Key={"PK": user_id, "SK": compose_bot_id(user_id, bot_id)}, + UpdateExpression="SET BedrockKnowledgeBase.knowledge_base_id = :kb_id, BedrockKnowledgeBase.data_source_ids = :ds_ids", + ExpressionAttributeValues={ + ":kb_id": knowledge_base_id, + ":ds_ids": data_source_ids, + }, + ConditionExpression="attribute_exists(PK) AND attribute_exists(SK)", + ReturnValues="ALL_NEW", + ) + logger.info(f"Updated knowledge base id for bot: {bot_id} successfully") + except ClientError as e: + if e.response["Error"]["Code"] == "ConditionalCheckFailedException": + raise RecordNotFoundError(f"Bot with id {bot_id} not found") + else: + raise e + + return response + + def find_private_bots_by_user_id( user_id: str, limit: int | None = None ) -> list[BotMeta]: @@ -281,6 +323,9 @@ def find_private_bots_by_user_id( description=item["Description"], is_public="PublicBotId" in item, sync_status=item["SyncStatus"], + has_bedrock_knowledge_base=( + True if item.get("BedrockKnowledgeBase", None) else False + ), ) for item in response["Items"] ] @@ -303,6 +348,9 @@ def find_private_bots_by_user_id( description=item["Description"], is_public="PublicBotId" in item, sync_status=item["SyncStatus"], + has_bedrock_knowledge_base=( + True if item.get("BedrockKnowledgeBase", None) else False + ), ) for item in response["Items"] ] @@ -387,7 +435,9 @@ def find_private_bot_by_id(user_id: str, bot_id: str) -> BotModel: if "AgentData" in item else AgentModel(tools=[]) ), - knowledge=KnowledgeModel(**item["Knowledge"]), + knowledge=KnowledgeModel( + **{**item["Knowledge"], "s3_urls": item["Knowledge"].get("s3_urls", [])} + ), sync_status=item["SyncStatus"], sync_status_reason=item["SyncStatusReason"], sync_last_exec_id=item["LastExecId"], @@ -406,6 +456,11 @@ def find_private_bot_by_id(user_id: str, bot_id: str) -> BotModel: ), display_retrieved_chunks=item.get("DisplayRetrievedChunks", False), conversation_quick_starters=item.get("ConversationQuickStarters", []), + bedrock_knowledge_base=( + BedrockKnowledgeBaseModel(**item["BedrockKnowledgeBase"]) + if "BedrockKnowledgeBase" in item + else None + ), ) logger.info(f"Found bot: {bot}") @@ -473,7 +528,9 @@ def find_public_bot_by_id(bot_id: str) -> BotModel: if "AgentData" in item else AgentModel(tools=[]) ), - knowledge=KnowledgeModel(**item["Knowledge"]), + knowledge=KnowledgeModel( + **{**item["Knowledge"], "s3_urls": item["Knowledge"].get("s3_urls", [])} + ), sync_status=item["SyncStatus"], sync_status_reason=item["SyncStatusReason"], sync_last_exec_id=item["LastExecId"], @@ -492,6 +549,11 @@ def find_public_bot_by_id(bot_id: str) -> BotModel: ), display_retrieved_chunks=item.get("DisplayRetrievedChunks", False), conversation_quick_starters=item.get("ConversationQuickStarters", []), + bedrock_knowledge_base=( + BedrockKnowledgeBaseModel(**item["BedrockKnowledgeBase"]) + if "BedrockKnowledgeBase" in item + else None + ), ) logger.info(f"Found public bot: {bot}") return bot @@ -683,6 +745,9 @@ def query_dynamodb(table, bot_id): sync_status=item["SyncStatus"], published_api_stack_name=item.get("ApiPublishmentStackName", None), published_api_datetime=item.get("ApiPublishedDatetime", None), + has_bedrock_knowledge_base=( + True if item.get("BedrockKnowledgeBase", None) else False + ), ) ) @@ -723,6 +788,9 @@ def find_all_published_bots( sync_status=item["SyncStatus"], published_api_stack_name=item["ApiPublishmentStackName"], published_api_datetime=item.get("ApiPublishedDatetime", None), + has_bedrock_knowledge_base=( + True if item.get("BedrockKnowledgeBase", None) else False + ), ) for item in response["Items"] ] diff --git a/backend/app/repositories/models/custom_bot.py b/backend/app/repositories/models/custom_bot.py index 941af66e0..efbccc498 100644 --- a/backend/app/repositories/models/custom_bot.py +++ b/backend/app/repositories/models/custom_bot.py @@ -1,6 +1,7 @@ from app.repositories.models.common import Float from app.routes.schemas.bot import type_sync_status from pydantic import BaseModel +from app.repositories.models.custom_bot_kb import BedrockKnowledgeBaseModel class EmbeddingParamsModel(BaseModel): @@ -13,6 +14,7 @@ class KnowledgeModel(BaseModel): source_urls: list[str] sitemap_urls: list[str] filenames: list[str] + s3_urls: list[str] def __str_in_claude_format__(self) -> str: """Description of the knowledge in Claude format.""" @@ -81,17 +83,22 @@ class BotModel(BaseModel): published_api_codebuild_id: str | None display_retrieved_chunks: bool conversation_quick_starters: list[ConversationQuickStarterModel] + bedrock_knowledge_base: BedrockKnowledgeBaseModel | None def has_knowledge(self) -> bool: return ( len(self.knowledge.source_urls) > 0 or len(self.knowledge.sitemap_urls) > 0 or len(self.knowledge.filenames) > 0 + or len(self.knowledge.s3_urls) > 0 ) def is_agent_enabled(self) -> bool: return len(self.agent.tools) > 0 + def has_bedrock_knowledge_base(self) -> bool: + return self.bedrock_knowledge_base is not None + class BotAliasModel(BaseModel): id: str @@ -121,6 +128,7 @@ class BotMeta(BaseModel): # This can be `False` if the bot is not owned by the user and original bot is removed. available: bool sync_status: type_sync_status + has_bedrock_knowledge_base: bool class BotMetaWithStackInfo(BotMeta): diff --git a/backend/app/repositories/models/custom_bot_kb.py b/backend/app/repositories/models/custom_bot_kb.py new file mode 100644 index 000000000..868765c71 --- /dev/null +++ b/backend/app/repositories/models/custom_bot_kb.py @@ -0,0 +1,35 @@ +from app.routes.schemas.bot_kb import ( + type_kb_chunking_strategy, + type_kb_embeddings_model, + type_kb_search_type, + type_os_character_filter, + type_os_token_filter, + type_os_tokenizer, +) +from pydantic import BaseModel + + +class SearchParamsModel(BaseModel): + max_results: int + search_type: type_kb_search_type + + +class AnalyzerParamsModel(BaseModel): + character_filters: list[type_os_character_filter] + tokenizer: type_os_tokenizer + token_filters: list[type_os_token_filter] + + +class OpenSearchParamsModel(BaseModel): + analyzer: AnalyzerParamsModel | None + + +class BedrockKnowledgeBaseModel(BaseModel): + embeddings_model: type_kb_embeddings_model + open_search: OpenSearchParamsModel + chunking_strategy: type_kb_chunking_strategy + search_params: SearchParamsModel + max_tokens: int | None = None + overlap_percentage: int | None = None + knowledge_base_id: str | None = None + data_source_ids: list[str] | None = None diff --git a/backend/app/routes/admin.py b/backend/app/routes/admin.py index 44f0de770..71395c2f4 100644 --- a/backend/app/routes/admin.py +++ b/backend/app/routes/admin.py @@ -118,6 +118,7 @@ def get_public_bot(request: Request, bot_id: str, admin_check=Depends(check_admi source_urls=bot.knowledge.source_urls, sitemap_urls=bot.knowledge.sitemap_urls, filenames=bot.knowledge.filenames, + s3_urls=bot.knowledge.s3_urls, ), sync_status=bot.sync_status, sync_status_reason=bot.sync_status_reason, diff --git a/backend/app/routes/bot.py b/backend/app/routes/bot.py index c78b9a50d..c7d1cdeb0 100644 --- a/backend/app/routes/bot.py +++ b/backend/app/routes/bot.py @@ -9,6 +9,7 @@ from app.routes.schemas.bot import ( Agent, AgentTool, + BedrockKnowledgeBaseOutput, BotInput, BotMetaOutput, BotModifyInput, @@ -17,11 +18,11 @@ BotPresignedUrlOutput, BotSummaryOutput, BotSwitchVisibilityInput, + ConversationQuickStarter, EmbeddingParams, GenerationParams, Knowledge, SearchParams, - ConversationQuickStarter, ) from app.usecases.bot import ( create_new_bot, @@ -113,6 +114,7 @@ def get_all_bots( description=bot.description, is_public=bot.is_public, sync_status=bot.sync_status, + has_bedrock_knowledge_base=bot.has_bedrock_knowledge_base, ) for bot in bots ] @@ -150,6 +152,7 @@ def get_private_bot(request: Request, bot_id: str): source_urls=bot.knowledge.source_urls, sitemap_urls=bot.knowledge.sitemap_urls, filenames=bot.knowledge.filenames, + s3_urls=bot.knowledge.s3_urls, ), generation_params=GenerationParams( max_tokens=bot.generation_params.max_tokens, @@ -172,6 +175,11 @@ def get_private_bot(request: Request, bot_id: str): ) for starter in bot.conversation_quick_starters ], + bedrock_knowledge_base=( + BedrockKnowledgeBaseOutput(**bot.bedrock_knowledge_base.model_dump()) + if bot.bedrock_knowledge_base + else None + ), ) return output diff --git a/backend/app/routes/schemas/bot.py b/backend/app/routes/schemas/bot.py index a1305b537..eb39fe63f 100644 --- a/backend/app/routes/schemas/bot.py +++ b/backend/app/routes/schemas/bot.py @@ -3,7 +3,11 @@ from typing import TYPE_CHECKING, Literal, Optional from app.routes.schemas.base import BaseSchema -from pydantic import Field +from app.routes.schemas.bot_kb import ( + BedrockKnowledgeBaseInput, + BedrockKnowledgeBaseOutput, +) +from pydantic import Field, root_validator, validator if TYPE_CHECKING: from app.repositories.models.custom_bot import BotModel @@ -11,7 +15,12 @@ # Knowledge sync status type # NOTE: `ORIGINAL_NOT_FOUND` is used when the original bot is removed. type_sync_status = Literal[ - "QUEUED", "RUNNING", "SUCCEEDED", "FAILED", "ORIGINAL_NOT_FOUND" + "QUEUED", + "KNOWLEDGE_BASE_STACK_CREATED", + "RUNNING", + "SUCCEEDED", + "FAILED", + "ORIGINAL_NOT_FOUND", ] @@ -50,13 +59,34 @@ class Knowledge(BaseSchema): source_urls: list[str] sitemap_urls: list[str] filenames: list[str] + s3_urls: list[str] + + @validator("s3_urls", each_item=True) + def validate_s3_url(cls, v): + if not v.startswith("s3://"): + raise ValueError(f"Invalid S3 URL format: {v}") + + url_parts = v.replace("s3://", "").split("/") + if len(url_parts) < 1: + raise ValueError(f"Invalid S3 URL format: {v}") + + bucket_name = url_parts.pop(0) + prefix = "/".join(url_parts) + + if not bucket_name: + raise ValueError(f"Invalid S3 URL format: {v}") + + if not v.endswith("/"): + raise ValueError(f"Invalid S3 URL format (must end with a '/'): {v}") + + return v class KnowledgeDiffInput(BaseSchema): source_urls: list[str] sitemap_urls: list[str] + s3_urls: list[str] added_filenames: list[str] - # updated_filenames: list[str] deleted_filenames: list[str] unchanged_filenames: list[str] @@ -78,6 +108,7 @@ class BotInput(BaseSchema): knowledge: Knowledge | None display_retrieved_chunks: bool conversation_quick_starters: list[ConversationQuickStarter] | None + bedrock_knowledge_base: BedrockKnowledgeBaseInput | None = None class BotModifyInput(BaseSchema): @@ -91,6 +122,7 @@ class BotModifyInput(BaseSchema): knowledge: KnowledgeDiffInput | None display_retrieved_chunks: bool conversation_quick_starters: list[ConversationQuickStarter] | None + bedrock_knowledge_base: BedrockKnowledgeBaseInput | None = None def has_update_files(self) -> bool: return self.knowledge is not None and ( @@ -103,10 +135,13 @@ def is_embedding_required(self, current_bot_model: BotModel) -> bool: return True if self.knowledge is not None and current_bot_model.has_knowledge(): - if set(self.knowledge.source_urls) == set( - current_bot_model.knowledge.source_urls - ) and set(self.knowledge.sitemap_urls) == set( - current_bot_model.knowledge.sitemap_urls + if ( + set(self.knowledge.source_urls) + == set(current_bot_model.knowledge.source_urls) + and set(self.knowledge.sitemap_urls) + == set(current_bot_model.knowledge.sitemap_urls) + and set(self.knowledge.s3_urls) + == set(current_bot_model.knowledge.s3_urls) ): pass else: @@ -142,6 +177,7 @@ class BotModifyOutput(BaseSchema): agent: Agent knowledge: Knowledge conversation_quick_starters: list[ConversationQuickStarter] + bedrock_knowledge_base: BedrockKnowledgeBaseOutput | None class BotOutput(BaseSchema): @@ -165,6 +201,7 @@ class BotOutput(BaseSchema): sync_last_exec_id: str display_retrieved_chunks: bool conversation_quick_starters: list[ConversationQuickStarter] + bedrock_knowledge_base: BedrockKnowledgeBaseOutput | None class BotMetaOutput(BaseSchema): @@ -180,6 +217,7 @@ class BotMetaOutput(BaseSchema): # This can be `False` if the bot is not owned by the user and original bot is removed. available: bool sync_status: type_sync_status + has_bedrock_knowledge_base: bool class BotSummaryOutput(BaseSchema): diff --git a/backend/app/routes/schemas/bot_kb.py b/backend/app/routes/schemas/bot_kb.py new file mode 100644 index 000000000..cc8b5a0d9 --- /dev/null +++ b/backend/app/routes/schemas/bot_kb.py @@ -0,0 +1,58 @@ +from typing import Literal + +from app.routes.schemas.base import BaseSchema +from pydantic import Field + +# Ref: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_ChunkingConfiguration.html +type_kb_chunking_strategy = Literal["default", "fixed_size", "none"] +type_kb_embeddings_model = Literal["titan_v1", "cohere_multilingual_v3"] +type_kb_search_type = Literal["hybrid", "semantic"] + +# OpenSearch Serverless Analyzer +# Ref: https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-genref.html +type_os_character_filter = Literal["icu_normalizer"] +type_os_tokenizer = Literal["kuromoji_tokenizer", "icu_tokenizer"] +type_os_token_filter = Literal[ + "kuromoji_baseform", + "kuromoji_part_of_speech", + "kuromoji_stemmer", + "cjk_width", + "ja_stop", + "lowercase", + "icu_folding", +] + + +class SearchParams(BaseSchema): + max_results: int + search_type: type_kb_search_type + + +class AnalyzerParams(BaseSchema): + character_filters: list[type_os_character_filter] + tokenizer: type_os_tokenizer + token_filters: list[type_os_token_filter] + + +class OpenSearchParams(BaseSchema): + analyzer: AnalyzerParams | None + + +class BedrockKnowledgeBaseInput(BaseSchema): + embeddings_model: type_kb_embeddings_model + open_search: OpenSearchParams + chunking_strategy: type_kb_chunking_strategy + search_params: SearchParams + max_tokens: int | None = None + overlap_percentage: int | None = None + + +class BedrockKnowledgeBaseOutput(BaseSchema): + embeddings_model: type_kb_embeddings_model + open_search: OpenSearchParams + chunking_strategy: type_kb_chunking_strategy + search_params: SearchParams + max_tokens: int | None = None + overlap_percentage: int | None = None + knowledge_base_id: str | None = None + data_source_ids: list[str] | None = None diff --git a/backend/app/usecases/bot.py b/backend/app/usecases/bot.py index ae23c5460..ce504c05b 100644 --- a/backend/app/usecases/bot.py +++ b/backend/app/usecases/bot.py @@ -37,6 +37,7 @@ KnowledgeModel, SearchParamsModel, ) +from app.repositories.models.custom_bot_kb import BedrockKnowledgeBaseModel from app.routes.schemas.bot import ( Agent, AgentTool, @@ -52,6 +53,7 @@ SearchParams, type_sync_status, ) +from app.routes.schemas.bot_kb import BedrockKnowledgeBaseOutput from app.utils import ( compose_upload_document_s3_path, compose_upload_temp_s3_path, @@ -102,15 +104,18 @@ def create_new_bot(user_id: str, bot_input: BotInput) -> BotOutput: len(bot_input.knowledge.source_urls) > 0 or len(bot_input.knowledge.sitemap_urls) > 0 or len(bot_input.knowledge.filenames) > 0 + or len(bot_input.knowledge.s3_urls) > 0 ) sync_status: type_sync_status = "QUEUED" if has_knowledge else "SUCCEEDED" source_urls = [] sitemap_urls = [] filenames = [] + s3_urls = [] if bot_input.knowledge: source_urls = bot_input.knowledge.source_urls sitemap_urls = bot_input.knowledge.sitemap_urls + s3_urls = bot_input.knowledge.s3_urls # Commit changes to S3 _update_s3_documents_by_diff( @@ -186,7 +191,10 @@ def create_new_bot(user_id: str, bot_input: BotInput) -> BotOutput: search_params=SearchParamsModel(**search_params), agent=agent, knowledge=KnowledgeModel( - source_urls=source_urls, sitemap_urls=sitemap_urls, filenames=filenames + source_urls=source_urls, + sitemap_urls=sitemap_urls, + filenames=filenames, + s3_urls=s3_urls, ), sync_status=sync_status, sync_status_reason="", @@ -206,6 +214,13 @@ def create_new_bot(user_id: str, bot_input: BotInput) -> BotOutput: for starter in bot_input.conversation_quick_starters ] ), + bedrock_knowledge_base=( + BedrockKnowledgeBaseModel( + **(bot_input.bedrock_knowledge_base.model_dump()) + ) + if bot_input.bedrock_knowledge_base + else None + ), ), ) return BotOutput( @@ -232,7 +247,10 @@ def create_new_bot(user_id: str, bot_input: BotInput) -> BotOutput: ] ), knowledge=Knowledge( - source_urls=source_urls, sitemap_urls=sitemap_urls, filenames=filenames + source_urls=source_urls, + sitemap_urls=sitemap_urls, + filenames=filenames, + s3_urls=s3_urls, ), sync_status=sync_status, sync_status_reason="", @@ -249,6 +267,13 @@ def create_new_bot(user_id: str, bot_input: BotInput) -> BotOutput: for starter in bot_input.conversation_quick_starters ] ), + bedrock_knowledge_base=( + BedrockKnowledgeBaseOutput( + **(bot_input.bedrock_knowledge_base.model_dump()) + ) + if bot_input.bedrock_knowledge_base + else None + ), ) @@ -259,11 +284,13 @@ def modify_owned_bot( source_urls = [] sitemap_urls = [] filenames = [] + s3_urls = [] sync_status: type_sync_status = "QUEUED" if modify_input.knowledge: source_urls = modify_input.knowledge.source_urls sitemap_urls = modify_input.knowledge.sitemap_urls + s3_urls = modify_input.knowledge.s3_urls # Commit changes to S3 _update_s3_documents_by_diff( @@ -350,6 +377,7 @@ def modify_owned_bot( source_urls=source_urls, sitemap_urls=sitemap_urls, filenames=filenames, + s3_urls=s3_urls, ), sync_status=sync_status, sync_status_reason="", @@ -365,6 +393,13 @@ def modify_owned_bot( for starter in modify_input.conversation_quick_starters ] ), + bedrock_knowledge_base=( + BedrockKnowledgeBaseModel( + **modify_input.bedrock_knowledge_base.model_dump() + ) + if modify_input.bedrock_knowledge_base + else None + ), ) return BotModifyOutput( @@ -389,6 +424,7 @@ def modify_owned_bot( source_urls=source_urls, sitemap_urls=sitemap_urls, filenames=filenames, + s3_urls=s3_urls, ), conversation_quick_starters=( [] @@ -401,6 +437,13 @@ def modify_owned_bot( for starter in modify_input.conversation_quick_starters ] ), + bedrock_knowledge_base=( + BedrockKnowledgeBaseOutput( + **(modify_input.bedrock_knowledge_base.model_dump()) + ) + if modify_input.bedrock_knowledge_base + else None + ), ) @@ -471,6 +514,7 @@ def fetch_all_bots_by_user_id( description=bot.description, is_public=True, sync_status=bot.sync_status, + has_bedrock_knowledge_base=bot.has_bedrock_knowledge_base(), ) except RecordNotFoundError: # Original bot is removed @@ -488,6 +532,7 @@ def fetch_all_bots_by_user_id( description="This item is no longer available", is_public=False, sync_status="ORIGINAL_NOT_FOUND", + has_bedrock_knowledge_base=False, ) if is_original_available and ( @@ -535,6 +580,9 @@ def fetch_all_bots_by_user_id( description=item["Description"], is_public="PublicBotId" in item, sync_status=item["SyncStatus"], + has_bedrock_knowledge_base=( + True if item.get("BedrockKnowledgeBase", None) else False + ), ) ) diff --git a/backend/app/usecases/chat.py b/backend/app/usecases/chat.py index e0282a8d2..cbdd6296e 100644 --- a/backend/app/usecases/chat.py +++ b/backend/app/usecases/chat.py @@ -316,6 +316,7 @@ def chat(user_id: str, chat_input: ChatInput) -> ChatOutput: logger.info(f"Thinking log: {thinking_log}") reply_txt = agent_response["output"] + conversation.should_continue = False else: message_map = conversation.message_map search_results = [] @@ -325,9 +326,7 @@ def chat(user_id: str, chat_input: ChatInput) -> ChatOutput: # NOTE: Currently embedding not support multi-modal. For now, use the last content. query = conversation.message_map[user_msg_id].content[-1].body - search_results = search_related_docs( - bot_id=bot.id, limit=bot.search_params.max_results, query=query - ) + search_results = search_related_docs(bot=bot, query=query) logger.info(f"Search results from vector store: {search_results}") # Insert contexts to instruction @@ -390,6 +389,8 @@ def chat(user_id: str, chat_input: ChatInput) -> ChatOutput: input_tokens = metrics.input_tokens output_tokens = metrics.output_tokens price = calculate_price(chat_input.message.model, input_tokens, output_tokens) + # Published API does not support continued generation + conversation.should_continue = False # Issue id for new assistant message assistant_msg_id = str(ULID()) @@ -423,9 +424,6 @@ def chat(user_id: str, chat_input: ChatInput) -> ChatOutput: conversation.total_price += price - # If continued, save the state - conversation.should_continue = response.stop_reason == "max_tokens" - # Store updated conversation store_conversation(user_id, conversation) # Update bot last used time @@ -615,8 +613,7 @@ def fetch_related_documents( return None chunks = search_related_docs( - bot_id=bot.id, - limit=bot.search_params.max_results, + bot=bot, query=chat_input.message.content[-1].body, ) diff --git a/backend/app/utils.py b/backend/app/utils.py index d4308e296..102518e20 100644 --- a/backend/app/utils.py +++ b/backend/app/utils.py @@ -40,6 +40,11 @@ def get_anthropic_client(region=BEDROCK_REGION): return client +def get_bedrock_agent_client(region=REGION): + client = boto3.client("bedrock-agent-runtime", region) + return client + + def get_current_time(): # Get current time as milliseconds epoch time return int(datetime.now().timestamp() * 1000) diff --git a/backend/app/vector_search.py b/backend/app/vector_search.py index 7797876cc..a1d8f3f8c 100644 --- a/backend/app/vector_search.py +++ b/backend/app/vector_search.py @@ -4,10 +4,14 @@ from typing import Any, Literal from app.bedrock import calculate_query_embedding -from app.utils import generate_presigned_url, query_postgres +from app.repositories.custom_bot import find_public_bot_by_id +from app.repositories.models.custom_bot import BotModel +from app.utils import generate_presigned_url, get_bedrock_agent_client, query_postgres +from botocore.exceptions import ClientError from pydantic import BaseModel logger = logging.getLogger(__name__) +agent_client = get_bedrock_agent_client() class SearchResult(BaseModel): @@ -62,7 +66,7 @@ def get_source_link(source: str) -> tuple[Literal["s3", "url"], str]: return "url", f"https://www.youtube.com/watch?v={source}" -def search_related_docs(bot_id: str, limit: int, query: str) -> list[SearchResult]: +def _pgvector_search(bot_id: str, limit: int, query: str) -> list[SearchResult]: """Search to fetch top n most related documents from pgvector. Args: bot_id (str): bot id @@ -93,3 +97,55 @@ def search_related_docs(bot_id: str, limit: int, query: str) -> list[SearchResul SearchResult(rank=i, bot_id=r[1], content=r[2], source=r[3]) for i, r in enumerate(results) ] + + +def _bedrock_knowledge_base_search(bot: BotModel, query: str) -> list[SearchResult]: + assert bot.bedrock_knowledge_base is not None + if bot.bedrock_knowledge_base.search_params.search_type == "semantic": + search_type = "SEMANTIC" + elif bot.bedrock_knowledge_base.search_params.search_type == "hybrid": + search_type = "HYBRID" + else: + raise ValueError("Invalid search type") + + limit = bot.bedrock_knowledge_base.search_params.max_results + knowledge_base_id = bot.bedrock_knowledge_base.knowledge_base_id + + try: + response = agent_client.retrieve( + knowledgeBaseId=knowledge_base_id, + retrievalQuery={"text": query}, + retrievalConfiguration={ + "vectorSearchConfiguration": { + "numberOfResults": limit, + "overrideSearchType": search_type, + } + }, + ) + + search_results = [] + for i, retrieval_result in enumerate(response.get("retrievalResults", [])): + content = retrieval_result.get("content", {}).get("text", "") + source = ( + retrieval_result.get("location", {}) + .get("s3Location", {}) + .get("uri", "") + ) + + search_results.append( + SearchResult(rank=i, bot_id=bot.id, content=content, source=source) + ) + + return search_results + + except ClientError as e: + logger.error(f"Error querying Bedrock Knowledge Base: {e}") + raise e + + +def search_related_docs(bot: BotModel, query: str) -> list[SearchResult]: + if bot.has_bedrock_knowledge_base(): + logger.info("Searching related documents using Bedrock Knowledge Base.") + return _bedrock_knowledge_base_search(bot, query) + logger.info("Searching related documents using pgvector.") + return _pgvector_search(bot.id, bot.search_params.max_results, query) diff --git a/backend/app/websocket.py b/backend/app/websocket.py index 289ee4bcb..6d2532b42 100644 --- a/backend/app/websocket.py +++ b/backend/app/websocket.py @@ -169,9 +169,7 @@ def process_chat_input( # Fetch most related documents from vector store # NOTE: Currently embedding not support multi-modal. For now, use the last text content. query = conversation.message_map[user_msg_id].content[-1].body - search_results = search_related_docs( - bot_id=bot.id, limit=bot.search_params.max_results, query=query - ) + search_results = search_related_docs(bot=bot, query=query) logger.info(f"Search results from vector store: {search_results}") # Insert contexts to instruction diff --git a/backend/embedding/Dockerfile b/backend/embedding/Dockerfile index 8b7ad9061..8a6a83fea 100644 --- a/backend/embedding/Dockerfile +++ b/backend/embedding/Dockerfile @@ -40,9 +40,13 @@ RUN apt-get update && apt-get install -y \ WORKDIR /src COPY ./embedding/pyproject.toml ./embedding/poetry.lock ./ -RUN pip install poetry --no-cache-dir && \ + +ENV POETRY_REQUESTS_TIMEOUT=10800 +RUN python -m pip install --upgrade pip && \ + pip install poetry --no-cache-dir && \ poetry config virtualenvs.create false && \ - poetry install --no-interaction --no-ansi + poetry install --no-interaction --no-ansi --only main && \ + poetry cache clear --all pypi RUN playwright install chromium diff --git a/backend/embedding/main.py b/backend/embedding/main.py index 38baf9e79..2a92b8176 100644 --- a/backend/embedding/main.py +++ b/backend/embedding/main.py @@ -248,11 +248,11 @@ def main( if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("Keys", type=str) - args = parser.parse_args() + # Get dynamodb stream event + event_json = os.getenv("EVENT") + logger.debug(f"event_json: {event_json}") - keys = json.loads(args.Keys) + keys = json.loads(event_json) # type:ignore sk = keys["SK"]["S"] bot_id = decompose_bot_id(sk) diff --git a/backend/embedding/poetry.lock b/backend/embedding/poetry.lock index ff64e7c3d..8285b5aa0 100644 --- a/backend/embedding/poetry.lock +++ b/backend/embedding/poetry.lock @@ -208,13 +208,13 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p [[package]] name = "aws-lambda-powertools" -version = "2.39.1" +version = "2.40.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"}, + {file = "aws_lambda_powertools-2.40.1-py3-none-any.whl", hash = "sha256:606feeb4c233d9f2cfbccc44789cf44e0790ddec6ae9d290dff9ca330ae51934"}, + {file = "aws_lambda_powertools-2.40.1.tar.gz", hash = "sha256:d7a1e2fdf4c8089e5d65fc54ac2f0f4e7fc46ae17f806737e6a1bec494095daf"}, ] [package.dependencies] @@ -309,17 +309,17 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.34.127" +version = "1.34.143" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.127-py3-none-any.whl", hash = "sha256:d370befe4fb7aea5bc383057d7dad18dda5d0cf3cd3295915bcc8c8c4191905c"}, - {file = "boto3-1.34.127.tar.gz", hash = "sha256:58ccdeae3a96811ecc9d5d866d8226faadbd0ee1891756e4a04d5186e9a57a64"}, + {file = "boto3-1.34.143-py3-none-any.whl", hash = "sha256:0d16832f23e6bd3ae94e35ea8e625529850bfad9baccd426de96ad8f445d8e03"}, + {file = "boto3-1.34.143.tar.gz", hash = "sha256:b590ce80c65149194def43ebf0ea1cf0533945502507837389a8d22e3ecbcf05"}, ] [package.dependencies] -botocore = ">=1.34.127,<1.35.0" +botocore = ">=1.34.143,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -328,13 +328,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.127" +version = "1.34.143" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.127-py3-none-any.whl", hash = "sha256:e14fa28c8bb141de965e700f88b196d17c67a703c7f0f5c7e14f7dd1cf636011"}, - {file = "botocore-1.34.127.tar.gz", hash = "sha256:a377871742c40603d559103f19acb7bc93cfaf285e68f21b81637ec396099877"}, + {file = "botocore-1.34.143-py3-none-any.whl", hash = "sha256:094aea179e8aaa1bc957ad49cc27d93b189dd3a1f3075d8b0ca7c445a2a88430"}, + {file = "botocore-1.34.143.tar.gz", hash = "sha256:059f032ec05733a836e04e869c5a15534420102f93116f3bc9a5b759b0651caf"}, ] [package.dependencies] @@ -800,22 +800,21 @@ files = [ [[package]] name = "duckduckgo-search" -version = "6.1.6" +version = "6.1.12" description = "Search for words, documents, images, news, maps and text translation using the DuckDuckGo.com search engine." optional = false python-versions = ">=3.8" files = [ - {file = "duckduckgo_search-6.1.6-py3-none-any.whl", hash = "sha256:6139ab17579e96ca7c5ed9398365245a36ecca8e7432545e3115ef90a9304eb7"}, - {file = "duckduckgo_search-6.1.6.tar.gz", hash = "sha256:42c83d58f4f1d717a580b89cc86861cbae59e46e75288243776c53349d006bf1"}, + {file = "duckduckgo_search-6.1.12-py3-none-any.whl", hash = "sha256:1a3c674de4a9307fe7a05b76726c2bf00d8a97c408ff443d07d7c7a8ac264ed2"}, + {file = "duckduckgo_search-6.1.12.tar.gz", hash = "sha256:6e16ddd54ebfa6567702bd371a95d396e54ad7ace2edd1cb7f4f565547eb065c"}, ] [package.dependencies] click = ">=8.1.7" -orjson = ">=3.10.4" -pyreqwest-impersonate = ">=0.4.7" +pyreqwest-impersonate = ">=0.4.9" [package.extras] -dev = ["mypy (>=1.10.0)", "pytest (>=8.2.2)", "pytest-asyncio (>=0.23.7)", "ruff (>=0.4.8)"] +dev = ["mypy (>=1.10.1)", "pytest (>=8.2.2)", "pytest-asyncio (>=0.23.7)", "ruff (>=0.5.0)"] lxml = ["lxml (>=5.2.2)"] [[package]] @@ -866,18 +865,18 @@ files = [ [[package]] name = "filelock" -version = "3.15.1" +version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"}, - {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [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)"] +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]] @@ -904,53 +903,53 @@ files = [ [[package]] name = "fonttools" -version = "4.53.0" +version = "4.53.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.53.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20"}, - {file = "fonttools-4.53.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d"}, - {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6"}, - {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5"}, - {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9"}, - {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca"}, - {file = "fonttools-4.53.0-cp310-cp310-win32.whl", hash = "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068"}, - {file = "fonttools-4.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68"}, - {file = "fonttools-4.53.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec"}, - {file = "fonttools-4.53.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749"}, - {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161"}, - {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee"}, - {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6"}, - {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e"}, - {file = "fonttools-4.53.0-cp311-cp311-win32.whl", hash = "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005"}, - {file = "fonttools-4.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796"}, - {file = "fonttools-4.53.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a"}, - {file = "fonttools-4.53.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4"}, - {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06"}, - {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d"}, - {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109"}, - {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2"}, - {file = "fonttools-4.53.0-cp312-cp312-win32.whl", hash = "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea"}, - {file = "fonttools-4.53.0-cp312-cp312-win_amd64.whl", hash = "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380"}, - {file = "fonttools-4.53.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12"}, - {file = "fonttools-4.53.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4"}, - {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce"}, - {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f"}, - {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206"}, - {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd"}, - {file = "fonttools-4.53.0-cp38-cp38-win32.whl", hash = "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af"}, - {file = "fonttools-4.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b"}, - {file = "fonttools-4.53.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac"}, - {file = "fonttools-4.53.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d"}, - {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1"}, - {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f"}, - {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64"}, - {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0"}, - {file = "fonttools-4.53.0-cp39-cp39-win32.whl", hash = "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9"}, - {file = "fonttools-4.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2"}, - {file = "fonttools-4.53.0-py3-none-any.whl", hash = "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4"}, - {file = "fonttools-4.53.0.tar.gz", hash = "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002"}, + {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, + {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, + {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, + {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, + {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, + {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, + {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, + {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, + {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, + {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, + {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, + {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, + {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, + {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, + {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, + {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, + {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, + {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, + {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, + {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, + {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, + {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, + {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, + {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, + {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, + {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, + {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, + {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, + {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, + {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, + {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, + {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, + {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, + {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, + {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, + {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, ] [package.extras] @@ -1055,13 +1054,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.6.0" +version = "2024.6.1" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.6.0-py3-none-any.whl", hash = "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee"}, - {file = "fsspec-2024.6.0.tar.gz", hash = "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2"}, + {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, + {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, ] [package.extras] @@ -1094,37 +1093,38 @@ tqdm = ["tqdm"] [[package]] name = "google-api-core" -version = "2.8.0" +version = "2.19.1" description = "Google API client core library" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "google-api-core-2.8.0.tar.gz", hash = "sha256:065bb8e11c605fd232707ae50963dc1c8af5b3c95b4568887515985e6c1156b3"}, - {file = "google_api_core-2.8.0-py3-none-any.whl", hash = "sha256:1b9f59236ce1bae9a687c1d4f22957e79a2669e53d032893f6bf0fca54f6931d"}, + {file = "google-api-core-2.19.1.tar.gz", hash = "sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd"}, + {file = "google_api_core-2.19.1-py3-none-any.whl", hash = "sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125"}, ] [package.dependencies] -google-auth = ">=1.25.0,<3.0dev" -googleapis-common-protos = ">=1.52.0,<2.0dev" -grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} -grpcio-status = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} -protobuf = ">=3.12.0" -requests = ">=2.18.0,<3.0.0dev" +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} +grpcio-status = {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} +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,<6.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" [package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio-status (>=1.33.2,<2.0dev)"] -grpcgcp = ["grpcio-gcp (>=0.2.2)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2)"] +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" +version = "2.32.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"}, + {file = "google_auth-2.32.0-py2.py3-none-any.whl", hash = "sha256:53326ea2ebec768070a94bee4e1b9194c9646ea0c2bd72422785bd0f9abfad7b"}, + {file = "google_auth-2.32.0.tar.gz", hash = "sha256:49315be72c55a6a37d62819e3573f6b416aca00721f7e3e31a008d928bf64022"}, ] [package.dependencies] @@ -1141,35 +1141,34 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-cloud-vision" -version = "2.7.2" -description = "Cloud Vision API API client library" +version = "3.7.3" +description = "Google Cloud Vision API client library" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "google-cloud-vision-2.7.2.tar.gz", hash = "sha256:e0d4d6c9fdeb9ddc35cc720d94132da0499d7d25c69d4fe3121c5a6fcd3b560e"}, - {file = "google_cloud_vision-2.7.2-py2.py3-none-any.whl", hash = "sha256:1a26fbe86ef268ac77cd736d60f8163a9a5278c9b8f205a74c96031ecf74075b"}, + {file = "google-cloud-vision-3.7.3.tar.gz", hash = "sha256:ee48c48e820c7e09932663986970fef456dc0f45c7af729d46f1f3dd97c1dfb6"}, + {file = "google_cloud_vision-3.7.3-py2.py3-none-any.whl", hash = "sha256:d989b7e91880f7bd11d65530c3140fc130bbe29513aebb80f3d3e107764265d1"}, ] [package.dependencies] -google-api-core = {version = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.15.0" - -[package.extras] -libcst = ["libcst (>=0.2.5)"] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<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,<6.0.0dev" [[package]] name = "googleapis-common-protos" -version = "1.63.1" +version = "1.63.2" 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"}, + {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"}, + {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"}, ] [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" +protobuf = ">=3.20.2,<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)"] @@ -1247,76 +1246,76 @@ test = ["objgraph", "psutil"] [[package]] name = "grpcio" -version = "1.64.1" +version = "1.65.0" 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"}, + {file = "grpcio-1.65.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:66ea0ca6108fcb391444bb7b37d04eac85bfaea1cfaf16db675d3734fc74ca1b"}, + {file = "grpcio-1.65.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:45d371dc4436fdcc31677f75b3ebe6175fbf0712ced49e0e4dfc18bbaf50f5a7"}, + {file = "grpcio-1.65.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:02dbbe113ec48581da07b7ddf52bfd49f5772374c4b5e36ea25131ce00b4f4f3"}, + {file = "grpcio-1.65.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5c9ee7b8f1ac82cc24f223cd7ec803c17079f90e63022d3e66c5e53fff0afb99"}, + {file = "grpcio-1.65.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da927f8a44e42837ae0027a3a063c85e2b26491d2babd4554e116f66fd46045d"}, + {file = "grpcio-1.65.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9916ea670a589f95f2453a4a5040294ace096271c126e684a1e45e61af76c988"}, + {file = "grpcio-1.65.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c46114787c5f530e845d2781f914600aade04b4f132dd012efb31bc4f76a72bb"}, + {file = "grpcio-1.65.0-cp310-cp310-win32.whl", hash = "sha256:1362d94ac9c05b202736180d23296840e00f495859b206261e6ed03a6d41978b"}, + {file = "grpcio-1.65.0-cp310-cp310-win_amd64.whl", hash = "sha256:00ed0828980009ce852d98230cdd2d5a22a4bcb946b5a0f6334dfd8258374cd7"}, + {file = "grpcio-1.65.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:25303f3747522252dd9cfcbacb88d828a36040f513e28fba17ee6184ebc3d330"}, + {file = "grpcio-1.65.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a2b368717dd8e0f6cb7e412d3b3bfb0012f61c04b2f76dbed669b0f5cf3fb0c"}, + {file = "grpcio-1.65.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:93c41fb74c576dc0130b190a5775197282115c6abbe1d913d42d9a2f9d98fdae"}, + {file = "grpcio-1.65.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34eb4fb9ef4d11ea741d264916d1b31a9e169d539a6f1c8300e04c493eec747e"}, + {file = "grpcio-1.65.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55c41272f9d7d3503e3e3e93f3f98589f07075eebd24e1c291a1df2e8ef40a49"}, + {file = "grpcio-1.65.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c275bac926754022c89ef03f16470f65b811e2cc25f2167d365564ad43e31001"}, + {file = "grpcio-1.65.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b02db2a59071f4d05cfc4d0c972759778d27e1d3347f22ca178b91117ad10541"}, + {file = "grpcio-1.65.0-cp311-cp311-win32.whl", hash = "sha256:ec9f41b9b0eb6407a6edb21bc22cb32e03cae76cde9c1d8bb151ed77c2c5af94"}, + {file = "grpcio-1.65.0-cp311-cp311-win_amd64.whl", hash = "sha256:3efc8b0600870f5e518dd2738188b3ba7b1bb2668244c9a2a8c4debda4ffe62b"}, + {file = "grpcio-1.65.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:d787abafafa9ed71e17220d4178c883abdb380e0484bd8965cb2e06375c7495b"}, + {file = "grpcio-1.65.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:52347f21d6ec77d7e7e4d5037f5e8ac0a0c851856d9459f9f95b009c2c740b4a"}, + {file = "grpcio-1.65.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:b16e1cd9b9cb9ac942cb20b7a2b1c5d35b9e61017e2998bf242a6f7748071795"}, + {file = "grpcio-1.65.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89bc9c8c6743a48f115fea8f3fada76be269d1914bf636e5fdb7cec9cdf192bc"}, + {file = "grpcio-1.65.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5a2ae900e6423438c4a9a5be38e9228621340a18333371215c0419d24a254ef"}, + {file = "grpcio-1.65.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4f451091ddd28f00c655f0b1e208cca705d40e4fde56a3cf849fead61a700d10"}, + {file = "grpcio-1.65.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4e30cd885e02abb98d6b0d5beb6259a567b0ce1416c498ec815fe383adb77864"}, + {file = "grpcio-1.65.0-cp312-cp312-win32.whl", hash = "sha256:9a9a0ce10a07923ebd48c056060052ebddfbec3193cdd32207af358ef317b00a"}, + {file = "grpcio-1.65.0-cp312-cp312-win_amd64.whl", hash = "sha256:87d9350ffe1a84b7441db7c70fdb4e51269a379f7a95d696d0d133831c4f9a19"}, + {file = "grpcio-1.65.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:0c504b30fc2fba143d9254e0240243b5866df9b7523162448797f4b21b5f30d5"}, + {file = "grpcio-1.65.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:480be4d41ceb5a7f22ecfc8db1ab68aeb58cc1a2da0865a91917d3cd0438dac7"}, + {file = "grpcio-1.65.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:984a1627b50d5df4a24120302ca95adb5139ba1c40354ba258fc2913666d8ee7"}, + {file = "grpcio-1.65.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f242956c0f4985dfcc920cd251cd7a899ca168e157e98c9b74a688657e813ad6"}, + {file = "grpcio-1.65.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ea93f570b2341c69635b8a333afb99fb4d5584f26a9cc94f06e56c943648aab"}, + {file = "grpcio-1.65.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1bebefd76517a43d0e77a5dcd61a8b69e9775340d856a0b35c6368ae628f7714"}, + {file = "grpcio-1.65.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:356d10a491a92a08c21aef806379f7b020f591c23580e3d29aeeb59d45908c86"}, + {file = "grpcio-1.65.0-cp38-cp38-win32.whl", hash = "sha256:c3294fd3ef9faa1fe14ad15d72dd7d2ee9fee6d3bd29a08c53e59a3c94de9cc9"}, + {file = "grpcio-1.65.0-cp38-cp38-win_amd64.whl", hash = "sha256:a2defc49c984550f25034e88d17a7e69dba6deb2b981d8f56f19b3aaa788ff30"}, + {file = "grpcio-1.65.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:b73022222ed4bf718d3d8527a9b88b162074a62c7530d30f4e951b56304b0f19"}, + {file = "grpcio-1.65.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16e0f789158ecc8309e0a2f16cb8c5e4753f351a7673aab75f42783c83f1e38b"}, + {file = "grpcio-1.65.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:cb0bd8bfba21fe0318317bf11687c67a3f8ce726369c0b3ccf4e6607fc5bc5f2"}, + {file = "grpcio-1.65.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1096f0fa79ec601aefd71685d3a610cdde96274c38cd8adcef972660297669a"}, + {file = "grpcio-1.65.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e576a88ce82fea70e68c548aceb5cd560c27da50091581996858bbbe01230c83"}, + {file = "grpcio-1.65.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ab70bd1ccb05ef373b691a9b9985289d8b2cf63c704471f5ee132e228d351af5"}, + {file = "grpcio-1.65.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:03eab632a8ce8dba00d97482d2821bf752a7c3cb4dc051be6c587ad3ca1c3e6d"}, + {file = "grpcio-1.65.0-cp39-cp39-win32.whl", hash = "sha256:f19bb85795ca82e007be427e7b6ac5e730023ffbab69d39ddeb1b84c6339df16"}, + {file = "grpcio-1.65.0-cp39-cp39-win_amd64.whl", hash = "sha256:dbd7eeafa67d8e403ac61caa31ebda2861435dcfd7bb7953c4ef05ad2ecf74bf"}, + {file = "grpcio-1.65.0.tar.gz", hash = "sha256:2c7891f66daefc80cce1bed6bc0c2802d26dac46544ba1be79c4e7d85661dd73"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.64.1)"] +protobuf = ["grpcio-tools (>=1.65.0)"] [[package]] name = "grpcio-status" -version = "1.64.1" +version = "1.65.0" description = "Status proto mapping for gRPC" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio_status-1.64.1-py3-none-any.whl", hash = "sha256:2ec6e0777958831484a517e32b6ffe0a4272242eae81bff2f5c3707fa58b40e3"}, - {file = "grpcio_status-1.64.1.tar.gz", hash = "sha256:c50bd14eb6506d8580a6c553bea463d7c08499b2c0e93f6d1864c5e8eabb1066"}, + {file = "grpcio_status-1.65.0-py3-none-any.whl", hash = "sha256:ecbbcdd5b49c666fb55efc53a5df42d502a8fcc94ee175b5008540d5e60228f5"}, + {file = "grpcio_status-1.65.0.tar.gz", hash = "sha256:1b546eb66690719bbe737054a0121863cc193d3e8be3223bcd2ea2eb0d0ba11e"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.64.1" +grpcio = ">=1.65.0" protobuf = ">=5.26.1,<6.0dev" [[package]] @@ -1656,22 +1655,22 @@ files = [ [[package]] name = "langchain-core" -version = "0.2.7" +version = "0.2.13" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.7-py3-none-any.whl", hash = "sha256:fd02e153c898486dd728d634684ffc64bc257ff2ba443dc7e53d017ac0bf4658"}, - {file = "langchain_core-0.2.7.tar.gz", hash = "sha256:b0b1b6dfbdedb39426fcb8bd3f07e40eec7964856e3fc384c420ca6dba61b34e"}, + {file = "langchain_core-0.2.13-py3-none-any.whl", hash = "sha256:b9f52003bfda464975413751737c7e6781781398ba14d9aa6c604046d6fc0c6f"}, + {file = "langchain_core-0.2.13.tar.gz", hash = "sha256:a5d8b436639b6aa0955f6db287beb4030c46a8e85951ba3873739c4d47645ee1"}, ] [package.dependencies] jsonpatch = ">=1.33,<2.0" langsmith = ">=0.1.75,<0.2.0" packaging = ">=23.2,<25" -pydantic = ">=1,<3" +pydantic = {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""} PyYAML = ">=5.3" -tenacity = ">=8.1.0,<9.0.0" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langdetect" @@ -1689,18 +1688,18 @@ six = "*" [[package]] name = "langsmith" -version = "0.1.77" +version = "0.1.85" 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.77-py3-none-any.whl", hash = "sha256:2202cc21b1ed7e7b9e5d2af2694be28898afa048c09fdf09f620cbd9301755ae"}, - {file = "langsmith-0.1.77.tar.gz", hash = "sha256:4ace09077a9a4e412afeb4b517ca68e7de7b07f36e4792dc8236ac5207c0c0c7"}, + {file = "langsmith-0.1.85-py3-none-any.whl", hash = "sha256:c1f94384f10cea96f7b4d33fd3db7ec180c03c7468877d50846f881d2017ff94"}, + {file = "langsmith-0.1.85.tar.gz", hash = "sha256:acff31f9e53efa48586cf8e32f65625a335c74d7c4fa306d1655ac18452296f6"}, ] [package.dependencies] orjson = ">=3.9.14,<4.0.0" -pydantic = ">=1,<3" +pydantic = {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""} requests = ">=2,<3" [[package]] @@ -1733,40 +1732,55 @@ ocr = ["google-cloud-vision (==1)", "pytesseract"] paddledetection = ["paddlepaddle (==2.1.0)"] tesseract = ["pytesseract"] +[[package]] +name = "llama-cloud" +version = "0.0.6" +description = "" +optional = false +python-versions = "<4,>=3.8" +files = [ + {file = "llama_cloud-0.0.6-py3-none-any.whl", hash = "sha256:0f07c8a865be632b543dec2bcad350a68a61f13413a7421b4b03de32c36f0194"}, + {file = "llama_cloud-0.0.6.tar.gz", hash = "sha256:33b94cd119133dcb2899c9b69e8e1c36aec7bc7e80062c55c65f15618722e091"}, +] + +[package.dependencies] +httpx = ">=0.20.0" +pydantic = ">=1.10" + [[package]] name = "llama-index" -version = "0.10.45" +version = "0.10.54" description = "Interface between LLMs and your data" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index-0.10.45-py3-none-any.whl", hash = "sha256:654871d8587397ecb9048f890934de1f44dee23d2bd4f48230b588b719798c81"}, - {file = "llama_index-0.10.45.tar.gz", hash = "sha256:1bfb5410b2a3b6e1d1898c2713c523be9e592e873ddf16cb47d10dc83d1c6e15"}, + {file = "llama_index-0.10.54-py3-none-any.whl", hash = "sha256:778e7038bd2ccc2ee5eea969ef6d7367253b5c5f82614f9c2419159a93b26dd0"}, + {file = "llama_index-0.10.54.tar.gz", hash = "sha256:d60b601cf166ed0351bb4a4b5ffb1fab100610f898bf882cf1b1a3855b54ebdc"}, ] [package.dependencies] llama-index-agent-openai = ">=0.1.4,<0.3.0" llama-index-cli = ">=0.1.2,<0.2.0" -llama-index-core = "0.10.44" +llama-index-core = "0.10.53.post1" llama-index-embeddings-openai = ">=0.1.5,<0.2.0" -llama-index-indices-managed-llama-cloud = ">=0.1.2,<0.2.0" +llama-index-indices-managed-llama-cloud = ">=0.2.0" llama-index-legacy = ">=0.9.48,<0.10.0" llama-index-llms-openai = ">=0.1.13,<0.2.0" llama-index-multi-modal-llms-openai = ">=0.1.3,<0.2.0" llama-index-program-openai = ">=0.1.3,<0.2.0" llama-index-question-gen-openai = ">=0.1.2,<0.2.0" llama-index-readers-file = ">=0.1.4,<0.2.0" -llama-index-readers-llama-parse = ">=0.1.2,<0.2.0" +llama-index-readers-llama-parse = ">=0.1.2" [[package]] name = "llama-index-agent-openai" -version = "0.2.7" +version = "0.2.8" description = "llama-index agent openai integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_agent_openai-0.2.7-py3-none-any.whl", hash = "sha256:34be65011a508dd8cab0c9a606594f28075b98b0cebe69e3c543adc8564fee0d"}, - {file = "llama_index_agent_openai-0.2.7.tar.gz", hash = "sha256:13ce535f03e32c821763c01e26af4222f3981178622414d3868013a1946e8124"}, + {file = "llama_index_agent_openai-0.2.8-py3-none-any.whl", hash = "sha256:e3e5c58cb1347d336a41391c60539098655f38fa57c1023063df5cfc5f468ef6"}, + {file = "llama_index_agent_openai-0.2.8.tar.gz", hash = "sha256:7f123e86992d6c33f310d36331c32989a921cb76abe9d0fd1cf1e40a7eb65d2e"}, ] [package.dependencies] @@ -1792,13 +1806,13 @@ llama-index-llms-openai = ">=0.1.1,<0.2.0" [[package]] name = "llama-index-core" -version = "0.10.44" +version = "0.10.53.post1" description = "Interface between LLMs and your data" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_core-0.10.44-py3-none-any.whl", hash = "sha256:eea293fb9bafab303bbf6de8f0fca45188971fda80d77fbd4fed5773967ef49c"}, - {file = "llama_index_core-0.10.44.tar.gz", hash = "sha256:df1543e6935bb909b22a50d3f702096c8431bab94642cbb3ba6b07ea9f8edf38"}, + {file = "llama_index_core-0.10.53.post1-py3-none-any.whl", hash = "sha256:565d0967dd8f05456c66f5aca6ee6ee3dbc5645b6a55c81957f776ff029d6a99"}, + {file = "llama_index_core-0.10.53.post1.tar.gz", hash = "sha256:6219a737b66c887b406814b0d9db6e24addd35f3136ffb6a879e54ac3f133406"}, ] [package.dependencies] @@ -1808,18 +1822,18 @@ deprecated = ">=1.2.9.3" dirtyjson = ">=1.0.8,<2.0.0" fsspec = ">=2023.5.0" httpx = "*" -llamaindex-py-client = ">=0.1.18,<0.2.0" +llama-cloud = ">=0.0.6,<0.0.7" nest-asyncio = ">=1.5.8,<2.0.0" networkx = ">=3.0" nltk = ">=3.8.1,<4.0.0" -numpy = "*" +numpy = "<2.0.0" openai = ">=1.1.0" pandas = "*" pillow = ">=9.0.0" PyYAML = ">=6.0.1" requests = ">=2.31.0" SQLAlchemy = {version = ">=1.4.49", extras = ["asyncio"]} -tenacity = ">=8.2.0,<9.0.0" +tenacity = ">=8.2.0,<8.4.0 || >8.4.0,<9.0.0" tiktoken = ">=0.3.3" tqdm = ">=4.66.1,<5.0.0" typing-extensions = ">=4.5.0" @@ -1842,18 +1856,18 @@ llama-index-core = ">=0.10.1,<0.11.0" [[package]] name = "llama-index-indices-managed-llama-cloud" -version = "0.1.6" +version = "0.2.4" description = "llama-index indices llama-cloud integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_indices_managed_llama_cloud-0.1.6-py3-none-any.whl", hash = "sha256:cba33e1a3677b2a2ae7f239119acbf6dc3818f105edc92315729842b56fbc949"}, - {file = "llama_index_indices_managed_llama_cloud-0.1.6.tar.gz", hash = "sha256:74b3b0e9ebf9d348d3054f9fc0c657031acceb9351c31116ad8d5a7ae4729f5c"}, + {file = "llama_index_indices_managed_llama_cloud-0.2.4-py3-none-any.whl", hash = "sha256:35ecc8c4d6098588e911b4bf990f8786765dab94fcd311729de2c2c7b3237bf3"}, + {file = "llama_index_indices_managed_llama_cloud-0.2.4.tar.gz", hash = "sha256:8ee6b11e47f2c5e7302a749b6e2baf893ab602967d86b13c84455b8ee1fb1404"}, ] [package.dependencies] -llama-index-core = ">=0.10.0,<0.11.0" -llamaindex-py-client = ">=0.1.19,<0.2.0" +llama-cloud = ">=0.0.6" +llama-index-core = ">=0.10.48.post1,<0.11.0" [[package]] name = "llama-index-legacy" @@ -1896,13 +1910,13 @@ query-tools = ["guidance (>=0.0.64,<0.0.65)", "jsonpath-ng (>=1.6.0,<2.0.0)", "l [[package]] name = "llama-index-llms-openai" -version = "0.1.22" +version = "0.1.25" description = "llama-index llms openai integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_llms_openai-0.1.22-py3-none-any.whl", hash = "sha256:84a8c910671460ad724ed818192f209f7481e71bcc6528553ba7e66db2e14bcd"}, - {file = "llama_index_llms_openai-0.1.22.tar.gz", hash = "sha256:729bf2ea7043517465e1d585089512b77d8b3ce92233a67c138d5d621061ed56"}, + {file = "llama_index_llms_openai-0.1.25-py3-none-any.whl", hash = "sha256:d1922ad2f2bb4697a6ee2f61793aeb2f5c5606302639559dd9bb0a1d6ab9e73f"}, + {file = "llama_index_llms_openai-0.1.25.tar.gz", hash = "sha256:49750f71d58e762a597ce639a2ccb119195c47aefa8a48c55c77be8a5cec4bc5"}, ] [package.dependencies] @@ -1910,13 +1924,12 @@ llama-index-core = ">=0.10.24,<0.11.0" [[package]] name = "llama-index-multi-modal-llms-openai" -version = "0.1.6" +version = "0.1.7" description = "llama-index multi-modal-llms openai integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_multi_modal_llms_openai-0.1.6-py3-none-any.whl", hash = "sha256:0b6950a6cf98d16ade7d3b9dd0821ecfe457ca103819ae6c3e66cfc9634ca646"}, - {file = "llama_index_multi_modal_llms_openai-0.1.6.tar.gz", hash = "sha256:10de75a877a444af35306385faad9b9f0624391e55309970564114a080a0578c"}, + {file = "llama_index_multi_modal_llms_openai-0.1.7-py3-none-any.whl", hash = "sha256:a86fa4a8f8372da31b978cc28d14da75ce6a39f42b1eea90cd3ac93017644766"}, ] [package.dependencies] @@ -1957,13 +1970,13 @@ llama-index-program-openai = ">=0.1.1,<0.2.0" [[package]] name = "llama-index-readers-file" -version = "0.1.25" +version = "0.1.30" description = "llama-index readers file integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_readers_file-0.1.25-py3-none-any.whl", hash = "sha256:bc659e432d441c445e110580340675aa60abae1d82add4f65e559dfe8add541b"}, - {file = "llama_index_readers_file-0.1.25.tar.gz", hash = "sha256:238ddd98aa377d6a44322013eb848056037c80ad84571ea5bf451a640fff4d5c"}, + {file = "llama_index_readers_file-0.1.30-py3-none-any.whl", hash = "sha256:d5f6cdd4685ee73103c68b9bc0dfb0d05439033133fc6bd45ef31ff41519e723"}, + {file = "llama_index_readers_file-0.1.30.tar.gz", hash = "sha256:32f40465f2a8a65fa5773e03c9f4dd55164be934ae67fad62113680436787d91"}, ] [package.dependencies] @@ -1977,48 +1990,33 @@ pymupdf = ["pymupdf (>=1.23.21,<2.0.0)"] [[package]] name = "llama-index-readers-llama-parse" -version = "0.1.4" +version = "0.1.6" description = "llama-index readers llama-parse integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_readers_llama_parse-0.1.4-py3-none-any.whl", hash = "sha256:c4914b37d12cceee56fbd185cca80f87d60acbf8ea7a73f9719610180be1fcdd"}, - {file = "llama_index_readers_llama_parse-0.1.4.tar.gz", hash = "sha256:78608b193c818894aefeee0aa303f02b7f80f2e4caf13866c2fd3b0b1023e2c0"}, + {file = "llama_index_readers_llama_parse-0.1.6-py3-none-any.whl", hash = "sha256:71d445a2357ce4c632e0fada7c913ac62790e77c062f12d916dd86378380ff1f"}, + {file = "llama_index_readers_llama_parse-0.1.6.tar.gz", hash = "sha256:04f2dcfbb0fb87ce70890f5a2f4f89941d79be6a818b43738f053560e4b451cf"}, ] [package.dependencies] llama-index-core = ">=0.10.7,<0.11.0" -llama-parse = ">=0.4.0,<0.5.0" +llama-parse = ">=0.4.0" [[package]] name = "llama-parse" -version = "0.4.4" +version = "0.4.6" description = "Parse files into RAG-Optimized formats." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_parse-0.4.4-py3-none-any.whl", hash = "sha256:bb9724d04fd31ed037000896c7cef7fcb9051325497db4592a15f8144754cd00"}, - {file = "llama_parse-0.4.4.tar.gz", hash = "sha256:b45c2db33a0d6b7a2d5f59e3d0ec7ee7f8227a852eaa56b04aa12b12f2c0d521"}, + {file = "llama_parse-0.4.6-py3-none-any.whl", hash = "sha256:543450fd2b358b5ea2fcdf388613720da07a503e90ea1c3f4cedd66dae35fa41"}, + {file = "llama_parse-0.4.6.tar.gz", hash = "sha256:9e6a6f80da1185d8b23a96ff3141a154a833003f8ea9c546601c68b2bbe424e6"}, ] [package.dependencies] llama-index-core = ">=0.10.29" -[[package]] -name = "llamaindex-py-client" -version = "0.1.19" -description = "" -optional = false -python-versions = "<4,>=3.8" -files = [ - {file = "llamaindex_py_client-0.1.19-py3-none-any.whl", hash = "sha256:fd9416fd78b97209bf323bc3c7fab314499778563e7274f10853ad560563d10e"}, - {file = "llamaindex_py_client-0.1.19.tar.gz", hash = "sha256:73f74792bb8c092bae6dc626627a09ac13a099fa8d10f8fcc83e17a2b332cca7"}, -] - -[package.dependencies] -httpx = ">=0.20.0" -pydantic = ">=1.10" - [[package]] name = "lxml" version = "5.2.2" @@ -2282,40 +2280,40 @@ tests = ["pytest", "pytz", "simplejson"] [[package]] name = "matplotlib" -version = "3.9.0" +version = "3.9.1" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2bcee1dffaf60fe7656183ac2190bd630842ff87b3153afb3e384d966b57fe56"}, - {file = "matplotlib-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f988bafb0fa39d1074ddd5bacd958c853e11def40800c5824556eb630f94d3b"}, - {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe428e191ea016bb278758c8ee82a8129c51d81d8c4bc0846c09e7e8e9057241"}, - {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf3978060a106fab40c328778b148f590e27f6fa3cd15a19d6892575bce387d"}, - {file = "matplotlib-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e7f03e5cbbfacdd48c8ea394d365d91ee8f3cae7e6ec611409927b5ed997ee4"}, - {file = "matplotlib-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:13beb4840317d45ffd4183a778685e215939be7b08616f431c7795276e067463"}, - {file = "matplotlib-3.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:063af8587fceeac13b0936c42a2b6c732c2ab1c98d38abc3337e430e1ff75e38"}, - {file = "matplotlib-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a2fa6d899e17ddca6d6526cf6e7ba677738bf2a6a9590d702c277204a7c6152"}, - {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550cdda3adbd596078cca7d13ed50b77879104e2e46392dcd7c75259d8f00e85"}, - {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cce0f31b351e3551d1f3779420cf8f6ec0d4a8cf9c0237a3b549fd28eb4abb"}, - {file = "matplotlib-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c53aeb514ccbbcbab55a27f912d79ea30ab21ee0531ee2c09f13800efb272674"}, - {file = "matplotlib-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5be985db2596d761cdf0c2eaf52396f26e6a64ab46bd8cd810c48972349d1be"}, - {file = "matplotlib-3.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c79f3a585f1368da6049318bdf1f85568d8d04b2e89fc24b7e02cc9b62017382"}, - {file = "matplotlib-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bdd1ecbe268eb3e7653e04f451635f0fb0f77f07fd070242b44c076c9106da84"}, - {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e85a1a6d732f645f1403ce5e6727fd9418cd4574521d5803d3d94911038e5"}, - {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a490715b3b9984fa609116481b22178348c1a220a4499cda79132000a79b4db"}, - {file = "matplotlib-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8146ce83cbc5dc71c223a74a1996d446cd35cfb6a04b683e1446b7e6c73603b7"}, - {file = "matplotlib-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:d91a4ffc587bacf5c4ce4ecfe4bcd23a4b675e76315f2866e588686cc97fccdf"}, - {file = "matplotlib-3.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:616fabf4981a3b3c5a15cd95eba359c8489c4e20e03717aea42866d8d0465956"}, - {file = "matplotlib-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd53c79fd02f1c1808d2cfc87dd3cf4dbc63c5244a58ee7944497107469c8d8a"}, - {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06a478f0d67636554fa78558cfbcd7b9dba85b51f5c3b5a0c9be49010cf5f321"}, - {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c40af649d19c85f8073e25e5806926986806fa6d54be506fbf02aef47d5a89"}, - {file = "matplotlib-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52146fc3bd7813cc784562cb93a15788be0b2875c4655e2cc6ea646bfa30344b"}, - {file = "matplotlib-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:0fc51eaa5262553868461c083d9adadb11a6017315f3a757fc45ec6ec5f02888"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bd4f2831168afac55b881db82a7730992aa41c4f007f1913465fb182d6fb20c0"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:290d304e59be2b33ef5c2d768d0237f5bd132986bdcc66f80bc9bcc300066a03"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff2e239c26be4f24bfa45860c20ffccd118d270c5b5d081fa4ea409b5469fcd"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:af4001b7cae70f7eaacfb063db605280058246de590fa7874f00f62259f2df7e"}, - {file = "matplotlib-3.9.0.tar.gz", hash = "sha256:e6d29ea6c19e34b30fb7d88b7081f869a03014f66fe06d62cc77d5a6ea88ed7a"}, + {file = "matplotlib-3.9.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ccd6270066feb9a9d8e0705aa027f1ff39f354c72a87efe8fa07632f30fc6bb"}, + {file = "matplotlib-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:591d3a88903a30a6d23b040c1e44d1afdd0d778758d07110eb7596f811f31842"}, + {file = "matplotlib-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2a59ff4b83d33bca3b5ec58203cc65985367812cb8c257f3e101632be86d92"}, + {file = "matplotlib-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fc001516ffcf1a221beb51198b194d9230199d6842c540108e4ce109ac05cc0"}, + {file = "matplotlib-3.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:83c6a792f1465d174c86d06f3ae85a8fe36e6f5964633ae8106312ec0921fdf5"}, + {file = "matplotlib-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:421851f4f57350bcf0811edd754a708d2275533e84f52f6760b740766c6747a7"}, + {file = "matplotlib-3.9.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b3fce58971b465e01b5c538f9d44915640c20ec5ff31346e963c9e1cd66fa812"}, + {file = "matplotlib-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a973c53ad0668c53e0ed76b27d2eeeae8799836fd0d0caaa4ecc66bf4e6676c0"}, + {file = "matplotlib-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82cd5acf8f3ef43f7532c2f230249720f5dc5dd40ecafaf1c60ac8200d46d7eb"}, + {file = "matplotlib-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab38a4f3772523179b2f772103d8030215b318fef6360cb40558f585bf3d017f"}, + {file = "matplotlib-3.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2315837485ca6188a4b632c5199900e28d33b481eb083663f6a44cfc8987ded3"}, + {file = "matplotlib-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a0c977c5c382f6696caf0bd277ef4f936da7e2aa202ff66cad5f0ac1428ee15b"}, + {file = "matplotlib-3.9.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:565d572efea2b94f264dd86ef27919515aa6d629252a169b42ce5f570db7f37b"}, + {file = "matplotlib-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d397fd8ccc64af2ec0af1f0efc3bacd745ebfb9d507f3f552e8adb689ed730a"}, + {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26040c8f5121cd1ad712abffcd4b5222a8aec3a0fe40bc8542c94331deb8780d"}, + {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12cb1837cffaac087ad6b44399d5e22b78c729de3cdae4629e252067b705e2b"}, + {file = "matplotlib-3.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0e835c6988edc3d2d08794f73c323cc62483e13df0194719ecb0723b564e0b5c"}, + {file = "matplotlib-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:44a21d922f78ce40435cb35b43dd7d573cf2a30138d5c4b709d19f00e3907fd7"}, + {file = "matplotlib-3.9.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0c584210c755ae921283d21d01f03a49ef46d1afa184134dd0f95b0202ee6f03"}, + {file = "matplotlib-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11fed08f34fa682c2b792942f8902e7aefeed400da71f9e5816bea40a7ce28fe"}, + {file = "matplotlib-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0000354e32efcfd86bda75729716b92f5c2edd5b947200be9881f0a671565c33"}, + {file = "matplotlib-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db17fea0ae3aceb8e9ac69c7e3051bae0b3d083bfec932240f9bf5d0197a049"}, + {file = "matplotlib-3.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:208cbce658b72bf6a8e675058fbbf59f67814057ae78165d8a2f87c45b48d0ff"}, + {file = "matplotlib-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:dc23f48ab630474264276be156d0d7710ac6c5a09648ccdf49fef9200d8cbe80"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3fda72d4d472e2ccd1be0e9ccb6bf0d2eaf635e7f8f51d737ed7e465ac020cb3"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:84b3ba8429935a444f1fdc80ed930babbe06725bcf09fbeb5c8757a2cd74af04"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b918770bf3e07845408716e5bbda17eadfc3fcbd9307dc67f37d6cf834bb3d98"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f1f2e5d29e9435c97ad4c36fb6668e89aee13d48c75893e25cef064675038ac9"}, + {file = "matplotlib-3.9.1.tar.gz", hash = "sha256:de06b19b8db95dd33d0dc17c926c7c9ebed9f572074b6fac4f65068a6814d010"}, ] [package.dependencies] @@ -2468,38 +2466,38 @@ files = [ [[package]] name = "mypy" -version = "1.10.0" +version = "1.10.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, - {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, - {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, - {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, - {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, - {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, - {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, - {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, - {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, - {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, - {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, - {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, - {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, - {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, - {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, - {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, - {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, - {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, - {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, + {file = "mypy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02"}, + {file = "mypy-1.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7"}, + {file = "mypy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a"}, + {file = "mypy-1.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9"}, + {file = "mypy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84"}, + {file = "mypy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f"}, + {file = "mypy-1.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b"}, + {file = "mypy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e"}, + {file = "mypy-1.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7"}, + {file = "mypy-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3"}, + {file = "mypy-1.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e"}, + {file = "mypy-1.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04"}, + {file = "mypy-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31"}, + {file = "mypy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c"}, + {file = "mypy-1.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade"}, + {file = "mypy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37"}, + {file = "mypy-1.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7"}, + {file = "mypy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d"}, + {file = "mypy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3"}, + {file = "mypy-1.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf"}, + {file = "mypy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531"}, + {file = "mypy-1.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3"}, + {file = "mypy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f"}, + {file = "mypy-1.10.1-py3-none-any.whl", hash = "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a"}, + {file = "mypy-1.10.1.tar.gz", hash = "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0"}, ] [package.dependencies] @@ -2744,14 +2742,13 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.5.40" +version = "12.5.82" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_aarch64.whl", hash = "sha256:004186d5ea6a57758fd6d57052a123c73a4815adf365eb8dd6a85c9eaa7535ff"}, - {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"}, + {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f9b37bc5c8cf7509665cb6ada5aaa0ce65618f2332b7d3e78e9790511f111212"}, + {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-win_amd64.whl", hash = "sha256:e782564d705ff0bf61ac3e1bf730166da66dd2fe9012f111ede5fc49b64ae697"}, ] [[package]] @@ -2824,55 +2821,55 @@ reference = ["Pillow", "google-re2"] [[package]] name = "onnxruntime" -version = "1.18.0" +version = "1.18.1" description = "ONNX Runtime is a runtime accelerator for Machine Learning models" optional = false python-versions = "*" files = [ - {file = "onnxruntime-1.18.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:5a3b7993a5ecf4a90f35542a4757e29b2d653da3efe06cdd3164b91167bbe10d"}, - {file = "onnxruntime-1.18.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15b944623b2cdfe7f7945690bfb71c10a4531b51997c8320b84e7b0bb59af902"}, - {file = "onnxruntime-1.18.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e61ce5005118064b1a0ed73ebe936bc773a102f067db34108ea6c64dd62a179"}, - {file = "onnxruntime-1.18.0-cp310-cp310-win32.whl", hash = "sha256:a4fc8a2a526eb442317d280610936a9f73deece06c7d5a91e51570860802b93f"}, - {file = "onnxruntime-1.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:71ed219b768cab004e5cd83e702590734f968679bf93aa488c1a7ffbe6e220c3"}, - {file = "onnxruntime-1.18.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:3d24bd623872a72a7fe2f51c103e20fcca2acfa35d48f2accd6be1ec8633d960"}, - {file = "onnxruntime-1.18.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f15e41ca9b307a12550bfd2ec93f88905d9fba12bab7e578f05138ad0ae10d7b"}, - {file = "onnxruntime-1.18.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f45ca2887f62a7b847d526965686b2923efa72538c89b7703c7b3fe970afd59"}, - {file = "onnxruntime-1.18.0-cp311-cp311-win32.whl", hash = "sha256:9e24d9ecc8781323d9e2eeda019b4b24babc4d624e7d53f61b1fe1a929b0511a"}, - {file = "onnxruntime-1.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:f8608398976ed18aef450d83777ff6f77d0b64eced1ed07a985e1a7db8ea3771"}, - {file = "onnxruntime-1.18.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:f1d79941f15fc40b1ee67738b2ca26b23e0181bf0070b5fb2984f0988734698f"}, - {file = "onnxruntime-1.18.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e8caf3a8565c853a22d323a3eebc2a81e3de7591981f085a4f74f7a60aab2d"}, - {file = "onnxruntime-1.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:498d2b8380635f5e6ebc50ec1b45f181588927280f32390fb910301d234f97b8"}, - {file = "onnxruntime-1.18.0-cp312-cp312-win32.whl", hash = "sha256:ba7cc0ce2798a386c082aaa6289ff7e9bedc3dee622eef10e74830cff200a72e"}, - {file = "onnxruntime-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:1fa175bd43f610465d5787ae06050c81f7ce09da2bf3e914eb282cb8eab363ef"}, - {file = "onnxruntime-1.18.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:0284c579c20ec8b1b472dd190290a040cc68b6caec790edb960f065d15cf164a"}, - {file = "onnxruntime-1.18.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d47353d036d8c380558a5643ea5f7964d9d259d31c86865bad9162c3e916d1f6"}, - {file = "onnxruntime-1.18.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:885509d2b9ba4b01f08f7fa28d31ee54b6477953451c7ccf124a84625f07c803"}, - {file = "onnxruntime-1.18.0-cp38-cp38-win32.whl", hash = "sha256:8614733de3695656411d71fc2f39333170df5da6c7efd6072a59962c0bc7055c"}, - {file = "onnxruntime-1.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:47af3f803752fce23ea790fd8d130a47b2b940629f03193f780818622e856e7a"}, - {file = "onnxruntime-1.18.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:9153eb2b4d5bbab764d0aea17adadffcfc18d89b957ad191b1c3650b9930c59f"}, - {file = "onnxruntime-1.18.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c7fd86eca727c989bb8d9c5104f3c45f7ee45f445cc75579ebe55d6b99dfd7c"}, - {file = "onnxruntime-1.18.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac67a4de9c1326c4d87bcbfb652c923039b8a2446bb28516219236bec3b494f5"}, - {file = "onnxruntime-1.18.0-cp39-cp39-win32.whl", hash = "sha256:6ffb445816d06497df7a6dd424b20e0b2c39639e01e7fe210e247b82d15a23b9"}, - {file = "onnxruntime-1.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:46de6031cb6745f33f7eca9e51ab73e8c66037fb7a3b6b4560887c5b55ab5d5d"}, + {file = "onnxruntime-1.18.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:29ef7683312393d4ba04252f1b287d964bd67d5e6048b94d2da3643986c74d80"}, + {file = "onnxruntime-1.18.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc706eb1df06ddf55776e15a30519fb15dda7697f987a2bbda4962845e3cec05"}, + {file = "onnxruntime-1.18.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7de69f5ced2a263531923fa68bbec52a56e793b802fcd81a03487b5e292bc3a"}, + {file = "onnxruntime-1.18.1-cp310-cp310-win32.whl", hash = "sha256:221e5b16173926e6c7de2cd437764492aa12b6811f45abd37024e7cf2ae5d7e3"}, + {file = "onnxruntime-1.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:75211b619275199c861ee94d317243b8a0fcde6032e5a80e1aa9ded8ab4c6060"}, + {file = "onnxruntime-1.18.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:f26582882f2dc581b809cfa41a125ba71ad9e715738ec6402418df356969774a"}, + {file = "onnxruntime-1.18.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef36f3a8b768506d02be349ac303fd95d92813ba3ba70304d40c3cd5c25d6a4c"}, + {file = "onnxruntime-1.18.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:170e711393e0618efa8ed27b59b9de0ee2383bd2a1f93622a97006a5ad48e434"}, + {file = "onnxruntime-1.18.1-cp311-cp311-win32.whl", hash = "sha256:9b6a33419b6949ea34e0dc009bc4470e550155b6da644571ecace4b198b0d88f"}, + {file = "onnxruntime-1.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c1380a9f1b7788da742c759b6a02ba771fe1ce620519b2b07309decbd1a2fe1"}, + {file = "onnxruntime-1.18.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:31bd57a55e3f983b598675dfc7e5d6f0877b70ec9864b3cc3c3e1923d0a01919"}, + {file = "onnxruntime-1.18.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9e03c4ba9f734500691a4d7d5b381cd71ee2f3ce80a1154ac8f7aed99d1ecaa"}, + {file = "onnxruntime-1.18.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:781aa9873640f5df24524f96f6070b8c550c66cb6af35710fd9f92a20b4bfbf6"}, + {file = "onnxruntime-1.18.1-cp312-cp312-win32.whl", hash = "sha256:3a2d9ab6254ca62adbb448222e630dc6883210f718065063518c8f93a32432be"}, + {file = "onnxruntime-1.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:ad93c560b1c38c27c0275ffd15cd7f45b3ad3fc96653c09ce2931179982ff204"}, + {file = "onnxruntime-1.18.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:3b55dc9d3c67626388958a3eb7ad87eb7c70f75cb0f7ff4908d27b8b42f2475c"}, + {file = "onnxruntime-1.18.1-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f80dbcfb6763cc0177a31168b29b4bd7662545b99a19e211de8c734b657e0669"}, + {file = "onnxruntime-1.18.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1ff2c61a16d6c8631796c54139bafea41ee7736077a0fc64ee8ae59432f5c58"}, + {file = "onnxruntime-1.18.1-cp38-cp38-win32.whl", hash = "sha256:219855bd272fe0c667b850bf1a1a5a02499269a70d59c48e6f27f9c8bcb25d02"}, + {file = "onnxruntime-1.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:afdf16aa607eb9a2c60d5ca2d5abf9f448e90c345b6b94c3ed14f4fb7e6a2d07"}, + {file = "onnxruntime-1.18.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:128df253ade673e60cea0955ec9d0e89617443a6d9ce47c2d79eb3f72a3be3de"}, + {file = "onnxruntime-1.18.1-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9839491e77e5c5a175cab3621e184d5a88925ee297ff4c311b68897197f4cde9"}, + {file = "onnxruntime-1.18.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad3187c1faff3ac15f7f0e7373ef4788c582cafa655a80fdbb33eaec88976c66"}, + {file = "onnxruntime-1.18.1-cp39-cp39-win32.whl", hash = "sha256:34657c78aa4e0b5145f9188b550ded3af626651b15017bf43d280d7e23dbf195"}, + {file = "onnxruntime-1.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c14fd97c3ddfa97da5feef595e2c73f14c2d0ec1d4ecbea99c8d96603c89589"}, ] [package.dependencies] coloredlogs = "*" flatbuffers = "*" -numpy = ">=1.21.6" +numpy = ">=1.21.6,<2.0" packaging = "*" protobuf = "*" sympy = "*" [[package]] name = "openai" -version = "1.34.0" +version = "1.35.13" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.34.0-py3-none-any.whl", hash = "sha256:018623c2f795424044675c6230fa3bfbf98d9e0aab45d8fd116f2efb2cfb6b7e"}, - {file = "openai-1.34.0.tar.gz", hash = "sha256:95c8e2da4acd6958e626186957d656597613587195abd0fb2527566a93e76770"}, + {file = "openai-1.35.13-py3-none-any.whl", hash = "sha256:36ec3e93e0d1f243f69be85c89b9221a471c3e450dfd9df16c9829e3cdf63e60"}, + {file = "openai-1.35.13.tar.gz", hash = "sha256:c684f3945608baf7d2dcc0ef3ee6f3e27e4c66f21076df0b47be45d57e6ae6e4"}, ] [package.dependencies] @@ -2889,18 +2886,18 @@ datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "opencv-python" -version = "4.10.0.82" +version = "4.10.0.84" description = "Wrapper package for OpenCV python bindings." optional = false python-versions = ">=3.6" files = [ - {file = "opencv-python-4.10.0.82.tar.gz", hash = "sha256:dbc021eaa310c4145c47cd648cb973db69bb5780d6e635386cd53d3ea76bd2d5"}, - {file = "opencv_python-4.10.0.82-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:5f78652339957ec24b80a782becfb32f822d2008a865512121fad8c3ce233e9a"}, - {file = "opencv_python-4.10.0.82-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:e6be19a0615aa8c4e0d34e0c7b133e26e386f4b7e9b557b69479104ab2c133ec"}, - {file = "opencv_python-4.10.0.82-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b49e530f7fd86f671514b39ffacdf5d14ceb073bc79d0de46bbb6b0cad78eaf"}, - {file = "opencv_python-4.10.0.82-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955c5ce8ac90c9e4636ad7f5c0d9c75b80abbe347182cfd09b0e3eec6e50472c"}, - {file = "opencv_python-4.10.0.82-cp37-abi3-win32.whl", hash = "sha256:ff54adc9e4daaf438e669664af08bec4a268c7b7356079338b8e4fae03810f2c"}, - {file = "opencv_python-4.10.0.82-cp37-abi3-win_amd64.whl", hash = "sha256:2e3c2557b176f1e528417520a52c0600a92c1bb1c359f3df8e6411ab4293f065"}, + {file = "opencv-python-4.10.0.84.tar.gz", hash = "sha256:72d234e4582e9658ffea8e9cae5b63d488ad06994ef12d81dc303b17472f3526"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:fc182f8f4cda51b45f01c64e4cbedfc2f00aff799debebc305d8d0210c43f251"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:71e575744f1d23f79741450254660442785f45a0797212852ee5199ef12eed98"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09a332b50488e2dda866a6c5573ee192fe3583239fb26ff2f7f9ceb0bc119ea6"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ace140fc6d647fbe1c692bcb2abce768973491222c067c131d80957c595b71f"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-win32.whl", hash = "sha256:2db02bb7e50b703f0a2d50c50ced72e95c574e1e5a0bb35a8a86d0b35c98c236"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-win_amd64.whl", hash = "sha256:32dbbd94c26f611dc5cc6979e6b7aa1f55a64d6b463cc1dcd3c95505a63e48fe"}, ] [package.dependencies] @@ -2908,13 +2905,13 @@ numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""} [[package]] name = "openpyxl" -version = "3.1.4" +version = "3.1.5" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false python-versions = ">=3.8" files = [ - {file = "openpyxl-3.1.4-py2.py3-none-any.whl", hash = "sha256:ec17f6483f2b8f7c88c57e5e5d3b0de0e3fb9ac70edc084d28e864f5b33bbefd"}, - {file = "openpyxl-3.1.4.tar.gz", hash = "sha256:8d2c8adf5d20d6ce8f9bca381df86b534835e974ed0156dacefa76f68c1d69fb"}, + {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, + {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, ] [package.dependencies] @@ -2936,57 +2933,62 @@ dev = ["black", "mypy", "pytest"] [[package]] name = "orjson" -version = "3.10.5" +version = "3.10.6" 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"}, + {file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"}, + {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"}, + {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"}, + {file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"}, + {file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"}, + {file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"}, + {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"}, + {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"}, + {file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"}, + {file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"}, + {file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"}, + {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"}, + {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"}, + {file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"}, + {file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"}, + {file = "orjson-3.10.6-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"}, + {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"}, + {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"}, + {file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"}, + {file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"}, + {file = "orjson-3.10.6-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb"}, + {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2"}, + {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a"}, + {file = "orjson-3.10.6-cp39-none-win32.whl", hash = "sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219"}, + {file = "orjson-3.10.6-cp39-none-win_amd64.whl", hash = "sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844"}, + {file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"}, ] [[package]] @@ -3116,13 +3118,13 @@ image = ["Pillow"] [[package]] name = "pdfplumber" -version = "0.11.1" +version = "0.11.2" description = "Plumb a PDF for detailed information about each char, rectangle, and line." optional = false python-versions = ">=3.8" files = [ - {file = "pdfplumber-0.11.1-py3-none-any.whl", hash = "sha256:8f3f087001fc3ec72d2c8be23d4ad59a763356e70d659a9180b5250919a3e5a8"}, - {file = "pdfplumber-0.11.1.tar.gz", hash = "sha256:cb95b4369fa94c3901bc6bce89d81e098afd2bd8d88e0d9706152f4c57e82349"}, + {file = "pdfplumber-0.11.2-py3-none-any.whl", hash = "sha256:024a7e0f8f4e7bbec8e1f6f694faeaa7b9fe33a0c1f9edd9d3f77298d9146b87"}, + {file = "pdfplumber-0.11.2.tar.gz", hash = "sha256:f237ce88e9918358f3848f4bae469358ca121ca412098e370908878ec9da699a"}, ] [package.dependencies] @@ -3210,84 +3212,95 @@ test = ["attrs (>=20.2.0)", "coverage[toml]", "hypothesis (>=6.36)", "numpy (>=1 [[package]] name = "pillow" -version = "10.3.0" +version = "10.4.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"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -3296,69 +3309,64 @@ xmp = ["defusedxml"] [[package]] name = "pillow-heif" -version = "0.16.0" +version = "0.17.0" description = "Python interface for libheif library" optional = false python-versions = ">=3.8" files = [ - {file = "pillow_heif-0.16.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:c7db96ac172e2654676986e8c35fa32bffdd5b429a8c86b9d628c0333c570d82"}, - {file = "pillow_heif-0.16.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:a146be0c8e7bef204eeaa14799b2fca8a4a52ad972850975e23ef10cee4e7de7"}, - {file = "pillow_heif-0.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33e0b1549bcdfec363b3ba6fb55b3de882e1409b5b00f5a68a1a027f051e8ef2"}, - {file = "pillow_heif-0.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea4410ce02e295079db5b2617579ba016671d334ac1888a1d4b34aedb56b866"}, - {file = "pillow_heif-0.16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:331579ce4f5fa079595c529b06810886ff76f8ade3eb411a1c9c90853a708022"}, - {file = "pillow_heif-0.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:792e5d88b7d016fe48ae2fd77a852ec8dcf9a7fad1f7f191d35bc173896fe378"}, - {file = "pillow_heif-0.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e0492e4fd6d3334b9eed3651058216ef62f04afa099cfc6b05815c1bf0da2c38"}, - {file = "pillow_heif-0.16.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:beb6576cbe5a9404a8f2ad9ec68f6b0c406e5e9f5d5573722dc3244898dc9866"}, - {file = "pillow_heif-0.16.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:241cf6c510215c6df0ee948dfed06a20c099475250c5c6cac5e7a1ef9e0ec4c3"}, - {file = "pillow_heif-0.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28c980bf8d5239ee87986c9217a5954b07993d71d391949a9feafad0a9c5e9a7"}, - {file = "pillow_heif-0.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8856cf5f0d53f83d814ae5c8d34433e5e5ad9f3e328480257cd6e9fbdb4a458"}, - {file = "pillow_heif-0.16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fba5c46f84031f1186bdea2a0c95f82958f8c29321200e73d7ac5e79ee460c83"}, - {file = "pillow_heif-0.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5c7f7a94fc2d08ddcf55a6834c4c55b7dea9605656c565ce11c82e3f6e0454a8"}, - {file = "pillow_heif-0.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a2681d4b62418813289987a9420059d724cd93542d0b05e0928fe4578517714"}, - {file = "pillow_heif-0.16.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:7e424d6a34b9466d054706393e76b5abdd84fabdc0c72b19ca10435a76140de7"}, - {file = "pillow_heif-0.16.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:be41b7fadd4a9355d24936f6fad83bb8130fe55ba228ec298ad316392bb6f38b"}, - {file = "pillow_heif-0.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:078bc74fd767625e465b2c107228f9c398b9a128bdf81b3f18812d7c07be660f"}, - {file = "pillow_heif-0.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f4293ecbb81d255d8d887dce4708a58e87c86e53c6f1b1affc4c3105e1bcb8c"}, - {file = "pillow_heif-0.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f63a1d8f95811569df5df9b6b11674038929c2f696221f2a393aee5ac1e535b4"}, - {file = "pillow_heif-0.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:89ec30420ddc843c43916febbe31697552ed123396a1696715eea75169866c07"}, - {file = "pillow_heif-0.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:d4595ec975db845d84ab90cbf0678f15b0068b8b83c01d1db7ea524e31bab4b4"}, - {file = "pillow_heif-0.16.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:1421d96aebdc9f5773213c8221ce547efb56e37a62da6698312edd4f281efb42"}, - {file = "pillow_heif-0.16.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:88ff22d2b162e7edd9cb9dd98de81455be04c40a99d1d3d3ebe1602b1a21c453"}, - {file = "pillow_heif-0.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb3efbe8efd26203589794988b11ea9bf3dea2d3bcf218e658f779d526dfcf80"}, - {file = "pillow_heif-0.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f062c1be6f04804ffdf0bc452142eff38d7544c8655c04291d16e3b996e4dc4"}, - {file = "pillow_heif-0.16.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:7fabd6534a38078a66ce8b7a5ae8ad37afd9863c930abd3031fb553f1ab4f01a"}, - {file = "pillow_heif-0.16.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d9e465d92cf01093e3e4c33776af97368add23ac1c8d0007f34b8d3e3390d6ad"}, - {file = "pillow_heif-0.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:502cebc90c11a6bffa2ea899088999c25fc99c8f322e047a266e541e3046b27c"}, - {file = "pillow_heif-0.16.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:c2ad68e3e4be40adfc5290bf6daa1569dd7d18501e17779d217ce5cd8c1e338d"}, - {file = "pillow_heif-0.16.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8e168d45b2ce63c1fe2334fd02927699b0097de72605f7571948010fd79e58f0"}, - {file = "pillow_heif-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bf10a1686c2d51f4db8ebb78825f96f28d18d1878599e1c64e88cfbdb70a3d2"}, - {file = "pillow_heif-0.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f15dc73ced02a0ccfac93159d12deeaecfbe4335883a1a3309df0f01c26e6e6"}, - {file = "pillow_heif-0.16.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2673048f3cf1498327add70f16e1129be2a09cf4a31cbc02363f5760eb5ba955"}, - {file = "pillow_heif-0.16.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9273af7224e0fb16c18637184a8ea9a8790105658daab04ad541982b8623e5c1"}, - {file = "pillow_heif-0.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:f613dfd05fd62a8b7b57649bfa5db1501be41e18b5e15dd4a2fc12d3e3ddfdaa"}, - {file = "pillow_heif-0.16.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:3501f22985cbb427c76febf07a7e309cb828e485c0cf250a625733fc06fc1815"}, - {file = "pillow_heif-0.16.0-pp310-pypy310_pp73-macosx_12_0_arm64.whl", hash = "sha256:2b7450303f08ec81d1a63a75052863bb687fc3be1fdd8a34d2c0fef627aacae5"}, - {file = "pillow_heif-0.16.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7794c1a8304eeb841d72cb73aa64cc60c9e5dccb2c7612f8caf528505f78581f"}, - {file = "pillow_heif-0.16.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5edd98192f74e4c7cffdd62953b2987e2b1e0d6a55d5c940306bed71f40206a"}, - {file = "pillow_heif-0.16.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:38fa2854ec7dbe6c875d64cc5b3cf5cc55f1c8a0248dc1c7c34e9d2505521b82"}, - {file = "pillow_heif-0.16.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b50160331754b603524e6ed33c386f478fd66fb345fa6433a507a01c8de642c6"}, - {file = "pillow_heif-0.16.0-pp38-pypy38_pp73-macosx_12_0_arm64.whl", hash = "sha256:9fd829c257a763e3a2e8418a773c2808c90799ee3e6b405b5399cb4fdfbe336e"}, - {file = "pillow_heif-0.16.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbd9cc527bbd53c3e7588e16aad170e11cfd180b7e9bd84f18fb020ddec11408"}, - {file = "pillow_heif-0.16.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a27abb523a07b17c118c09f1a00f92cde2295f8e997600024d4b57df3c5ba818"}, - {file = "pillow_heif-0.16.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0075adeb324adb07ddbfbe8a5c79ed12e5d04e60e9a642ff9427e71b5b0adccd"}, - {file = "pillow_heif-0.16.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:40014105688478d6ca146fc04bff6c13f445d01bdea79417b34ee50c1e559190"}, - {file = "pillow_heif-0.16.0-pp39-pypy39_pp73-macosx_12_0_arm64.whl", hash = "sha256:7ef47297d526147923f4ecc7ff681a5d5f4e6e3300017681f59968652a0d8afb"}, - {file = "pillow_heif-0.16.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9923dfcc97ae9484d3514f2f6ec368e2ac97cd66f7b95359cc1b0ec0c1cd6157"}, - {file = "pillow_heif-0.16.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17963a73186961fe7792aef01c46e980635f3fcc1836393de39ec9c6776ca51e"}, - {file = "pillow_heif-0.16.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4b6caa5b13b4dfc180507527254014530f6bedbeabc1de2238918bf5b2700c7e"}, - {file = "pillow_heif-0.16.0.tar.gz", hash = "sha256:4d95004bb77aa640f80617716aa21bc092ec06307f6f2ad423deeeda07b4d29c"}, + {file = "pillow_heif-0.17.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:70fa89a6ed62d4eb993f1adcd72a547861e7a947714bad87f0c0b201ef04c28c"}, + {file = "pillow_heif-0.17.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:7a201d9f086ab4c475691936e40e063529f401a0a53f70ef3b1e5404726b80fd"}, + {file = "pillow_heif-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f29d98668785fbb8ddcf0cf5e86f8676c2a4d7dc3c3ee51a37304c6047cea4d"}, + {file = "pillow_heif-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab279e6b5a5d65ee30db49d55668b9b1b2756827a251c2c6577d7dcaa152c1a9"}, + {file = "pillow_heif-0.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5d360eac8a066739fa01a9d14954a288bc52eb9ac90e924d85b0ab89502626d6"}, + {file = "pillow_heif-0.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:861cd3783df852c28d1c7434562f59dc1f10f38746c5bbf0be4fafc8516a493b"}, + {file = "pillow_heif-0.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:3d2f4b33eb0ea85d5afae3d340aa60781570ca56513666b22fe1fa94a6546ab8"}, + {file = "pillow_heif-0.17.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7991509a4d0291116a26b9cd9f3482e4b2a4e3cdd9950de33cd78dae53b7a94d"}, + {file = "pillow_heif-0.17.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:b85cdcdcec561e28b3f72d181342a6fe72298a4da7ad6fe973161efb699f9555"}, + {file = "pillow_heif-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23eeda0ce7d22d35f806c48c9f4e9eccfb7f5cf7f54f459ca71d053ed6e7e84e"}, + {file = "pillow_heif-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac7505dbdea5467ba5eb4013c06915f9b42f893b4856ac957f4568317814268"}, + {file = "pillow_heif-0.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ccdbdf6cc7e63b6dc886c1e258f84f9ca622611c0f63ecfd7e453e026aa18a35"}, + {file = "pillow_heif-0.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2055dd6a9f2ccfe68bcfb375aac667923ca330adea4c21d46e8b0541c942768f"}, + {file = "pillow_heif-0.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:853637f56b431d77750390fb3327f4e7025a755c1bcee9d209384f4b24583598"}, + {file = "pillow_heif-0.17.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:29e5bc3a6529e1247f974386f55e4a2932dbdb8b8407496c95e7fd5c30a695a6"}, + {file = "pillow_heif-0.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:28226858905df14879a856d11179cf765c2728306ed686802bb7c8fff5e77a82"}, + {file = "pillow_heif-0.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4992e51c5e6968957e083fdd2b93865396b00755a4c8e53c71c0233cc53637f"}, + {file = "pillow_heif-0.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e460433a23aab5c0e92fb6700ee3c2aec32e680daa12520bd784f263bf95319f"}, + {file = "pillow_heif-0.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e193d3d078c301fd3ecd136ca4e351df6ae7a3b5837f48828bb9e78390a3a88"}, + {file = "pillow_heif-0.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:72d3d32756fb039a062f239c5890a2757d0ca8b36c6a4dd1b6c81bbecc36d646"}, + {file = "pillow_heif-0.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:aef99e3201be61e1b2322faf982765327f7423b8a065c31c24761aecf5df161e"}, + {file = "pillow_heif-0.17.0-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:7d82702167839a14f95169e5d4ecae7c31e2669a6c0772b6cb7eae4d74caf69b"}, + {file = "pillow_heif-0.17.0-cp38-cp38-macosx_14_0_arm64.whl", hash = "sha256:5b8983e5dc8156e1af5a26335b086d85ed3f8e570be5f922546ef131e8cf9c00"}, + {file = "pillow_heif-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e0dcc4e3901c8d2bd099e670c62f431895d2d7a5a0979da89865508d41e1a06"}, + {file = "pillow_heif-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:444408526de16e55509077cce83d1893ba14e47e9f1b61e1a83aa9a23dcb8eeb"}, + {file = "pillow_heif-0.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d0d92e835b57ddff51a06442d5c701eae4a8da32d4dcd14bc0fa74dfccc35ac7"}, + {file = "pillow_heif-0.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:1c9a69b8f1ff131ae3d11ba86386b7ac1872702d8529a055cb694cffbd876a7b"}, + {file = "pillow_heif-0.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:27074ae9ded6576bc99d75d5c9911736711d44bb2a383177e305db6dbea1da27"}, + {file = "pillow_heif-0.17.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:e1aae72d0a608525aa041ed3853198f9e5d16bc1ccb0e3c5320ec08be5ed8c7f"}, + {file = "pillow_heif-0.17.0-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:80f2156b7d75abdc3b69c4688192be56cb40db9a423d67c375f34099814aed1a"}, + {file = "pillow_heif-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:190a69a5695fe6e661024b7266c3282aad4c582ca172ce4cb3851986e0635d7f"}, + {file = "pillow_heif-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:130b8ba2c4116dbaaa531052fe3868ab98e078ab8d51efb9453ca9c787dc3517"}, + {file = "pillow_heif-0.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:11545360fd2d52b8319988c73f58caba6de6c3a49b28f0808a0cf48a29f860c2"}, + {file = "pillow_heif-0.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ec51216fa9373a6efe493614766e4fc7ad715d5496c049a7019c7890a0eeb9bc"}, + {file = "pillow_heif-0.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:dea62e7559577b69354672f3f23c3c8d308c14015965ab97f9d4440229ae6d70"}, + {file = "pillow_heif-0.17.0-pp310-pypy310_pp73-macosx_12_0_x86_64.whl", hash = "sha256:d787ee558500d0222b8ab30a520512109c39fe76c25cea613295c83a808d3589"}, + {file = "pillow_heif-0.17.0-pp310-pypy310_pp73-macosx_14_0_arm64.whl", hash = "sha256:4cbe8e609c363d6c41f5fd52aa4c1274927b88df1ae8b96ff3dee1d5549b58e2"}, + {file = "pillow_heif-0.17.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd469939924a9722e4353d3770d27d9fa8a5a2a869519f48f190a8bc6694d995"}, + {file = "pillow_heif-0.17.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58fdcb04b6c3a8802f94415bd6e2d20df2d79cf6947e4ff9a1b1cdfdb13a187a"}, + {file = "pillow_heif-0.17.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:fd5b9d27ffb06ce81a8d4c86ca026ce7644108cc27802a8122a52b7863fb1af7"}, + {file = "pillow_heif-0.17.0-pp39-pypy39_pp73-macosx_12_0_x86_64.whl", hash = "sha256:eed517d85d2ce15b8fdaf382bcd04947e87d961e0dceb258c161167ed4a6cbb0"}, + {file = "pillow_heif-0.17.0-pp39-pypy39_pp73-macosx_14_0_arm64.whl", hash = "sha256:f70150db79a3c2e9d1f93263dc88810f265c3d86968b8954bc563f487672a999"}, + {file = "pillow_heif-0.17.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cda9f1d67bbb8e2b4d976e6113d876b27bea9544a95e37ee7cb8e53f242598d"}, + {file = "pillow_heif-0.17.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c27fe963fc279128519e5845556e8c57622b3d504df1b63aa06038086de0799e"}, + {file = "pillow_heif-0.17.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a10cdb3d525d22fc31b268f55740352ac2adf357016a87b16116b0d7df29198f"}, + {file = "pillow_heif-0.17.0.tar.gz", hash = "sha256:9541ffd1f80ff3f12da26aba76eb6da458fafa5f8bf4ee16279de0e2a5464ba9"}, ] [package.dependencies] -pillow = ">=9.5.0" +pillow = ">=10.1.0" [package.extras] -dev = ["coverage", "defusedxml", "numpy", "opencv-python (==4.9.0.80)", "packaging", "pre-commit", "pylint", "pympler", "pytest"] +dev = ["coverage", "defusedxml", "numpy", "opencv-python (==4.10.0.84)", "packaging", "pre-commit", "pylint", "pympler", "pytest"] docs = ["sphinx (>=4.4)", "sphinx-issues (>=3.0.1)", "sphinx-rtd-theme (>=1.0)"] tests = ["defusedxml", "numpy", "packaging", "pympler", "pytest"] tests-min = ["defusedxml", "packaging", "pytest"] @@ -3381,18 +3389,18 @@ type = ["mypy (>=1.8)"] [[package]] name = "playwright" -version = "1.44.0" +version = "1.45.0" description = "A high-level API to automate web browsers" optional = false python-versions = ">=3.8" files = [ - {file = "playwright-1.44.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:c2317a80896796fdeb03d60f06cc229e775ff2e19b80c64b1bb9b29c8a59d992"}, - {file = "playwright-1.44.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54d44fb634d870839301c2326e1e12a178a1be0de76d0caaec230ab075c2e077"}, - {file = "playwright-1.44.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:64b67194e73b47ae72acf25f1a9cfacfef38ca2b52e4bb8b0abd385c5deeaadf"}, - {file = "playwright-1.44.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:29161b1fae71f7c402df5b15f0bd3deaeecd8b3d1ecd9ff01271700c66210e7b"}, - {file = "playwright-1.44.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8c8a3bfea17576d3f94a2363eee195cbda8dbba86975588c7eaac7792b25eee"}, - {file = "playwright-1.44.0-py3-none-win32.whl", hash = "sha256:235e37832deaa9af8a629d09955396259ab757533cc1922f9b0308b4ee0d9cdf"}, - {file = "playwright-1.44.0-py3-none-win_amd64.whl", hash = "sha256:5b8a4a1d4d50f4ff99b47965576322a8c4e34631854b862a25c1feb824be22a8"}, + {file = "playwright-1.45.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:7d49aee5907d8e72060f04bc299cb6851c2dc44cb227540ade89d7aa529e907a"}, + {file = "playwright-1.45.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:210c9f848820f58b5b5ed48047748620b780ca3acc3e2b7560dafb2bfdd6d90a"}, + {file = "playwright-1.45.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:13b5398831f5499580e819ddc996633446a93bf88029e89451e51da188e16ae3"}, + {file = "playwright-1.45.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:0ba5a39f25fb9b9cf1bd48678f44536a29f6d83376329de2dee1567dac220afe"}, + {file = "playwright-1.45.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b09fa76614ba2926d45a4c0581f710c13652d5e32290ba6a1490fbafff7f0be8"}, + {file = "playwright-1.45.0-py3-none-win32.whl", hash = "sha256:97a7d53af89af54208b69c051046b462675fcf5b93f7fbfb7c0fa7f813424ee2"}, + {file = "playwright-1.45.0-py3-none-win_amd64.whl", hash = "sha256:701db496928429aec103739e48e3110806bd5cf49456cc95b89f28e1abda71da"}, ] [package.dependencies] @@ -3401,13 +3409,13 @@ pyee = "11.1.0" [[package]] name = "portalocker" -version = "2.8.2" +version = "2.10.0" 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"}, + {file = "portalocker-2.10.0-py3-none-any.whl", hash = "sha256:48944147b2cd42520549bc1bb8fe44e220296e56f7c3d551bc6ecce69d9b0de1"}, + {file = "portalocker-2.10.0.tar.gz", hash = "sha256:49de8bc0a2f68ca98bf9e219c81a3e6b27097c7bf505a87c5a112ce1aaeb9b81"}, ] [package.dependencies] @@ -3420,41 +3428,70 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p [[package]] name = "proto-plus" -version = "1.20.4" +version = "1.24.0" description = "Beautiful, Pythonic protocol buffers." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "proto-plus-1.20.4.tar.gz", hash = "sha256:6653541c2f1209e4d5268d3e6302791f72a95cc5f8bdcf3e60d943edc657e70a"}, - {file = "proto_plus-1.20.4-py3-none-any.whl", hash = "sha256:3cfaac30676793d5ee764a0982bc30481beb5059f315e2a2422d7c73ded5b601"}, + {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" +protobuf = ">=3.19.0,<6.0.0dev" [package.extras] -testing = ["google-api-core[grpc] (>=1.22.2)"] +testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" -version = "5.27.1" +version = "5.27.2" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.27.1-cp310-abi3-win32.whl", hash = "sha256:3adc15ec0ff35c5b2d0992f9345b04a540c1e73bfee3ff1643db43cc1d734333"}, - {file = "protobuf-5.27.1-cp310-abi3-win_amd64.whl", hash = "sha256:25236b69ab4ce1bec413fd4b68a15ef8141794427e0b4dc173e9d5d9dffc3bcd"}, - {file = "protobuf-5.27.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4e38fc29d7df32e01a41cf118b5a968b1efd46b9c41ff515234e794011c78b17"}, - {file = "protobuf-5.27.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:917ed03c3eb8a2d51c3496359f5b53b4e4b7e40edfbdd3d3f34336e0eef6825a"}, - {file = "protobuf-5.27.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:ee52874a9e69a30271649be88ecbe69d374232e8fd0b4e4b0aaaa87f429f1631"}, - {file = "protobuf-5.27.1-cp38-cp38-win32.whl", hash = "sha256:7a97b9c5aed86b9ca289eb5148df6c208ab5bb6906930590961e08f097258107"}, - {file = "protobuf-5.27.1-cp38-cp38-win_amd64.whl", hash = "sha256:f6abd0f69968792da7460d3c2cfa7d94fd74e1c21df321eb6345b963f9ec3d8d"}, - {file = "protobuf-5.27.1-cp39-cp39-win32.whl", hash = "sha256:dfddb7537f789002cc4eb00752c92e67885badcc7005566f2c5de9d969d3282d"}, - {file = "protobuf-5.27.1-cp39-cp39-win_amd64.whl", hash = "sha256:39309898b912ca6febb0084ea912e976482834f401be35840a008da12d189340"}, - {file = "protobuf-5.27.1-py3-none-any.whl", hash = "sha256:4ac7249a1530a2ed50e24201d6630125ced04b30619262f06224616e0030b6cf"}, - {file = "protobuf-5.27.1.tar.gz", hash = "sha256:df5e5b8e39b7d1c25b186ffdf9f44f40f810bbcc9d2b71d9d3156fee5a9adf15"}, + {file = "protobuf-5.27.2-cp310-abi3-win32.whl", hash = "sha256:354d84fac2b0d76062e9b3221f4abbbacdfd2a4d8af36bab0474f3a0bb30ab38"}, + {file = "protobuf-5.27.2-cp310-abi3-win_amd64.whl", hash = "sha256:0e341109c609749d501986b835f667c6e1e24531096cff9d34ae411595e26505"}, + {file = "protobuf-5.27.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a109916aaac42bff84702fb5187f3edadbc7c97fc2c99c5ff81dd15dcce0d1e5"}, + {file = "protobuf-5.27.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:176c12b1f1c880bf7a76d9f7c75822b6a2bc3db2d28baa4d300e8ce4cde7409b"}, + {file = "protobuf-5.27.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:b848dbe1d57ed7c191dfc4ea64b8b004a3f9ece4bf4d0d80a367b76df20bf36e"}, + {file = "protobuf-5.27.2-cp38-cp38-win32.whl", hash = "sha256:4fadd8d83e1992eed0248bc50a4a6361dc31bcccc84388c54c86e530b7f58863"}, + {file = "protobuf-5.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:610e700f02469c4a997e58e328cac6f305f649826853813177e6290416e846c6"}, + {file = "protobuf-5.27.2-cp39-cp39-win32.whl", hash = "sha256:9e8f199bf7f97bd7ecebffcae45ebf9527603549b2b562df0fbc6d4d688f14ca"}, + {file = "protobuf-5.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:7fc3add9e6003e026da5fc9e59b131b8f22b428b991ccd53e2af8071687b4fce"}, + {file = "protobuf-5.27.2-py3-none-any.whl", hash = "sha256:54330f07e4949d09614707c48b06d1a22f8ffb5763c159efd5c0928326a91470"}, + {file = "protobuf-5.27.2.tar.gz", hash = "sha256:f3ecdef226b9af856075f28227ff2c90ce3a594d092c39bee5513573f25e2714"}, +] + +[[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 = "py" version = "1.11.0" @@ -3546,109 +3583,119 @@ files = [ [[package]] name = "pydantic" -version = "2.7.4" +version = "2.8.2" 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"}, + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.18.4" -typing-extensions = ">=4.6.1" +pydantic-core = "2.20.1" +typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} [package.extras] email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.18.4" +version = "2.20.1" 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"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, ] [package.dependencies] @@ -3749,59 +3796,59 @@ files = [ [[package]] name = "pyreqwest-impersonate" -version = "0.4.7" +version = "0.4.9" description = "HTTP client that can impersonate web browsers, mimicking their headers and `TLS/JA3/JA4/HTTP2` fingerprints" optional = false python-versions = ">=3.8" files = [ - {file = "pyreqwest_impersonate-0.4.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c175dfc429c4231a6ce03841630b236f50995ca613ff1eea26fa4c75c730b562"}, - {file = "pyreqwest_impersonate-0.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3f83c50cef2d5ed0a9246318fd3ef3bfeabe286d4eabf92df4835c05a0be7dc"}, - {file = "pyreqwest_impersonate-0.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f34930113aa42f47e0542418f6a67bdb2c23fe0e2fa1866f60b29280a036b829"}, - {file = "pyreqwest_impersonate-0.4.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88d2792df548b845edd409a3e4284f76cb4fc2510fe4a69fde9e39d54910b935"}, - {file = "pyreqwest_impersonate-0.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27622d5183185dc63bcab9a7dd1de566688c63b844812b1d9366da7c459a494"}, - {file = "pyreqwest_impersonate-0.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b7bf13d49ef127e659ed134129336e94f7107023ed0138c81a46321b9a580428"}, - {file = "pyreqwest_impersonate-0.4.7-cp310-none-win_amd64.whl", hash = "sha256:0cba006b076b85a875814a4b5dd8cb27f483ebeeb0de83984a3786060fe18e0d"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:370a8cb7a92b15749cbbe3ce7a9f09d35aac7d2a74505eb447f45419ea8ef2ff"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:33244ea10ccee08bac7a7ccdc3a8e6bef6e28f2466ed61de551fa24b76ee4b6a"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba24fb6db822cbd9cbac32539893cc19cc06dd1820e03536e685b9fd2a2ffdd"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e001ed09fc364cc00578fd31c0ae44d543cf75daf06b2657c7a82dcd99336ce"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:608525535f078e85114fcd4eeba0f0771ffc7093c29208e9c0a55147502723bf"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:38daedba0fc997e29cbc25c684a42a04aed38bfbcf85d8f1ffe8f87314d5f72f"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-none-win_amd64.whl", hash = "sha256:d21f3e93ee0aecdc43d2914800bdf23501bde858d70ac7c0b06168f85f95bf22"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5caeee29370a06a322ea6951730d21ec3c641ce46417fd2b5805b283564f2fef"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1c7aa4b428ed58370975d828a95eaf10561712e79a4e2eafca1746a4654a34a8"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:887249adcab35487a44a5428ccab2a6363642785b36649a732d5e649df568b8e"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60f932de8033c15323ba79a7470406ca8228e07aa60078dee5a18e89f0a9fc88"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a2e6332fd6d78623a22f4e747688fe9e6005b61b6f208936d5428d2a65d34b39"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:349b005eef323195685ba5cb2b6f302da0db481e59f03696ef57099f232f0c1f"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-none-win_amd64.whl", hash = "sha256:5620025ac138a10c46a9b14c91b6f58114d50063ff865a2d02ad632751b67b29"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ebf954e09b3dc800a7576c7bde9827b00064531364c7817356c7cc58eb4b46b2"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:112d9561f136548bd67d31cadb6b78d4c31751e526e62e09c6e581c2f1711455"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05213f5f014ecc6732d859a0f51b3dff0424748cc6e2d0d9a42aa1f7108b4eaa"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10fa70529a60fc043650ce03481fab7714e7519c3b06f5e81c95206b8b60aec6"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5b1288881eada1891db7e862c69b673fb159834a41f823b9b00fc52d0f096ccc"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:57ca562229c40615074f36e7f1ae5e57b8164f604eddb042132467c3a00fc2c5"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-none-win_amd64.whl", hash = "sha256:c098ef1333511ea9a43be9a818fcc0866bd2caa63cdc9cf4ab48450ace675646"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:39d961330190bf2d59983ad16dafb4b42d5adcdfe7531ad099c8f3ab53f8d906"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0d793591784b89953422b1efaa17460f57f6116de25b3e3065d9fa6cf220ef18"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:945116bb9ffb7e45a87e313f47de28c4da889b14bda620aebc5ba9c3600425cf"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b96a0955c49f346786ee997c755561fecf33b7886cecef861fe4db15c7b23ad3"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ed997197f907ccce9b86a75163b5e78743bc469d2ddcf8a22d4d90c2595573cb"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1f54788f6fb0ee8b31c1eaadba81fb003efb406a768844e2a1a50b855f4806bf"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-none-win_amd64.whl", hash = "sha256:0a679e81b0175dcc670a5ed47a5c184d7031ce16b5c58bf6b2c650ab9f2496c8"}, - {file = "pyreqwest_impersonate-0.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bddb07e04e4006a2184608c44154983fdfa0ce2e230b0a7cec81cd4ba88dd07"}, - {file = "pyreqwest_impersonate-0.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:780c53bfd2fbda151081165733fba5d5b1e17dd61999360110820942e351d011"}, - {file = "pyreqwest_impersonate-0.4.7-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4bfa8ea763e6935e7660f8e885f1b00713b0d22f79a526c6ae6932b1856d1343"}, - {file = "pyreqwest_impersonate-0.4.7-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:96b23b0688a63cbd6c39237461baa95162a69a15e9533789163aabcaf3f572fb"}, - {file = "pyreqwest_impersonate-0.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b0eb56a8ad9d48952c613903d3ef6d8762d48dcec9807a509fee2a43e94ccac"}, - {file = "pyreqwest_impersonate-0.4.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9330176494e260521ea0eaae349ca06128dc527400248c57b378597c470d335c"}, - {file = "pyreqwest_impersonate-0.4.7-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:6343bc3392781ff470e5dc47fea9f77bb61d8831b07e901900d31c46decec5d1"}, - {file = "pyreqwest_impersonate-0.4.7-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ecd598e16020a165029647ca80078311bf079e8317bf61c1b2fa824b8967e0db"}, - {file = "pyreqwest_impersonate-0.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a38f3014ac31b08f5fb1ef4e1eb6c6e810f51f6cb815d0066ab3f34ec0f82d98"}, - {file = "pyreqwest_impersonate-0.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db76a97068e5145f5b348037e09a91b2bed9c8eab92e79a3297b1306429fa839"}, - {file = "pyreqwest_impersonate-0.4.7-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1596a8ef8f20bbfe606a90ad524946747846611c8633cbdfbad0a4298b538218"}, - {file = "pyreqwest_impersonate-0.4.7-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dcee18bc350b3d3a0455422c446f1f03f00eb762b3e470066e2bc4664fd7110d"}, - {file = "pyreqwest_impersonate-0.4.7.tar.gz", hash = "sha256:74ba7e6e4f4f753da4f71a7e5dc12625b296bd7d6ddd64093a1fbff14d8d5df7"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a229f56575d992df0c520d93408b4b6b660b304387af06208e7b97d739cce2ff"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c00dbfd0ed878bed231384cd0c823d71a42220ae73c6d982b6fe77d2870338ca"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d4e6ce0e48b73740f08b1aa69cdbded5d66f4eec327d5eaf2ac42a4fce1a008"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690a5c5615b33cbab340e3a4247256ede157ebf39a02f563cff5356bf61c0c51"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7231511ee14faee27b90a84ec74e15515b7e2d1c389710698660765eaed6e2fd"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2fdbe8e146e595c02fa0afb776d70f9e3b351122e2de9af15934b83f3a548ecd"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-none-win_amd64.whl", hash = "sha256:982b0e53db24c084675a056944dd769aa07cd1378abf972927f3f1afb23e08b0"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:60b1102b8aec7bbf91e0f7b8bbc3507776731a9acc6844de764911e8d64f7dd2"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37150478157e683374517d4c0eae0f991b8f5280067a8ee042b6a72fec088843"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc77cd1cdae22dad7549a4e9a1a4630619c2ff443add1b28c7d607accda81eb"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83e99e627d13f1f60d71ce2c2a2b03e1c7f57e8f6a73bde2827ff97cb96f1683"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:72d1adb73264db8c5e24d073d558a895d6690d13a5e38fd857b8b01c33fcbabf"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6253bd8a104316bbece0e6c658d28292f0bf37a99cccfaf476470b98252d185b"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-none-win_amd64.whl", hash = "sha256:7e25628a900236fc76320e790fce90e5502371994523c476af2b1c938382f5fa"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:57e1e7f3bfc175c3229947cdd2b26564bcea2923135b8dec8ab157609e201a7c"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3aeb1c834f54fe685d3c7c0bec65dd981bd988fa3725ee3c7b5656eb7c44a1f7"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27bc384f18099573817d7ed68d12eb67d33dfc5d2b30ab2ac5a69cdf19c22b6f"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd604444ddf86ed222b49dd5e3f050c4c0e980dd7be0b3ea0f208fb70544c4b6"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5206dc7311081accf5b7d021c9e0e68219fd7bb35b0cd755b2d72c3ebfa41842"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76802f0738c2d00bb4e057938ec048c4c7c4efc5c44f04b9d877ad4419b21ee8"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-none-win_amd64.whl", hash = "sha256:7cf94f6365bc144f787658e844f94dad38107fb9ff61d65079fb6510447777fe"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:66e92bd868146028dac1ef9cd2b4aac57e7e6cbd8806fa8a4c77ac5becf396e1"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc3ff7ac332879e40301d737b3ec1f3691b1de7492728bea26e75e26d05f89ec"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c9e9eba83620852d4253023e50e3436726aee16e2de94afbd468da4373830dc"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d6b47d403c63b461a97efa2aed668f0f06ed26cf61c23d7d6dab4f5a0c81ffc"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:88f695a01e8699ec3a1547d793617b9fd00f810c05c2b4dc0d1472c7f12eed97"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:abb4fbfaa1a3c3adeb7f46baa1d67663af85ab24f2b4cdd15a668ddc6be3a375"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-none-win_amd64.whl", hash = "sha256:884c1399fe0157dcd0a5a71e3600910df50faa0108c64602d47c15e75b32e60b"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bf5cd99276207510d64b48eff5602e12f049754d3b0f1194a024e1a080a61d3d"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:029eea1d386d12856da767d685169835f0b0c025ae312c1ee7bc0d8cb47a7d3d"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1bfb8795fe0a46aee883abcf510a9ecdb4e9acf75c3a5a23571276f555f5e88"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fe35ce48e7e6b570304ee15915da0e6fab82dcae2b7a1d1a92593b522ebe852"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dfa377a842bd2e73d1f201bfc33194dd98c148372409d376f6d57efe338ff0eb"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d46880e68eb779cd071648e94a7ec50b3b77a28210f218be407eda1b0c8df343"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-none-win_amd64.whl", hash = "sha256:ac431e4a94f8529a19a396750d78c66cc4fa11a8cc61d4bed7f0e0295a9394a9"}, + {file = "pyreqwest_impersonate-0.4.9-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12fd04d8da4d23ab5720402fd9f3b6944fb388c19952f2ec9121b46ac1f74616"}, + {file = "pyreqwest_impersonate-0.4.9-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b52df560d78681cde2fbc39bee547a42a79c8fd33655b79618835ecc412e6933"}, + {file = "pyreqwest_impersonate-0.4.9-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e1a2828942f9d589ee6161496444a380d3305e78bda25ff63e4f993b0545b193"}, + {file = "pyreqwest_impersonate-0.4.9-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:beebedf6d8c0d5fdee9ae15bc64a74e51b35f98eb0d049bf2db067702fbf4e53"}, + {file = "pyreqwest_impersonate-0.4.9-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a3d47dea1f46410b58ab60795b5818c8c99d901f6c93fbb6a9d23fa55adb2b1"}, + {file = "pyreqwest_impersonate-0.4.9-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb871adc5d12b2bcbb5af167384d49fc4e7e5e07d12cf912b931149163df724"}, + {file = "pyreqwest_impersonate-0.4.9-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d1b0b5556d2bd14a4ffa32654291fe2a9ef1eaac35b5514d9220e7e333a6c727"}, + {file = "pyreqwest_impersonate-0.4.9-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5d50feaec78c06d51e1dd65cdbe80a1fc62ff93c8114555482f8a8cc5fe14895"}, + {file = "pyreqwest_impersonate-0.4.9-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2a9cfc41917200d8eee61b87a5668abe7d1f924a55b7437065540edf613beed"}, + {file = "pyreqwest_impersonate-0.4.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8106e3df0c1dca4df99e0f998f0e085ea3e1facfaa5afc268160a496ddf7256f"}, + {file = "pyreqwest_impersonate-0.4.9-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ff66bb7dc6b1f52cf950b5e9cb0e53baffd1a15da595fd1ef933cd9e36396403"}, + {file = "pyreqwest_impersonate-0.4.9-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39f2a3ed17cf08098dc637459e88fb86d3fa7bdf9502659c82218be75651649c"}, + {file = "pyreqwest_impersonate-0.4.9.tar.gz", hash = "sha256:4ec8df7fe813e89f61e814c5ef75f6fd71164c8e26299c1a42dcd0d42f0bc96c"}, ] [package.extras] @@ -4013,104 +4060,104 @@ files = [ [[package]] name = "rapidfuzz" -version = "3.9.3" +version = "3.9.4" 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"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9b9793c19bdf38656c8eaefbcf4549d798572dadd70581379e666035c9df781"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:015b5080b999404fe06ec2cb4f40b0be62f0710c926ab41e82dfbc28e80675b4"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc5ceca9c1e1663f3e6c23fb89a311f69b7615a40ddd7645e3435bf3082688a"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1424e238bc3f20e1759db1e0afb48a988a9ece183724bef91ea2a291c0b92a95"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed01378f605aa1f449bee82cd9c83772883120d6483e90aa6c5a4ce95dc5c3aa"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb26d412271e5a76cdee1c2d6bf9881310665d3fe43b882d0ed24edfcb891a84"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f37e9e1f17be193c41a31c864ad4cd3ebd2b40780db11cd5c04abf2bcf4201b"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d070ec5cf96b927c4dc5133c598c7ff6db3b833b363b2919b13417f1002560bc"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:10e61bb7bc807968cef09a0e32ce253711a2d450a4dce7841d21d45330ffdb24"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:31a2fc60bb2c7face4140010a7aeeafed18b4f9cdfa495cc644a68a8c60d1ff7"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fbebf1791a71a2e89f5c12b78abddc018354d5859e305ec3372fdae14f80a826"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:aee9fc9e3bb488d040afc590c0a7904597bf4ccd50d1491c3f4a5e7e67e6cd2c"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-win32.whl", hash = "sha256:005a02688a51c7d2451a2d41c79d737aa326ff54167211b78a383fc2aace2c2c"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:3a2e75e41ee3274754d3b2163cc6c82cd95b892a85ab031f57112e09da36455f"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-win_arm64.whl", hash = "sha256:2c99d355f37f2b289e978e761f2f8efeedc2b14f4751d9ff7ee344a9a5ca98d9"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:07141aa6099e39d48637ce72a25b893fc1e433c50b3e837c75d8edf99e0c63e1"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db1664eaff5d7d0f2542dd9c25d272478deaf2c8412e4ad93770e2e2d828e175"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc01a223f6605737bec3202e94dcb1a449b6c76d46082cfc4aa980f2a60fd40e"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1869c42e73e2a8910b479be204fa736418741b63ea2325f9cc583c30f2ded41a"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62ea7007941fb2795fff305ac858f3521ec694c829d5126e8f52a3e92ae75526"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:698e992436bf7f0afc750690c301215a36ff952a6dcd62882ec13b9a1ebf7a39"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b76f611935f15a209d3730c360c56b6df8911a9e81e6a38022efbfb96e433bab"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129627d730db2e11f76169344a032f4e3883d34f20829419916df31d6d1338b1"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:90a82143c14e9a14b723a118c9ef8d1bbc0c5a16b1ac622a1e6c916caff44dd8"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ded58612fe3b0e0d06e935eaeaf5a9fd27da8ba9ed3e2596307f40351923bf72"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f16f5d1c4f02fab18366f2d703391fcdbd87c944ea10736ca1dc3d70d8bd2d8b"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:26aa7eece23e0df55fb75fbc2a8fb678322e07c77d1fd0e9540496e6e2b5f03e"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-win32.whl", hash = "sha256:f187a9c3b940ce1ee324710626daf72c05599946bd6748abe9e289f1daa9a077"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d8e9130fe5d7c9182990b366ad78fd632f744097e753e08ace573877d67c32f8"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-win_arm64.whl", hash = "sha256:40419e98b10cd6a00ce26e4837a67362f658fc3cd7a71bd8bd25c99f7ee8fea5"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b5d5072b548db1b313a07d62d88fe0b037bd2783c16607c647e01b070f6cf9e5"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf5bcf22e1f0fd273354462631d443ef78d677f7d2fc292de2aec72ae1473e66"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c8fc973adde8ed52810f590410e03fb6f0b541bbaeb04c38d77e63442b2df4c"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2464bb120f135293e9a712e342c43695d3d83168907df05f8c4ead1612310c7"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d9d58689aca22057cf1a5851677b8a3ccc9b535ca008c7ed06dc6e1899f7844"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167e745f98baa0f3034c13583e6302fb69249a01239f1483d68c27abb841e0a1"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db0bf0663b4b6da1507869722420ea9356b6195aa907228d6201303e69837af9"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd6ac61b74fdb9e23f04d5f068e6cf554f47e77228ca28aa2347a6ca8903972f"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:60ff67c690acecf381759c16cb06c878328fe2361ddf77b25d0e434ea48a29da"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:cb934363380c60f3a57d14af94325125cd8cded9822611a9f78220444034e36e"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fe833493fb5cc5682c823ea3e2f7066b07612ee8f61ecdf03e1268f262106cdd"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2797fb847d89e04040d281cb1902cbeffbc4b5131a5c53fc0db490fd76b2a547"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-win32.whl", hash = "sha256:52e3d89377744dae68ed7c84ad0ddd3f5e891c82d48d26423b9e066fc835cc7c"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:c76da20481c906e08400ee9be230f9e611d5931a33707d9df40337c2655c84b5"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-win_arm64.whl", hash = "sha256:f2d2846f3980445864c7e8b8818a29707fcaff2f0261159ef6b7bd27ba139296"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:355fc4a268ffa07bab88d9adee173783ec8d20136059e028d2a9135c623c44e6"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d81a78f90269190b568a8353d4ea86015289c36d7e525cd4d43176c88eff429"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e618625ffc4660b26dc8e56225f8b966d5842fa190e70c60db6cd393e25b86e"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b712336ad6f2bacdbc9f1452556e8942269ef71f60a9e6883ef1726b52d9228a"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc1ee19fdad05770c897e793836c002344524301501d71ef2e832847425707"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1950f8597890c0c707cb7e0416c62a1cf03dcdb0384bc0b2dbda7e05efe738ec"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a6c35f272ec9c430568dc8c1c30cb873f6bc96be2c79795e0bce6db4e0e101d"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:1df0f9e9239132a231c86ae4f545ec2b55409fa44470692fcfb36b1bd00157ad"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d2c51955329bfccf99ae26f63d5928bf5be9fcfcd9f458f6847fd4b7e2b8986c"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:3c522f462d9fc504f2ea8d82e44aa580e60566acc754422c829ad75c752fbf8d"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:d8a52fc50ded60d81117d7647f262c529659fb21d23e14ebfd0b35efa4f1b83d"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:04dbdfb0f0bfd3f99cf1e9e24fadc6ded2736d7933f32f1151b0f2abb38f9a25"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-win32.whl", hash = "sha256:4968c8bd1df84b42f382549e6226710ad3476f976389839168db3e68fd373298"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:3fe4545f89f8d6c27b6bbbabfe40839624873c08bd6700f63ac36970a179f8f5"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f256c8fb8f3125574c8c0c919ab0a1f75d7cba4d053dda2e762dcc36357969d"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fdc09cf6e9d8eac3ce48a4615b3a3ee332ea84ac9657dbbefef913b13e632f"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d395d46b80063d3b5d13c0af43d2c2cedf3ab48c6a0c2aeec715aa5455b0c632"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fa714fb96ce9e70c37e64c83b62fe8307030081a0bfae74a76fac7ba0f91715"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc1a0f29f9119be7a8d3c720f1d2068317ae532e39e4f7f948607c3a6de8396"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6022674aa1747d6300f699cd7c54d7dae89bfe1f84556de699c4ac5df0838082"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcb72e5f9762fd469701a7e12e94b924af9004954f8c739f925cb19c00862e38"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ad04ae301129f0eb5b350a333accd375ce155a0c1cec85ab0ec01f770214e2e4"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f46a22506f17c0433e349f2d1dc11907c393d9b3601b91d4e334fa9a439a6a4d"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:01b42a8728c36011718da409aa86b84984396bf0ca3bfb6e62624f2014f6022c"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e590d5d5443cf56f83a51d3c4867bd1f6be8ef8cfcc44279522bcef3845b2a51"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4c72078b5fdce34ba5753f9299ae304e282420e6455e043ad08e4488ca13a2b0"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-win32.whl", hash = "sha256:f75639277304e9b75e6a7b3c07042d2264e16740a11e449645689ed28e9c2124"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:e81e27e8c32a1e1278a4bb1ce31401bfaa8c2cc697a053b985a6f8d013df83ec"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-win_arm64.whl", hash = "sha256:15bc397ee9a3ed1210b629b9f5f1da809244adc51ce620c504138c6e7095b7bd"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:20488ade4e1ddba3cfad04f400da7a9c1b91eff5b7bd3d1c50b385d78b587f4f"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:e61b03509b1a6eb31bc5582694f6df837d340535da7eba7bedb8ae42a2fcd0b9"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:098d231d4e51644d421a641f4a5f2f151f856f53c252b03516e01389b2bfef99"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17ab8b7d10fde8dd763ad428aa961c0f30a1b44426e675186af8903b5d134fb0"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e272df61bee0a056a3daf99f9b1bd82cf73ace7d668894788139c868fdf37d6f"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d6481e099ff8c4edda85b8b9b5174c200540fd23c8f38120016c765a86fa01f5"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ad61676e9bdae677d577fe80ec1c2cea1d150c86be647e652551dcfe505b1113"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:af65020c0dd48d0d8ae405e7e69b9d8ae306eb9b6249ca8bf511a13f465fad85"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d38b4e026fcd580e0bda6c0ae941e0e9a52c6bc66cdce0b8b0da61e1959f5f8"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f74ed072c2b9dc6743fb19994319d443a4330b0e64aeba0aa9105406c7c5b9c2"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee5f6b8321f90615c184bd8a4c676e9becda69b8e4e451a90923db719d6857c"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3a555e3c841d6efa350f862204bb0a3fea0c006b8acc9b152b374fa36518a1c6"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0772150d37bf018110351c01d032bf9ab25127b966a29830faa8ad69b7e2f651"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:addcdd3c3deef1bd54075bd7aba0a6ea9f1d01764a08620074b7a7b1e5447cb9"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fe86b82b776554add8f900b6af202b74eb5efe8f25acdb8680a5c977608727f"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0fc91ac59f4414d8542454dfd6287a154b8e6f1256718c898f695bdbb993467"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a944e546a296a5fdcaabb537b01459f1b14d66f74e584cb2a91448bffadc3c1"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4fb96ba96d58c668a17a06b5b5e8340fedc26188e87b0d229d38104556f30cd8"}, + {file = "rapidfuzz-3.9.4.tar.gz", hash = "sha256:366bf8947b84e37f2f4cf31aaf5f37c39f620d8c0eddb8b633e6ba0129ca4a0a"}, ] [package.extras] @@ -4270,13 +4317,13 @@ pyasn1 = ">=0.1.3" [[package]] name = "s3transfer" -version = "0.10.1" +version = "0.10.2" description = "An Amazon S3 Transfer Manager" optional = false -python-versions = ">= 3.8" +python-versions = ">=3.8" files = [ - {file = "s3transfer-0.10.1-py3-none-any.whl", hash = "sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d"}, - {file = "s3transfer-0.10.1.tar.gz", hash = "sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19"}, + {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"}, + {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"}, ] [package.dependencies] @@ -4409,45 +4456,45 @@ torch = ["safetensors[numpy]", "torch (>=1.10)"] [[package]] name = "scipy" -version = "1.13.1" +version = "1.14.0" description = "Fundamental algorithms for scientific computing in Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" 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"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1"}, + {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0"}, + {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0"}, + {file = "scipy-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d"}, + {file = "scipy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86"}, + {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8"}, + {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74"}, + {file = "scipy-1.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb"}, + {file = "scipy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f"}, + {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209"}, + {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14"}, + {file = "scipy-1.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159"}, + {file = "scipy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20"}, + {file = "scipy-1.14.0.tar.gz", hash = "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b"}, ] [package.dependencies] -numpy = ">=1.22.4,<2.3" +numpy = ">=1.23.5,<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"] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "scramp" @@ -4498,64 +4545,64 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.30" +version = "2.0.31" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, - {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, - {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, + {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", optional = true, markers = "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\" or extra == \"asyncio\""} +greenlet = {version = "!=0.4.17", optional = true, 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\") or extra == \"asyncio\""} typing-extensions = ">=4.6.0" [package.extras] @@ -4596,17 +4643,20 @@ files = [ [[package]] name = "sympy" -version = "1.12.1" +version = "1.13.0" 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"}, + {file = "sympy-1.13.0-py3-none-any.whl", hash = "sha256:6b0b32a4673fb91bd3cac3b55406c8e01d53ae22780be467301cc452f6680c92"}, + {file = "sympy-1.13.0.tar.gz", hash = "sha256:3b6af8f4d008b9a1a6a4268b335b984b23835f26d1d60b0526ebc71d48a25f57"}, ] [package.dependencies] -mpmath = ">=1.1.0,<1.4.0" +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] [[package]] name = "tabulate" @@ -4624,15 +4674,15 @@ widechars = ["wcwidth"] [[package]] name = "tbb" -version = "2021.12.0" +version = "2021.13.0" description = "Intel® oneAPI Threading Building Blocks (oneTBB)" optional = false python-versions = "*" files = [ - {file = "tbb-2021.12.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:f2cc9a7f8ababaa506cbff796ce97c3bf91062ba521e15054394f773375d81d8"}, - {file = "tbb-2021.12.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:a925e9a7c77d3a46ae31c34b0bb7f801c4118e857d137b68f68a8e458fcf2bd7"}, - {file = "tbb-2021.12.0-py3-none-win32.whl", hash = "sha256:b1725b30c174048edc8be70bd43bb95473f396ce895d91151a474d0fa9f450a8"}, - {file = "tbb-2021.12.0-py3-none-win_amd64.whl", hash = "sha256:fc2772d850229f2f3df85f1109c4844c495a2db7433d38200959ee9265b34789"}, + {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]] @@ -4704,13 +4754,13 @@ blobfile = ["blobfile (>=2)"] [[package]] name = "timm" -version = "1.0.3" +version = "1.0.7" description = "PyTorch Image Models" optional = false python-versions = ">=3.8" files = [ - {file = "timm-1.0.3-py3-none-any.whl", hash = "sha256:d1ec86f7765aa79fbc7491508fa6e285d38a38f10bf4fe44ba2e9c70f91f0f5b"}, - {file = "timm-1.0.3.tar.gz", hash = "sha256:83920a7efe2cfd503b2a1257dc8808d6ff7dcd18a4b79f451c283e7d71497329"}, + {file = "timm-1.0.7-py3-none-any.whl", hash = "sha256:942ced65b47b5ec12b8df07eb8ee929f1bb310402155b28931ab7a85ecc1cef2"}, + {file = "timm-1.0.7.tar.gz", hash = "sha256:d1d26d906b5e188d7e7d536a6a0999568bb184f884f9a334c48d46fc6dc166c8"}, ] [package.dependencies] @@ -4950,19 +5000,19 @@ telegram = ["requests"] [[package]] name = "transformers" -version = "4.41.2" +version = "4.42.3" 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"}, + {file = "transformers-4.42.3-py3-none-any.whl", hash = "sha256:a61a0df9609b7d69229d941b2fd857c841ba3043d6da503d0da1a4b133f65b92"}, + {file = "transformers-4.42.3.tar.gz", hash = "sha256:7539873ff45809145265cbc94ea4619d2713c41ceaa277b692d8b0be3430f7eb"}, ] [package.dependencies] filelock = "*" -huggingface-hub = ">=0.23.0,<1.0" -numpy = ">=1.17" +huggingface-hub = ">=0.23.2,<1.0" +numpy = ">=1.17,<2.0" packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" @@ -4974,14 +5024,15 @@ tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.21.0)"] agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +benchmark = ["optimum-benchmark (>=0.2.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.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)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] 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"] @@ -4992,25 +5043,26 @@ 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)"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.4.4)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +ruff = ["ruff (==0.4.4)"] 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"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] -tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] -timm = ["timm"] +timm = ["timm (<=0.9.16)"] tokenizers = ["tokenizers (>=0.19,<0.20)"] torch = ["accelerate (>=0.21.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.23.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)"] +torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17,<2.0)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] @@ -5087,13 +5139,13 @@ files = [ [[package]] name = "unstructured" -version = "0.14.6" +version = "0.14.10" 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"}, + {file = "unstructured-0.14.10-py3-none-any.whl", hash = "sha256:127052de54f0c49cd7c4432dd5e6c1f3fe0b8521192e32b126a0758dcc06da65"}, + {file = "unstructured-0.14.10.tar.gz", hash = "sha256:7076567a27e204ddbe129eb99e66bcc90c1cae6c4d4138506f6d555a527be73f"}, ] [package.dependencies] @@ -5110,7 +5162,7 @@ lxml = "*" markdown = {version = "*", optional = true, markers = "extra == \"md\""} networkx = {version = "*", optional = true, markers = "extra == \"xlsx\""} nltk = "*" -numpy = "*" +numpy = "<2" onnx = {version = "*", optional = true, markers = "extra == \"pdf\""} openpyxl = {version = "*", optional = true, markers = "extra == \"xlsx\""} pandas = {version = "*", optional = true, markers = "extra == \"xlsx\""} @@ -5118,6 +5170,7 @@ pdf2image = {version = "*", optional = true, markers = "extra == \"pdf\""} "pdfminer.six" = {version = "*", optional = true, markers = "extra == \"pdf\""} pikepdf = {version = "*", optional = true, markers = "extra == \"pdf\""} pillow-heif = {version = "*", optional = true, markers = "extra == \"pdf\""} +psutil = "*" pypdf = {version = "*", optional = true, markers = "extra == \"pdf\""} pytesseract = {version = "*", optional = true, markers = "extra == \"pdf\""} python-docx = {version = ">=1.1.2", optional = true, markers = "extra == \"docx\""} @@ -5130,14 +5183,14 @@ tabulate = "*" tqdm = "*" typing-extensions = "*" unstructured-client = "*" -unstructured-inference = {version = "0.7.35", optional = true, markers = "extra == \"pdf\""} +unstructured-inference = {version = "0.7.36", optional = true, markers = "extra == \"pdf\""} "unstructured.pytesseract" = {version = ">=0.3.12", optional = true, markers = "extra == \"pdf\""} wrapt = "*" xlrd = {version = "*", optional = true, markers = "extra == \"xlsx\""} [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"] +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.36)", "unstructured.pytesseract (>=0.3.12)", "xlrd"] astra = ["astrapy"] azure = ["adlfs", "fsspec"] azure-cognitive-search = ["azure-search-documents"] @@ -5154,7 +5207,7 @@ discord = ["discord-py"] doc = ["python-docx (>=1.1.2)"] docx = ["python-docx (>=1.1.2)"] dropbox = ["dropboxdrivefs", "fsspec"] -elasticsearch = ["elasticsearch"] +elasticsearch = ["elasticsearch[async]"] embed-huggingface = ["huggingface", "langchain-community", "sentence-transformers"] embed-octoai = ["openai", "tiktoken"] embed-vertexai = ["langchain", "langchain-community", "langchain-google-vertexai"] @@ -5166,9 +5219,10 @@ 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)"] +image = ["effdet", "google-cloud-vision", "onnx", "pdf2image", "pdfminer.six", "pikepdf", "pillow-heif", "pypdf", "pytesseract", "unstructured-inference (==0.7.36)", "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"] +kafka = ["confluent-kafka"] +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.36)", "unstructured.pytesseract (>=0.3.12)", "xlrd"] md = ["markdown"] mongodb = ["pymongo"] msg = ["python-oxmsg"] @@ -5180,7 +5234,7 @@ 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)"] +pdf = ["effdet", "google-cloud-vision", "onnx", "pdf2image", "pdfminer.six", "pikepdf", "pillow-heif", "pypdf", "pytesseract", "unstructured-inference (==0.7.36)", "unstructured.pytesseract (>=0.3.12)"] pinecone = ["pinecone-client (>=3.7.1)"] postgres = ["psycopg2-binary"] ppt = ["python-pptx (<=0.6.23)"] @@ -5193,6 +5247,7 @@ s3 = ["fsspec", "s3fs"] salesforce = ["simple-salesforce"] sftp = ["fsspec", "paramiko"] sharepoint = ["Office365-REST-Python-Client", "msal"] +singlestore = ["singlestoredb"] slack = ["slack-sdk"] tsv = ["pandas"] weaviate = ["weaviate-client"] @@ -5201,13 +5256,13 @@ xlsx = ["networkx", "openpyxl", "pandas", "xlrd"] [[package]] name = "unstructured-client" -version = "0.23.5" +version = "0.24.0" description = "Python Client SDK for Unstructured API" optional = false python-versions = ">=3.8" files = [ - {file = "unstructured-client-0.23.5.tar.gz", hash = "sha256:daf41bb0573324c6c76a72d4827c53675ae1d3b29cc3fb3ac127be1ac4d47a43"}, - {file = "unstructured_client-0.23.5-py3-none-any.whl", hash = "sha256:e33ba5e3465b26395e84b65faf8ccbc4568ddd0c76f4b55277d1d6f3ff23dd32"}, + {file = "unstructured-client-0.24.0.tar.gz", hash = "sha256:c087715121a369393532036a357a858782d203ddba697610132c9e7687b7a295"}, + {file = "unstructured_client-0.24.0-py3-none-any.whl", hash = "sha256:f73d13765213234d489b1bc426adb0ea63135ccaf776a1646b08dba80e57f86a"}, ] [package.dependencies] @@ -5236,13 +5291,13 @@ dev = ["pylint (==3.1.0)"] [[package]] name = "unstructured-inference" -version = "0.7.35" +version = "0.7.36" description = "A library for performing inference using trained models." optional = false python-versions = ">=3.7.0" files = [ - {file = "unstructured_inference-0.7.35-py3-none-any.whl", hash = "sha256:3333c2547e22b701b429e2494d6df382fb3fdf7fa28fa0450c69807456ca5b44"}, - {file = "unstructured_inference-0.7.35.tar.gz", hash = "sha256:43574350d59916ac8300bb33699dce3461df75cebee85fc8039c1663fa2ef8d3"}, + {file = "unstructured_inference-0.7.36-py3-none-any.whl", hash = "sha256:6e59c2226c0d049d8e78e102d95bba1a126e14ede4d40494a72ef82ecf7fb64f"}, + {file = "unstructured_inference-0.7.36.tar.gz", hash = "sha256:0b998b311c6156df021d309147b724de4f88f80ef17d8328dfc37eedab67d82a"}, ] [package.dependencies] diff --git a/backend/embedding_statemachine/bedrock_knowledge_base/fetch_stack_output.py b/backend/embedding_statemachine/bedrock_knowledge_base/fetch_stack_output.py new file mode 100644 index 000000000..86609536d --- /dev/null +++ b/backend/embedding_statemachine/bedrock_knowledge_base/fetch_stack_output.py @@ -0,0 +1,46 @@ +import json +import boto3 +from app.repositories.custom_bot import ( + compose_bot_id, + decompose_bot_id, + find_private_bot_by_id, +) + +cf_client = boto3.client("cloudformation") + + +def handler(event, context): + print(event) + pk = event["pk"] + sk = event["sk"] + + bot_id = decompose_bot_id(sk) + + # Note: stack naming rule is defined on: + # cdk/bin/bedrock-knowledge-base.ts + stack_name = f"BrChatKbStack{bot_id}" + + response = cf_client.describe_stacks(StackName=stack_name) + outputs = response["Stacks"][0]["Outputs"] + + knowledge_base_id = None + data_source_ids = [] + + for output in outputs: + if output["OutputKey"] == "KnowledgeBaseId": + knowledge_base_id = output["OutputValue"] + elif output["OutputKey"].startswith("DataSource"): + data_source_ids.append(output["OutputValue"]) + + result = [] + for data_source_id in data_source_ids: + result.append( + { + "KnowledgeBaseId": knowledge_base_id, + "DataSourceId": data_source_id, + "PK": pk, + "SK": sk, + } + ) + + return result diff --git a/backend/embedding_statemachine/bedrock_knowledge_base/store_knowledge_base_id.py b/backend/embedding_statemachine/bedrock_knowledge_base/store_knowledge_base_id.py new file mode 100644 index 000000000..061caa907 --- /dev/null +++ b/backend/embedding_statemachine/bedrock_knowledge_base/store_knowledge_base_id.py @@ -0,0 +1,33 @@ +import os +import json +import logging + +import boto3 +from retry import retry +from app.routes.schemas.bot import type_sync_status +from app.repositories.common import _get_table_client +from app.repositories.custom_bot import decompose_bot_id, update_knowledge_base_id +from typing import TypedDict + +logger = logging.getLogger() +logger.setLevel(logging.INFO) + + +class StackOutput(TypedDict): + KnowledgeBaseId: str + DataSourceId: str + + +def handler(event, context): + logger.info(f"Event: {event}") + pk = event["pk"] + sk = event["sk"] + stack_output: list[StackOutput] = event["stack_output"] + + kb_id = stack_output[0]["KnowledgeBaseId"] + data_source_ids = [x["DataSourceId"] for x in stack_output] + + user_id = pk + bot_id = decompose_bot_id(sk) + + update_knowledge_base_id(user_id, bot_id, kb_id, data_source_ids) diff --git a/backend/embedding_statemachine/bedrock_knowledge_base/update_bot_status.py b/backend/embedding_statemachine/bedrock_knowledge_base/update_bot_status.py new file mode 100644 index 000000000..cf9d57123 --- /dev/null +++ b/backend/embedding_statemachine/bedrock_knowledge_base/update_bot_status.py @@ -0,0 +1,110 @@ +import json +import logging +import os + +import boto3 +from app.repositories.common import _get_table_client +from app.repositories.custom_bot import ( + compose_bot_id, + decompose_bot_id, + find_private_bot_by_id, +) +from app.routes.schemas.bot import type_sync_status +from retry import retry + +logger = logging.getLogger() +logger.setLevel(logging.DEBUG) + +dynamodb = boto3.resource("dynamodb") + +RETRIES_TO_UPDATE_SYNC_STATUS = 4 +RETRY_DELAY_TO_UPDATE_SYNC_STATUS = 2 + + +@retry(tries=RETRIES_TO_UPDATE_SYNC_STATUS, delay=RETRY_DELAY_TO_UPDATE_SYNC_STATUS) +def update_sync_status( + user_id: str, + bot_id: str, + sync_status: type_sync_status, + sync_status_reason: str, + last_exec_id: str, +): + table = _get_table_client(user_id) + table.update_item( + Key={"PK": user_id, "SK": compose_bot_id(user_id, bot_id)}, + UpdateExpression="SET SyncStatus = :sync_status, SyncStatusReason = :sync_status_reason, LastExecId = :last_exec_id", + ExpressionAttributeValues={ + ":sync_status": sync_status, + ":sync_status_reason": sync_status_reason, + ":last_exec_id": last_exec_id, + }, + ) + + +def extract_from_cause(cause_str: str) -> tuple: + logger.debug(f"Extracting PK and SK from cause: {cause_str}") + cause = json.loads(cause_str) + logger.debug(f"Cause: {cause}") + environment_variables = cause["Build"]["Environment"]["EnvironmentVariables"] + logger.debug(f"Environment variables: {environment_variables}") + + pk = next( + (item["Value"] for item in environment_variables if item["Name"] == "PK"), None + ) + sk = next( + (item["Value"] for item in environment_variables if item["Name"] == "SK"), None + ) + + if not pk or not sk: + raise ValueError("PK or SK not found in cause.") + + build_arn = cause["Build"].get("Arn", "") + + logger.debug(f"PK: {pk}, SK: {sk}, Build ARN: {build_arn}") + + return pk, sk, build_arn + + +def handler(event, context): + logger.info(f"Event: {event}") + try: + cause = event.get("cause", None) + ingestion_job = event.get("ingestion_job", None) + if cause: + # UpdateSymcStatusFailed + pk, sk, build_arn = extract_from_cause(cause) + sync_status = "FAILED" + sync_status_reason = cause + last_exec_id = build_arn + elif ingestion_job: + # UpdateSymcStatusFailedForIngestion + pk = event["pk"] + sk = event["sk"] + sync_status = "FAILED" + sync_status_reason = str(ingestion_job["IngestionJob"]["FailureReasons"]) + last_exec_id = ingestion_job["IngestionJob"]["IngestionJobId"] + else: + pk = event["pk"] + sk = event["sk"] + sync_status = event["sync_status"] + sync_status_reason = event.get("sync_status_reason", "") + last_exec_id = event.get("last_exec_id", "") + + user_id = pk + bot_id = decompose_bot_id(sk) + + logger.info( + f"Updating sync status for bot {bot_id} of user {user_id} to {sync_status} with reason: {sync_status_reason}" + ) + + update_sync_status( + user_id, bot_id, sync_status, sync_status_reason, last_exec_id + ) + + return { + "statusCode": 200, + "body": json.dumps("Sync status updated successfully."), + } + except Exception as e: + logger.error(f"Error updating sync status: {e}") + return {"statusCode": 500, "body": json.dumps("Error updating sync status.")} diff --git a/backend/lambda.Dockerfile b/backend/lambda.Dockerfile new file mode 100644 index 000000000..c22ff409e --- /dev/null +++ b/backend/lambda.Dockerfile @@ -0,0 +1,15 @@ +FROM public.ecr.aws/lambda/python:3.11 + +COPY ./pyproject.toml ./poetry.lock ./ + +ENV POETRY_REQUESTS_TIMEOUT=10800 +RUN python -m pip install --upgrade pip && \ + pip install poetry --no-cache-dir && \ + poetry config virtualenvs.create false && \ + poetry install --no-interaction --no-ansi --only main && \ + poetry cache clear --all pypi + +COPY ./app ./app +COPY ./embedding_statemachine ./embedding_statemachine + +CMD ["app.websocket.handler"] \ No newline at end of file diff --git a/backend/poetry.lock b/backend/poetry.lock index 76836b594..ad0cdc7f5 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -81,13 +81,13 @@ files = [ [[package]] name = "aws-lambda-powertools" -version = "2.39.1" +version = "2.40.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"}, + {file = "aws_lambda_powertools-2.40.1-py3-none-any.whl", hash = "sha256:606feeb4c233d9f2cfbccc44789cf44e0790ddec6ae9d290dff9ca330ae51934"}, + {file = "aws_lambda_powertools-2.40.1.tar.gz", hash = "sha256:d7a1e2fdf4c8089e5d65fc54ac2f0f4e7fc46ae17f806737e6a1bec494095daf"}, ] [package.dependencies] @@ -150,17 +150,17 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.34.127" +version = "1.34.143" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.127-py3-none-any.whl", hash = "sha256:d370befe4fb7aea5bc383057d7dad18dda5d0cf3cd3295915bcc8c8c4191905c"}, - {file = "boto3-1.34.127.tar.gz", hash = "sha256:58ccdeae3a96811ecc9d5d866d8226faadbd0ee1891756e4a04d5186e9a57a64"}, + {file = "boto3-1.34.143-py3-none-any.whl", hash = "sha256:0d16832f23e6bd3ae94e35ea8e625529850bfad9baccd426de96ad8f445d8e03"}, + {file = "boto3-1.34.143.tar.gz", hash = "sha256:b590ce80c65149194def43ebf0ea1cf0533945502507837389a8d22e3ecbcf05"}, ] [package.dependencies] -botocore = ">=1.34.127,<1.35.0" +botocore = ">=1.34.143,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -169,13 +169,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.127" +version = "1.34.143" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.127-py3-none-any.whl", hash = "sha256:e14fa28c8bb141de965e700f88b196d17c67a703c7f0f5c7e14f7dd1cf636011"}, - {file = "botocore-1.34.127.tar.gz", hash = "sha256:a377871742c40603d559103f19acb7bc93cfaf285e68f21b81637ec396099877"}, + {file = "botocore-1.34.143-py3-none-any.whl", hash = "sha256:094aea179e8aaa1bc957ad49cc27d93b189dd3a1f3075d8b0ca7c445a2a88430"}, + {file = "botocore-1.34.143.tar.gz", hash = "sha256:059f032ec05733a836e04e869c5a15534420102f93116f3bc9a5b759b0651caf"}, ] [package.dependencies] @@ -345,22 +345,21 @@ files = [ [[package]] name = "duckduckgo-search" -version = "6.1.6" +version = "6.1.12" description = "Search for words, documents, images, news, maps and text translation using the DuckDuckGo.com search engine." optional = false python-versions = ">=3.8" files = [ - {file = "duckduckgo_search-6.1.6-py3-none-any.whl", hash = "sha256:6139ab17579e96ca7c5ed9398365245a36ecca8e7432545e3115ef90a9304eb7"}, - {file = "duckduckgo_search-6.1.6.tar.gz", hash = "sha256:42c83d58f4f1d717a580b89cc86861cbae59e46e75288243776c53349d006bf1"}, + {file = "duckduckgo_search-6.1.12-py3-none-any.whl", hash = "sha256:1a3c674de4a9307fe7a05b76726c2bf00d8a97c408ff443d07d7c7a8ac264ed2"}, + {file = "duckduckgo_search-6.1.12.tar.gz", hash = "sha256:6e16ddd54ebfa6567702bd371a95d396e54ad7ace2edd1cb7f4f565547eb065c"}, ] [package.dependencies] click = ">=8.1.7" -orjson = ">=3.10.4" -pyreqwest-impersonate = ">=0.4.7" +pyreqwest-impersonate = ">=0.4.9" [package.extras] -dev = ["mypy (>=1.10.0)", "pytest (>=8.2.2)", "pytest-asyncio (>=0.23.7)", "ruff (>=0.4.8)"] +dev = ["mypy (>=1.10.1)", "pytest (>=8.2.2)", "pytest-asyncio (>=0.23.7)", "ruff (>=0.5.0)"] lxml = ["lxml (>=5.2.2)"] [[package]] @@ -402,29 +401,29 @@ all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)" [[package]] name = "filelock" -version = "3.15.1" +version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"}, - {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [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)"] +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 = "fsspec" -version = "2024.6.0" +version = "2024.6.1" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.6.0-py3-none-any.whl", hash = "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee"}, - {file = "fsspec-2024.6.0.tar.gz", hash = "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2"}, + {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, + {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, ] [package.extras] @@ -594,22 +593,25 @@ files = [ [[package]] name = "langchain-core" -version = "0.2.7" +version = "0.2.13" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.7-py3-none-any.whl", hash = "sha256:fd02e153c898486dd728d634684ffc64bc257ff2ba443dc7e53d017ac0bf4658"}, - {file = "langchain_core-0.2.7.tar.gz", hash = "sha256:b0b1b6dfbdedb39426fcb8bd3f07e40eec7964856e3fc384c420ca6dba61b34e"}, + {file = "langchain_core-0.2.13-py3-none-any.whl", hash = "sha256:b9f52003bfda464975413751737c7e6781781398ba14d9aa6c604046d6fc0c6f"}, + {file = "langchain_core-0.2.13.tar.gz", hash = "sha256:a5d8b436639b6aa0955f6db287beb4030c46a8e85951ba3873739c4d47645ee1"}, ] [package.dependencies] jsonpatch = ">=1.33,<2.0" langsmith = ">=0.1.75,<0.2.0" packaging = ">=23.2,<25" -pydantic = ">=1,<3" +pydantic = [ + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] PyYAML = ">=5.3" -tenacity = ">=8.1.0,<9.0.0" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langdetect" @@ -627,54 +629,57 @@ six = "*" [[package]] name = "langsmith" -version = "0.1.77" +version = "0.1.85" 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.77-py3-none-any.whl", hash = "sha256:2202cc21b1ed7e7b9e5d2af2694be28898afa048c09fdf09f620cbd9301755ae"}, - {file = "langsmith-0.1.77.tar.gz", hash = "sha256:4ace09077a9a4e412afeb4b517ca68e7de7b07f36e4792dc8236ac5207c0c0c7"}, + {file = "langsmith-0.1.85-py3-none-any.whl", hash = "sha256:c1f94384f10cea96f7b4d33fd3db7ec180c03c7468877d50846f881d2017ff94"}, + {file = "langsmith-0.1.85.tar.gz", hash = "sha256:acff31f9e53efa48586cf8e32f65625a335c74d7c4fa306d1655ac18452296f6"}, ] [package.dependencies] orjson = ">=3.9.14,<4.0.0" -pydantic = ">=1,<3" +pydantic = [ + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] requests = ">=2,<3" [[package]] name = "mypy" -version = "1.10.0" +version = "1.10.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, - {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, - {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, - {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, - {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, - {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, - {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, - {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, - {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, - {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, - {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, - {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, - {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, - {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, - {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, - {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, - {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, - {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, - {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, + {file = "mypy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02"}, + {file = "mypy-1.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7"}, + {file = "mypy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a"}, + {file = "mypy-1.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9"}, + {file = "mypy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84"}, + {file = "mypy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f"}, + {file = "mypy-1.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b"}, + {file = "mypy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e"}, + {file = "mypy-1.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7"}, + {file = "mypy-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3"}, + {file = "mypy-1.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e"}, + {file = "mypy-1.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04"}, + {file = "mypy-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31"}, + {file = "mypy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c"}, + {file = "mypy-1.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade"}, + {file = "mypy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37"}, + {file = "mypy-1.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7"}, + {file = "mypy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d"}, + {file = "mypy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3"}, + {file = "mypy-1.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf"}, + {file = "mypy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531"}, + {file = "mypy-1.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3"}, + {file = "mypy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f"}, + {file = "mypy-1.10.1-py3-none-any.whl", hash = "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a"}, + {file = "mypy-1.10.1.tar.gz", hash = "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0"}, ] [package.dependencies] @@ -700,57 +705,62 @@ files = [ [[package]] name = "orjson" -version = "3.10.5" +version = "3.10.6" 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"}, + {file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"}, + {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"}, + {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"}, + {file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"}, + {file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"}, + {file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"}, + {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"}, + {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"}, + {file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"}, + {file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"}, + {file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"}, + {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"}, + {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"}, + {file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"}, + {file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"}, + {file = "orjson-3.10.6-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"}, + {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"}, + {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"}, + {file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"}, + {file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"}, + {file = "orjson-3.10.6-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb"}, + {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2"}, + {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a"}, + {file = "orjson-3.10.6-cp39-none-win32.whl", hash = "sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219"}, + {file = "orjson-3.10.6-cp39-none-win_amd64.whl", hash = "sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844"}, + {file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"}, ] [[package]] @@ -830,109 +840,119 @@ files = [ [[package]] name = "pydantic" -version = "2.7.4" +version = "2.8.2" 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"}, + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.18.4" -typing-extensions = ">=4.6.1" +pydantic-core = "2.20.1" +typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} [package.extras] email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.18.4" +version = "2.20.1" 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"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, ] [package.dependencies] @@ -951,59 +971,59 @@ files = [ [[package]] name = "pyreqwest-impersonate" -version = "0.4.7" +version = "0.4.9" description = "HTTP client that can impersonate web browsers, mimicking their headers and `TLS/JA3/JA4/HTTP2` fingerprints" optional = false python-versions = ">=3.8" files = [ - {file = "pyreqwest_impersonate-0.4.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c175dfc429c4231a6ce03841630b236f50995ca613ff1eea26fa4c75c730b562"}, - {file = "pyreqwest_impersonate-0.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3f83c50cef2d5ed0a9246318fd3ef3bfeabe286d4eabf92df4835c05a0be7dc"}, - {file = "pyreqwest_impersonate-0.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f34930113aa42f47e0542418f6a67bdb2c23fe0e2fa1866f60b29280a036b829"}, - {file = "pyreqwest_impersonate-0.4.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88d2792df548b845edd409a3e4284f76cb4fc2510fe4a69fde9e39d54910b935"}, - {file = "pyreqwest_impersonate-0.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27622d5183185dc63bcab9a7dd1de566688c63b844812b1d9366da7c459a494"}, - {file = "pyreqwest_impersonate-0.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b7bf13d49ef127e659ed134129336e94f7107023ed0138c81a46321b9a580428"}, - {file = "pyreqwest_impersonate-0.4.7-cp310-none-win_amd64.whl", hash = "sha256:0cba006b076b85a875814a4b5dd8cb27f483ebeeb0de83984a3786060fe18e0d"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:370a8cb7a92b15749cbbe3ce7a9f09d35aac7d2a74505eb447f45419ea8ef2ff"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:33244ea10ccee08bac7a7ccdc3a8e6bef6e28f2466ed61de551fa24b76ee4b6a"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba24fb6db822cbd9cbac32539893cc19cc06dd1820e03536e685b9fd2a2ffdd"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e001ed09fc364cc00578fd31c0ae44d543cf75daf06b2657c7a82dcd99336ce"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:608525535f078e85114fcd4eeba0f0771ffc7093c29208e9c0a55147502723bf"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:38daedba0fc997e29cbc25c684a42a04aed38bfbcf85d8f1ffe8f87314d5f72f"}, - {file = "pyreqwest_impersonate-0.4.7-cp311-none-win_amd64.whl", hash = "sha256:d21f3e93ee0aecdc43d2914800bdf23501bde858d70ac7c0b06168f85f95bf22"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5caeee29370a06a322ea6951730d21ec3c641ce46417fd2b5805b283564f2fef"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1c7aa4b428ed58370975d828a95eaf10561712e79a4e2eafca1746a4654a34a8"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:887249adcab35487a44a5428ccab2a6363642785b36649a732d5e649df568b8e"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60f932de8033c15323ba79a7470406ca8228e07aa60078dee5a18e89f0a9fc88"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a2e6332fd6d78623a22f4e747688fe9e6005b61b6f208936d5428d2a65d34b39"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:349b005eef323195685ba5cb2b6f302da0db481e59f03696ef57099f232f0c1f"}, - {file = "pyreqwest_impersonate-0.4.7-cp312-none-win_amd64.whl", hash = "sha256:5620025ac138a10c46a9b14c91b6f58114d50063ff865a2d02ad632751b67b29"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ebf954e09b3dc800a7576c7bde9827b00064531364c7817356c7cc58eb4b46b2"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:112d9561f136548bd67d31cadb6b78d4c31751e526e62e09c6e581c2f1711455"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05213f5f014ecc6732d859a0f51b3dff0424748cc6e2d0d9a42aa1f7108b4eaa"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10fa70529a60fc043650ce03481fab7714e7519c3b06f5e81c95206b8b60aec6"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5b1288881eada1891db7e862c69b673fb159834a41f823b9b00fc52d0f096ccc"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:57ca562229c40615074f36e7f1ae5e57b8164f604eddb042132467c3a00fc2c5"}, - {file = "pyreqwest_impersonate-0.4.7-cp38-none-win_amd64.whl", hash = "sha256:c098ef1333511ea9a43be9a818fcc0866bd2caa63cdc9cf4ab48450ace675646"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:39d961330190bf2d59983ad16dafb4b42d5adcdfe7531ad099c8f3ab53f8d906"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0d793591784b89953422b1efaa17460f57f6116de25b3e3065d9fa6cf220ef18"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:945116bb9ffb7e45a87e313f47de28c4da889b14bda620aebc5ba9c3600425cf"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b96a0955c49f346786ee997c755561fecf33b7886cecef861fe4db15c7b23ad3"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ed997197f907ccce9b86a75163b5e78743bc469d2ddcf8a22d4d90c2595573cb"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1f54788f6fb0ee8b31c1eaadba81fb003efb406a768844e2a1a50b855f4806bf"}, - {file = "pyreqwest_impersonate-0.4.7-cp39-none-win_amd64.whl", hash = "sha256:0a679e81b0175dcc670a5ed47a5c184d7031ce16b5c58bf6b2c650ab9f2496c8"}, - {file = "pyreqwest_impersonate-0.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bddb07e04e4006a2184608c44154983fdfa0ce2e230b0a7cec81cd4ba88dd07"}, - {file = "pyreqwest_impersonate-0.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:780c53bfd2fbda151081165733fba5d5b1e17dd61999360110820942e351d011"}, - {file = "pyreqwest_impersonate-0.4.7-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4bfa8ea763e6935e7660f8e885f1b00713b0d22f79a526c6ae6932b1856d1343"}, - {file = "pyreqwest_impersonate-0.4.7-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:96b23b0688a63cbd6c39237461baa95162a69a15e9533789163aabcaf3f572fb"}, - {file = "pyreqwest_impersonate-0.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b0eb56a8ad9d48952c613903d3ef6d8762d48dcec9807a509fee2a43e94ccac"}, - {file = "pyreqwest_impersonate-0.4.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9330176494e260521ea0eaae349ca06128dc527400248c57b378597c470d335c"}, - {file = "pyreqwest_impersonate-0.4.7-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:6343bc3392781ff470e5dc47fea9f77bb61d8831b07e901900d31c46decec5d1"}, - {file = "pyreqwest_impersonate-0.4.7-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ecd598e16020a165029647ca80078311bf079e8317bf61c1b2fa824b8967e0db"}, - {file = "pyreqwest_impersonate-0.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a38f3014ac31b08f5fb1ef4e1eb6c6e810f51f6cb815d0066ab3f34ec0f82d98"}, - {file = "pyreqwest_impersonate-0.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db76a97068e5145f5b348037e09a91b2bed9c8eab92e79a3297b1306429fa839"}, - {file = "pyreqwest_impersonate-0.4.7-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1596a8ef8f20bbfe606a90ad524946747846611c8633cbdfbad0a4298b538218"}, - {file = "pyreqwest_impersonate-0.4.7-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dcee18bc350b3d3a0455422c446f1f03f00eb762b3e470066e2bc4664fd7110d"}, - {file = "pyreqwest_impersonate-0.4.7.tar.gz", hash = "sha256:74ba7e6e4f4f753da4f71a7e5dc12625b296bd7d6ddd64093a1fbff14d8d5df7"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a229f56575d992df0c520d93408b4b6b660b304387af06208e7b97d739cce2ff"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c00dbfd0ed878bed231384cd0c823d71a42220ae73c6d982b6fe77d2870338ca"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d4e6ce0e48b73740f08b1aa69cdbded5d66f4eec327d5eaf2ac42a4fce1a008"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690a5c5615b33cbab340e3a4247256ede157ebf39a02f563cff5356bf61c0c51"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7231511ee14faee27b90a84ec74e15515b7e2d1c389710698660765eaed6e2fd"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2fdbe8e146e595c02fa0afb776d70f9e3b351122e2de9af15934b83f3a548ecd"}, + {file = "pyreqwest_impersonate-0.4.9-cp310-none-win_amd64.whl", hash = "sha256:982b0e53db24c084675a056944dd769aa07cd1378abf972927f3f1afb23e08b0"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:60b1102b8aec7bbf91e0f7b8bbc3507776731a9acc6844de764911e8d64f7dd2"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37150478157e683374517d4c0eae0f991b8f5280067a8ee042b6a72fec088843"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc77cd1cdae22dad7549a4e9a1a4630619c2ff443add1b28c7d607accda81eb"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83e99e627d13f1f60d71ce2c2a2b03e1c7f57e8f6a73bde2827ff97cb96f1683"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:72d1adb73264db8c5e24d073d558a895d6690d13a5e38fd857b8b01c33fcbabf"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6253bd8a104316bbece0e6c658d28292f0bf37a99cccfaf476470b98252d185b"}, + {file = "pyreqwest_impersonate-0.4.9-cp311-none-win_amd64.whl", hash = "sha256:7e25628a900236fc76320e790fce90e5502371994523c476af2b1c938382f5fa"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:57e1e7f3bfc175c3229947cdd2b26564bcea2923135b8dec8ab157609e201a7c"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3aeb1c834f54fe685d3c7c0bec65dd981bd988fa3725ee3c7b5656eb7c44a1f7"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27bc384f18099573817d7ed68d12eb67d33dfc5d2b30ab2ac5a69cdf19c22b6f"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd604444ddf86ed222b49dd5e3f050c4c0e980dd7be0b3ea0f208fb70544c4b6"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5206dc7311081accf5b7d021c9e0e68219fd7bb35b0cd755b2d72c3ebfa41842"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76802f0738c2d00bb4e057938ec048c4c7c4efc5c44f04b9d877ad4419b21ee8"}, + {file = "pyreqwest_impersonate-0.4.9-cp312-none-win_amd64.whl", hash = "sha256:7cf94f6365bc144f787658e844f94dad38107fb9ff61d65079fb6510447777fe"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:66e92bd868146028dac1ef9cd2b4aac57e7e6cbd8806fa8a4c77ac5becf396e1"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc3ff7ac332879e40301d737b3ec1f3691b1de7492728bea26e75e26d05f89ec"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c9e9eba83620852d4253023e50e3436726aee16e2de94afbd468da4373830dc"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d6b47d403c63b461a97efa2aed668f0f06ed26cf61c23d7d6dab4f5a0c81ffc"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:88f695a01e8699ec3a1547d793617b9fd00f810c05c2b4dc0d1472c7f12eed97"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:abb4fbfaa1a3c3adeb7f46baa1d67663af85ab24f2b4cdd15a668ddc6be3a375"}, + {file = "pyreqwest_impersonate-0.4.9-cp38-none-win_amd64.whl", hash = "sha256:884c1399fe0157dcd0a5a71e3600910df50faa0108c64602d47c15e75b32e60b"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bf5cd99276207510d64b48eff5602e12f049754d3b0f1194a024e1a080a61d3d"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:029eea1d386d12856da767d685169835f0b0c025ae312c1ee7bc0d8cb47a7d3d"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1bfb8795fe0a46aee883abcf510a9ecdb4e9acf75c3a5a23571276f555f5e88"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fe35ce48e7e6b570304ee15915da0e6fab82dcae2b7a1d1a92593b522ebe852"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dfa377a842bd2e73d1f201bfc33194dd98c148372409d376f6d57efe338ff0eb"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d46880e68eb779cd071648e94a7ec50b3b77a28210f218be407eda1b0c8df343"}, + {file = "pyreqwest_impersonate-0.4.9-cp39-none-win_amd64.whl", hash = "sha256:ac431e4a94f8529a19a396750d78c66cc4fa11a8cc61d4bed7f0e0295a9394a9"}, + {file = "pyreqwest_impersonate-0.4.9-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12fd04d8da4d23ab5720402fd9f3b6944fb388c19952f2ec9121b46ac1f74616"}, + {file = "pyreqwest_impersonate-0.4.9-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b52df560d78681cde2fbc39bee547a42a79c8fd33655b79618835ecc412e6933"}, + {file = "pyreqwest_impersonate-0.4.9-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e1a2828942f9d589ee6161496444a380d3305e78bda25ff63e4f993b0545b193"}, + {file = "pyreqwest_impersonate-0.4.9-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:beebedf6d8c0d5fdee9ae15bc64a74e51b35f98eb0d049bf2db067702fbf4e53"}, + {file = "pyreqwest_impersonate-0.4.9-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a3d47dea1f46410b58ab60795b5818c8c99d901f6c93fbb6a9d23fa55adb2b1"}, + {file = "pyreqwest_impersonate-0.4.9-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb871adc5d12b2bcbb5af167384d49fc4e7e5e07d12cf912b931149163df724"}, + {file = "pyreqwest_impersonate-0.4.9-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d1b0b5556d2bd14a4ffa32654291fe2a9ef1eaac35b5514d9220e7e333a6c727"}, + {file = "pyreqwest_impersonate-0.4.9-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5d50feaec78c06d51e1dd65cdbe80a1fc62ff93c8114555482f8a8cc5fe14895"}, + {file = "pyreqwest_impersonate-0.4.9-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2a9cfc41917200d8eee61b87a5668abe7d1f924a55b7437065540edf613beed"}, + {file = "pyreqwest_impersonate-0.4.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8106e3df0c1dca4df99e0f998f0e085ea3e1facfaa5afc268160a496ddf7256f"}, + {file = "pyreqwest_impersonate-0.4.9-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ff66bb7dc6b1f52cf950b5e9cb0e53baffd1a15da595fd1ef933cd9e36396403"}, + {file = "pyreqwest_impersonate-0.4.9-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39f2a3ed17cf08098dc637459e88fb86d3fa7bdf9502659c82218be75651649c"}, + {file = "pyreqwest_impersonate-0.4.9.tar.gz", hash = "sha256:4ec8df7fe813e89f61e814c5ef75f6fd71164c8e26299c1a42dcd0d42f0bc96c"}, ] [package.extras] @@ -1167,13 +1187,13 @@ pyasn1 = ">=0.1.3" [[package]] name = "s3transfer" -version = "0.10.1" +version = "0.10.2" description = "An Amazon S3 Transfer Manager" optional = false -python-versions = ">= 3.8" +python-versions = ">=3.8" files = [ - {file = "s3transfer-0.10.1-py3-none-any.whl", hash = "sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d"}, - {file = "s3transfer-0.10.1.tar.gz", hash = "sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19"}, + {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"}, + {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"}, ] [package.dependencies] @@ -1389,13 +1409,13 @@ telegram = ["requests"] [[package]] name = "types-requests" -version = "2.32.0.20240602" +version = "2.32.0.20240622" 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"}, + {file = "types-requests-2.32.0.20240622.tar.gz", hash = "sha256:ed5e8a412fcc39159d6319385c009d642845f250c63902718f605cd90faade31"}, + {file = "types_requests-2.32.0.20240622-py3-none-any.whl", hash = "sha256:97bac6b54b5bd4cf91d407e62f0932a74821bc2211f22116d9ee1dd643826caf"}, ] [package.dependencies] diff --git a/backend/tests/test_repositories/test_conversation.py b/backend/tests/test_repositories/test_conversation.py index cdf310b0e..4daef6dcc 100644 --- a/backend/tests/test_repositories/test_conversation.py +++ b/backend/tests/test_repositories/test_conversation.py @@ -27,11 +27,11 @@ AgentModel, AgentToolModel, BotModel, + ConversationQuickStarterModel, EmbeddingParamsModel, GenerationParamsModel, KnowledgeModel, SearchParamsModel, - ConversationQuickStarterModel, ) from boto3.dynamodb.conditions import Key from botocore.exceptions import ClientError @@ -128,12 +128,16 @@ def test_store_and_find_conversation(self): role="user", content=[ ContentModel( - content_type="text", body="Hello", media_type=None + content_type="text", + body="Hello", + media_type=None, + file_name=None, ), ContentModel( content_type="image", body="iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=", media_type="image/png", + file_name=None, ), ], model="claude-instant-v1", @@ -142,7 +146,12 @@ def test_store_and_find_conversation(self): create_time=1627984879.9, feedback=None, used_chunks=[ - ChunkModel(content="chunk1", source="source1", rank=1), + ChunkModel( + content="chunk1", + source="source1", + rank=1, + content_type="url", + ), ], thinking_log="test thinking log", ) @@ -241,6 +250,7 @@ def test_store_and_find_large_conversation(self): body="This is a large message." * 1000, # Repeating to make it large media_type=None, + file_name=None, ) ], model="claude-instant-v1", @@ -415,6 +425,7 @@ def setUp(self) -> None: source_urls=["https://aws.amazon.com/"], sitemap_urls=["https://aws.amazon.sitemap.xml"], filenames=["aws.pdf"], + s3_urls=["s3://example/path/"], ), sync_status="RUNNING", sync_status_reason="reason", @@ -426,6 +437,7 @@ def setUp(self) -> None: conversation_quick_starters=[ ConversationQuickStarterModel(title="QS title", example="QS example") ], + bedrock_knowledge_base=None, ) bot2 = BotModel( id="2", @@ -462,6 +474,7 @@ def setUp(self) -> None: source_urls=["https://aws.amazon.com/"], sitemap_urls=["https://aws.amazon.sitemap.xml"], filenames=["aws.pdf"], + s3_urls=[], ), sync_status="RUNNING", sync_status_reason="reason", @@ -473,6 +486,7 @@ def setUp(self) -> None: conversation_quick_starters=[ ConversationQuickStarterModel(title="QS title", example="QS example") ], + bedrock_knowledge_base=None, ) store_conversation("user", conversation1) diff --git a/backend/tests/test_repositories/test_custom_bot.py b/backend/tests/test_repositories/test_custom_bot.py index d02f68d76..e3f04246a 100644 --- a/backend/tests/test_repositories/test_custom_bot.py +++ b/backend/tests/test_repositories/test_custom_bot.py @@ -19,18 +19,26 @@ update_bot_last_used_time, update_bot_publication, update_bot_visibility, + update_knowledge_base_id, ) from app.repositories.models.custom_bot import ( AgentModel, AgentToolModel, BotAliasModel, - BotModel, ConversationQuickStarterModel, EmbeddingParamsModel, GenerationParamsModel, KnowledgeModel, SearchParamsModel, ) +from app.repositories.models.custom_bot_kb import ( + AnalyzerParamsModel, + BedrockKnowledgeBaseModel, + OpenSearchParamsModel, +) +from app.repositories.models.custom_bot_kb import ( + SearchParamsModel as SearchParamsModelKB, +) from app.usecases.bot import fetch_all_bots_by_user_id from tests.test_repositories.utils.bot_factory import ( create_test_private_bot, @@ -51,6 +59,23 @@ def test_store_and_find_bot(self): conversation_quick_starters=[ ConversationQuickStarterModel(title="QS title", example="QS example") ], + bedrock_knowledge_base=BedrockKnowledgeBaseModel( + embeddings_model="titan_v1", + open_search=OpenSearchParamsModel( + analyzer=AnalyzerParamsModel( + character_filters=["icu_normalizer"], + tokenizer="kuromoji_tokenizer", + token_filters=["kuromoji_baseform"], + ) + ), + search_params=SearchParamsModelKB( + max_results=20, + search_type="hybrid", + ), + chunking_strategy="default", + max_tokens=2000, + overlap_percentage=0, + ), ) store_bot("user1", bot) @@ -83,6 +108,7 @@ def test_store_and_find_bot(self): self.assertEqual(bot.knowledge.source_urls, ["https://aws.amazon.com/"]) self.assertEqual(bot.knowledge.sitemap_urls, ["https://aws.amazon.sitemap.xml"]) self.assertEqual(bot.knowledge.filenames, ["test.txt"]) + self.assertEqual(bot.knowledge.s3_urls, ["s3://test-user/test-bot/"]) self.assertEqual(bot.sync_status, "RUNNING") self.assertEqual(bot.sync_status_reason, "reason") self.assertEqual(bot.sync_last_exec_id, "") @@ -91,6 +117,24 @@ def test_store_and_find_bot(self): self.assertEqual(len(bot.conversation_quick_starters), 1) self.assertEqual(bot.conversation_quick_starters[0].title, "QS title") self.assertEqual(bot.conversation_quick_starters[0].example, "QS example") + self.assertEqual(bot.bedrock_knowledge_base.embeddings_model, "titan_v1") + self.assertEqual(bot.bedrock_knowledge_base.chunking_strategy, "default") + self.assertEqual(bot.bedrock_knowledge_base.max_tokens, 2000) + self.assertEqual(bot.bedrock_knowledge_base.overlap_percentage, 0) + self.assertEqual( + bot.bedrock_knowledge_base.open_search.analyzer.character_filters, + ["icu_normalizer"], + ) + self.assertEqual( + bot.bedrock_knowledge_base.open_search.analyzer.tokenizer, + "kuromoji_tokenizer", + ) + self.assertEqual( + bot.bedrock_knowledge_base.open_search.analyzer.token_filters, + ["kuromoji_baseform"], + ) + self.assertEqual(bot.bedrock_knowledge_base.search_params.max_results, 20) + self.assertEqual(bot.bedrock_knowledge_base.search_params.search_type, "hybrid") # Assert bot is stored in user1's bot list bot = find_private_bots_by_user_id("user1") @@ -140,6 +184,36 @@ def test_update_delete_bot_publication(self): delete_bot_by_id("user1", "1") + def test_update_knowledge_base_id(self): + bot = create_test_private_bot( + "1", + False, + "user1", + bedrock_knowledge_base=BedrockKnowledgeBaseModel( + embeddings_model="titan_v1", + open_search=OpenSearchParamsModel( + analyzer=AnalyzerParamsModel( + character_filters=["icu_normalizer"], + tokenizer="kuromoji_tokenizer", + token_filters=["kuromoji_baseform"], + ) + ), + search_params=SearchParamsModelKB( + max_results=20, + search_type="hybrid", + ), + chunking_strategy="default", + max_tokens=2000, + overlap_percentage=0, + ), + ) + store_bot("user1", bot) + update_knowledge_base_id("user1", "1", "kb1", ["ds1", "ds2"]) + bot = find_private_bot_by_id("user1", "1") + self.assertEqual(bot.bedrock_knowledge_base.knowledge_base_id, "kb1") + self.assertEqual(bot.bedrock_knowledge_base.data_source_ids, ["ds1", "ds2"]) + delete_bot_by_id("user1", "1") + def test_update_bot(self): bot = create_test_private_bot("1", False, "user1") store_bot("user1", bot) @@ -173,6 +247,7 @@ def test_update_bot(self): source_urls=["https://updated.com/"], sitemap_urls=["https://updated.xml"], filenames=["updated.txt"], + s3_urls=["s3://test-user/test-bot/"], ), sync_status="RUNNING", sync_status_reason="reason", @@ -180,6 +255,23 @@ def test_update_bot(self): conversation_quick_starters=[ ConversationQuickStarterModel(title="QS title", example="QS example") ], + bedrock_knowledge_base=BedrockKnowledgeBaseModel( + embeddings_model="titan_v1", + open_search=OpenSearchParamsModel( + analyzer=AnalyzerParamsModel( + character_filters=["icu_normalizer"], + tokenizer="kuromoji_tokenizer", + token_filters=["kuromoji_baseform"], + ) + ), + search_params=SearchParamsModelKB( + max_results=20, + search_type="hybrid", + ), + chunking_strategy="default", + max_tokens=2000, + overlap_percentage=0, + ), ) bot = find_private_bot_by_id("user1", "1") @@ -209,6 +301,23 @@ def test_update_bot(self): self.assertEqual(bot.conversation_quick_starters[0].title, "QS title") self.assertEqual(bot.conversation_quick_starters[0].example, "QS example") + self.assertEqual(bot.bedrock_knowledge_base.embeddings_model, "titan_v1") + self.assertEqual(bot.bedrock_knowledge_base.chunking_strategy, "default") + self.assertEqual(bot.bedrock_knowledge_base.max_tokens, 2000) + self.assertEqual(bot.bedrock_knowledge_base.overlap_percentage, 0) + self.assertEqual( + bot.bedrock_knowledge_base.open_search.analyzer.character_filters, + ["icu_normalizer"], + ) + self.assertEqual( + bot.bedrock_knowledge_base.open_search.analyzer.tokenizer, + "kuromoji_tokenizer", + ) + self.assertEqual( + bot.bedrock_knowledge_base.open_search.analyzer.token_filters, + ["kuromoji_baseform"], + ) + delete_bot_by_id("user1", "1") @@ -361,7 +470,9 @@ def test_update_bot_visibility(self): max_results=20, ), agent=AgentModel(tools=[]), - knowledge=KnowledgeModel(source_urls=[], sitemap_urls=[], filenames=[]), + knowledge=KnowledgeModel( + source_urls=[], sitemap_urls=[], filenames=[], s3_urls=[] + ), sync_status="RUNNING", sync_status_reason="", display_retrieved_chunks=True, diff --git a/backend/tests/test_repositories/utils/bot_factory.py b/backend/tests/test_repositories/utils/bot_factory.py index 3e5087ddb..694c7e33a 100644 --- a/backend/tests/test_repositories/utils/bot_factory.py +++ b/backend/tests/test_repositories/utils/bot_factory.py @@ -7,13 +7,14 @@ from app.repositories.models.custom_bot import ( AgentModel, AgentToolModel, + BedrockKnowledgeBaseModel, BotAliasModel, BotModel, + ConversationQuickStarterModel, EmbeddingParamsModel, GenerationParamsModel, KnowledgeModel, SearchParamsModel, - ConversationQuickStarterModel, ) from app.routes.schemas.bot import type_sync_status @@ -29,6 +30,7 @@ def create_test_private_bot( published_api_codebuild_id: str | None = None, display_retrieved_chunks: bool = True, conversation_quick_starters: list[ConversationQuickStarterModel] | None = None, + bedrock_knowledge_base: BedrockKnowledgeBaseModel | None = None, ): return BotModel( id=id, @@ -65,6 +67,7 @@ def create_test_private_bot( source_urls=["https://aws.amazon.com/"], sitemap_urls=["https://aws.amazon.sitemap.xml"], filenames=["test.txt"], + s3_urls=["s3://test-user/test-bot/"], ), sync_status=sync_status, sync_status_reason="reason", @@ -76,6 +79,7 @@ def create_test_private_bot( conversation_quick_starters=( [] if conversation_quick_starters is None else conversation_quick_starters ), + bedrock_knowledge_base=bedrock_knowledge_base, ) @@ -85,6 +89,8 @@ def create_test_public_bot( owner_user_id, public_bot_id=None, instruction="Test Public Bot Prompt", + conversation_quick_starters: list[ConversationQuickStarterModel] | None = None, + bedrock_knowledge_base: BedrockKnowledgeBaseModel | None = None, ): return BotModel( id=id, @@ -121,6 +127,7 @@ def create_test_public_bot( source_urls=["https://aws.amazon.com/"], sitemap_urls=["https://aws.amazon.sitemap.xml"], filenames=["test.txt"], + s3_urls=["s3://test-user/test-bot/"], ), sync_status="RUNNING", sync_status_reason="reason", @@ -129,4 +136,8 @@ def create_test_public_bot( published_api_datetime=None, published_api_codebuild_id=None, display_retrieved_chunks=True, + conversation_quick_starters=( + conversation_quick_starters if conversation_quick_starters else [] + ), + bedrock_knowledge_base=bedrock_knowledge_base, ) diff --git a/backend/tests/test_usecases/test_chat.py b/backend/tests/test_usecases/test_chat.py index 0de5b5fb0..b883d45d1 100644 --- a/backend/tests/test_usecases/test_chat.py +++ b/backend/tests/test_usecases/test_chat.py @@ -57,7 +57,12 @@ def test_trace_to_root(self): "user_1": MessageModel( role="user", content=[ - ContentModel(content_type="text", body="user_1", media_type=None) + ContentModel( + content_type="text", + body="user_1", + media_type=None, + file_name="test", + ) ], model=MODEL, children=["bot_1"], @@ -70,7 +75,12 @@ def test_trace_to_root(self): "bot_1": MessageModel( role="assistant", content=[ - ContentModel(content_type="text", body="bot_1", media_type=None) + ContentModel( + content_type="text", + body="bot_1", + media_type=None, + file_name="test", + ) ], model=MODEL, children=["user_2"], @@ -83,7 +93,12 @@ def test_trace_to_root(self): "user_2": MessageModel( role="user", content=[ - ContentModel(content_type="text", body="user_2", media_type=None) + ContentModel( + content_type="text", + body="user_2", + media_type=None, + file_name="test", + ) ], model=MODEL, children=["bot_2"], @@ -96,7 +111,12 @@ def test_trace_to_root(self): "bot_2": MessageModel( role="assistant", content=[ - ContentModel(content_type="text", body="bot_2", media_type=None) + ContentModel( + content_type="text", + body="bot_2", + media_type=None, + file_name="test", + ) ], model=MODEL, children=["user_3a", "user_3b"], @@ -109,7 +129,12 @@ def test_trace_to_root(self): "user_3a": MessageModel( role="user", content=[ - ContentModel(content_type="text", body="user_3a", media_type=None) + ContentModel( + content_type="text", + body="user_3a", + media_type=None, + file_name="test", + ) ], model=MODEL, children=[], @@ -161,6 +186,7 @@ def test_chat(self): content_type="text", body="あなたの名前は何ですか?", media_type=None, + file_name=None, ) ], model=MODEL, @@ -168,6 +194,7 @@ def test_chat(self): message_id=None, ), bot_id=None, + continue_generate=False, ) output: ChatOutput = chat(user_id="user1", chat_input=chat_input) self.output = output @@ -204,9 +231,7 @@ def test_chat_mistral(self): role="user", content=[ Content( - content_type="text", - body=body, - media_type=None, + content_type="text", body=body, media_type=None, file_name=None ) ], model=MISTRAL_MODEL, @@ -214,6 +239,7 @@ def test_chat_mistral(self): message_id=None, ), bot_id=None, + continue_generate=False, ) output: ChatOutput = chat(user_id="user1", chat_input=chat_input) self.output = output @@ -256,12 +282,14 @@ def test_chat(self): content_type="text", body="Explain the image", media_type=None, + file_name=None, ), Content( content_type="image", # AWS Logo image body="iVBORw0KGgoAAAANSUhEUgAADwAAAAhwBAMAAABikNZBAAAAG1BMVEVHcEz/jgT///8aKzz/mgDWzsP8vG50fon/rzbIBP4LAAAAAXRSTlMAQObYZgAAIABJREFUeNrs3UFu20YUgOHoBtLC2neA8X1CgNzTgOb+R6hsN4XrNI6tUJw3M9+HtF0E3dgifrzHIfXtGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA105XRz8GALhnaj/NjwsAds/vuwQbkQHgSw6nrWgwAOyeX1tpANg5vCoMAB847evoJw6AgbcaP34ATL5VGIUBMP2qMAB0P/xqMADqq8AAcE+HU2R+PwCYe1UYAHqffSUYAPWVYADYwqk9R781AIy/pmAA6Hz2NQYDYPJVYQAYMb8aDEBDTt3xOwVAfk3BAPCTw0mBAcD4K8EAiK+bwQAgvxIMgPxaRQPAlxxOQ5FgAIy/CgyA8VeBAUB8ncYCoEen4fkMAGD6tYsGwPhrCAYA/TUEA6C/CgwAN3D31x4aAMOvORgA+TUGA8DmLJ8NwQDoryEYAP1FgQGQX2toAHograZgAPTXFAxA/yyfJRgA+ZVgAEYgpgoMgPlXgQGQXyQYgO1pqCeSADD9GoIBkF8kGAD9tYcGoAOqqcAAGH+toQHQXwzBANyBWhqCAZBfCQagf7bP9tAAmH8VGADzLwoMgP66EQyA/qLAANxEGq2hAdBfCQZAf1FgAO7A3V8FBsD46ywWAOZfFBgA868tNACmXwzBABh/FRgA8y8KDID+uhMMgP5iCAbQX8zAAMivBAPQMdWzhgZAfxUYgAFYP1tDA6C/KDCA/qLAAMivG8EA6C+GYABuonEKDID+osAA+osCA6C/CgxAFxy/chYaAP1FggH0FwUG4B5ETYEB0F8UGGAE9s8KDID+4mkkgBGImRkYAP3FEAwwAOtnBQbA+Is1NID5FwUGwAD8ZedSVltoAMy/u1T3Muc0Xf+klKbnf6Wc5rkoMAD6u7GyzC+W639fm/uz6frX86WU5fpPXzU++iQD6O+uo+7T86B7i3/+rynPy+N1OF4VGID9tJ7fKW2nKDAA+vvxunnasrxvLQ1Pwj7PAK04NFjetItpOa9mYAD09/V5ojmn3Uxzc+e0fKQB9Hfz0fcy5x3r+5rg5wavZmAAhuzveZ6mKVUzvTxCXBQYgG208kKNFEPORYEBGKO/55qTb7MnpH22ASKLv3++BKvvj9PRqwID0G1/zyVkfl920eGPZR19vgH098YTzymwnJeiwAB01t/zJezs+/YR4dgNVmAA/f3i6Bs/vv/OwZG/v0GBAQKKO/vm1JacFyexAGh6/j23M/u+fzx4NQMD0Gx/28zvS4KDviXLRx0glpgvm8ypYdMScQo2AgPob/vHnj9xIkuBAfilQ7z65tSJeO/IUmAA/e129v2PcGOwjzxADMHym7qT86rAAITu70NOXYq1iD761APUF2oBfUmdCvZyDgUG0N8+Hvv9zBBcLKEBiNff8yV17joFrwoMwDMHn4dtsA8/gPm3jFHfHw8Guw8MoL8hjJTf17vBZmAA/a3vabT+Rnku2AgMUImTzxVvBRcFBtBfd3/3T/CUiwID6G+d4bfMaWB5LqsCA+jv/m+9mtLgpmleFRhgLNUPYJ1z4joGLwoMoL979ld7gzwW7GIA2JGzz54KVmCAAeffi+y+UftGsAsCYIz+novx991TwXWPQx9dEgD7qPzkr9NX/3MneC5mYAD9vee9X9NvxPPQrgqA+zu49+s0li00wFD9fRDZDz0qMID+3uP2r8T+bgu9WkIDdMr3LsR+IqkoMID+bnn4anb66pOvh14UGEB/N8uvR48aOA7t+gC4l0o3gL33+asJdhALQH/1V4EB+DOePVJgS2iAUfr7pKbtfEGDERigl/762sGbj0MvCgygv/I7ymloBQbYWI0DWE5f/SkFBtBfd39rqHAn2MUC0Hh/rZ+38F2BAVpm/lVgBQYYob9u/za8hT66YgBaXUBfdHM7+39HoQIDtDkAG383fh7p0RIaQH/d/a1AgQH0V3+rDMGrJTRAYw76693QRmAA/eW2EThbQgNYQP9SUcputtCuHYBmBmDfvdDVGtrVA9BKfyXy3kPwrq/FOrp+AJror7u/e7yUQ4EBWqC/CmwJDdD3AKy/Hb4VywgMEL2/jl/1OQMrMEDsBfSDLO5oWhQYwABs/K3xPJLbwAD66+mjrl/KYQQGiNrfk/m3BgUGCMrx585nYEtogKH7a/9cy6MCAwy8gHb8eYT7wK4ngGgDsPXzEEPw0QUFEKu/jl8pMAD791cAhymwawrgMw72z8P4ywgMMNoArL8jPQ+swABR+uv+bxCLAgOMtIDW38FeySHAABEGYK/fGG8N7coCqN9fr98I5vvf7N3LbWNHEAVQKAPhAQrgLUg4EQdALrQnAeefghcGDHjhGcke1vecHLovbnU9UgIDbBhA678rO7AhNID8RQIDrMtf8+eSm1gPQ2iARPqvDiyBAUYWYPm7eRPLEBogK3//kHN1XVVggKkDaP13eQKrwAAp+Wv/qvgm1k0CA0wcQOu/NrEkMID8JSWBHTWA4AG0+XOLKfSpAgPIXyZuYjlsAJEDaPkrgSUwQHwBlr8S2BAaID5/7V/ZxFKBAeIH0PqvDiyBAeILsPyVwIbQAPKXL/iUwADdB9CHNNOBDaEBwguw/tvUTQUGkL+M24V28AADaN8fYQgNMKwAy18JbAgNEF+AzZ8lsAoMEJ+/+m93l4cKDNBvAC1/BySwITRAvwJ8l1+m0IbQAOH5+5ReElgCA4QPoOWvz4ElMEB8AfYALIE9AwPEF2D9VwKrwADxBVj+SmAJDBBfgA+ZNYsABmiRv95/rUJLYID4AbT8lcASGCC+AMtfCSyAARIKsLCSwBIYID5/77JKAvsYGCB8AO0DpLFuKjBA3QLsAySfA6vAAPEFWP+VwCowQHwB/pBRo11UYICS+esDJItYKjBA/ABa/i7owA8JDFCuAPsASQc2hAaIL8AWsFY4VWCAWvlrAcsqtAoMED+A9gAsgVVggPgCLH8lsAoMIH9pmMAOJ2AAbQGaH3+MZAgNUKMAW4D2MZIhNEB8AbYAvc5NBQbIz18PwAupwAD5A2hpZAitAgPEF2APwBJYAgPEF+BDFklgQ2iA8ALsAdgilgoMkDCA9gXwXg8VGCBtAC1/JbAEBogvwPJ3tYshNEBOAbYAbRFLBQaIz1+/gGURSwIDxAewBWhe8QwsgAH56xewyHgGdlyBQd48APMapwQGMIDGEBpgfAGWPLwsgR1ZQAE2gEYCAxTKX18g8berAAaIGkB7AOalCfzu2AIKsJ+gJGEILYEBBdgDMD9nCA0QUYDlL4bQAPH56wGYgAR2dAEDaF8Ak/AMrAIDCrABNBnPwA4voAD/wyFqMIQGiC/AvkDCEBogvgAbQBOWwA4woAD7CUp+7qICA7ysAEsZ/t2pAgO8qAAbQPOjCvxQgQFeUoBtQBM7hHaIAfnrJ7BI+BZJBQYMoOUvGZvQjjGgAHsA5itUYAD5y4AhtIMMrC/ABtB8yU0FBhRg+Uv/Z2BHGVhegA2gyRlCq8DA7gLsJyjJGkI7zMDmAmwATdomtAoMbC7Ad6FC2hDacQb2FuBDpmAPCyC8ABtAkzqEdqCBrQXYAJpvOiUwoAArwLQfQr8708DKAixN+LaLAAYUYD/BQfshtEMNLMxfP8FBgSG0Yw3sC2BJwn/ymwAG5K8BNAmuXoGBXd5sQFNjD+shgQEBbABN901oRxtYNYE+pAiG0ADh+WsATZ1NaIcbWBTAdxHC/6ICA2u8GUAzdQjteANb8tcAmlJDaBUYMICGjE1oBxzYEcAG0PwCpwAG5K9PgGm+h+WIA0X90hfgp+igWgV+d8iB+QXYBhb19rAEMKAAQ8anSBIYGF+A/QswJT9FcsyB6QEsNSj5KZIKDAzPXwNofIoE8DVvBtBUpQIDAtgAGhUYoGr+HhIDFRjga3wCTGFXFRhQgP0JAwluKjCgABtA03sI7bgDMwuwATTFh9AqMDCzAD9lBSowgAKMCqwCAxsKsA0s6u9hOfLAvAC2gUWDIbQKDIybQBtA02II7dAD0wqwDSxe6KECAwqwAky8iwoMKMA2sEhwqsCAAmwDi9ZDaAcfmFSA5QNt9rAcfGBQAbaBxcuZQQMKsA0sVGCACgXYBhYBbiowoADbwKLzENrhB4YUYMlAryG0CgzMKMA2sAjyUIEBBdgGFiowQGoBtoGFCgwQX4BtYBHnogIDAtgGFglOFRgwgf7Lh0yg4xBaBQaaF2AbWPTcwxLAQPMC/JQI9KzALgFAAQYVGFCAFWBUYIDqBdgGFglUYEABvgsD4p0qMLC9AB+yABUYQAFGBVaBAQUYqldgdwHQswD7BIksVwkMbA7gpxzAKzBA+ARaAab9K7AABhRgUIEBBVgBRgUGKFqA7zIAi9AA4QX4kABMWIRWgYFuBVgAkOyhAgMbA9i/MKACAyRMoF3/qMAA8QXYCzD5PlVgQAGGthVYAAONCrAXYLwCAyjAqMBegYEVAewFmFEV2MUAKMDgFRiYyL8woAJLYKBtALv2UYEB4ifQXoCp49MrMLCmAPsbQlRgAAUYr8AqMKAAQ9MK7HoAyhdgK9BMrMBm0ED1AmwFmmpOFRjYEMBegClHBQYWTKC9AFPPTQUG5hdgL8BMfQV2RQAKMCQsQptBAwowqMCAAqwAowIDJAfw3U3P3AosgIGyE+gPFz2TK7BrAqhagL0AU9VFBQYGF2AvwNR1qsCAAgwJVGBAAQYVGODXBfDhjmd6BXZVAAUn0Aow8yuwGTRQsAB7AUYFBogvwP4HmOoeKjAwMYAVYKq7qsDAwAm0F2BUYAAFGF70CiyAAQUYvutmBg0owKACAwLYCjRegVVgoOEE+nCzs2YRWgUGFGBQgQEFGFRggNgAdq2zqQILYKDKBPrDrc6qCuzaABRgUIGBtQXYCzCdnCowoABDzwrs4gAqFODf3ehsewU2gwYqBPDdjU4vZtDAiAm0FWhUYAAFGCIqsAAG0guw/yGkn5sZNNC/AD/d5phBA4QHsAJMR75EAtpPoA93OTsrsOsDyJ1Au8pZWoHNoAEFGFRgYFsA393k9GQNC2g9gVaA2VuBBTCgAENGBXaFAGkF2K9Q0tepAgN9A9glzuYKLICBrAm0H+Ggs4cZNNC1AD/d4VjDAggPYAUYFRggYQKtAKMCAyRMoF3gqMAA8QXYN0iowC4SICGAXd+owGbQQPwEWgGmv1MFBvoVYCtYDGANC2hXgH2DxAQ3AQx0K8CHuxtrWGbQQHwAu7qxhqUCA/ETaAUYFVgFBhIK8N3NjQosgIHwAPYNEiqwGTSQMIF+urdRgVVgILwA+wYJFVgAAwkBbAWLQcyggT4TaHc2g5wC+E/27mC3jWOJAugvuAmYexJo/s8MIO1nAPE/8ueJbAhGElmWSE5199Q53r3NW7lu6lYPDViAIV7VQQMWYBjwGZYVGAgKYAswnmFZgYEGDfRqYmMFFsBA+ALsGySswDpowAIM99NBAyMEsGnN7kxWYKD/BtoTLHTQVmCgQQDPpjWeYQlgILyBtgBjBdZBAxZg8AwLSLEA+waJfToJYKDvAF5Nanap6qCBvhtogxrPsAQwEL8Afzen8QxLBw3EB7AxjWdYVmAgvoG2AOMZlhUYaLAAe4KFZ1gCGNBAg2dYgAYaPMMC2GYBns1oPMMSwIAFGHp6hqWDBrYK4IMJjRXYCgyEN9BHDTRWYAEMxAewBZi9qzpooMcG2gLM7i1WYKDDBtp0RgctgIH4APYGGs+wdNBAgwbabMYKbAUGLMCwhYsVGOgtgFezGc+wBDAQ3kB7goUVWAcNaKChz2dYBg3w6AA2l0li0kEDGmjQQQPJF+CDuYxnWAIYCA9gCzB5nHTQQD8NtAWYPKoABvppoGdTGR20DhoIX4A10OigrcBAgwC2AJOKd9BALw20iUwqkwAGNNAQ76KDBvoI4NVERgdtBQbCG+ijEzCeYVmBgfgAfjGP0UELYCC+gTaOSWcRwEAHDbRpjA7aERjQQEPvz7CswIAGGm4zCWCg9QL83SzGMywdNBAfwAezGB20AAbCG2gfAeMZlg4aaBDAGmhyqlZgoG0DbQEmqUUAA00baHMYHbQOGogP4NUcxjMsAQzEN9CmMGlNOmigXQB7gkVeFyswoIGGwTpoKzDgDTS0eIZl9ADeQIMOGtBAwzh8CgxooEEHDeQJYG+gya3qoAENNAzWQQtgsAB7ggU6aEADDQMRwIAGGnTQQJIAno1fdNBWYCC8gXYChiqAgfgAtgCDDhrQQMNoHbQABguwN9CggwZGCeDV7AUdNBDeQHuCBa8uAhiIDeCDyQuvdNBAbAPtCRb8MAlgIHIBLuYu6KCB+AD2Bhp00IAGGto5CWAgLoC9gYZHBLAOGjTQ3kCDIzDQfwO9mrrwZtFBAxpocAQGdtxAW4Dhl6qDBqIa6NnMBR00oIEGHTSQoYH2KxyggwYaBLAGGh7VQQtgEMA+AgYdNND1CVgAgw4aaBDAGmjQQQPxDbQ30KCDBhoswKtpC/8lgIHtA9isBR00oIEGHTSQYgE+mLXwPxcBDGwdwLNZCw/toA0k0EBroKFBB+0IDAJYAw06aKDTBno1aeE9AhjYNoDNWXj0EVgHDRpo/xIhOAIDXQawBhp00IAGGvoxWYGB7QLYR0iggwYaNNAHUxZ+o+qgge0a6NmUhd/Z7sew5DZooM1YCO+grc6ggdZAw8Yd9I8oVmSDANZAQ0wH/e3uv51yGDTQoIO+MTXLwxh0sK8A1kDDRy6lN+Yd7KSBXk1Y+EjpkJkHewhg8xU+NPWYwN9MPdBAgw5aDoMA9i8hQYoOWgbD+A30bLzCx5a+E9hBGCzAoIOWwSCAnYAhRwcthGHMBtpsheE7aNdgGDCA/QwW/NmpjEIGgxMwOAJLYRDAfgYLEhyBJTAMFMAaaNhXB+1BFgxyAj6YrLC/DtoWDP030AIY9thBi2DoPoDNVfiUpQzJdIReG2hvoGGnR2AZDH0H8Gquwl6PwJpo0ECDI7AlGASwj5DgFtPICWwLBidgcAS2BYMA9k8Bw6fVwQPYEgxOwDCmpRQZDDgBgw5aEQ3DNtAHMxXydNB2YOgngFczFT6vFBEMOAFDuKnshKkJrQPYR0jwFZcigQENNOigFdEwagCbp5Czg7YGQ9sG2kdI8DWnXQWwJRiaBfDBPIWkR2AJDE0b6Nk8hbRHYBEM7QJYAw1ftewtgR2CQQMNOmgRDEkCeDVNIXsHrYiGFidgsxR00JZgcAKGEZyKBAacgMERWAsNTsCgg5bAoIF2AgYdtBoaugxg/xIS6KBlMDQIYA003KRIYOCuE7A5Cjpol2CIX4B9hAQ6aAkMDQL4YI7CbZaihQacgEEHLYHBCRh00CIYLMBOwKCDdgkGJ2DQQduBQQA7AYMOWgKDEzCMpUhgEMB+hxIcgSUwOAGDI7AIBgH8gdkIBUdgr6EhvIH2ERLcY16yJLApC07A0JOpSGDQQDsBgw5aAsMgAbwaoHCPWiQwaKB9BQzxFgkMAtgJGOI9lyKCQQA7AUO0pyKBwQnYV8Cgg/Y9MAwRwIYn3KnmCmAJDBpo6MSpSGAQwD5CAgEsgUEDDSk66JKOoQv3BrAfgoYHWPIlsCUYnIChvanYgUEAOwFDuEvCALYDw30BbHLCIxQJDE7ATsAQrk4pE9johdsD2A9Bgw5aAoM3WDDsCrwULTQIYD8EDeH+KnZg0EA7AUO4pBuwHRgB7AQMbZ2yBrAdGA20r4ChpUuRwCCAfQUMOmgJDAIYUpjyBrA7ME7ATsDQTk0cwHZgBLATMOig7cCggYZUTsUODALYV8Cgg5bA0G0AH4xM0EFLYIg/AQtg0EFLYPAGC3TQEhi8wQJ00J5CgzdYMIJLsQODAHYChnjpA9gOjBPwp8zGJTzWJIFNZASwEzDES/8MSwKjgXYCBiuwMzA4AUOaFXiRwGYyAtgJGKzAEhicgMEKLIFBADsBw0Z8C+whFhpoJ2AYK4GP1zfHn3+W6+sfCQwCGNishD6+nOt5fnWe6/nnn/nH/3I+Py8SGHZ0Ap4NStjE/Py5v4PXW/4S1jrGRmw0I4C9wYJ4f07g68t8+38Dz/XpepXAMGoAfzckoVELfX2p9e41e+48hJXQOAE7AUO8p/ez8fp0x977Ts6f/0nhRQLDYAHsBAxb7sD1Xw+njsfr02PD99f/Ubd9tARGA+0EDC28bafXl6d6f+X8cQj/buWWwNBfAPsZDghJ4dClu7cUNqARwE7AkLH4tgJDjyfg1ayCXUbwVQJD3wFsUMFeM7ine7AERgPtBAypmuhuHkYb0ghgJ2DIpJ8PhO3ACGAnYEi2Btc+MtiYxgnYz3BAuhDu4cMkKzAC2BssSFhFP0tg6KqB9i8xQJ4tWAKDN1j8zd7d7LaNZGEAfQYbmGC2GoPS3oJGz2EKstY0ED+AiUDr7icfJ9MznQ6StiixeOvnnEUv247C1MfvVpGCiM3gVwkMzmABAcKfDJbA2AJ2Bgu0YEehwRksYMG94FcJDOEB7AwWtDiIfjaEBmewgIhB9CCBITaAbQFDowK/rlACYwJtCxia3goeJDDYAgYCIvjVQSyICmBbwND2VvCrCgwxW8AvViBoPIJjBtESGGewrD/QfAY/S2BwBguIiODBNjAIYCDAswSGZSfQDkED36wHQ2gQwMDy+uUPY1m5aTmAX6w6wB8W3wlWgbEFDPDVcZDAsEwAf7LgAN/PoV8NoWGRAL633gCBc2gVGAEM8N8AlsCwxBms3moD/OjZEBpSB7AtYOBnLVgCQ+IANoEGfprAr4bQYAsYiIjgQQJDwgB+scoAv/CbITSkC2BLDPBLgwQGZ7CAmhPYEJrmAtg3MQBZJLBFnNYC+N76AvydZwkMzmABFUewITRtFWDvwQI+dFSBYf4AtrQAH1rmiWAVmKYC2CFo4BKDCgzzbgE7BA1c1IENocEZLKDWDmwITUMB3FtVgHwS2FKOM1gAP1qrwDBbANsCBiQwBATwvRUFkMDgDBbQfAJbzmkjgC0ngASG5QPYaziAidK/FMsQmhYC2BksYKp+UIHBGSwgwKACgwAGJDAUeAbrxUICXOHJEBpuC+DeOgJk2IFVYGqfQHsKCZDAEBDADkEDmU6hLevUPYEWwECuHdi6TtUBfG8JATLtwIbQVB3AL1YQINcObGGn5gDuLSBArgmsAuMMFkBEAlvaqTeATaCBGz2pwAhgTwEDlXVgazsCGEACw2xnsGwBA3knsCE0AhggIoGt7tQZwPfWDWAGaxUYAewQNFBXB5bAVHkGq7dqAPMwhEYAC2Cgqim0CkyNAWzNAObSqcAI4It9smQA+XdgFZj6zmAJYKCEBLbEU10AewwYmNOTBMYE2lNIQIDBEBoFWAADFSWwVZ7KAri3WgBFJLAKTF0TaGewgLmtDaERwM5gAfUksADGGSwACQy3BbCFAkhg5RwWAtgWMBBgUIERwL4MGKgmgS315OhOAAP5WKvACGBnsIBqEthaTy0B3FskgJISWAWmlgC2RADJDBIYZ7AcggYqSWABTB0B/E8LBFDYENpyjwYMIIFBAAONJLD1nhrOYPkqBiCtQQIjfz0GDNSRwM5hUX7+CmAgORUY8es9HECAtQqMyBXAQB0JLAQo5bCzQ9BAVQmsAlNq8XUIGig7gcUBRfbeP322LgBLWElghK8JNBBgEMA0P3U2gQYCdHaBUX6/c29RABaylsBovl7DAQRYGUIjfj0FDAR4UoERvv87gyWAgQUNKjDS1yFoYHmdCoz8FcBAgLUKTKOHnj2FBMRW4EEFRvoKYCCACkzjs2dPIQExnlVgmm+/X/1uMQAW9qQC03b31YCBKobQKjDFlV8BDMRYq8C0Xn+9CAsIMajAtN1+BTCgAiN/g1gIgAArFZiWp89ehAVUMoQWJpRVfgUwEKZTgWm3/HoRFlDNEFqkUFb9fS/AL1YBoIIhtApMWfX37u61twgANQyhxQol1d9399YAIMpaBabd/PUeLCDQkwpMk9NnAQxEG1RgGo1f78EC6hlCyxcKGT57DxZQ1xBaBaac+us1HEBNQ2gZQzH1VwADNQ2hVWCK6b93d5/96wfqGUKLGUqJXwEMVDWEVoEpY/zsKSSgtiG0rKGM+iuAgRz8pgLTXv4KYCADKjCNjZ+9hwPIw0oFprX+K4CByiqwAKaQ/PUiLNrRH4+nd+fzl/PpdDwe3X3mZG0GTWPxW/l7OLru+M2Xb//trbftOh7P5/P2R+N7Fh99OJl4ksA0tP1bbwC/5+6Xnyy3fyy4VtzWwvf0s2vhT+ezS6KyIbTcIf/6W2UAv6+24/YD+/MXbbgRH4Tv/0PYFRFvZReYhurvu3/UFb7ny1ZbIdxK9738eni/IlwQ0QYVmJby9+5LRWPnj5uv2tOS7jT5gpDBsdYqMC3lbzXv4ZhUdf6awZa9OuP37IIoz5MKTEP5+6mStXbc3uCs9Yjfv1wQzmSFUYFpJn7r+C6k4y1rrQiu0unGC2KvBgdZqcA0k78VTKBP43YOIrgimxmuCRGsAiN+vYhyifj9tuKK4EqmzzNdEyI4xFoFppX8vRO/37Hgmj6L4HCDAOZGpeTvJ/GrBNdVf8+zXhF2JgoeQptB678COJXj7PH71c7yZ/wsgmOtVGAaqL8lH4LuksTvrCX4b7vYfrn3cHWn8/YXn9bXN2Mvd8d0Hvepc+6U4pIwh1aBkb9eRJlqzphkvd3kUa4+/qiWyZePBxZvt/+Qc+43ZajAGD8X/hTSaZvUeZbgy2NlP2WSL5f8Hrf+GsmmIkrw0gYVmAbyt8gA3ozbxOZIpEMW3eqUScO76NPYZZu/SvDC1iowDeRvgQHcnbbpzbDcXvqT0t6rZPFbXDyy6LPNXyVYBcb+r/dwpK+/82xIbpaoR78PAAAgAElEQVT6QTePwZP/Fpd/GG+L/Fkdh26oAgtg+ZvzU0iFrSndYbuUGyPp4l80Zfm8/NNKW4Ev/T12OeevMbQKjPxt+UVY3bjdFpLAYw7lc8HGP0s47rPO3xmOiXE5AUzd+7/FBfBpu6i3ZbIv3as/Hqa0u4R/b5f/Htnfmb0JxqXM9cXAgkn+ehFWafX35tV2wo9J9omNmZS7MfUvseClIYFLG0KrwObP3sNRYv7eEkpdDmt6JsnSpf7AC9qZ4HIrFZi687egAD5tI/RLBHCqGfRm0h81i0n4dZ/3WMhdGXaBkb/fuZe/ac69TgngfXzwJZ2EHxLXy0MxcxEmWQtgqs7fUt7DETF+vi0cuwyib8wkVxLPd0+lXBMEVWDxJH89Blxk/l79/qNJAfwWHnwpNze7tDcBm+WvCV9ZqQIjfm/3WkQAbwLz9+pcmvIjHjPYAk4XKw9JAzjk5sxBrIUMKjBVPn9U0LcBb7ax+uQBvA8PvpST1UPSz3os6JogaAitAivA3gRdaP5eGUyTgiE8+HLZis5/A9g28KJWAphq8/eT/E22DRz/Eowxk1qXMte6qGvCEFoFRv5WH8AZ5O91yXQIX84zCZWkD2QVdzoeFRj5W8oEOov8vWq1nRTAj1kEcJqzYA8JP+hD3DWhAhdVgQWV81cKcKH5e1U0TToCtcvis9uFB/CunMtDBV7IWgWmyvzN/z2U3TYXfdr822cRwGkyZUwXwCU+nkZIBRbA5s9egzU1f8dsAniXOP+Cm2cuATxt0nAIvSRU4KIqsLCSvybQBRWcW/tOl7hhp4in8CnGW7pbnPmJxoUMKjD15W/2BfiUUf5e0Xei55lX3L70RQVw9P3Zo2hUgbEBXOkZ6G6blcekAVhvAG9S/QIP5d2ToQKj/5YxgR7zCuBt0t8/QZvK5FzRQ6LPuCvviiCyAgtg+WsCXc4O383nsA4p/+dpAipFAB8SdcpD/BXxJhpLqsAyS/4qwMUW4MkD2ofYceY1NzCPwX+Pu7T3FzaBS9WpwNSVvwpw6vU2+DmkzQIlf+4Afizr/szXAi9mpQJTVf7mXoAP+QXwxArcxQbwNWeUUhwrSjPTzeL+zCms5ajA1HP+uYDXQGeYv1MrcOwB5EMeidKl+RDy2KCQiyow8rfCt1B2OQbwxAU39jmkMY9E2ST58ZlsUPSCUQVG/tZXgB+yDOC32gO4Dw3gfdo/nABWgbEBnIPPuf9zO2QZwPt0NxGPc3+CmTxYM+VD2KVIdc8hqcACWP46gZW+v2W24k4K4LlP1HaZJMohxU3IKIBVYDNo+WsA3VgAT6rAoV9IeF0AP4b+Rb6l+GAFsAqsAstfBTj9ADWzXb/Q55CuC6ldEQGczd3Zo1RUgXEAa2L+9gJ4kXcvRAbwQyYBnODuJp93tAjg0iqwAJa/4U8gdfn/U+tyDeBJOTmm6tbJAngf+hdZ3AE9AVxcBZZh8jfWawH9N+MAnrLtd0j1P06XUnP/RSZ4Cimja0MAq8DYAJ6Uv0X8S9tkG8BTOmLkc0hjeQG8S/CpCmAVWAWWvx4AriWAp4yKN+UF8NzjkYf5P4GtAG5VpwLL36L9+18CeLlF9z/snd1u67YShZ/hHKDpdSLQundg+DkiwvC1A2Q/gAnDr3922uL0/OzEHHKGv9+6KFqgiCRa1Me1hiOJwlLl/U+NNNZ49WOvAHheXQAwBWD6j6YG8NGIgrr7n1wjAA7q7jsA4Hm1I4OGv53Uep/+1ud/Xy4/PrYNABfNoOuVX9dGkBK0B6Cp7XkAGAuMCKD/m7w/Pk6be3GfennZ/viXl825rubZ0jCA9zb40S2/pgJYuxFYPQLwABgLDIDhb2vY7cjedu6ABVmxrwbgxf7itP3qQZvoABgLTAYNf80Luz9+nDozuF07YAEpRZehWn71bQB41abZCoCxwACYAnA71vfkXrbhplnLDljw2K3Xh5Sc1Nb7Ha+m1wWAscAQGAOsqN8/Tts26Cxr2gHHu8R6fUjB3t5r83LTHlAAjAUGwPDXInV++jS+A6tpByyAVDUAv44J4BUAY4HZhgV/625zHtf5duGABc/dYGKsLQGsWomWXP9RezwBMBYYAFMApuI7nAOOR6WoZKk4fq4RpigPqnsFwOhCBo0BrpM8n2aZY2074Feb69haWMAcagH40OFtAYCxwGgW//s0fPDciwOOz2knB7BThplSAn2/32+30586n8/3ewgAGAuM8L/ffcZ3m2iKNe6A9yYgvLYwfsda66irLs+/Yu/t9Mt55E7newDAfegZAGOAy5rfj8mmWL4DDj9tzvn06XN+/vOebnIyKVXpcZ7RLltrHbWZ3xXH+4MSjjsJIQyAO7XAZNDwV0DfbboZluOAjz8ftL980iaZnMy0uFL6G9oAsNc9btZbOO5xGyjc+Q6Ax68CQzYC6Ph9z/NptXI5ouerQlocugPwVgfAMaFCxg92E1yWOwcA3LbYhoUBLlT5nXOCpTngY9xjVoHBBwMEaZZfS6wtdNcBESOankDfpCd+ugPgoavAABj+xux7nnWCrWb0lTxfFYLapUr66xoBsG45NTWBvqdMI3cHwCNbYOBGAP1IH/POL7EDvktNTiaCN4uVhNp6K2e3kiJUnC73Q2Isknr2ZwDcrN6wwPAX/LbigFM8jstC8NWAQW0A+FDnV9x0h/Jv/mYM6kMEA+BaYhsWATTvvGrEAd8Tn7FrKICpKulv1ibyOgA2uqjM5cSDVRoA7tcCwzf4++XWqw83+fRa7fGbZ4KjMRVqpL++DQAvqkdNuahb9jV8uyMaAPdrgcmgAfCv9RuzK/7RnZMwfj5ezYvAVfqQshpm9X5F3S6kKvz9/h4BwPV0wQLDX4vS71SvnMx0wMdToQOlx8VV+pCy3jeid/8FTfPvKvH355FDiR3jCAuMau/A+v2DmRXtgI8aD9jUQnCs+Vm7A/C1TQAvtfj7jQnGAXdsgQEwBpidzxnYMvc3KrBcK6S/eR8t0AOw6kHFsbrmd52+qATjgCvqmQwa/vLO51oO+K42WIkEtoDh1gKA1WydU73yipvJvrxJAHBNAWACaE3365hS0b7xeCt4sDxYVjCfeV8NOtQYV/1FhfZq9lzgGEiiNzJoDDDhcw0HfC8feCfDMgBgDbsqvaab+j15ttwwjuTaYYHhL9/7Le+AM1uPIt2NFqd8+fR3yQKwWna7aA6mrxlAf3FTHpmoVXUBwATQfHShtAO+GRwv2HFqKW8+fRsA9porj1A3gP5lIfjARO3aApNBw98/eo+YSvEO+Gjyks6UbUsGebAS+7K6kPTgFTSz93o7oL8m8J6JigVGnQfQxM8Saultfs4um0aeiQPACod0DRjg/yPwlYmKBUad85fNzwIe3syOKIdW7OO3fCNwHn/VuKJ53bKytp01/U8CUwLu3QID4OkD6I1JFA/go+FoyUPovQEOtzqXYgJgp+n8fRMG+FNnEuh29EwGjQGm+lsIhzfTQ5q9aal4H9KaCWAlsKyaQxksfpk0nQIGuBmRQWOA00UNSQLgW/lDqhRsfW8AVuKXKoCbMcCfd8rZOo5BhTJoLPDM/GUGCx649s87sQWO/LtLafO5ZAJYydotiusOV+H8v3XB9xtztAXtADABdOLuK2aPIHIs4DesXna4ljafjQDYKwJYZOoJlsigyaAxwN/j9x3/K3h63yscU+tBX7wPyWcCWGkvtmYX0lL+9FEXegbAGGDefaWupWT5N8Vm2WyDPhYmn2UNNSgi05dOEdAkFhjmzWiAefeGxDYW2+4iJJfFNugmAKyT4WouOwIJNPq13rDA8Bf7awjDe7HhWm1qpb6s+cxtA1ZCmNNcyYTi/h11oh0AJoCWNf/y7isBDI8Ft5s6m1rpUpZ9+QDea/6AKsdraw80akkXMmgMsEDvTJko3f+s/hb1M96kVloYwGs2gFWqqKviRbvSqwfUj54BMPyNr/5if2N1vt/L4lfMrqv+X90XvwgrAHvFhcxKCRh9KTJoAmh2X42h6n1ICuxbsgFcuhlKdU3BTTyb3rDAGGDi5yHkTWqlZdnn2wBwUDzcQgkYfakdAMYAx718g8nSuFaTqDYU5Ud2F5KOi9QcRl84Pkdd6UIGDX/xvyPImThFX5R9CgDeio7kXnMAr9zE04ltWATQEf6X7VcdKFgAeCnKvnz+Fm6G2mv+Khv38HzLZgAMfx/pB/OkBy0WUW3RTbyuDQCvmswMZdNzRAaNxgqg+fZRH1otolpXkn2rAoD3+QO5aI4ie7DQd2IbFgaY9qMxZOIUS7JPA8AKO5m8IjMdAEbfCgDDX/g7hLwFgENB9i0KAC66F1sVwHvu4Bn1TAZNAM325xG0WES1JfuQHq8gQlsAfrzkWAEw+n6JhgXGAMPfEbRaRLW+JQAfI86mZJS/1/xNrtzBU+oCgDHAfHxwBFkAWGKrza3nMeJssu9Zp8lMAIweaEcGDX/h7wgKBrVSia3erM//sBbgmGoX0lJu9BAWGA0UQMPf3uQNAFyyD+lx5NsYgFUDBO5fLDAAxgD/W/C3N4mKwAa5dib7HrN+7zTqsmrMjFjEePUVERpOABgDjP8dQKI3ScX+voJcO5N9awThCzRDxTPzoPnHAPC0eoPAGGD2Pw8gi0bgcp/zWSMWDQUAHDQXHAEAIzJoDDD58wwKBgAu90HbJQLABRqBg+YQAmD0WBcAjAGGv/3LGwB4LQZgH1G3LtAIrJrih1LxAepYWW/DohFpPAMMf/uUpGl3H/k3JYVlY+t5LAFgB4BRaZFBY4DZf9W/JNugD/pAymxljQGw/Zs4VlXDD4ARGTT8hb9TyBkAWFJYvmadfcwp2zcC6wL4FQCjx9qRQRNAkz/3L4vPBpUCsItJzZ05gBdVZPItBkQGjQHG/84hi28X+UIQcTFotX8Th1e9WgCMyKAxwPjfOWTx7aKlUIy6Rnlb8yxXtQuJCBqRQWOAef/GJLL4dlGpPqSYNuAX+0bgeADHrFVxwIgMGgMMfwFwKoBdMwCO42MmgHUHEACjKD0DYAzwPz6YCH3L5OOBhRqBfRRZrRuBnepqwxFBIzJo+Bun35gHncukaTcY/M2UwxwjPX7OSQiWMAfd3wMAz60LAJ4dwPC3f1l8PNAb/M2UUz9EArIQgPe6vwcAJoMGwDNXgJ+YBP0rDAzgfSQgc05CcLExh8EBo9jwiiLw5DuwNiYBAM4zhXGuMJVV10ik7XMG0KvG7QAYkUETQMPfWeTrAjiDImvkCRsDOH4Fo1wS4HOEZNAAeF4D/M4MmAzA0Zwq04e0RlrOYOsldS/VAWBEBo0Bhr+TaLGIi4tQZIm0nMaNwMqXCoBRiQwaLvZtgGkAHkQmcbGgsGzp3WP/vxyUOeX1S7GPKaPutSODntUAw18ArJNrb8lnHiK5upiiLH78rtoA3rh7JxcZ9KQGGP6OU0iyALAg174mn3mIPF/bN3EsABjV0hsWeEoDTAMwANay1ekAjj1f20bgRZmXpT6mjMigUacGmDt/IFns+hFQfW+3cthHn0wGyrxyyfYVAKMSGTQA7tYAv3PjA2CtP5rcAuSiAWXaCByURy8UWLsgMmiKwN0aYN4APZSCBYBN/qg05o4HcEYjsPZKIxRYuyAyaCxwrwaYAjAA1sRI6nkv0UVXy0Zg7S4kycjRh4QA8GwG+Gnjrp8UwIIHvm8BwPEnUwLAVwCMyKAxwPAXpbFSgClBH9Jmdd5HwRUmj96qfZ2CpQu7sNAOAE9lgMmfJwawAFMF+pBCNIAtG4EX7cGTAHjP3UsGDYBnMsD43+G0WADYNQDgg2A1kHxfe+34QPBzsAsL5WTQFIG74+87NzwAjpI9ReL9oeWbOEJNAPM5BkQGPRGACaDnBrDAJwZrAMe3AcfY8eQwN2jHxYLwnpdRIvZBz8Rf5vuAWk2e997axq0CV2sIYPWkXQTgK7fv9LoA4Fl2YP2Tux0AVw22Rae9CWxqag7u6gKYIjB6JoOeBMB8AgkAV/6rIsJLcuKj+eDFXqWTAJhOYMQ+6En4yxsoAbCFNUwEsBcw1TcAYIOBI4NGZNDTVIA3bvUh5WoDOA0iEgDbNQIv+pXuVzJoVCiDBsD9GOB37nQALPiz8dug90mnHQRssmsE9vqkDGTQSDSByaAnADAdSADYCMBpLu5VF8CJWW7QX2UEMmhUKoOGk70k0ATQAFj0tPe2AHYS5Ln6AL4aDBwZNCKDnsMAE0CPKxsAx/chJW2AcqKTNWsENggPFhGAeRcHcgB4dAMMfwGwEMCrbR1zFZHJqhHYGVyjEMB7bmAyaAA8tgF+ctzkAFgGYOM+JG0Ap/UhrQYuf5UBmG1YiA8yDG6AiblGVrDZ8WML4EUEJl8bwAKD7V6xwEikHQAe2gDzCiwcsBzARlyPRepRBuA0I7lYUFIIYD6JhGhEGtkA04GEA04gpTf1cEHEpdUIwN5i5F6xwKhYBg0tmzfA79zgANgSwAeLkz4IAbyZDt3V5PegCozIoEc3wLwDGgCnAHg1BbDMF1o1AgeLMreXApheYDJoADysAebuBsC2AE6oYsragGMAnBTkmlzhIgUwr8OaXrwMCwOMALAQeukZ6io8VxsAOxMAr2IAsw9rdj0D4EENMPwFwIlOy7IPaRX+TZs3cawmIbETA/j1xl1MBk0GPaABftq4twFwGoAt+5AWoau2aQSOBrDMXssBTAhNBg2ARzTA79zaADjxMe8N8eGFPLUBsK+9cvn77Fkok0ED4OEADH8BcDJH4jcT7fXP+Sg+F0sAbzZ/ljIw+ks7isADJtC8AgsApwPYsg8pCP+kTSNw9Mhp5+uUgdH/iCLwePzlFVgAOAPAzhDAUlO9mpRRjezpmgJgysBk0AB4LAATQAPgnGe8YX4qPVVXFcDCBYb7F3tnkyM3jkThOxho76sEmXsJCZ3DKSRyXQX4AiIKef1pGx70uKfdSTEiqAjqexgMemOlfih9fI8RrBkCIzLos68A04EEgEWf+PID7z3lcfepWixEF4NyMnsi8t000ekzaKjp0gATQAPgVgDei460+4gWjcDJypuuMwRGO0UjUmcGmAAaAMtAYteHZAHg/Tn4YHV5wwyB0U6xCNyXAaYCGgALQTLMxxFq/2RgP4BXq4Q91QKYduDzaiSD7skAE0ADYCknyzkyaaNvqZgMmAF4N9rHecYDo50CwD0ZYAJoACwFsF0fUt59QItG4GwF4NoqLGqhz6yvZNAYYASA/5JZH5IPANu1Oa8zBEY79QUA92OASbIAsPzbnq0AvD/TNmgENutCEiwCsycWGTQAjg9gAmgA3LSdRht9W4VdNQPwfk86SgBc9ZcV0YkzaADsLIEmgAbAbdtp9iUuyQTAe7mVbC5uX3hPMTSSZ9CwEwOMzgzgfUdOFczT34ljsLH3O7MDiqERGXRfBpg9KAFwo/0yrP7QYQ3S9i5Em3Uh7Zq6sBCM/qs3LHAPBpgAGgA3XiWdJ130LS0AnA2XZEcpgImhT6gXANyDAebNBcBK1URGdUO5gqX6O3Fkk8nF3jv3+3uACT6baETCACMAXHHoRfewl6o4fOfM07Qxd5UTmBj6dALAHQAYAwyAtVCy2gC4xnSqNwIXp8RVL1RSAPC8bIzuU4lGpPgJ9DvDGABrAbi8lkgXwFsDACeTS9uN93/Xg+n0mcQiMAYYAeAKH7dn2I1VJ6q9WJtMzH3FU2ElGP0UncAYYASAK3zcnkOnKpxrNwIPtgAe5hkTjHaKReDgBpgKLACsWU50EID/6V9p9yGVrm9Xbgw5zmrCBJNBA2AMMDofgIuPvSf+HVwA2LQLSS+DpieYDBoARwEwBjiextvt9vHxuN+//9+f/321+9IbAniPT1yrSKrdCJzNbto+h40JRvIMGgC7SKCZKcdC7+PxTxhYlsfjdnMB4OKVzD3uM1fRXLsR2Hpb5qQJYEzwSfSVKqzABphNoMPodn88rb55fBRRGADblGJLupD2EL60GIuX5gRiETiwASaAjkLfRzE0CyBsCeByG6dJpqmSmJvBlS3VT3lVJjAdSWdIxWhEimuA3xm/Iei72/t8XI8CcHkt71XxmFulo5wMAHypftBp1hYdSf3rDQBjgJHZBPdeWRz7uF2PALBFH1KqhHlWBXBpuD7VP+xZX5jg3sVulGEBjAHuFr8/GXwAgHMkAKuWYguLoA0yaIqxTiAWgaMm0Bhg73rIM8hbawAXQ6TcKda1AWs3ApfeNQHw0jxjgtHOSToAjmmAPzM19q27jgP6/3VAUwAXl0GXu8+1kqODKoDNi6BfVffiwASfRVRhxTTAtCD5xq/ex3j5uLYDcLGLK4dfLYCTKi3Ni6CNMugfJhgE9yuqsGICmHfSc6700P0C/2KDowE4V5pp1UbgsQWARyMA05HUsdiNMmQCjQHuPn3+3SfYFMDlpbx6R5yqcVZ+gaUTi0n04LMVgelIIoMGwI4MMBVY57G/f0+inQD4qnbEzRGAN9GjH2Y7YYLJoAGwFwP8zrh1y19rG2QLYPU+pLH6SJqNwGsTAL8aAphiLDJoFoExwKh5/Py/H+GbNYBX7YOnai+t2Qi8avt64d3DBCNpBg1MDwMwBtirHrOxlg9bABenqKXu8zmA62lWDuDSmyZ8/Mn44WOCyaDJoA9PoDHAXpVnT9osEVIKv6dEX+oBXF6z3KIIusUA+ADB3ekFCxzMAPMS+tToi79VAC5upSll1Vp9oEHPsI7Ks4qjLDAdSQAYAB9tgGlBgr92FUXaAM7V0EvtATyJB4H9U6UjqTPRCRzLALMJJfw1BHDxVWgdbxJQs/RVaNOFVGjbMcHoFwHgUAB+Z8TCXzucFBfyFsKv/iwVG4EH3Ws61gJjgjsTVVihEmhePvhrCOBB9+ij4Dh6V7jqunqVCYzIBG+8cf2IReBIBvgbAxb+xgFwErhOvZ04Cp/OojEU2jxbYuiOPh4AOI4BpgXJpTzytw7AxXW8k9LhJAC+6D6ei8ZQWNs8XHqC+xGLwKwAo+74Wwfg4j6kMlo9N9QSlJVa1rkhgBtZYGLofvQVAEcBMAbYo9a5HwAr9yGtgsMMWgAeTW9YdYhPDI1+6AsAjpJAkzs51H3uCcC5LYAvojRcN1ZX8pQzBEZNMmigigFGae4KwMV2XgfnMgBfVZ/QNdqAWHj7ADBqZ4DfGavu5LIAWgDg4gS1CFeSWi61RuBBc0qhGCJQioV+6CsADgFgNqF0KLf8rQRwUj286Chal7g29pMNMxEI3INeWAQOkUDzsvnTOncG4FHz8KPoKFqNwC27kJoPCj4KHaRoADiCAWYF2J/S3BuAi2uIJpXbcxWBs4yZWe+ClCcxEBh9F4vAEQDMm+Zv6pr7A3DpJZXA7zmAZUayDMBti6C/a2j4mEmhATBqkEBjgP3JM3+tAbxogGiRYaxo2XY8wEpmPDAqF3+PIYAB/sQ4JYBuAOBVEcCr6CBKjcClT0k1GpnxwKhYbMWBAUa+v7LNAFw8q9Awghc/ANZtqr1DYGSeQQPgdgB+Z5R603puABd89Z8CeBJOcErIU7gge9EdHE1DaHbkCC46gb0n0J+Z5BJANwGwZh+S7BhKO3EUzpOmyPEIBD5nBg1aWwEYA+xOuU8Av+odfxQeQ+cas+3t8jE/Y19oMmhkl0CzAuxOw9wpgEsnFs8t43MAX4VnMuldj3rEtIZ42ggAY4ApgQ6nce4VwKXgeL5oKmsD1moEPqyZp21EwhpVZL0BYM8AZgXYndZuAVxq7Rf5kRbpPS5Y+xy1rsb5HI1l4Mh6YRHYcwL9jRHqTGnuFsDJDYBVduJIx/ErQWAEgDHAKHi86BLAz5twnzrYi/hM1C7nYjFK7iEeOHKwogWAMcCoJwNc/z1WW3WUtQEX3eXnU9PCRH3qYKGCeXpcAWDHBpjhiQFuCOCs9QNSAKs0Aq+H2semBCaEPh2AqcJqYIA/MTwxwA4B/NQ0ik9R4yLzse6x6VTtwqsZVZRB+wUwyZI3zV0DeFUC8CimnkYjcCEBzRb3mhKYT0VUUYVFAo16MsD1AB6U/FZqAOCnnu+4LqQjCEwIfbYMGsBigDHAfQFYqw8piW3n2gzAhuFtUwJPvJ1k0EgTwBhgDHBbABdvICF10k/9mkIjcDoeXE0JzHT9XBk0ALZOoN8Zm86UOwfwqxKAV7HtVGgEHqxvljMCU4cVVPxBJJ8A/oOhiQFuDOCs47ayBwCvLoxjjvDY0aECwC4TaAwwBrj1l3jV+QVpG3BRGH7VuRbrQdOuH5g6rKB6A8AeE2gGJgbYK4AnYZL9/AzlV5l9ALjhrpRY4JhiEdijASaB9qa1fwAnFQCPCmeYxcdwYxvvWGAEgKMB+MrA9KVxBsBla7jyNmCFnTiO70L661RarV1MvKUhvywsAlOChZ5pOAGARxWvJW8DVmgEHh0xqxWBscAxBYApwULPNJ8AwDp9SIMCKFYpbZL5vXIYQ2OBATDSADCbcHhTOgWAVfqQNAAs3oljULgQzeGTscDoN6IM2l0CjQH2pvUUAF41ACzfh0OhEdhJF1LjGHrjRQ2oL1RhOQMwBtibtEuwljn/+J+zr/Cg8RPyNmCFRuDszjLescBIM4MGwCTQp5FWCdbj8XG7/UKa2+12fzyyDwCr9CFlhRMcpZdZdkOb7t84PrDASC+DBsBmCfSVMelMWQW+t3/7PN+0MCz4CJca/YvoGCUnKL1Ml1VLd/Mcmh2hI+qFRWBXAKYHqb8EevkomVX9SeF8qAtqAuCSOyFsBB59GsbRPIdm7h5QXwCwqwT6nSHpTNISrI8930UphCVUKfzlRRRj6wD4opClt8eVdTHWxMsaUACYEiwkN4Ya+P3plB6uATyL2Kcz5dEA8BFjydgE87IGDNhYBPYEYFIkbxI1AT/qnmc9gyUAVuhD0mgDFjcCD2IjH9UEb7yu8fQVADtKoBmPHSXQi2A6NdYV7WFQ1ecAACAASURBVEg+wYMcwBptwCVznkX+xI4qWbLcloMyrICiCssRgEmgO0qgpZ/D26MtgJP8N3IjAM/yKP0wWFkWY/G6xhNVWI4S6HfGYzcJ9E3jW50bAri03HsSsG9SOpGrGMAHxrU3MxM88cLGEwDGACNpLqsZPwtssAgrcmevdH6y6wywXmplgtkN6zQAZhHYAMAYYHfKx/L3decmSluDa70IrOumdCKb2MhfDx1WVjtjXXljw4kyaC8J9GdeH28aD+fv667SWRGAV6nNSkqAEO3E4bgL6RcTnMmg0XdRhUUCjVQTaF3+7pkGbC0uVsA+rZnARQpgB2HtgwwaAWBHAMYA95FAa/N3RyXY1uJnrtUEL+SDqBG4bBrhoWPHoimYb0i8lA0AO0mgGYvu5OMj6AzAW7VzXbROZJEG6T6y2jsZNKIM2okB/sRQ9KaqJqTtwNMQ/fZoDuCL2vVKQ4vNxwBTL8Yig44n9sKiBhoJ4sy/7f585DxAxpUsdFlZyZ+JGoFzrKhWuxiLlzacXgCwhwT6GyPRnbIPC+IMwJfqf196epILjcYp5Z2xNt7aaPoCgCnBQoJM1tpatQKwtA9pdgDgMV5Sq1qMxX7Q8cQisAMAU4LlT8nJ968VgAcZgEe12YmgEThFxJSiCWYRON48/w0AH59A3xiI7rQ6+fy1AnCSrTMmteBX0AhcNomYvH2D9YqxSNLC6SsAPhzAGGCHyk5W4FoBeJR945Pa9MQcwJu7sZa0cuiJ9zaaqMI6PoH+g2HoT17yv1YAfpX9yqB2ewQ7caxBAaxWjEUGHU5UYR2fQL8zDP2ZEi/xXzMAZ9GvaLUBi3biyHFzWqViLF7ccALAJNCoMs1sUNrTDMCrKOXMavdnrMdMaEipmOCNN/cUAGYRWDGBxgA7VHZigN0B+FJ5vyZFAF+r/6XnmFbDBE+8udFEGfTBAOYPEXqUmxbMZgBOomVGxbOrvtLx2CflwQSzCBxOLwD42ASaXbA8uhE32V8MAI+KZ5drj5XCm0R5OTSv7jkAzCKwGoAxwA41uHEezQA8Sj7xo2JEv9YyNGoXkmYMzdckmiiDPjaBpgfJo1YvBrgdgF8ln/ikaM2qG4HXHhAljKE33t1oogrrUAC/MwIdKrtJ/toBWNKHNChGBNWNwGsXIW0SAZjtoAEwCTQAji4/xaftALw6AXB1I3A+drHARQxNFVY4sRnloTXQDECP30A/K2/tADwIJhurojNLtS62F4soIjAvbzRRhXUkgKmB7iAGXFycytbmly5V5nNHRlDbCDweHVboaa0H8JW3N9psHwBTA41qzGCLj3o7AI+C2UbWPDmzQrA4VUr1pVgTb280AeDjAEwC3YMDsZxFtQPwqwDAqidX2QjcE4DrCUwVVjgH/AaAaUJC+xDQrPDFHYD/w94Z5LiRI1H0Cm0DPXubYHHWKQg6h0XIWlcdQURB6775TKNnAA/G7WIwI8gg8/21YbGYTD7GjwjmqSl4vqrO/tZuW8yyBFsJTBXWdKIKa1wAjAPtUo5cv44ALs3xflLlXuNNHHktPrUSmLd3NnEZ5TAAEwD7NIUcXX7QEcDtfUhJlXuhzWctiwWIjZVYnOmn224A8CgAv7H6PCo5ijk6Ajg0/05Q5V5jI3AVgGdKkbZ1Iz14f2cTVVijUsCcVl1KVgRtu6d3BHBqdtyz6hw1Ani9IuEmAm+8v7OJKqxRTUisvQXMP9sdryOAY/OBo6jOUWwyHeJ68WFsATBl0NPpGwDGgUatkYetjdERwO19SEV3bEaFYPNlSFvuhaYMejp9AcBDHGiagJ3KU9lp6Ajg0rrDn3oD+NEKq6W9GMqg59QLVVjcwoEaAWxs+fWMgHPjDh+VA8+mmzjCkuFhAcAAGADjQB9JstTbtk4EHBo9d20ANzUCZwenpdFrkT6kOQWARzjQNAE7lSzz9rAdjEMAP+QTph2JtxSCzVkiLDehH7zBs52y6EMCwKiBeR0cv54ATo0/FJSd39BiJZc14ST/NuHGGzyb6EMa4UBjFa0AYOusYu4I4Ni4w2sDuKkReFV7VlwJTR8SAAbAlGDNq+xpu+sJ4K+Nf3JWnqTU4DtED3aFiaQhMH1I04lGYBxo1LbjWRt+XQHc2IdUtCepIZRNy7IpAeDVxecYBgAYB3oJAD+MB9MVwNkIwNKhAeAdITAAnk7fAXB3B5oA2K1OhwVwZfZbPGHSoTU0Aod106NBGALzBk8nAAyA0X8UXe12pSeAK93Oq3TCrup/9NZ0UNnmXJE0Aq++5VCF1d2BfmPZAWBvAI5Nv5TUJ6nhJo5Fu5CELgiNwHOKKqzeAP4Hx1SvSq4Sbl0B/NUGwOJJCnIzeeXYMAHgxfUCgHGgUcN2Z55V7Avgul/bhLi86D+CSxOAZ12SBQADYACsCWACYLcS1bxs1qPpu+/mllNHVj+lyAEcXdgVLpak/ZpE6qIKq3MKmCUHgKcF8EUYn4knKYqD2eTCrrCSrCyBq7Dm0ysA5hosJIBQJ7sv9h1KMgGwfGTidG5YOzQsAHhtfQHAXQH8xpJbA8DXIwL4JKSlfGTiRuCwdnI0A2AATBJYrwaaFbdItGEN4NQXwLHhr44GkyQGcPbwsFwsA67CmlFUYXUFMDXQqwDY0c6rEt81/JQFgMWNwMXDwzIUAF5bEQD3BDAONAD2CeAi/6lkAARxI/DqYCoAeG0BYJqQkL9gI3QGcF2ycRsP4IvcOp8ZTNnTqRDpR8CUQXcE8GcWHAD2CeC63zuL2NBQFJQsALxNvCgTAF5bALijA00A7Pks6grAuTOAG/qQLAAsbQRO3SZohlXJ/gKAATC3cBxgqzPv+OgN4CgHcDGIPKOQMmF1AH8FwGvrGwDu5kBTAw2Aa1VcAvgkGmLLwIR/bl6eSwUAA2CqsEgBA+ClAVz5g1cJKx8mw3iIRz31sswAeGlxEwcpYPSnROUum/VoTj4B/JAcWFrWu7ARuEh98+kUAPDS4iaObgEw12ABYItwXAfAWfpbySTyFAJ4/RsaEwAGwAAYBxoArw3gIP27k0nkKbuJY/kupBErAXV9vq8AmGuwkDMAp+7bbt0vngWovNgM4yId9ORYAsAAmDJompAAcM+trj+AxX1I2cT6NQDw5MYsAF5bfwDgPgCmCcm3gicAS2pfLx03+h9+q5i4BLKbOKqe2eTrsgDgpUUjcKcUMA70QgC2tqAHAFjah1RscCCKaHO/6QHAyERUYXUCMEuNCNhi19UiTBYC2GiORI3ANdM0+2fqMwBeWjcA3MWBpgkJALsGcJD94dEo9wqAAfCxBIC7APgzKw0AKxqx/gFsxZtNNk2P46xLADyj6EMiBYx8AXjEl5nqCq+36n9+sXoMZ9k0AWDkWlRh9QAwDjQA1oahLoDroH+2BrCkD+kIXUiStQCAZ9QLAMaBRq4AHAYAWNiHFIxyr+oAnn1dAmAAjAe9G8A40AC4XnkEgIvox7IgVasciIse2exdSAB4dUUATBMSctUHXEYAWNaHVKxoIDCVs8QzPwCAr7zFMwoA8ylC5CoCPonUdQLMAVzqOVPGH5UAMNobAVMGTQoYeYqARUXQahFwEh09zGggaAQuR7BlAfDqAsD2AObVAMAme65iBBwlAI5mNBA0Ah8CSgAYAANgmpAAcD8AhyEArjO+z7VYaB1FPYBjz8kBwMhINAKbAxgHGgCrurAmjCmaAL7YPYezAE3TF0ED4OX1BQBbA/iNVbYWgG1ra0+OAXypnK1m8tU3AqfhD8oZgHmJiYBJAZMCBsDdtlzVwCcIdvlsNkOxGsBhuFUBgNF+cRWWNYB/Z5EBYKOReAVwM/nqb+KoaQN+HGld8hJPqX8CYGMAf2aRLRVpGKcW8yAAJ8GvFTvyVf/BBQAvlu8mAqYM2iIFjAO9WgRsutedBgFY0odkSL7qRuByiKAQAK8u7qK0BjBrjAjYaCCqUV59AXg0PBXkyj/4GF1IAj8EAE8qGoFtHWi6gAGwVSiuCuD6PqRoSL7aRuB4DCYB4OUjYABMFzCSBZ6GAynDAJyrAZwMYVDbCHyMLiQBgM+8xETAAJgU8BEAbPhMT8MAHKrjLEsA1zYCH6MLSXAeA8CTikZgHGjkBcDiFLAeZVJ18B8MYaAJ4Mf867L0Xweor2gEpgkJxTFR5w7LcRCAr18t24DrG4HzWKOil04AeHV9B8CkgAGwEwCL+atoPVYDuFjOTyVXj9GFFD2sSWQrAEwKGACPiTr3O9C9AfywBnCpA/Ax6oITAF5frwDYDsCkgFcEsFnBSx4J4FJ79jD1futu4ogjn5JLAHPSn1XfKIMmBXx4+QCwnL+KcV5tH1I0hUFWA/A2/6oMAHh9vQBgOwC/sb4WBPBl/H5rMJZQCeBkmnwNVWBNxzBlBY4IrzAABsDcQzmrZBdguBiE9lhSJe+T6ZkgVfkP4RgxYQHA6ysCYC6CBsAOGoHjaSiAY+XPBVOHvq4RmC4kbqJcRpRBU4MFgB30IYUmAF/7bvfXj+G3C8CxijXlEEiKAJgIGABTg3UAZQcAPg0GcKn70y3v4aiahcMAWFAEzU2U84o+JFLAAHh8I3BqA/Cj7xw8bNuAK2/i4FMMXIR1aAD/hgONA72SZPavyeZeRgM41O30xiOqaQQ+SBdSGe3JoB6iEdgKwDjQiwLYoua0MQBWBE1lH5KxKV7TCHyQLqQTAAbAAJgu4AMoDQdwbgTwue8cnKPx5OSKI0fNSK+HWpNXXuFp9QUAGwGYt2JVAOsHHLGRv4rFRlVDuCTjAYWKI0cYc0Zy7MrwBh8rAv6EA00K+MAA3tQHkMcDuM7ytAZwTSNw7joto1SGLALUW3wRmBTw4RVH+b57A2DN4Kdqx8/Gc1PTCFwGPCHXSxIAH8yCBsA40GtpGPV2BsCa6b+qQRRjd6CCOzUA3qZfkWHkgRARAdMFjFz6fQZFLzsC4N59SObjqQDwIcqCJSty4wUGwACYFPBhAKy842UXAE4uAPzxk7geoSw4jlkDCAAvAuDfWVrrAljX89tFvm3Mnm+Gvo+fxPsRyoLDQEMGdT1qAWATAH9maU0kaQw6kv5jy6CtZ+bjJ3HpXpV0c34i5P2dWZ9oBLYAMKfSZQMOZdNvn/V7GbTpWw1HJROtCeD4/PM/fHfsQFMEPXUEzGXQFkXQpICnUhpm/O7m3tXLQHRgoJKJNng8l64napEjQxH01ALAFgDGgV4awJdBe+347yFZw0AFwA+Lx9MzCB58LwzqqD8AsAGA31hYU/lAw+LO6CfaCx5iz+gMwD9Wf3VbjmHUX4v6i68xkAJGw7BXhsecqsHn1v1J2Nry/zMn3WzooV3pqK++A2ADALOu5pKYg26g1/lzDObRmEYm2ipB0InA4z/OhfrpBQDrO9B0Aa8OYB3fL7qijYvYUwHAhpXhXWzowTeTIyLg2QPgN9bVXMpjnN/iIuhUHM21/5OwRNL/H5De3a3Fjbd3anETBw40CkPyjHdfPTfZQzgePM3ITxwKcwLHYQcwNATArwCYLuCjK43Y5XVuX9aL94IH8zd58gR+NhjrRHAecBJEAwWASQFzDB0Q7MWiAmC9jGfycBhIHnzwXw7GlsADW9LREH0DwFwEfXgNMDp1+KtYheUCwNHRhPydJ2BoQ4tPZdRgAWAADIBnV+m+z2cl/uo5rvvZt3kYRIdryuwInAdMORqqFwDMNRyHV+5Nm7sWfxW3YBdnAUdXk/z9qrCyoe8D/XYEgCmCRmMUOludSY2/isApSwBYMSb8xbHMJAiOI/12NEaRRmBqsA6v1Jd8ivxVtFx3u+JXD4PoA+DTUz/2bCjLIwU8vwAwn0LiGNqVN5r8VXQhd/chuTgFPPRWxS/Hov6R4Jay+I1XlwgYAHMP1vTqGXveVfmrR5zkIRYPbs4jHx4GlDPBZewfiwbpFQDrApglNaFKP/Qp81cvCooeAJw8hOG10fj76BXIiwuAATD3YM2v0C3a0uavYhLYQzlYcjMbNXa4mg/ddi0LKWAATBE0KeAFlDrt9kr3X9mEQcVBKB49nAKqAazlQzcuiwcv7vz6BoBVAfzGkppQsc92nwz4q7cNZw/j8FMEXTkfCvXQt/F2O5oIwJ8AMCngxdQj4IrPk4XUmOMCwMXJaUQwH8/bvt9pzUpwEfQK+gKASQGjYk/gezHhr57rujP/eh36IAzqgusPJHsQfCseon0EgEkBo2Fqbn+pLcOJRvhVdCKTh2FkH3MhHUprOdYeV+TKa7uAvgNgAIza4VOVAzRyn3U34uiBffsagVVdWeFZoCEMjncvfysaJS6DpgYL7Sn++bgQNt5PltrGz4EeD/aF4aqNOfJgXMbguC8pgQN9WAD/RgqYTyEtpj174XNc9KtKneJgFOnkBkpNbvjzVrkF3PcuiwcvLQAGwAB4De2zPt8Vo5xzGeVFZgcAjn6g1Dodz+ctfvBH3vYfynCg1xCXQWs60HwKaVbtvYLpZ+5jbIpyHuKzgNapL3gIPt0UQe86j1ye77ef+9G32/PpyvdAAJgUMBqt/SHJ84ctN97uz9IY2aRRcV/yEHyWJQD83yXxfN7vt790v9+fz4u/+1cQAF4GwDjQ00qpTaj8e8/dtc1u8rOAVjAUPbBvz3PQtWXzybFwoA8M4E+kgLkHazUFJztrC4NWAnAGwNRAH0kAmHuwkMKH8PQ21jBj9OnhIKSbF3UNYLy2VSLgVwCsBmBqsCaWn401jQqHioPgM7kJCz0DGAd6GQFgPQC/sZzmlYv99txkBZ/HT4ELAD8OA2AcaCJgAEwN1koKfpzFUUngsPPkoLIhufFlPQOYnYYIGACTAl7qKOrHWcyDQr/kICTb8xj+xd7d7LZtpQEYbu8gNZDM2hZo7QUYugG38NYSJHcbozG8FmFoPYVR+LIb569F6zoSeX4+ks8zwMxyXJXiq+/wkBzhkoibgAV4igF2CXh62von1l3HECbKX9P7L6/6ryHxhdHAAd75to7GtQCnCvCJo8kadIqtNU2t9Aw7wInnwrgBtgVr4gF+I8D2YFmDzjfY1LoI3D1+qwDdW6Q9HuIGeOHLOh6nAmwTNBHWoJfdh/FV7eZE6F7ihdm4AV75ro7HVoBtgibCGfevgNR6HPSs/2+HilcCphJgW7DGxPsIkz0J2sFkDTrRlb2hbYNOGOB5gCk8doB3vqoCLMDuQrIGne28euxfsqgcv4RDWYQfAaEDbAvWuH72C7C7kOi5+pn6vDqrE+DOawCLhCekKGGaGYApQIDtwaL+GvSuzxiYagKNsC83yqXRmQGYAied9wLsZcDUXoO+6FWhi8ofwC7Av4RF4oNhHjPAC1/TcRFge7Cofs5d9apQ7dcxpPzxGeFHQOAA+5aOzLUA24NFv+XP5LeWzOoEeBYgwBF+BMQNsAFYgMf+LEovA56sdZAB+NjL0YvK0Un572AWZDRsDMAUcCrASQJ84lAavibMXHPcQuyu7j9/0o1B8wB/Q93lEAPwlGwF2CZoOnUv487Wda8BunB0IgT4YiTHgi3QE3MuwB5ESc812OS3ds7rLEy29ePXRJkN1wZgCqy6CXCKANuDNQ5R5pqmTgDXAboQ5fkUMwMwAuw5WBRU46y76juLpgvgOkD82nQf4gBXQ8r+yKA+AfYyYHougKa8Ben4XwKrytGJEOBRHAoGYAEWYAGesnWQ02pT5cQ8DzB9rqPEKdourJVvpwALsD1YRuAS64pVBtAmwPQ5ixLgYLuwvAdYgAVYgI3AZU6rsyrtCRC/TgFejONyxGufslOMAE8hwN3uQnIcGYHTrivOKwzA3ZZdEwd4nnIdYTxr0DtfTQEWYHchGYELnVar5G9df220CZOnSPug7cAaK69DShBgdyEZgVNf11vXSE+X9d9FgM8/z/qsHVgIsE3QjHUEXvWevx7qD32pp88YdyHFGoEXvpZjdSrA/QPsMDICJ09XW2FlsgkQ4DbOAm2Uq8AWoAVYgAXYCFzyxpJ1jZXJAKujbfJPcvAjsAVoAZ5IgO3B4izGWDMvP3x2ql+A3z/ZVmhj3Au885UUYAG2B2sq5jHGmrbC4Leuvzw6i1SoCIvQFqAFWIBfc+IwGpc2xFgzq3BiPr5+yX8FzCMt0QZ4GodHcAjwdAJsEzRFTrsX/f+KHCfmef3l3w4f/uBXQ1wAFmABFmA6r8TmWFZsK6y7Blj+DbMH65Obyv198G0UYAG2B8sidPFlxXmF6rT1B7S2+hBe/HpEpR8XCLAAE1DmlccDx8YKO3NmOUb5vH9C7l3CNQtsA5YATynA9mBRYBF61/+PWGX6557Xn9CO/vEz8OUQG7AEWIB7BPjWUWQROstlvab80NfUnz6bcFNiq79kcu51SH0D7FsyRvl2Ql/0P/NnvDJ4ZGxW9f+ExcDXQ2yAFmABFmB6roRmWLSdl5/5ZvWnz3W8TO09AYs8BNiToCk39hyXrLZ4cppsvyYy/fQps0/pRn/J8n0TYAEmxVJojlysy5+Z2/qRiHijzo3+IsDuQqLcd6Ot3d8X59HMxZnXnz7X0VagMx0N+osl6L4B9iqG8Ra4/m2d6/JLrvX3PzXhVqBLD8FL/RXgCd6H5DZgMhZ4meIvyD7xzevHr405Kc5LDcHuPxJgAbYJmqRboTs91nddPjht9fgd/sOn7KMam73+kvaQEuCeAXYMKXDGx+o35YNz6NXOjH/LTbwF6C9/WIEh2PMnTcDTDPCPAkyuAnd9rc1N+XPzYQXO+p6efdRRMf8Q7P1HAizANkGTssA9UtGW3/J7QGWWm8yj5gEf6r7KAbHJOwRbfp7WEvR7Ae4VYJugR/8Vaete1fvb/3+5k3Nzs1/+1z9Mu9w/bPL/BfvvfO77aqnKuA7t8q8JWIBtgiZpgfutKn7bfLub2Ae/2dw87F/8z0OBXwCv/jyx/EwaJmABJsF6aMap5vMvAMNRpB9le+MvKQ4kAXYbMDkLnGKq2ez3G/8WRp5g468JeNqPwuoS4J1DaBKn29ZUwz9/FaXM796BMkk/CbCXEZJpCF6aaiTY7zRMwAJM6TVH+XVQOFAQYLcBU/xs66w6jYOi901JDhQBFmABJmWC986q00nwXn4RYC8jJMbAs7SjxlFx2O80m9sFWIC7B/jWEeRs+8/Z10nVUXHY8Ot3mgALsABz/Krji8uO+/3GOXXKR8UR9TX88tG1APfZBC3A07XZfMzwfr9cLp//5+FBeznbHBRhz1XBBOxlhED6SXjz2qssXKLABGwTNJA1w5uH56WRtm2/rZJstBcBTncJWIABEGB3IQEgwAIMAALsLiQABHg0AX63cgAB0M2pAPcIsOMHABNw+QC7BAyACViAATABT+M5HCeOHwAKTsBvBFiAARDgagG+dfwAIMACDMBwXAtw9wDvHD8AmIBNwAAI8CSeRLly/AAgwAIMwHC4BtwjwA4fAEzAAgzAgJwLcOc9WN7FAEBnlqC7B/iDwwcAE7C7kAAYkK0ACzAAJmABBsAELMBuAwbABOwuJABMwALsLiQATMACDIAJWIABwAScaQ/WW0cPAAJcPsAnjh4ABNhtwAAIsAADgABnCfC7laMHAAEuH2AHDwACLMAACPAkbgN2FxIAAlwhwCcOHgAEuHyAbx08AHR3KsAmYABMwCZgAARYgAUYgDwsQQswACbgAT2JcuXgAUCABRiAQbkWYAEGwAQ8nAA7dgDowSYsAQaggq0ACzAAJmDXgAEQYAH2NkIABDhUgP/n2AFAgE3AAAyL+4A7BvitYwcAE3D5R0ELMAAC7HXAAAiwlyEBwPe4BtwxwL87dgAwAZuAARBgAQaADAH+QYA9iRKAfq4F2KOgATABexkSACZgAfYkSgBMwAIMgAlYgAHABOxdDAAMynsBFmAAyrMELcAACLCXIQEgwAIswAAIsEdBAzAeNmEJMAACLMAACLAAexcDAALsXQwACLAnUQKAAHsOBwACPIEAnzhyABBgAQZgYBoBFmAAhjEBvxFgAQag/AQswAIMgAlYgAEYoJ8EWIABMAELMAAmYAH2LgYAsmgE2MuQADABexkSAAIswF6GBEAelqAFGICBBPgHARZgAARYgAEQYJuwAECATcDAMK02H+7u7p+eHh+vLp89Xl09Pd3d3W0bn81InAuwAAOxBqPt3dPT5X94fP6vjyHe+JwEWIABkvnY3q+VfdXVc4U/+LwG7dRdSK4BAyEG3+Y5vt9v79893TkZCbAJGKBHfbf3x6X3r1nYarQACzBAN53r+3UO9hEKsAADHOm8X30/+2PlgxRgAQY43F2C+n5O8K0PU4Cn8DpgAQYSaO6/3OSbJsGmYAEWYIDvO7+/TOwPH6oAjz7A7xw5QLT8Pm+JdmvwgFwLsAADxTU58msIFmABBqiS3+ch+NbnK8ACDPCSZDufX2YZeiDeC7AAAyWd582vAguwAAP8W87V529+9zkPgZchdQrwW0cO0MX28bKEW5+0AAswQNnx95OVD1uABRig7Pj77BeftgALMMBnxcZfl4EFWIABvjp/LNnfyyufuAALMMDZ2fayMCNwdI0ACzCQ333p/roKLMACDHD2W/H+WoMWYAEGnGkfLyu49cHHdi7AAgxkPtFW6a+LwAIswMDEz7OXdfzso4/tVIAFGMhpW6m/dmEJsAADU/Zrrf7ahRXd/70MSYCBMfbX86Cj8zbCbgE+cegMx+aD0xCT7K9t0AJsAqamT/tPf5FgJthfAY6tEWAT8Mj7++VimDMR0+uv+5D+ZO9edtvIlQAM5xHiADN7DyRBz2H0GNpaUARvbbQFPYfRMfzYMxOcnCROrL6QLfHy/aus7IBd5s8qFsnEZ6crAibgopeYcgHU69/mxicgYALGpdipxuFyrC/sXweBCdgeMC7Hj0cytoYD551fGwIGAcuAZSBuJUB9/hXzaXNNwARcMq3ZCJfiMu8vEDABEzDSoDMdIZHgcxUW3nLnw3VhggAAIABJREFUJkp7wCXnIG+mo+6LMcFFqi8EjF95IGAZcMGsXEyAC3HfEDAImIAJmIGRQOhdBF+CgAkYl2Htcj5chBQasLzGkHyUEDAB1yZgx4ExP21DwOjlioAJuDIBa4XG7OwaAgYBE3DdrJyNRDJxR8D4mSUBE3CFEyEDY9Z5tUtHwI8+BwETMC7DO7OS48CYkbYhYBAwAVdPx8A4N+uE/KsEnXSFzk2UBFw07zbDPBkbnHnVJwMGAROwZMTEhEoSYHFOwO6CxqVYmplQcwIszFNmT8Ay4FpnQxdyoPwEmIBT5loPFgFXOx0yMGagJWAQMAHjK6ceK2dgnDPgdEHjJzwHbA+4dHbeakMaJRcZMIIF/JGAZcDFZCSuxMIZF3wEjJ94IGACLp3FqenpxfggKp0SNAiYgDEkBZYD44zRRsAgYHvAdXF6V86llIjIkoAxGMeAZcDVVwUZGPGY/BBh9/r6cviXp//x379fX1+DBeyTEDABI+FJkYFxMQH/p9390/ZEnro/HF9lwARc7ikkAi6dnrsRPMyAswt483o4fB5sx/1hYnOXk3YJsyRge8BmxaZ5NkQ4n4BHqff7bD3JwQRMwDJgXJi+w5mPhghx6Et7n7bTf/b+lYCLWq0RMAHXsdR0XQHOQ/d+3vu0DJ+yWwIuB1dBE3AlLBgYF4u015fD51g/fz+uEO2ce8K4CtoecPWJybdMgYExQ7ElsOj8u1/QEnAhPBAwAVdC7x35DIzIkbaJmPj+yJGAy1iruQiLgKuhZWCcha9F4n/lu53tN9wTcAms3MNBwPVEe//pkK1RQhQFf545lIYb+G9fg4AJGJen/524DQOjkHrON26MVbLcETAB18OAa/IZGJnQyYAJmICREWsGRimsZMAETMAoLGtgYOTBwCL0s5FKlgcCnizgP4VPkSkwA6OoFJiAyxLwBwIm4KKzBgZGQSkwASfLlKcYCJiAS88aGBil1HNcsUrABIxk2DEwSoGACZiAkVXMdwyMQhhUgxbKybIi4OkCvhI/BdftGBjpsyBgAiZglJc2MDAymMCHRLJhIuD0IWCzFgMjL5ZD4tgwJcsdAROwFJiBkSkdAdcm4I8ETMCZM/AOP68TIv+1pNcICZiAkRJrBkYR7Ag4Z9xEScAqdwyMXFl4DImACRiZMfQhGQZG7rWcG6NEwASMpBj8mrl7hJD3SpKA0+WKgAMEvBVA2bJsGBhVCPjZKCU7CzmFJANWu+vjyWgh34WkBSQBEzBSo2Ng5A8BVybgjwRMwJUU7/7PF8OFXAW8NUjJzkEEbA+4WloGRgWFHGNEwASMHOeu77wYLhAwouIirCABP4qgrBnRh8XAyFTAroJOlwc9WCHvERJw5rQMjNIF7CbKZFkSMAHXzJg+LKkEslxEEnC6849TSEEC/iSEMmc3zsBbI4bcBHxjjFJlT8AErIDHwCBgnJ87AibgyotAzTgDPxoy5CXgZ2OUKp5iIGDzFwOj5BqOiCVgAkaiLJuRmM9AwIgx93gLiYCrZz3WwC7FQk4CNkQETMBIlnasgR0IBgEjGKeQAgX8hxgq4c9grIA3DIxsBOz0OgETMBJmN9bA7jZANgIWq8niGDAB46+xh4EdCEZC9IXq34YoVRwDDhTwn2KojFJQM97Aj4YNOQj4xhARcKECvhJDZdAyMPJkScDZ4hiwB4HxlfFF6KZ5MmxIPwN+NkQETMBImvUEATsQjMuzcg8HAVcrYMFdCu0UAzuOhOQFbIiSxT0coQL+JIgKYTlFwM5YgoBBwASMQNbTDLw1ckhZwNaI6S76CThUwA4Cl0M7zcCPRg5xlXrsmuZlaIvf2j0c2X5op5AIGINreZqhcYYw/NaQ/zKsuLJ2DwcBEzDy536igbViYY4gHFZcWTgGnCvXKtCuwsJ3phWhm40qHyJxHN1gsHMMmIAJGCWUhCamwFqxEIVlO37/ducYcK48qEC7ixI/sJ5sYNMcwv3bTUhf+8o21obJYgs4XMDCuyi6qQbWioXgAkw3RZ+tY8CZ4jFCAsabOXCygLViIXA+ntZC1TkGnCneQnIZNN5wH2BgsYDpHCcmsI4B58oDARMwRlb0bARjBpbtxCbmpVNIuXJFwF5jwBsCitAMjKlR103NYAk42zWXiygJGL8QUIT2QCEmsd9MbqJaOQacKWsC9hoDfqUNMbBWLMRd8/Us8deOAee66iLgCG3QBFxeOTBEwO7kwNhS5DGkhrx2CilT7gg4goBdBl1ZQmIjGHH92wW1MS+cQqpJwB8ImICLJ6gIrQyNMfWWvrtfehS6cwopU5xCImD8flJsAg28NYYYxLE/moIWix4jTLbyQcBeY8DvWQcaWBkagybhAf7taaPqnELKFFvAXmPAtLzC1dCIUWkZdPV4kICfjXKqiy8CJmC899cRKmAbwejj1OnfwQJ2CinX1RcBEzDeYx1sYOeRcJLjwEA6mcSunEIiYM8hoTjacAMrQ+P9GsvgAAsRsFNIBEzAyHGC7BplaMw2/Q4Pr+eASo1TSMlyrQk6ioAfhVKhU2S4gDe3lmf4HWPuejk5wyycQsoUp5C8R4hT7JpGGRpzcGxiCXinCTpTPEboOSScJEIRWhkav9ZWxgXWyRmm1QRdkYA/ErDXGCqaKGMIuFGGxk8cRgZQyCJR7CU7uRAwAeM06ygGdikHvrM8jt3FOPnjnELKlGsCJmD00MYxsDI0viU+o/c1TjYyLzVBZ4q3kAgYvelKHAFvXMqBrxzHB8/NSZ9rgs4UTdAEjF4iFaGVofHXmMs3hvZRrTzFkGkoaIKOJGDPIRVNG8vAerGqZz+prf7kj1xogs6TFQETMAbQxTKwJwor5zht4XbyZ+40QVck4OJ7sLzGgJFFPr1YGBZHE1dyzyEFGsOeKg8E7DJoDOE+noFvJcG1sp8aM9uA+owmaAImYGROG8/Abqask+Vx8prt9A/WBJ1pQFwRsNcYMOyPpWsiJsHWa/Wxmh5Bp2eXpSbomgT8gYB/wx/CqfT5M6KAJcHS32jXYPVFptwg2SmFgAkYQ7mPaeDmRRIs/Y3SgtV3TF2gEXD5AnYOqXzaqAZ2IKkijkGR0vPDF5qg88RN0ASMEQvWJi4OJEl/w3eA+44Ba4JOljsCdhMHLmdgSXAl6W+QgHsN2mqCzhOnkOIJ2E0cNdBGNnBzMKalswwMmv4nPLqQDWRcDqeQIgp4K54YWBKMN+xDI6Q/QDRBZ7o004MVUcDivAZiF6G1Q0t/Qx/zXenBynQyIWACxjjW8Q386kyw9HdqB3RvSG58hVS5JuCIbdCfBFQVtPEN3EmCpb/TC8gLPVh5ckfAbuJAAgbeuBirQI4RImOIPncuoswTPVgOAmM0M2wD2wkuMP2NcXf4oPpxqwcrzwghYAJGKgaWBEt/p9mzcxFlltgCjipgB4Gr4X4WA3siqaA1Wpyns74MSqT0YOWJLWAHgTGJbh4Du5ajkNriMdKKLEJBxkWUyfJAwASMSTPsXAa+VYfOn32s6Bg2o6z1YOU5iVwRcNQa9KOYqqfE2MyFZizp77j2qYUerIoE/JGAHQTGXNvAmrFy5xCvGjLwN7Z6sPJcxBMwAWMq7WwGbm5lLbmyj7c30f8Gw5BI1IOVLJqgCRjT6eYzcHOQt2TJcRMvBh6jBKIerGTRBE3ACKggzShgdegcOcSMgC9Df+tSD1ae6MFyFyVSNbBDwdmFQ9SSyG2kMHz0YYoScCVbwJPOIbkKqzLuZzWwfuiciNf7PG4DuO8Uki+T7IKNgAkYQbTzGlgdOhv2kTsCRiSuOz1YBEzA7qKsMe3pGgpGdP0O3wDuWwV6izBZNEHLgBG6ip1ZwF4Krq/6PLZ1+aT8n32eVHERpbsoEcq6mR0KTptj/E8+6ovrwcoTTdDRBSza62M3u4A36tAJc5hhF2LUPLLSg5Vn3YSAXQaNcNr5c2Bbwamy72bw77h927VrOLLkWg+Wg8CIsJLtzmDg5sXiLsFPf5zjU4+U5sI1HFlyR8DRBawLq0ZWzVmwFVyFfsecAO6vwDz7TKlyRcAEjIwM3BwMdUIcZqp8jC11dJ5CynL5Zgs4voAdBK6T+4aCK2M/18bDl7H/E9dw5LlqJ+AZBPwosKqkPZeBdWOlMXvOtu8/umtqpQcrS/RgzXEO6ZPAqpOuoWDZ7/k3gHuaoJ99rFTRg0XAiMbyfAZubin4op865pu/b/07voS2cA1HlujBmkPAurCqLUqeT8BN90rBl9PvnF92gjBb13AQsE1gAq6ddXNOXuQ2F1lmHef9qhP+S50t4CwjSQ+WNmjE5P6sBm5uKfgC2e+sOw2TfOkajiy5JuBZBLwVWtXSNmdWsEL0WTnO/D03UyaPlS3gLLkjYOeQkLeBN7Lgc2a/czPpY65tAWfJgy1gbdCIPEl3TSMLpt9pPE/6ny1sAWeJHiwCRmxWzfl5kQWXoN/xN2D1V11ufLpkQ0oFeh4B/8Pe/e22bWRxHMe+wdpAd69tmIKfo2AD3lqwhNzasAm9xgaMwMeu7STepPEfWeSQc4afL3pRtHDjikN9eX7nzND7kBhYFUy/0wxgnb89BO3RLFvMYCVqAv/X2lo0n+cwsNOxEj5S7aa5gusjfz8t4JCYwbIPCeUYuG68piGJfieaqzviBKz3Ixct4Hy5IWACRgru6plo1z78cUl45vNYYfGlFnBIzGClagL7FmTgudhbfCH1e+wA1vnbQ9C3rmG2yQoBpxKwVb90ZtiMZB5r9IvYTnnV0jztuYrZogVMwCjRwOaxRrmCuzqGf98agtYCLi2BJmD7kHBIwFTPSSOJHpg976a9XkOeFLSAFyTgfxOw9yEhewPX9V4ZfDTtxPnF0QPQ7y00WVy+3w8ETMBIyOeZDeyNwRGy5+GevNQCjsgZAduHhJINLIk+Jnvu61j+Pb/WAo7IFQF7ISGSsqvnRxL9keK37epu8kv0ddgvfTf2ux0wBY7h8EJCJOYuAwPXjdM5DmM1zwPTfuCv/cYTgwufL4agCRip6eosUAYfVPzOs2176C+eZrYaidebBDqhgO1DQlYG1g3OsvgdQ5JvzGD95cJmixmslAI2Bo3vD7q5GNi7GvIrfoe8AemZC5uQIqIFbB8Spqit8jGwKPoltnOOyg3aAPyNO5uQIqIFnFLA9iHh2cB1TjTtxiX52b7zPh+NUKN2NiFF/FYg4KQCXltiyNLAdd2bin6Onps6un/PnUMZES3gtAI+tcTwg8vMDNzUn7SDq7af/UKM0RBY2YQUkRsCTjqFRcDI18Df2sFL/n7e7upu9kvwNe3asgkpY04I2Bg0puJzXXNwNrXvdpfHxz/K/821TUgB0QI2hYXFG/hBAovLouceuxrZv28MQd+67bLljIAJGAxcN0tycC6175gjyjYhRcSbGIxBY1J2db70bVX+BVi3OV2CsRq0lU1IETGD5TRoTMtdXWft4KJX7CaDmeckA1Kvz2B9ccvlixksY9Bg4EU0hKvVLC8ZTHsA5Q8uJNABMYPldQxg4JcOyiqsEK7aXZffp7xOv6Yk0BljBstp0GDg1wrhdSGf9za70nesA6Cf6RyDFZAbAjYGjenpQhi4qZv4afQqs65vGv+eOwYrIlrAxqAxRyAaowZ+oKv7Nuyrkx5z56Zegn9XEuiI65OAjUGDgd+VcNPeR3uQ3OTY9E3l39eHoCXQOaczEmhj0GDgw4yxj/IGw+pp4irzmH/cB/NrCXRArgjYGDQY+OCe8GMenfdXerXNtueb8nzIu9T7jJEACbTXMYCBPyjhh1L4NkcLfyt8m3qB/j2XQC8ogSZgY9BYqoH/b+FNRha+b3d9oA9wbP+upvqDMCJnBDyFgHVhUJqBf4i4b2ffK7zePrm3qxfs31dnsCTQOaMFPMk+pFMrDYUa+El8D8Xw/RzjWetN+9Tv7aJ9ZuOXpdcS6IA4hmMSAZvCQsEG/rkansjDVfWt6o2n3lSx8J0EOiAS6EkErAmM1+nqcmiePZwol15vHs3bhVVvMik6hSMgWsCmsDA7d3VpfJtD7h9M3G7WY6h4vdm0D+Jtnv/bkUnh30oCHRAt4IkELAfCogz8bOIfKt4/uHi72VRVdahyq2qz3T781L7vuroI8aYMhS+dwrGcBJqATWGBgT8+rPWd/on2JXZP/6r5/WeKeSRJ8zB+IYGOR0XAprCQA7t6sXTN978WQSL/vvYI98WtlTErAp5IwM7CAgMjmX9fm+RzY+XMjRksY9BgYEzl31Qt2UoCHZATAnYWFhgYwf372kGUt26rjDmTQBuDRjZcMhT/HsnLM1iOoSwygV62gB1GiURsOapkPiWMwe5sApZAE7AxaCQIElGEf1OunE4CTcAyaGPQGGbgjqgKZZ904RjBCnizE7DDKMHACO/flU3A8TCDZQoLDIwJ+Jp21VzYBBwPu4AdRonsKOj1hJjIvy+/DPgvN1PWSKCnFLAmMA6EgUvjPvWS6Yxgxcu6JNDOwgIDI/X23/QmNIIVDy3gaQXseRSH4lAs/v1QMWUEKx6O4ZhWwKeWHA7lM28V4991+uVyYQQrHlrA0wrYURw4HIdiFULK46+euTaCtZwEmoBNYSF9qmg7ku2/h/LSWlm7h8pMoAn4X6awkJyKgW0/OhAjWMtJoLWAj82gPZLiQwY2DG370WFpiT1I8e5uBbAxaOSNYWjjz4fwwgyWFxHm3mIiYGPQyBzD0MafD+DaHqRwXBGwKSzkjmFo41fv09mDFA4tYFNYCJBUGcXi3/f4/U//051TaAJNwJrAmBDD0Mav3vsytwcpHHYBawIjBoahjV+9yYUCOBxXCmBNYMTAMLTxq7e4VgCHQwKtCYwwDSNO0/59nd+aFE6hLDaBJuAhAr618nCUgTWC4/B16tXhEI7lCFgLeIiAT608HIVTsbR/D85HnEJZbgJNwEOmsDSBcSwawdq/L3OhAA73PE3AswhYExhH40wO7d8XuVYALyaB1gImYMyERrDdvy/RKYCj4VWEMwnYvYEBwZVGsPbv7yiAwyGBNoWFgGgEZ8yn9TzBiD3A4bIsAp5JwKawIIbW/h2TS3uAo6EFPJeANYExMIZmYPHzL1wogKNxQ8CawBBDI3j8/MivQ9B/ukEk0ASsCYxk2I+UHe2My+HXyTy3hwRaBq0JjJRP0GLovOLn+zlXwy8C/uLuyJ8TAtYEhhga0ePnfwq4cWuUnEATsCYwxND4ma8zL4VrZ3AsJYHWAtYERiaP0Q7lWPj08wsCdgZHBK4IWBMYYmiMsPl3Pfs6uLAFKRYSaE1glFAEm8Va9PTVj2VgAivWbUvA3seAEqgUwUsvfx8RQIdCC9gUFgrBLNaCp6/+kUGbgI7BDQGbwoIYGsGnr57p1L+BYisJ9LwCNoWFMRFDL+7sq99bEV1/704oPYEmYFNYUAQjq/IXEmgC1gSGIng501fWHI5EATy3gE8tQozLVhGs/EWIvEoBrAkMRTBK6P5CAk3AmsBQBCt/gfcYMANNwJrAUAQrf4FjOSPg+QUsg4YiOGT5u7bKME8CbQZrNAHLoKEIDoi9thiIAjiHJrDnaKTBnuCEe4/cthh6fxKwjUhQBOPD6bPyF4O5kkDnIOA/rEQke8i+Y0vlLwpLoAnYRiTEwDDW2PS3VhWGUxFwHgJ2PyPlfS6Hlj4jP2xCykTAp9YikubQiuDxtv5KnzEONiHZCYxl0DKn5i9KSaAVwHYCIxZyaOkzJNAErAkMObSDJ7FwrghYExhLyqEpWPqMXDADnY2ANYExBeahj+aT9BnjJlIEnI2ANYFBwZq/WBA3EmhNYCwO53J8XL+av5BAlyzgU+sRFGznL5bCGQFrAmOZObRdwWavEDaBJuDxS2B3OaZUsFbwgfq9tViQWQKtBSyDBgXTL3AklwpgO4FBwXiV3ugzJNCawEASVhRs4y8k0ASsCYxZFNwzreoXk7MlYE1g4HxLwfQLCfTSBSyDhiCafrEEBryJkIDTCNhplKBgk89YAmcS6OyawO57UDD9QgKtANYExsJCMQp26hUk0JrAwCwsXcHOfIYEWhMYmIl2ua9p8MJBhEigCVgTGMWy0F1Je/qFBFoGDcyt4MUl0Y3WLyTQMmgrE1k8oC/qbYWN1i+mvb/MQMuggTdol5JE7910mJiVBDpPAf9hbSKbx/Sd4hfILIEmYBk0llIGlz0TbfAKs3CiBZypgMVhyCss23WKX2BMrhTAuQr41OpEZpS4L6nZe9TFXNwQsCYwcChVYVF0f6/4xXypkgQ6WwFrAiPPMriYKLppXU2ELYAJWBMYHBzWvm4wzJwnnUigNYGBj391xD4jq9lvXEPMzaUCOOMM2mmUyLwOVvsCxz/FSqCzbgL7moAsenT7qn2RBysJtAwaGMRmF2dvUm/DL/LhioCzFrAMGjEcHOK06P09+yKnBPpEAm0jElB+GN20jpqEBJqANYFR7BN9m6WEm73tvsiQ/ymAM8+gHYaFaE/1bd/lJV8zV5BAE7AMGgthk0clTL7ImSsCzj6DXlumCMm6nXUwq9+bd0be3GgBZy/gU8sUcWm3M2xRavr2nnyROysFsI1IQGo27WQWbvbciyBIoDWBgaksnHg4q9+3m8rnjDBIoG1EAiakqrbje7jp2/ZW2YtgDEugCVgGDQzw8FARN/2Dee8VvYiJBFoGDczIuqru20cVf6BF3PX9/uFnpM0IjgJYBg3kI+PN/aOOH9g90T/y+Dff/uF2s1mv1z4olMEZAccQsMOwAKAohr0JWAItgwYAHCfgEwIOImCxGwCUhATaYVgAgBlQAIcRsAwaAApiqwCOk0HfWq8AUAw3BBxHwOagAaAYVhJoGTQAYHquCDiSgG+tWAAohBMJtAwaADA5ZwrgUAKWQQNAGQw8BYuAZdAAgGNYSaBl0ACA6bkiYBk0AGB6TiTQ0QR8atUCQHzOFMDhmsD/sWwBQAHMpNML2BgWAMRnS8AyaAB/s3d3KW4cYRhGyRJKYOPbDrTIRrIANajvS2DtQxfJusMYTBxnnGg81V/9nbMGiZfn69YMxMsu0D0msA8uQOdWAewGDUC8xQB3eYP2U2CAzgPYBdoNGoB4ZwHc6QCffHgBeiaAe71B+ykwQM/e+wqWAa42wGnz8QXo18UF2g0aAAFsgL2GBTCDxQB3fIO++QAD9OrhAt1xAvspMECvdgHsBg1AvGyA3aABCPfeP8LhAl15gP0UGEAAU+MGvfkQAwhg4hP45FMM0KGLAe59gL2GBdChd/8RDhfo+jfom88xQHcWAdz/APspMEB/kgF2gwagvwB2gW5hgE8+yQACmPgbtJ8CA3TmbIDHSOCbzzJAV7IL9BgD7DUsgK6sAniQG7TXsAC6cjHAowzwzacZoB+eAI9zg/YaFkBHsgEeJ4E3n2eAeQLYK1jtDPDJBxqgF54Au0EDUIEAHmmAvYYF0ItFAA91g/ZLJIBpAtgAS2AA4gPYBbqtAfYUGGCSADbAbtAAVAhgF+jGEvjkYw0ggIlPYDdoAAFMjRu0BAaYIYANsNewAIgPYBfo9gbYL5EABDA1btASGKBtZwEsgQHoMoANcJMD/MGHG6Bhiwv0qDdof4wDoGVZAA+bwCcfbwABTPwAew0LoF3JAA98g775gAM06uwVLAkMQLwsgEceYAkM0KhFAI99g/ZLJAABjAQGQABPksCeAgO0yCvQww9w2nzMAcYMYAPc9g365HMOIIBxgwbg14sBlsAAhCvyNzi8gtX8AEtggMZkAzzHa1g3n3WA8QLYBVoCA/AmiwCWwADEE8ASGAABzHEDLIEB2rEK4Ilu0BIYoBlegZbAAMRbBPBUAyyBAYYKYAPcyw1aAgO0ocxvgF2gJTAAAtgAS2AAAUxjN2gJDCCAkcAAU1oEsAQGIF4ywBIYgF4D2AVaAgMggA2wBAZo28UAT3qDlsAANRX6CZILdH8DLIEBasoCeNobtAQGqGcRwBIYgHBrEsASGIBwWQBLYADCLQJ47gGWwAB9B7AB7vQGLYEB+g5gF2gJDMDTir2BJYC7HWAJDFBBFsBu0BIYINxZAEtgCQwQLwlgCSyBAcItAlgCvzj5LgBEWgWwBJbAAPGyATbAEhggXLkDtAt07zdoCQwQKAlgCSyBAcJd7K8E/psvBECQswA2wN/44CsBECN7AuwG7a9xAAhgKiew97AAIpT7CbAAlsAAPO0igA2wBAYIdxbAbtASGCBcyQO0AJbAADzpIYANsAQGCLcLYAssgQHClXwALICHegrsr3EAHCkLYAnsCA0ggGlngCUwwGFWAewG/WObbwjAQR4CWAJ7DwsgXMk3oAXwgAl88x0BOELRB8ACWAID8JSiD4AFsAQG4Dm7AJbAEhggXNkDtAAecoDTyRcFoLSHAHaDdoQGCLcLYAn8DF8VgKLKvoElgMdNYH8PC6Dh/RXAAyewIzRAQWXfwBLAIyewN6EBytkEsAF2hAaIdxHAbtCO0AC9H6AN8OAJ7AgNUEbhN7Ds7/AJ7AgNUETh/fUEePgEdoQGKGFxgJbAjtAA8QfoJIAlsL8JDRC+v1kAS+C323x1AN4nC2AJ7AgNEK7wL4AF8DQJ7AgN8B6lX8ASwNMksCM0wDuUfgFLAE80wI7QAD8vC2AL7MfAAP0foAXwTAPsCA3wk85JAHsNyxEaoP/9FcCTJbC/CQ3Qxv4K4MkS2GNggLcr/hewBPCECewIDfBmWQBLYEdogHAX+2uBHaEBwu3JABvgInyZAN7ggBewPAGe8ymwIzRA7f0VwJMmsCM0wLNW+yuBvQkNEC87QEtgCwwQbhHAEtgRGiDcIQ+ABfDMCey/MgA84bckgPnFERog2CEvYAng2RPYb5EA6uyvAJ48gT0GBvgfWQBzRAI7QgPU2F8BLIEtMMB/OOYFaAEsgT0GBrC/1Elgj4EBfig5QHNcAltggNet9pdDE9jf4wB41cUAc2wCexEd6Ot+AAAG1ElEQVQL4BV78gSYgxP45HsG8L2z/eXwBPYYGOBfkgM0xyewIzTAd7IAJiKBk+8awLce9peQBLbAACH96wAtgV2hAeL7VwBbYAsMEN+/AtgR2o+RACr0rwCWwH6MBBDfvwJYAltggAr7K4AlsAUGsL80lMBexAJmd0kO0NRI4E++fID+FcDEJ7AGBqb2sL/USmALDOhfB2hqJLAXsQD7K4CpkcAaGJjUJQlgqiawBgamtCcBTOUEtsDAfDb7iwUGCLce+/zXAdoAew4MUGF/BbAF1sAAr3gkAUwb72FpYGCm/k1JANNMAqcPvpPAJI6+PwtgCewKDWB/aX+BXaGBCVyzAzStDbAFBsZ3Pnx+BbCnwBYYoML+CmAJ7EEwgP2lkwTWwMDI1uQATbML7NdIwLj7m+0vDR+hP/uOAmPakwM0LSewKzQwppwcoGk7gS0wMKCI16/srwX2LjTAP60h++sA7QhtgQG+tScBTB8L7AoN2F/7S40jtAUGxjk/B+2vA7QFLrPAmy8tYH7tL/GPgT0HBobY3xy1vw7QEtgZGuDr/MbtrwCWwP4sJcBXYednASyBy/rdtxewv/aXCgt823yBgW7vz4H76wDtCF38OfBnEwyYXwFMeAL7PRLQ6fX5bn/pfYE/WWCgv/3N9pfej9D+RTDQ3/k5dH49AJbAx/nT1xmwv/aXCgusgQH76wBNjQX+Y/OdBrqw7cH7K4A9BjbBAOH5a38lsLehASrkrwO0BA75oxyrbzfQcv1e7ykJYMZL4JcJ9gUH2t3fCvNrfy1w1ALffMWBVu0V9tcB2gKHufqOAy3artn+MvBj4Jc/yrH5ogPNXZ/3GvNrfwlN4PTJg2Cgsfld71X21wNgYhM4JW9DA+bX/lJjgT/ePQoGGrHfUyUO0IQfob9U8OZrD7Swv9n+MlMCexkLaMJWLX8doKm3wOm+2WCgpmu9/NW/VDxCv/xhLAsMVLw+V8xf/UvVBE4f759VMFBFvXefBTAtLPCXETbBQLDteq9Zv/aXJgbY+1hAsOted33tL+0ssAj+q727yWkQigIwugVfYlgACQtxC01gzgCW4rrlpw0dWLUI5b72HKsjHcqXe3mlwOM0bTqa3hCmwD4qGHiMquqT/uIk9HWCawkG9u9vgPxaQBNqBB4KXPiQBmBfp0Z/UeDvtB4RDew0+Zb10Qef9ZewS+j5swo9HgvYfPAd2lukKISGoAUexmAJBjacfau2bcPU1/xL5AKPz8dyIgvYavhNcYZf/SXwbeDLGJy6kwYD/189p1gkhtgj8Pxwjr4r7aKB1fWtmr4Nll8DMHkUeLwdbBcNrJl8h9G3f0/xCAwZLKGv35tUl/bRwB/jW9bxBl/9JbsReImwp0UDv6uqSO830l+yn4HnW8KdBAM3yzvuyeqmT5G5AUyWM7DHRQO38xs7vOZfMh+BZ101Ho12SxiYrgSn2Dtn8y/PVOCUPsYfn109/e/NiyfbaXihTfP0qupmfI/vR8qF/pL3EvqeffX0mr7b6Wt5nR/1cf7RXn63WP5q+dsiAegvCgyQJU1BgQH0FwUGsICGnA5iARiAMQIDoL8oMID+YgkNoL+gwAD6iwID6C8oMMDmvAEJB7EA9BcFBtBfUGCAPcgHbgMD6C9mYAD9BTMwwB7c/8UIDGAAxgwMoL+gwAD2z9hCA+gvKDCA/qLAAPqL28AA3CQWKDCA/mILDWD/DAoMoL8oMID+ghvBAKsIBGZgAAFGgQH0F2yhAfQXBQZ4Ds5focAA8osCA+gvKDDAHiQBZ6EBDMAoMID+gi00gPyiwABPQQmwhgbQX8zAAPoLCgywB/d/UWAA/UWBAeQXnMQC0F8UGEB+QYEB9Bf3gQH0FxQYQH9RYAD9BQUGXpfrPRIMIL/gMDSgv6DAAPqLLTSA/oIZGGANp59RYADjL1hDA6ZfMAUD6C8KDKC/oMAAa7ioo8AAxl9QYMD4CwoMYPwFDQbkF47j3xewfQZDMID+osAA1s9gDQ0gv5iBAWyfQYMB0y/YQwPILxiCAf0FQzCA/IIEA/IL1tAAP3OVxhQMIL8gwYD8gk00gPyCKRiQXzAGA9zrzfUYQzCA/IIZGJBfMAYDyC9IMJA9l19sol0HAPkFCQbUF+yhAdQXJBjInHNXYBMNGH5BgwHDL9hFA5h9wRwMiC9oMIC9M2gwoL4gwgDaC5txJQHkFzQYEF+wjwY4c40EwzBg4gXTMCC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA8b4A6LRjs9XRgY0AAAAASUVORK5CYII=", media_type="image/png", + file_name=None, ), ], model="claude-v3-sonnet", # Specify v3 model @@ -269,6 +297,7 @@ def test_chat(self): message_id=None, ), bot_id=None, + continue_generate=False, ) output: ChatOutput = chat(user_id="user1", chat_input=chat_input) # Check the output whether the explanation is about aws logo @@ -341,6 +370,7 @@ def test_continue_chat(self): content_type="text", body="あなたの名前は?", media_type=None, + file_name=None, ) ], model=MODEL, @@ -472,6 +502,7 @@ def test_chat(self): content_type="text", body="では、おやすみなさいはなんと言う?", media_type=None, + file_name=None, ) ], model=MODEL, @@ -499,6 +530,7 @@ def test_chat(self): content_type="text", body="では、おやすみなさいはなんと言う?", media_type=None, + file_name=None, ) ], model=MODEL, @@ -605,6 +637,7 @@ def test_chat_with_private_bot(self): content_type="text", body="こんにちは", media_type=None, + file_name=None, ) ], model=MODEL, @@ -632,6 +665,7 @@ def test_chat_with_private_bot(self): content_type="text", body="自己紹介して", media_type=None, + file_name=None, ) ], model=MODEL, @@ -654,6 +688,7 @@ def test_chat_with_private_bot(self): content_type="text", body="こんばんは", media_type=None, + file_name=None, ) ], model=MODEL, @@ -680,6 +715,7 @@ def test_chat_with_public_bot(self): content_type="text", body="こんにちは", media_type=None, + file_name=None, ) ], model=MODEL, @@ -703,6 +739,7 @@ def test_chat_with_public_bot(self): content_type="text", body="自己紹介して", media_type=None, + file_name=None, ) ], model=MODEL, @@ -728,6 +765,7 @@ def test_fetch_conversation(self): content_type="text", body="君の名は?", media_type=None, + file_name=None, ) ], model=MODEL, @@ -779,6 +817,7 @@ def test_agent_chat(self): content_type="text", body="Today's amazon stock price?", media_type=None, + file_name=None, ) ], model=self.model, @@ -836,6 +875,7 @@ def test_insert_knowledge(self): content_type="text", body=create_test_instruction_template("俺様風の口調で"), media_type=None, + file_name=None, ) ], model=MODEL, @@ -853,6 +893,7 @@ def test_insert_knowledge(self): content_type="text", body="Serverlessのメリットを説明して", media_type=None, + file_name=None, ) ], model=MODEL, @@ -866,7 +907,7 @@ def test_insert_knowledge(self): }, bot_id="bot1", last_message_id="1-user", - continue_generate=False, + should_continue=False, ) conversation_with_context = insert_knowledge( conversation, results, display_citation=True @@ -886,6 +927,7 @@ def test_streaming_api(self): content_type="text", body="あなたの名前は何ですか?", media_type=None, + file_name=None, ) ], model=MODEL, diff --git a/backend/tests/test_usecases/utils/bot_factory.py b/backend/tests/test_usecases/utils/bot_factory.py index 288d9973b..6cf114350 100644 --- a/backend/tests/test_usecases/utils/bot_factory.py +++ b/backend/tests/test_usecases/utils/bot_factory.py @@ -25,6 +25,7 @@ def create_test_private_bot( sync_status="RUNNING", include_internet_tool=False, set_dummy_knowledge=True, + bedrock_knowledge_base=None, ): return BotModel( id=id, @@ -69,12 +70,11 @@ def create_test_private_bot( source_urls=["https://aws.amazon.com/"], sitemap_urls=["https://aws.amazon.sitemap.xml"], filenames=["test.txt"], + s3_urls=["s3://example/doc/"], ) if set_dummy_knowledge else KnowledgeModel( - source_urls=[], - sitemap_urls=[], - filenames=[], + source_urls=[], sitemap_urls=[], filenames=[], s3_urls=[] ) ), sync_status=sync_status, @@ -85,6 +85,7 @@ def create_test_private_bot( published_api_codebuild_id=None, display_retrieved_chunks=True, conversation_quick_starters=[], + bedrock_knowledge_base=bedrock_knowledge_base, ) @@ -94,6 +95,7 @@ def create_test_public_bot( owner_user_id, public_bot_id=None, instruction="Test Public Bot Prompt", + bedrock_knowledge_base=None, ): return BotModel( id=id, @@ -133,6 +135,7 @@ def create_test_public_bot( source_urls=["https://aws.amazon.com/"], sitemap_urls=["https://aws.amazon.sitemap.xml"], filenames=["test.txt"], + s3_urls=["s3://example/doc/"], ), sync_status="RUNNING", sync_status_reason="reason", @@ -142,6 +145,7 @@ def create_test_public_bot( published_api_codebuild_id=None, display_retrieved_chunks=True, conversation_quick_starters=[], + bedrock_knowledge_base=bedrock_knowledge_base, ) diff --git a/backend/websocket.Dockerfile b/backend/websocket.Dockerfile deleted file mode 100644 index d8ef54458..000000000 --- a/backend/websocket.Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM public.ecr.aws/lambda/python:3.11 - -COPY ./pyproject.toml ./poetry.lock ./ -RUN pip install poetry --no-cache-dir && \ - poetry config virtualenvs.create false && \ - poetry install --no-interaction --no-ansi - -COPY ./app ./app - -CMD ["app.websocket.handler"] \ No newline at end of file diff --git a/cdk/bin/api-publish.ts b/cdk/bin/api-publish.ts index a08cd1b3f..40a70342f 100644 --- a/cdk/bin/api-publish.ts +++ b/cdk/bin/api-publish.ts @@ -3,7 +3,6 @@ import "source-map-support/register"; import * as cdk from "aws-cdk-lib"; import { ApiPublishmentStack, VpcConfig } from "../lib/api-publishment-stack"; import * as apigateway from "aws-cdk-lib/aws-apigateway"; -import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager"; const app = new cdk.App(); diff --git a/cdk/bin/bedrock-knowledge-base.ts b/cdk/bin/bedrock-knowledge-base.ts new file mode 100644 index 000000000..5a1c274d7 --- /dev/null +++ b/cdk/bin/bedrock-knowledge-base.ts @@ -0,0 +1,88 @@ +import "source-map-support/register"; +import * as cdk from "aws-cdk-lib"; +import { BedrockKnowledgeBaseStack } from "../lib/bedrock-knowledge-base-stack"; +import { + getEmbeddingModel, + getChunkingStrategy, + getAnalyzer, +} from "../lib/utils/bedrock-knowledge-base-args"; + +const app = new cdk.App(); + +const PK: string = process.env.PK!; +const SK: string = process.env.SK!; +const BEDROCK_CLAUDE_CHAT_DOCUMENT_BUCKET_NAME: string = + process.env.BEDROCK_CLAUDE_CHAT_DOCUMENT_BUCKET_NAME!; +const KNOWLEDGE: string = process.env.KNOWLEDGE!; +const BEDROCK_KNOWLEDGE_BASE: string = process.env.BEDROCK_KNOWLEDGE_BASE!; + +console.log("PK: ", PK); +console.log("SK: ", SK); +console.log( + "BEDROCK_CLAUDE_CHAT_DOCUMENT_BUCKET_NAME: ", + BEDROCK_CLAUDE_CHAT_DOCUMENT_BUCKET_NAME +); +console.log("KNOWLEDGE: ", KNOWLEDGE); +console.log("BEDROCK_KNOWLEDGE_BASE: ", BEDROCK_KNOWLEDGE_BASE); + +const ownerUserId: string = PK; +const botId: string = SK.split("#")[2]; +const knowledgeBase = JSON.parse(BEDROCK_KNOWLEDGE_BASE); +const knowledge = JSON.parse(KNOWLEDGE); +const existingS3Urls: string[] = knowledge.s3_urls.L.map( + (s3Url: any) => s3Url.S +); + +console.log("ownerUserId: ", ownerUserId); +console.log("botId: ", botId); +console.log("knowledgeBase: ", knowledgeBase); +console.log("knowledge: ", knowledge); +console.log("existingS3Urls: ", existingS3Urls); + +const embeddingsModel = getEmbeddingModel(knowledgeBase.embeddings_model.S); +const chunkingStrategy = getChunkingStrategy(knowledgeBase.chunking_strategy.S); +const maxTokens: number | undefined = knowledgeBase.max_tokens + ? Number(knowledgeBase.max_tokens.N) + : undefined; +const instruction: string | undefined = knowledgeBase.instruction + ? knowledgeBase.instruction.S + : undefined; +const analyzer = knowledgeBase.open_search.M.analyzer.M + ? getAnalyzer(knowledgeBase.open_search.M.analyzer.M) + : undefined; +const overlapPercentage: number | undefined = knowledgeBase.overlap_percentage + ? Number(knowledgeBase.overlap_percentage.N) + : undefined; + +console.log("embeddingsModel: ", embeddingsModel); +console.log("chunkingStrategy: ", chunkingStrategy); +console.log("maxTokens: ", maxTokens); +console.log("instruction: ", instruction); +if (analyzer) { + console.log( + "Analyzer: ", + JSON.stringify(knowledgeBase.open_search.M.analyzer, null, 2) + ); +} else { + console.log("Analyzer is undefined or null."); +} + +console.log("overlapPercentage: ", overlapPercentage); + +const knowledgeBaseStack = new BedrockKnowledgeBaseStack( + app, + `BrChatKbStack${botId}`, + { + ownerUserId, + botId, + embeddingsModel, + bedrockClaudeChatDocumentBucketName: + BEDROCK_CLAUDE_CHAT_DOCUMENT_BUCKET_NAME, + chunkingStrategy, + existingS3Urls, + maxTokens, + instruction, + analyzer, + overlapPercentage, + } +); diff --git a/cdk/cdk.json b/cdk/cdk.json index 642d9d8f3..50a6a2815 100644 --- a/cdk/cdk.json +++ b/cdk/cdk.json @@ -6,6 +6,7 @@ "README.md", "../backend/**/__pycache__", "../backend/tests/**", + "../backend/.mypy_cache/**", "cdk*.json", "**/*.d.ts", "**/*.js", diff --git a/cdk/lib/api-publishment-stack.ts b/cdk/lib/api-publishment-stack.ts index 03d733eb6..891ae7b01 100644 --- a/cdk/lib/api-publishment-stack.ts +++ b/cdk/lib/api-publishment-stack.ts @@ -123,7 +123,7 @@ export class ApiPublishmentStack extends Stack { path.join(__dirname, "../../backend"), { platform: Platform.LINUX_AMD64, - file: "websocket.Dockerfile", + file: "lambda.Dockerfile", cmd: ["app.sqs_consumer.handler"], } ), diff --git a/cdk/lib/bedrock-chat-stack.ts b/cdk/lib/bedrock-chat-stack.ts index 4465a7ea7..a93f085ff 100644 --- a/cdk/lib/bedrock-chat-stack.ts +++ b/cdk/lib/bedrock-chat-stack.ts @@ -1,4 +1,4 @@ -import { CfnOutput, RemovalPolicy, StackProps } from "aws-cdk-lib"; +import { CfnOutput, RemovalPolicy, StackProps, IgnoreMode } from "aws-cdk-lib"; import { BlockPublicAccess, Bucket, @@ -21,7 +21,9 @@ import { TIdentityProvider, identityProvider } from "./utils/identity-provider"; import { ApiPublishCodebuild } from "./constructs/api-publish-codebuild"; import { WebAclForPublishedApi } from "./constructs/webacl-for-published-api"; import { CronScheduleProps, createCronSchedule } from "./utils/cron-schedule"; -import { NagSuppressions } from "cdk-nag"; +import * as s3deploy from "aws-cdk-lib/aws-s3-deployment"; +import * as path from "path"; +import { BedrockKnowledgeBaseCodebuild } from "./constructs/bedrock-knowledge-base-codebuild"; export interface BedrockChatStackProps extends StackProps { readonly bedrockRegion: string; @@ -82,15 +84,54 @@ export class BedrockChatStack extends cdk.Stack { serverAccessLogsPrefix: "DocumentBucket", }); - // CodeBuild is used for api publication + // Bucket for source code + const sourceBucket = new Bucket(this, "SourceBucketForCodeBuild", { + encryption: BucketEncryption.S3_MANAGED, + blockPublicAccess: BlockPublicAccess.BLOCK_ALL, + enforceSSL: true, + removalPolicy: RemovalPolicy.DESTROY, + objectOwnership: ObjectOwnership.OBJECT_WRITER, + autoDeleteObjects: true, + serverAccessLogsBucket: accessLogBucket, + serverAccessLogsPrefix: "SourceBucketForCodeBuild", + }); + new s3deploy.BucketDeployment(this, "SourceDeploy", { + sources: [ + s3deploy.Source.asset(path.join(__dirname, "../../"), { + ignoreMode: IgnoreMode.GIT, + exclude: [ + "**/node_modules/**", + "**/dist/**", + "**/.venv/**", + "**/__pycache__/**", + "**/cdk.out/**", + "**/.vscode/**", + "**/.DS_Store/**", + "**/.git/**", + "**/.github/**", + "**/.mypy_cache/**", + ], + }), + ], + destinationBucket: sourceBucket, + }); + // CodeBuild used for api publication const apiPublishCodebuild = new ApiPublishCodebuild( this, "ApiPublishCodebuild", { - accessLogBucket, + sourceBucket, dbSecret: vectorStore.secret, } ); + // CodeBuild used for KnowledgeBase + const bedrockKnowledgeBaseCodebuild = new BedrockKnowledgeBaseCodebuild( + this, + "BedrockKnowledgeBaseCodebuild", + { + sourceBucket, + } + ); const frontend = new Frontend(this, "Frontend", { accessLogBucket, @@ -137,6 +178,7 @@ export class BedrockChatStack extends cdk.Stack { dbSecrets: vectorStore.secret, documentBucket, apiPublishProject: apiPublishCodebuild.project, + bedrockKnowledgeBaseProject: bedrockKnowledgeBaseCodebuild.project, usageAnalysis, largeMessageBucket, enableMistral: props.enableMistral, @@ -181,6 +223,7 @@ export class BedrockChatStack extends cdk.Stack { documentBucket, embeddingContainerVcpu: props.embeddingContainerVcpu, embeddingContainerMemory: props.embeddingContainerMemory, + bedrockKnowledgeBaseProject: bedrockKnowledgeBaseCodebuild.project, }); documentBucket.grantRead(embedding.container.taskDefinition.taskRole); diff --git a/cdk/lib/bedrock-knowledge-base-stack.ts b/cdk/lib/bedrock-knowledge-base-stack.ts new file mode 100644 index 000000000..13081cafa --- /dev/null +++ b/cdk/lib/bedrock-knowledge-base-stack.ts @@ -0,0 +1,156 @@ +import { CfnOutput, RemovalPolicy, Stack, StackProps } from "aws-cdk-lib"; +import { Construct } from "constructs"; +import { VectorCollection } from "@cdklabs/generative-ai-cdk-constructs/lib/cdk-lib/opensearchserverless"; +import { + Analyzer, + VectorIndex, +} from "@cdklabs/generative-ai-cdk-constructs/lib/cdk-lib/opensearch-vectorindex"; +import * as s3 from "aws-cdk-lib/aws-s3"; +import { + BedrockFoundationModel, + ChunkingStrategy, + S3DataSource, +} from "@cdklabs/generative-ai-cdk-constructs/lib/cdk-lib/bedrock"; +import { KnowledgeBase } from "@cdklabs/generative-ai-cdk-constructs/lib/cdk-lib/bedrock"; + +interface BedrockKnowledgeBaseStackProps extends StackProps { + readonly ownerUserId: string; + readonly botId: string; + readonly embeddingsModel: BedrockFoundationModel; + readonly bedrockClaudeChatDocumentBucketName: string; + readonly chunkingStrategy: ChunkingStrategy; + readonly existingS3Urls: string[]; + readonly maxTokens?: number; + readonly instruction?: string; + readonly analyzer?: Analyzer; + readonly overlapPercentage?: number; +} + +export class BedrockKnowledgeBaseStack extends Stack { + constructor( + scope: Construct, + id: string, + props: BedrockKnowledgeBaseStackProps + ) { + super(scope, id, props); + + const { docBucketsAndPrefixes } = this.setupBucketsAndPrefixes(props); + + const vectorCollection = new VectorCollection(this, "KBVectors"); + const vectorIndex = new VectorIndex(this, "KBIndex", { + collection: vectorCollection, + // DO NOT CHANGE THIS VALUE + indexName: "bedrock-knowledge-base-default-index", + // DO NOT CHANGE THIS VALUE + vectorField: "bedrock-knowledge-base-default-vector", + vectorDimensions: props.embeddingsModel.vectorDimensions!, + mappings: [ + { + mappingField: "AMAZON_BEDROCK_TEXT_CHUNK", + dataType: "text", + filterable: true, + }, + { + mappingField: "AMAZON_BEDROCK_METADATA", + dataType: "text", + filterable: false, + }, + ], + analyzer: props.analyzer, + }); + + const kb = new KnowledgeBase(this, "KB", { + embeddingsModel: props.embeddingsModel, + vectorStore: vectorCollection, + vectorIndex: vectorIndex, + instruction: props.instruction, + }); + + const dataSources = docBucketsAndPrefixes.map(({ bucket, prefix }) => { + bucket.grantRead(kb.role); + const inclusionPrefixes = prefix === "" ? undefined : [prefix]; + return new S3DataSource(this, `DataSource${prefix}`, { + bucket: bucket, + knowledgeBase: kb, + dataSourceName: bucket.bucketName, + chunkingStrategy: props.chunkingStrategy, + maxTokens: props.maxTokens, + overlapPercentage: props.overlapPercentage, + inclusionPrefixes: inclusionPrefixes, + }); + }); + + new CfnOutput(this, "KnowledgeBaseId", { + value: kb.knowledgeBaseId, + }); + new CfnOutput(this, "KnowledgeBaseArn", { + value: kb.knowledgeBaseArn, + }); + new CfnOutput(this, "OwnerUserId", { + value: props.ownerUserId, + }); + new CfnOutput(this, "BotId", { + value: props.botId, + }); + dataSources.forEach((dataSource, index) => { + new CfnOutput(this, `DataSource${index}`, { + value: dataSource.dataSourceId, + }); + }); + } + + private setupBucketsAndPrefixes(props: BedrockKnowledgeBaseStackProps): { + docBucketsAndPrefixes: { bucket: s3.IBucket; prefix: string }[]; + } { + /** + * Setup the document buckets and prefixes based on the provided properties. + * + * This method processes the provided existing bucket URLs and sets up the + * S3 buckets and inclusion prefixes accordingly. It always includes the + * default bedrockClaudeChatDocumentBucketName in the list of document buckets. + * + * @param props The properties passed to the stack, including existing bucket URLs, owner user ID, and bot ID. + * @returns An object containing the list of document buckets and extracted prefixes. + */ + const docBucketsAndPrefixes: { bucket: s3.IBucket; prefix: string }[] = []; + + // Always add the default bucket with its default prefix + docBucketsAndPrefixes.push({ + bucket: s3.Bucket.fromBucketName( + this, + props.bedrockClaudeChatDocumentBucketName, + props.bedrockClaudeChatDocumentBucketName + ), + prefix: `${props.ownerUserId}/${props.botId}/documents/`, + }); + + if (props.existingS3Urls && props.existingS3Urls.length > 0) { + props.existingS3Urls.forEach((url) => { + const { bucketName, prefix } = this.parseS3Url(url); + docBucketsAndPrefixes.push({ + bucket: s3.Bucket.fromBucketName(this, bucketName, bucketName), + prefix: prefix, + }); + }); + } + + return { docBucketsAndPrefixes }; + } + + private parseS3Url(url: string): { bucketName: string; prefix: string } { + console.info(`Parsing S3 URL: ${url}`); + if (!url.startsWith("s3://")) { + throw new Error(`Invalid S3 URL format: ${url}`); + } + + const urlParts = url.replace("s3://", "").split("/"); + if (urlParts.length < 1) { + throw new Error(`Invalid S3 URL format: ${url}`); + } + + const bucketName = urlParts.shift()!; + const prefix = urlParts.join("/"); + console.info(`Parsed S3 URL: bucketName=${bucketName}, prefix=${prefix}`); + return { bucketName, prefix }; + } +} diff --git a/cdk/lib/constructs/api-publish-codebuild.ts b/cdk/lib/constructs/api-publish-codebuild.ts index 0d14686d9..61570d0bd 100644 --- a/cdk/lib/constructs/api-publish-codebuild.ts +++ b/cdk/lib/constructs/api-publish-codebuild.ts @@ -1,16 +1,13 @@ import { Construct } from "constructs"; import * as codebuild from "aws-cdk-lib/aws-codebuild"; import * as s3 from "aws-cdk-lib/aws-s3"; -import { IgnoreMode, RemovalPolicy } from "aws-cdk-lib"; -import * as s3deploy from "aws-cdk-lib/aws-s3-deployment"; -import * as path from "path"; import * as iam from "aws-cdk-lib/aws-iam"; import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager"; import { NagSuppressions } from "cdk-nag"; export interface ApiPublishCodebuildProps { + readonly sourceBucket: s3.Bucket; readonly dbSecret: secretsmanager.ISecret; - readonly accessLogBucket?: s3.Bucket; } export class ApiPublishCodebuild extends Construct { @@ -18,38 +15,7 @@ export class ApiPublishCodebuild extends Construct { constructor(scope: Construct, id: string, props: ApiPublishCodebuildProps) { super(scope, id); - const sourceBucket = new s3.Bucket(this, "ApiPublishCodebuildBucket", { - encryption: s3.BucketEncryption.S3_MANAGED, - blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL, - enforceSSL: true, - removalPolicy: RemovalPolicy.DESTROY, - objectOwnership: s3.ObjectOwnership.OBJECT_WRITER, - autoDeleteObjects: true, - serverAccessLogsBucket: props.accessLogBucket, - serverAccessLogsPrefix: "ApiPublishCodebuildBucket", - }); - - new s3deploy.BucketDeployment(this, "PublishApiSourceDeploy", { - sources: [ - s3deploy.Source.asset(path.join(__dirname, "../../../"), { - ignoreMode: IgnoreMode.GIT, - exclude: [ - "**/node_modules/**", - "**/dist/**", - "**/.venv/**", - "**/__pycache__/**", - "**/cdk.out/**", - "**/.vscode/**", - "**/.DS_Store/**", - "**/.git/**", - "**/.github/**", - "**/.mypy_cache/**", - ], - }), - ], - destinationBucket: sourceBucket, - }); - + const sourceBucket = props.sourceBucket; const project = new codebuild.Project(this, "Project", { source: codebuild.Source.s3({ bucket: sourceBucket, diff --git a/cdk/lib/constructs/api.ts b/cdk/lib/constructs/api.ts index ce7868c88..6cb8b7500 100644 --- a/cdk/lib/constructs/api.ts +++ b/cdk/lib/constructs/api.ts @@ -20,7 +20,7 @@ import * as iam from "aws-cdk-lib/aws-iam"; import * as ec2 from "aws-cdk-lib/aws-ec2"; import * as path from "path"; import { IBucket } from "aws-cdk-lib/aws-s3"; -import { ISecret } from "aws-cdk-lib/aws-secretsmanager" +import { ISecret } from "aws-cdk-lib/aws-secretsmanager"; import * as codebuild from "aws-cdk-lib/aws-codebuild"; import { UsageAnalysis } from "./usage-analysis"; export interface ApiProps { @@ -34,6 +34,7 @@ export interface ApiProps { readonly documentBucket: IBucket; readonly largeMessageBucket: IBucket; readonly apiPublishProject: codebuild.IProject; + readonly bedrockKnowledgeBaseProject: codebuild.IProject; readonly usageAnalysis?: UsageAnalysis; readonly enableMistral: boolean; } @@ -78,7 +79,10 @@ export class Api extends Construct { new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: ["codebuild:StartBuild"], - resources: [props.apiPublishProject.projectArn], + resources: [ + props.apiPublishProject.projectArn, + props.bedrockKnowledgeBaseProject.projectArn, + ], }) ); handlerRole.addToPolicy( @@ -98,7 +102,10 @@ export class Api extends Construct { new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: ["codebuild:BatchGetBuilds"], - resources: [props.apiPublishProject.projectArn], + resources: [ + props.apiPublishProject.projectArn, + props.bedrockKnowledgeBaseProject.projectArn, + ], }) ); handlerRole.addToPolicy( @@ -190,6 +197,8 @@ export class Api extends Construct { DOCUMENT_BUCKET: props.documentBucket.bucketName, LARGE_MESSAGE_BUCKET: props.largeMessageBucket.bucketName, PUBLISH_API_CODEBUILD_PROJECT_NAME: props.apiPublishProject.projectName, + KNOWLEDGE_BASE_CODEBUILD_PROJECT_NAME: + props.bedrockKnowledgeBaseProject.projectName, USAGE_ANALYSIS_DATABASE: props.usageAnalysis?.database.databaseName || "", USAGE_ANALYSIS_TABLE: @@ -200,7 +209,7 @@ export class Api extends Construct { }, role: handlerRole, }); - props.dbSecrets.grantRead(handler) + props.dbSecrets.grantRead(handler); const api = new HttpApi(this, "Default", { corsPreflight: { diff --git a/cdk/lib/constructs/bedrock-knowledge-base-codebuild.ts b/cdk/lib/constructs/bedrock-knowledge-base-codebuild.ts new file mode 100644 index 000000000..df6f6264b --- /dev/null +++ b/cdk/lib/constructs/bedrock-knowledge-base-codebuild.ts @@ -0,0 +1,87 @@ +import { Construct } from "constructs"; +import * as codebuild from "aws-cdk-lib/aws-codebuild"; +import * as s3 from "aws-cdk-lib/aws-s3"; +import * as iam from "aws-cdk-lib/aws-iam"; +import { NagSuppressions } from "cdk-nag"; + +export interface BedrockKnowledgeBaseCodebuildProps { + readonly sourceBucket: s3.Bucket; +} + +export class BedrockKnowledgeBaseCodebuild extends Construct { + public readonly project: codebuild.Project; + constructor( + scope: Construct, + id: string, + props: BedrockKnowledgeBaseCodebuildProps + ) { + super(scope, id); + + const sourceBucket = props.sourceBucket; + const project = new codebuild.Project(this, "Project", { + source: codebuild.Source.s3({ + bucket: sourceBucket, + path: "", + }), + environment: { + buildImage: codebuild.LinuxBuildImage.STANDARD_7_0, + privileged: true, + }, + environmentVariables: { + PK: { value: "" }, + SK: { value: "" }, + BEDROCK_CLAUDE_CHAT_DOCUMENT_BUCKET_NAME: { + value: "", + }, + KNOWLEDGE: { value: "" }, + BEDROCK_KNOWLEDGE_BASE: { value: "" }, + }, + buildSpec: codebuild.BuildSpec.fromObject({ + version: "0.2", + phases: { + install: { + "runtime-versions": { + nodejs: "18", + }, + commands: ["npm install -g aws-cdk"], + "on-failure": "ABORT", + }, + build: { + commands: [ + "cd cdk", + "npm ci", + // Extract BOT_ID from SK. Note that SK is given like #BOT# + `export BOT_ID=$(echo $SK | awk -F'#' '{print $3}')`, + // Replace cdk's entrypoint. This is a workaround to avoid the issue that cdk synthesize all stacks. + "sed -i 's|bin/bedrock-chat.ts|bin/bedrock-knowledge-base.ts|' cdk.json", + `cdk deploy --require-approval never BrChatKbStack$BOT_ID`, + ], + }, + }, + }), + }); + sourceBucket.grantRead(project.role!); + + // Allow `cdk deploy` + project.role!.addToPrincipalPolicy( + new iam.PolicyStatement({ + actions: ["sts:AssumeRole"], + resources: ["arn:aws:iam::*:role/cdk-*"], + }) + ); + + NagSuppressions.addResourceSuppressions(project, [ + { + id: "AwsPrototyping-CodeBuildProjectKMSEncryptedArtifacts", + reason: + "default: The AWS-managed CMK for Amazon Simple Storage Service (Amazon S3) is used.", + }, + { + id: "AwsPrototyping-CodeBuildProjectPrivilegedModeDisabled", + reason: "for running on the docker daemon on the docker container", + }, + ]); + + this.project = project; + } +} diff --git a/cdk/lib/constructs/embedding.ts b/cdk/lib/constructs/embedding.ts index 3ff799c32..797d4b8e2 100644 --- a/cdk/lib/constructs/embedding.ts +++ b/cdk/lib/constructs/embedding.ts @@ -12,6 +12,7 @@ import { IBucket } from "aws-cdk-lib/aws-s3"; import * as lambda from "aws-cdk-lib/aws-lambda"; import { ISecret } from "aws-cdk-lib/aws-secretsmanager"; import * as cdk from "aws-cdk-lib"; +import * as codebuild from "aws-cdk-lib/aws-codebuild"; import { DockerImageCode, DockerImageFunction, @@ -19,6 +20,8 @@ import { } from "aws-cdk-lib/aws-lambda"; import { DynamoEventSource } from "aws-cdk-lib/aws-lambda-event-sources"; import { SociIndexBuild } from "deploy-time-build"; +import * as sfn from "aws-cdk-lib/aws-stepfunctions"; +import * as tasks from "aws-cdk-lib/aws-stepfunctions-tasks"; export interface EmbeddingProps { readonly vpc: ec2.IVpc; @@ -29,46 +32,96 @@ export interface EmbeddingProps { readonly documentBucket: IBucket; readonly embeddingContainerVcpu: number; readonly embeddingContainerMemory: number; + readonly bedrockKnowledgeBaseProject: codebuild.IProject; } export class Embedding extends Construct { readonly taskSecurityGroup: ec2.ISecurityGroup; readonly container: ecs.ContainerDefinition; readonly removalHandler: IFunction; + private _cluster: ecs.Cluster; + private _updateSyncStatusHandler: IFunction; + private _fetchStackOutputHandler: IFunction; + private _StoreKnowledgeBaseIdHandler: IFunction; + private _taskDefinition: ecs.FargateTaskDefinition; + private _pipeRole: iam.Role; + private _stateMachine: sfn.StateMachine; + private _taskSecurityGroup: ec2.ISecurityGroup; + private _container: ecs.ContainerDefinition; + private _removalHandler: IFunction; + constructor(scope: Construct, id: string, props: EmbeddingProps) { super(scope, id); - /** - * ECS - */ - const cluster = new ecs.Cluster(this, "Cluster", { + this.setupCluster(props) + .setupEcsTaskDefinition(props) + .createEcsContainer(props) + .setupStateMachineHandlers(props) + .setupStateMachine(props) + .setupEventBridgePipe(props) + .setupRemovalHandler(props); + this.outputValues(); + + this.taskSecurityGroup = this._taskSecurityGroup; + this.container = this._container; + this.removalHandler = this._removalHandler; + } + + private setupCluster(props: EmbeddingProps): this { + this._cluster = new ecs.Cluster(this, "Cluster", { vpc: props.vpc, containerInsights: true, }); - const taskDefinition = new ecs.FargateTaskDefinition( + return this; + } + + private setupEcsTaskDefinition(props: EmbeddingProps): this { + if (!this._cluster) { + throw new Error( + "Cluster must be initialized before setting up the task definition" + ); + } + + this._taskSecurityGroup = new ec2.SecurityGroup(this, "TaskSecurityGroup", { + vpc: props.vpc, + allowAllOutbound: true, + }); + + this._taskDefinition = new ecs.FargateTaskDefinition( this, "TaskDefinition", { cpu: props.embeddingContainerVcpu, memoryLimitMiB: props.embeddingContainerMemory, + ephemeralStorageGiB: 100, runtimePlatform: { cpuArchitecture: ecs.CpuArchitecture.X86_64, operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, }, } ); - taskDefinition.addToTaskRolePolicy( + this._taskDefinition.addToTaskRolePolicy( new iam.PolicyStatement({ actions: ["bedrock:*"], resources: ["*"], }) ); - taskDefinition.addToTaskRolePolicy( + this._taskDefinition.addToTaskRolePolicy( new iam.PolicyStatement({ actions: ["sts:AssumeRole"], resources: [props.tableAccessRole.roleArn], }) ); + return this; + } + + private createEcsContainer(props: EmbeddingProps): this { + if (!this._taskDefinition) { + throw new Error( + "Task definition must be set up before creating the container" + ); + } + const taskLogGroup = new logs.LogGroup(this, "TaskLogGroup", { removalPolicy: RemovalPolicy.DESTROY, retention: logs.RetentionDays.ONE_WEEK, @@ -81,7 +134,7 @@ export class Embedding extends Construct { }); SociIndexBuild.fromDockerImageAsset(this, "Index", asset); - const container = taskDefinition.addContainer("Container", { + this._container = this._taskDefinition.addContainer("Container", { image: ecs.AssetImage.fromDockerImageAsset(asset), logging: ecs.LogDriver.awsLogs({ streamPrefix: "embed-task", @@ -97,24 +150,385 @@ export class Embedding extends Construct { DOCUMENT_BUCKET: props.documentBucket.bucketName, }, }); - taskLogGroup.grantWrite(container.taskDefinition.executionRole!); - props.dbSecrets.grantRead(container.taskDefinition.taskRole); - const taskSg = new ec2.SecurityGroup(this, "TaskSecurityGroup", { - vpc: props.vpc, - allowAllOutbound: true, + taskLogGroup.grantWrite(this._container.taskDefinition.executionRole!); + props.dbSecrets.grantRead(this._container.taskDefinition.taskRole); + return this; + } + + private setupStateMachineHandlers(props: EmbeddingProps): this { + const handlerRole = new iam.Role(this, "HandlerRole", { + assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"), + }); + handlerRole.addToPolicy( + // Assume the table access role for row-level access control. + new iam.PolicyStatement({ + actions: ["sts:AssumeRole"], + resources: [props.tableAccessRole.roleArn], + }) + ); + handlerRole.addToPolicy( + new iam.PolicyStatement({ + actions: ["bedrock:*"], + resources: ["*"], + }) + ); + handlerRole.addManagedPolicy( + iam.ManagedPolicy.fromAwsManagedPolicyName( + "service-role/AWSLambdaVPCAccessExecutionRole" + ) + ); + handlerRole.addToPolicy( + new iam.PolicyStatement({ + actions: [ + "cloudformation:DescribeStacks", + "cloudformation:DescribeStackEvents", + "cloudformation:DescribeStackResource", + "cloudformation:DescribeStackResources", + ], + resources: [`*`], + }) + ); + + this._updateSyncStatusHandler = new DockerImageFunction( + this, + "UpdateSyncStatusHandler", + { + code: DockerImageCode.fromImageAsset( + path.join(__dirname, "../../../backend"), + { + platform: Platform.LINUX_AMD64, + file: "lambda.Dockerfile", + cmd: [ + "embedding_statemachine.bedrock_knowledge_base.update_bot_status.handler", + ], + } + ), + memorySize: 512, + timeout: Duration.minutes(1), + environment: { + ACCOUNT: Stack.of(this).account, + REGION: Stack.of(this).region, + TABLE_NAME: props.database.tableName, + TABLE_ACCESS_ROLE_ARN: props.tableAccessRole.roleArn, + }, + role: handlerRole, + } + ); + + this._fetchStackOutputHandler = new DockerImageFunction( + this, + "FetchStackOutputHandler", + { + code: DockerImageCode.fromImageAsset( + path.join(__dirname, "../../../backend"), + { + platform: Platform.LINUX_AMD64, + file: "lambda.Dockerfile", + cmd: [ + "embedding_statemachine.bedrock_knowledge_base.fetch_stack_output.handler", + ], + } + ), + memorySize: 512, + timeout: Duration.minutes(1), + role: handlerRole, + } + ); + this._StoreKnowledgeBaseIdHandler = new DockerImageFunction( + this, + "StoreKnowledgeBaseIdHandler", + { + code: DockerImageCode.fromImageAsset( + path.join(__dirname, "../../../backend"), + { + platform: Platform.LINUX_AMD64, + file: "lambda.Dockerfile", + cmd: [ + "embedding_statemachine.bedrock_knowledge_base.store_knowledge_base_id.handler", + ], + } + ), + memorySize: 512, + timeout: Duration.minutes(1), + environment: { + ACCOUNT: Stack.of(this).account, + REGION: Stack.of(this).region, + TABLE_NAME: props.database.tableName, + TABLE_ACCESS_ROLE_ARN: props.tableAccessRole.roleArn, + }, + role: handlerRole, + } + ); + return this; + } + + private setupStateMachine(props: EmbeddingProps): this { + if (!this._container) { + throw new Error( + "Container must be created before setting up the state machine" + ); + } + + const extractFirstElement = new sfn.Pass(this, "ExtractFirstElement", { + parameters: { + "dynamodb.$": "$[0].dynamodb", + "eventID.$": "$[0].eventID", + "eventName.$": "$[0].eventName", + "eventSource.$": "$[0].eventSource", + "eventVersion.$": "$[0].eventVersion", + "awsRegion.$": "$[0].awsRegion", + "eventSourceARN.$": "$[0].eventSourceARN", + }, + resultPath: "$", + }); + + const ecsTask = new tasks.EcsRunTask(this, "RunEcsTask", { + integrationPattern: sfn.IntegrationPattern.RUN_JOB, + cluster: this._cluster, + taskDefinition: this._taskDefinition, + launchTarget: new tasks.EcsFargateLaunchTarget(), + containerOverrides: [ + { + containerDefinition: this._container, + // We use environment variables to pass the event data to the ecs task + // instead of command because JsonPath is not supported on command + environment: [ + { + name: "EVENT", + // Note that DynamoDB stream batch size is 1 + value: sfn.JsonPath.stringAt( + "States.JsonToString($[0].dynamodb.Keys)" + ), + }, + ], + }, + ], + assignPublicIp: false, + securityGroups: [this._taskSecurityGroup], + subnets: { + subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, + }, }); - /** - * EventBridge Pipes - */ + const startKnowledgeBaseBuild = new tasks.CodeBuildStartBuild( + this, + "StartKnowledgeBaseBuild", + { + project: props.bedrockKnowledgeBaseProject, + integrationPattern: sfn.IntegrationPattern.RUN_JOB, + environmentVariablesOverride: { + PK: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: sfn.JsonPath.stringAt("$.dynamodb.NewImage.PK.S"), + }, + SK: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: sfn.JsonPath.stringAt("$.dynamodb.NewImage.SK.S"), + }, + // Bucket name provisioned by the bedrock stack + BEDROCK_CLAUDE_CHAT_DOCUMENT_BUCKET_NAME: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: props.documentBucket.bucketName, + }, + // Source info e.g. file names, URLs, etc. + KNOWLEDGE: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: sfn.JsonPath.stringAt( + "States.JsonToString($.dynamodb.NewImage.Knowledge.M)" + ), + }, + // Bedrock Knowledge Base configuration + BEDROCK_KNOWLEDGE_BASE: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: sfn.JsonPath.stringAt( + "States.JsonToString($.dynamodb.NewImage.BedrockKnowledgeBase.M)" + ), + }, + }, + resultPath: "$.Build", + } + ); + + const updateSyncStatusRunning = this.createUpdateSyncStatusTask( + "UpdateSyncStatusRunning", + "RUNNING" + ); + + const updateSyncStatusSucceeded = this.createUpdateSyncStatusTask( + "UpdateSyncStatusSuccess", + "SUCCEEDED", + "Knowledge base sync succeeded" + ); + + const updateSyncStatusFailed = new tasks.LambdaInvoke( + this, + "UpdateSyncStatusFailed", + { + lambdaFunction: this._updateSyncStatusHandler, + payload: sfn.TaskInput.fromObject({ + "cause.$": "$.Cause", + }), + resultPath: sfn.JsonPath.DISCARD, + } + ); + + const fallback = updateSyncStatusFailed.next( + new sfn.Fail(this, "Fail", { + cause: "Knowledge base sync failed", + error: "Knowledge base sync failed", + }) + ); + startKnowledgeBaseBuild.addCatch(fallback); + + const fetchStackOutput = new tasks.LambdaInvoke(this, "FetchStackOutput", { + lambdaFunction: this._fetchStackOutputHandler, + payload: sfn.TaskInput.fromObject({ + "pk.$": "$.dynamodb.NewImage.PK.S", + "sk.$": "$.dynamodb.NewImage.SK.S", + }), + resultPath: "$.StackOutput", + }); + fetchStackOutput.addCatch(fallback); + + const storeKnowledgeBaseId = new tasks.LambdaInvoke( + this, + "StoreKnowledgeBaseId", + { + lambdaFunction: this._StoreKnowledgeBaseIdHandler, + payload: sfn.TaskInput.fromObject({ + "pk.$": "$.dynamodb.NewImage.PK.S", + "sk.$": "$.dynamodb.NewImage.SK.S", + "stack_output.$": "$.StackOutput.Payload", + }), + resultPath: sfn.JsonPath.DISCARD, + } + ); + storeKnowledgeBaseId.addCatch(fallback); + + const startIngestionJob = new tasks.CallAwsService( + this, + "StartIngestionJob", + { + service: "bedrockagent", + action: "startIngestionJob", + iamAction: "bedrock:StartIngestionJob", + parameters: { + DataSourceId: sfn.JsonPath.stringAt("$.DataSourceId"), + KnowledgeBaseId: sfn.JsonPath.stringAt("$.KnowledgeBaseId"), + }, + // Ref: https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonbedrock.html#amazonbedrock-knowledge-base + iamResources: [ + `arn:${Stack.of(this).partition}:bedrock:${Stack.of(this).region}:${ + Stack.of(this).account + }:knowledge-base/*`, + ], + resultPath: "$.IngestionJob", + } + ); + + const getIngestionJob = new tasks.CallAwsService(this, "GetIngestionJob", { + service: "bedrockagent", + action: "getIngestionJob", + iamAction: "bedrock:GetIngestionJob", + parameters: { + DataSourceId: sfn.JsonPath.stringAt( + "$.IngestionJob.IngestionJob.DataSourceId" + ), + KnowledgeBaseId: sfn.JsonPath.stringAt( + "$.IngestionJob.IngestionJob.KnowledgeBaseId" + ), + IngestionJobId: sfn.JsonPath.stringAt( + "$.IngestionJob.IngestionJob.IngestionJobId" + ), + }, + // Ref: https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonbedrock.html#amazonbedrock-knowledge-base + iamResources: [ + `arn:${Stack.of(this).partition}:bedrock:${Stack.of(this).region}:${ + Stack.of(this).account + }:knowledge-base/*`, + ], + resultPath: "$.IngestionJob", + }); + + const waitTask = new sfn.Wait(this, "WaitSeconds", { + time: sfn.WaitTime.duration(Duration.seconds(3)), + }); + + const checkIngestionJobStatus = new sfn.Choice( + this, + "CheckIngestionJobStatus" + ) + .when( + sfn.Condition.stringEquals( + "$.IngestionJob.IngestionJob.Status", + "COMPLETE" + ), + new sfn.Pass(this, "IngestionJobCompleted") + ) + .when( + sfn.Condition.stringEquals( + "$.IngestionJob.IngestionJob.Status", + "FAILED" + ), + new tasks.LambdaInvoke(this, "UpdateSyncStatusFailedForIngestion", { + lambdaFunction: this._updateSyncStatusHandler, + payload: sfn.TaskInput.fromObject({ + pk: sfn.JsonPath.stringAt("$.PK"), + sk: sfn.JsonPath.stringAt("$.SK"), + ingestion_job: sfn.JsonPath.stringAt("$.IngestionJob"), + }), + resultPath: sfn.JsonPath.DISCARD, + }).next( + new sfn.Fail(this, "IngestionFail", { + cause: "Ingestion job failed", + error: "Ingestion job failed", + }) + ) + ) + .otherwise(waitTask.next(getIngestionJob)); + + const mapIngestionJobs = new sfn.Map(this, "MapIngestionJobs", { + inputPath: "$.StackOutput.Payload", + resultPath: sfn.JsonPath.DISCARD, + maxConcurrency: 1, + }).itemProcessor( + startIngestionJob.next(getIngestionJob).next(checkIngestionJobStatus) + ); + + const definition = new sfn.Choice(this, "CheckKnowledgeBaseExists") + .when( + sfn.Condition.isPresent("$[0].dynamodb.NewImage.BedrockKnowledgeBase"), + extractFirstElement + .next(updateSyncStatusRunning) + .next(startKnowledgeBaseBuild) + .next(fetchStackOutput) + .next(storeKnowledgeBaseId) + .next(mapIngestionJobs) + .next(updateSyncStatusSucceeded) + ) + .otherwise(ecsTask); + + this._stateMachine = new sfn.StateMachine(this, "StateMachine", { + definitionBody: sfn.DefinitionBody.fromChainable(definition), + }); + return this; + } + + private setupEventBridgePipe(props: EmbeddingProps): this { + if (!this._stateMachine) { + throw new Error( + "State machine must be set up before setting up the EventBridge pipe" + ); + } + const pipeLogGroup = new logs.LogGroup(this, "PipeLogGroup", { removalPolicy: RemovalPolicy.DESTROY, retention: logs.RetentionDays.ONE_WEEK, }); - const pipeRole = new iam.Role(this, "PipeRole", { + this._pipeRole = new iam.Role(this, "PipeRole", { assumedBy: new iam.ServicePrincipal("pipes.amazonaws.com"), }); - pipeRole.addToPolicy( + this._pipeRole.addToPolicy( new iam.PolicyStatement({ actions: [ "dynamodb:DescribeStream", @@ -125,36 +539,28 @@ export class Embedding extends Construct { resources: [props.database.tableStreamArn!], }) ); - pipeRole.addToPolicy( + this._pipeRole.addToPolicy( new iam.PolicyStatement({ - actions: ["ecs:RunTask"], - resources: [ - taskDefinition.taskDefinitionArn, - `${taskDefinition.taskDefinitionArn}:*`, - ], + actions: ["states:StartExecution"], + resources: [this._stateMachine.stateMachineArn], }) ); - pipeRole.addToPolicy( + this._pipeRole.addToPolicy( new iam.PolicyStatement({ - actions: ["iam:PassRole"], - resources: ["*"], - conditions: { - StringLike: { - "iam:PassedToService": "ecs-tasks.amazonaws.com", - }, - }, + actions: ["logs:CreateLogStream", "logs:PutLogEvents"], + resources: [pipeLogGroup.logGroupArn], }) ); - const pipe = new CfnPipe(this, "Pipe", { + + new CfnPipe(this, "Pipe", { source: props.database.tableStreamArn!, sourceParameters: { dynamoDbStreamParameters: { batchSize: 1, startingPosition: "LATEST", - maximumRetryAttempts: 1, // Avoid infinite retry which causes stuck + maximumRetryAttempts: 1, }, filterCriteria: { - // Trigger when bot is created or updated filters: [ { pattern: @@ -163,35 +569,10 @@ export class Embedding extends Construct { ], }, }, - target: cluster.clusterArn, + target: this._stateMachine.stateMachineArn, targetParameters: { - ecsTaskParameters: { - enableEcsManagedTags: false, - enableExecuteCommand: false, - launchType: "FARGATE", - networkConfiguration: { - awsvpcConfiguration: { - assignPublicIp: "DISABLED", - subnets: props.vpc.selectSubnets({ - subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, - }).subnetIds, - securityGroups: [taskSg.securityGroupId], - }, - }, - taskCount: 1, - taskDefinitionArn: taskDefinition.taskDefinitionArn, - overrides: { - // Pass event as argument. - // Ref: https://repost.aws/questions/QU_WC7301mT8qR7ip_9cyjdQ/eventbridge-pipes-and-ecs-task - containerOverrides: [ - { - // Only pass keys and load the object from within the ECS task. - // https://github.com/aws-samples/bedrock-claude-chat/issues/190 - command: ["-u", "embedding/main.py", "$.dynamodb.Keys"], - name: taskDefinition.defaultContainer!.containerName, - }, - ], - }, + stepFunctionStateMachineParameters: { + invocationType: "FIRE_AND_FORGET", }, }, logConfiguration: { @@ -200,12 +581,13 @@ export class Embedding extends Construct { }, level: "INFO", }, - roleArn: pipeRole.roleArn, + roleArn: this._pipeRole.roleArn, }); - /** - * Removal handler - */ + return this; + } + + private setupRemovalHandler(props: EmbeddingProps): this { const removeHandlerRole = new iam.Role(this, "RemovalHandlerRole", { assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"), }); @@ -214,6 +596,13 @@ export class Embedding extends Construct { "service-role/AWSLambdaVPCAccessExecutionRole" ) ); + removeHandlerRole.addToPolicy( + // Assume the table access role for row-level access control. + new iam.PolicyStatement({ + actions: ["sts:AssumeRole"], + resources: [props.tableAccessRole.roleArn], + }) + ); removeHandlerRole.addToPolicy( new iam.PolicyStatement({ effect: iam.Effect.ALLOW, @@ -241,12 +630,13 @@ export class Embedding extends Construct { ); props.database.grantStreamRead(removeHandlerRole); props.documentBucket.grantReadWrite(removeHandlerRole); - const removalHandler = new DockerImageFunction(this, "BotRemovalHandler", { + + this._removalHandler = new DockerImageFunction(this, "BotRemovalHandler", { code: DockerImageCode.fromImageAsset( path.join(__dirname, "../../../backend"), { platform: Platform.LINUX_AMD64, - file: "websocket.Dockerfile", + file: "lambda.Dockerfile", cmd: ["app.bot_remove.handler"], } ), @@ -254,13 +644,17 @@ export class Embedding extends Construct { vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, timeout: Duration.minutes(1), environment: { + ACCOUNT: Stack.of(this).account, + REGION: Stack.of(this).region, + TABLE_NAME: props.database.tableName, + TABLE_ACCESS_ROLE_ARN: props.tableAccessRole.roleArn, DB_SECRETS_ARN: props.dbSecrets.secretArn, DOCUMENT_BUCKET: props.documentBucket.bucketName, }, role: removeHandlerRole, }); - props.dbSecrets.grantRead(removalHandler); - removalHandler.addEventSource( + props.dbSecrets.grantRead(this._removalHandler); + this._removalHandler.addEventSource( new DynamoEventSource(props.database, { startingPosition: lambda.StartingPosition.TRIM_HORIZON, batchSize: 1, @@ -273,25 +667,51 @@ export class Embedding extends Construct { }) ); - this.taskSecurityGroup = taskSg; - this.container = container; - this.removalHandler = removalHandler; + return this; + } + private outputValues(): void { new CfnOutput(this, "ClusterName", { - value: cluster.clusterName, + value: this._cluster.clusterName, }); new CfnOutput(this, "TaskDefinitionName", { value: cdk.Fn.select( 1, cdk.Fn.split( "/", - cdk.Fn.select(5, cdk.Fn.split(":", taskDefinition.taskDefinitionArn)) + cdk.Fn.select( + 5, + cdk.Fn.split(":", this._taskDefinition.taskDefinitionArn) + ) ) ), }); - new CfnOutput(this, "TaskSecurityGroupId", { - value: taskSg.securityGroupId, + value: this._taskSecurityGroup.securityGroupId, + }); + } + + private createUpdateSyncStatusTask( + id: string, + syncStatus: string, + syncStatusReason?: string, + lastExecIdPath?: string + ): tasks.LambdaInvoke { + const payload: { [key: string]: any } = { + "pk.$": "$.dynamodb.NewImage.PK.S", + "sk.$": "$.dynamodb.NewImage.SK.S", + sync_status: syncStatus, + sync_status_reason: syncStatusReason || "", + }; + + if (lastExecIdPath) { + payload["last_exec_id.$"] = lastExecIdPath; + } + + return new tasks.LambdaInvoke(this, id, { + lambdaFunction: this._updateSyncStatusHandler, + payload: sfn.TaskInput.fromObject(payload), + resultPath: sfn.JsonPath.DISCARD, }); } } diff --git a/cdk/lib/constructs/websocket.ts b/cdk/lib/constructs/websocket.ts index c76243a1d..ec4105071 100644 --- a/cdk/lib/constructs/websocket.ts +++ b/cdk/lib/constructs/websocket.ts @@ -91,7 +91,7 @@ export class WebSocket extends Construct { path.join(__dirname, "../../../backend"), { platform: Platform.LINUX_AMD64, - file: "websocket.Dockerfile", + file: "lambda.Dockerfile", } ), vpc: props.vpc, diff --git a/cdk/lib/utils/bedrock-knowledge-base-args.ts b/cdk/lib/utils/bedrock-knowledge-base-args.ts new file mode 100644 index 000000000..456d91b68 --- /dev/null +++ b/cdk/lib/utils/bedrock-knowledge-base-args.ts @@ -0,0 +1,124 @@ +import { + BedrockFoundationModel, + ChunkingStrategy, +} from "@cdklabs/generative-ai-cdk-constructs/lib/cdk-lib/bedrock"; +import { Analyzer } from "@cdklabs/generative-ai-cdk-constructs/lib/cdk-lib/opensearch-vectorindex"; +import { + CharacterFilterType, + TokenFilterType, + TokenizerType, +} from "@cdklabs/generative-ai-cdk-constructs/lib/cdk-lib/opensearchserverless"; + +export const getEmbeddingModel = ( + embeddingsModel: string +): BedrockFoundationModel => { + switch (embeddingsModel) { + case "titan_v1": + return BedrockFoundationModel.TITAN_EMBED_TEXT_V1; + case "cohere_multilingual_v3": + return BedrockFoundationModel.COHERE_EMBED_MULTILINGUAL_V3; + default: + throw new Error(`Unknown embeddings model: ${embeddingsModel}`); + } +}; + +export const getChunkingStrategy = ( + chunkingStrategy: string +): ChunkingStrategy => { + switch (chunkingStrategy) { + case "default": + return ChunkingStrategy.DEFAULT; + case "fixed_size": + return ChunkingStrategy.FIXED_SIZE; + case "none": + return ChunkingStrategy.NONE; + default: + throw new Error(`Unknown chunking strategy: ${chunkingStrategy}`); + } +}; + +export const getAnalyzer = (analyzer: any): Analyzer | undefined => { + // Example of analyzer: + // { + // "character_filters": { + // "L": [ + // { + // "S": "icu_normalizer" + // } + // ] + // }, + // "token_filters": { + // "L": [ + // { + // "S": "kuromoji_baseform" + // }, + // { + // "S": "kuromoji_part_of_speech" + // } + // ] + // }, + // "tokenizer": { + // "S": "kuromoji_tokenizer" + // } + // } + console.log("getAnalyzer: analyzer: ", analyzer); + if ( + !analyzer || + !analyzer.character_filters || + !analyzer.character_filters.L + ) { + return undefined; + } + + const characterFilters: CharacterFilterType[] = + analyzer.character_filters.L.map((filter: any) => { + switch (filter.S) { + case "icu_normalizer": + return CharacterFilterType.ICU_NORMALIZER; + default: + throw new Error(`Unknown character filter: ${filter.S}`); + } + }); + + const tokenizer: TokenizerType = (() => { + if (!analyzer.tokenizer || !analyzer.tokenizer.S) { + throw new Error(`Tokenizer is not defined`); + } + switch (analyzer.tokenizer.S) { + case "kuromoji_tokenizer": + return TokenizerType.KUROMOJI_TOKENIZER; + case "icu_tokenizer": + return TokenizerType.ICU_TOKENIZER; + default: + throw new Error(`Unknown tokenizer: ${analyzer.tokenizer.S}`); + } + })(); + + const tokenFilters: TokenFilterType[] = + analyzer.token_filters?.L.map((filter: any) => { + switch (filter.S) { + case "kuromoji_baseform": + return TokenFilterType.KUROMOJI_BASEFORM; + case "kuromoji_part_of_speech": + return TokenFilterType.KUROMOJI_PART_OF_SPEECH; + case "kuromoji_stemmer": + return TokenFilterType.KUROMOJI_STEMMER; + case "cjk_width": + return TokenFilterType.CJK_WIDTH; + case "ja_stop": + return TokenFilterType.JA_STOP; + case "lowercase": + return TokenFilterType.LOWERCASE; + case "icu_folding": + return TokenFilterType.ICU_FOLDING; + default: + throw new Error(`Unknown token filter: ${filter.S}`); + } + }) || []; + + return { + characterFilters, + tokenizer, + tokenFilters, + }; +}; diff --git a/cdk/package-lock.json b/cdk/package-lock.json index 746b54ba3..43e7d5114 100644 --- a/cdk/package-lock.json +++ b/cdk/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@aws-cdk/aws-glue-alpha": "^2.147.3-alpha.0", "@aws-cdk/aws-lambda-python-alpha": "^2.147.3-alpha.0", + "@cdklabs/generative-ai-cdk-constructs": "^0.1.201", "aws-cdk-lib": "^2.147.3", "cdk-aws-lambda-powertools-layer": "^3.7.0", "constructs": "^10.0.0", @@ -727,6 +728,33 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@cdklabs/generative-ai-cdk-constructs": { + "version": "0.1.201", + "resolved": "https://registry.npmjs.org/@cdklabs/generative-ai-cdk-constructs/-/generative-ai-cdk-constructs-0.1.201.tgz", + "integrity": "sha512-/T4i778UpRnviNGC5G0Aki/3wjnNdo8MbHRCqODtiwi+ezil3haPTHEYkn79w5td37IWvqEQ2eLjk0851cF9rw==", + "bundleDependencies": [ + "deepmerge" + ], + "dependencies": { + "cdk-nag": "^2.28.145", + "deepmerge": "^4.3.1" + }, + "engines": { + "node": ">= 18.12.0 <= 20.x" + }, + "peerDependencies": { + "aws-cdk-lib": "^2.143.0", + "constructs": "^10.3.0" + } + }, + "node_modules/@cdklabs/generative-ai-cdk-constructs/node_modules/deepmerge": { + "version": "4.3.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -1944,11 +1972,9 @@ } }, "node_modules/cdk-nag": { - "version": "2.28.115", - "resolved": "https://registry.npmjs.org/cdk-nag/-/cdk-nag-2.28.115.tgz", - "integrity": "sha512-aaOVHaVmcT6kVA3cOzZi44NZUUBPXco8xjgmxZH9qH+H+lmX52AesC6InM7k1UlrtPZ9TW8sU9oIHFxd7r2BqA==", - "dev": true, - "peer": true, + "version": "2.28.157", + "resolved": "https://registry.npmjs.org/cdk-nag/-/cdk-nag-2.28.157.tgz", + "integrity": "sha512-5nwOEq5bXMl1Hfe4ig1JNtECVM2jt6ISO8kZq5eq6YflLp2YLrhkAoDWSdyEDDo0l30uDLGSl9sxxkdR39l5gQ==", "peerDependencies": { "aws-cdk-lib": "^2.116.0", "constructs": "^10.0.5" @@ -2055,9 +2081,9 @@ "dev": true }, "node_modules/constructs": { - "version": "10.2.69", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.69.tgz", - "integrity": "sha512-0AiM/uQe5Uk6JVe/62oolmSN2MjbFQkOlYrM3fFGZLKuT+g7xlAI10EebFhyCcZwI2JAcWuWCmmCAyCothxjuw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", + "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", "engines": { "node": ">= 16.14.0" } @@ -2115,7 +2141,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3723,6 +3748,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } diff --git a/cdk/package.json b/cdk/package.json index 0ec9939f6..24af57e09 100644 --- a/cdk/package.json +++ b/cdk/package.json @@ -24,6 +24,7 @@ "dependencies": { "@aws-cdk/aws-glue-alpha": "^2.147.3-alpha.0", "@aws-cdk/aws-lambda-python-alpha": "^2.147.3-alpha.0", + "@cdklabs/generative-ai-cdk-constructs": "^0.1.201", "aws-cdk-lib": "^2.147.3", "cdk-aws-lambda-powertools-layer": "^3.7.0", "constructs": "^10.0.0", diff --git a/cdk/test/cdk.test.ts b/cdk/test/cdk.test.ts index 527aa4757..a48be657f 100644 --- a/cdk/test/cdk.test.ts +++ b/cdk/test/cdk.test.ts @@ -2,8 +2,15 @@ import * as cdk from "aws-cdk-lib"; import { BedrockChatStack } from "../lib/bedrock-chat-stack"; import { Template } from "aws-cdk-lib/assertions"; import { AwsPrototypingChecks } from "@aws-prototyping-sdk/pdk-nag"; +import { + getEmbeddingModel, + getChunkingStrategy, + getAnalyzer, +} from "../lib/utils/bedrock-knowledge-base-args"; +import { BedrockKnowledgeBaseStack } from "../lib/bedrock-knowledge-base-stack"; +import { Analyzer } from "@cdklabs/generative-ai-cdk-constructs/lib/cdk-lib/opensearch-vectorindex"; -describe("Fine-grained Assertions Test", () => { +describe("Bedrock Chat Stack Test", () => { test("Identity Provider Generation", () => { const app = new cdk.App(); @@ -233,3 +240,270 @@ describe("Scheduler Test", () => { template.resourceCountIs("AWS::Events::Rule", 1); }); }); + +describe("Bedrock Knowledge Base Stack", () => { + const setupStack = (params: any = {}) => { + const app = new cdk.App(); + // Security check + cdk.Aspects.of(app).add(new AwsPrototypingChecks()); + + const PK: string = "test-user-id"; + const SK: string = "test-user-id#BOT#test-bot-id"; + const KNOWLEDGE = { + sitemap_urls: { + L: [], + }, + filenames: { + L: [ + { + S: "test-filename.pdf", + }, + ], + }, + source_urls: { + L: [ + { + S: "https://example.com", + }, + ], + }, + s3_urls: params.s3Urls !== undefined ? params.s3Urls : { L: [] }, + }; + + const BEDROCK_KNOWLEDGE_BASE = { + chunking_strategy: { + S: "fixed_size", + }, + max_tokens: + params.maxTokens !== undefined + ? { N: String(params.maxTokens) } + : undefined, + instruction: + params.instruction !== undefined + ? { S: params.instruction } + : undefined, + overlap_percentage: + params.overlapPercentage !== undefined + ? { N: String(params.overlapPercentage) } + : undefined, + open_search: { + M: { + analyzer: + params.analyzer !== undefined + ? JSON.parse(params.analyzer) + : { + character_filters: { + L: [ + { + S: "icu_normalizer", + }, + ], + }, + token_filters: { + L: [ + { + S: "kuromoji_baseform", + }, + { + S: "kuromoji_part_of_speech", + }, + ], + }, + tokenizer: { + S: "kuromoji_tokenizer", + }, + }, + }, + }, + embeddings_model: { + S: "titan_v1", + }, + }; + + const BEDROCK_CLAUDE_CHAT_DOCUMENT_BUCKET_NAME = + "test-document-bucket-name"; + + const ownerUserId: string = PK; + const botId: string = SK.split("#")[2]; + const knowledgeBase = BEDROCK_KNOWLEDGE_BASE; + const knowledge = KNOWLEDGE; + const existingS3Urls: string[] = knowledge.s3_urls.L.map( + (s3Url: any) => s3Url.S + ); + + const embeddingsModel = getEmbeddingModel(knowledgeBase.embeddings_model.S); + const chunkingStrategy = getChunkingStrategy( + knowledgeBase.chunking_strategy.S + ); + const maxTokens: number | undefined = knowledgeBase.max_tokens + ? Number(knowledgeBase.max_tokens.N) + : undefined; + const instruction: string | undefined = knowledgeBase.instruction + ? knowledgeBase.instruction.S + : undefined; + const analyzer = knowledgeBase.open_search.M.analyzer + ? getAnalyzer(knowledgeBase.open_search.M.analyzer) + : undefined; + const overlapPercentage: number | undefined = + knowledgeBase.overlap_percentage + ? Number(knowledgeBase.overlap_percentage.N) + : undefined; + + const stack = new BedrockKnowledgeBaseStack( + app, + "BedrockKnowledgeBaseStack", + { + ownerUserId, + botId, + embeddingsModel, + bedrockClaudeChatDocumentBucketName: + BEDROCK_CLAUDE_CHAT_DOCUMENT_BUCKET_NAME, + chunkingStrategy, + existingS3Urls, + maxTokens, + instruction, + analyzer, + overlapPercentage, + } + ); + + return Template.fromStack(stack); + }; + + test("default kb stack", () => { + const template = setupStack({ + s3Urls: { + L: [ + { + S: "s3://test-bucket/test-key", + }, + ], + }, + maxTokens: 500, + instruction: "This is an example instruction.", + overlapPercentage: 10, + analyzer: `{ + "character_filters": { + "L": [ + { + "S": "icu_normalizer" + } + ] + }, + "token_filters": { + "L": [ + { + "S": "kuromoji_baseform" + }, + { + "S": "kuromoji_part_of_speech" + } + ] + }, + "tokenizer": { + "S": "kuromoji_tokenizer" + } + }`, + }); + expect(template).toBeDefined(); + }); + + test("kb stack without maxTokens", () => { + const template = setupStack({ + instruction: "This is an example instruction.", + overlapPercentage: 10, + analyzer: `{ + "character_filters": { + "L": [ + { + "S": "icu_normalizer" + } + ] + }, + "token_filters": { + "L": [ + { + "S": "kuromoji_baseform" + }, + { + "S": "kuromoji_part_of_speech" + } + ] + }, + "tokenizer": { + "S": "kuromoji_tokenizer" + } + }`, + }); + expect(template).toBeDefined(); + }); + + test("kb stack without instruction", () => { + const template = setupStack({ + maxTokens: 500, + overlapPercentage: 10, + analyzer: `{ + "character_filters": { + "L": [ + { + "S": "icu_normalizer" + } + ] + }, + "token_filters": { + "L": [ + { + "S": "kuromoji_baseform" + }, + { + "S": "kuromoji_part_of_speech" + } + ] + }, + "tokenizer": { + "S": "kuromoji_tokenizer" + } + }`, + }); + expect(template).toBeDefined(); + }); + + test("kb stack without analyzer", () => { + const template = setupStack({ + maxTokens: 500, + instruction: "This is an example instruction.", + overlapPercentage: 10, + }); + expect(template).toBeDefined(); + }); + + test("kb stack without overlapPercentage", () => { + const template = setupStack({ + maxTokens: 500, + instruction: "This is an example instruction.", + analyzer: `{ + "character_filters": { + "L": [ + { + "S": "icu_normalizer" + } + ] + }, + "token_filters": { + "L": [ + { + "S": "kuromoji_baseform" + }, + { + "S": "kuromoji_part_of_speech" + } + ] + }, + "tokenizer": { + "S": "kuromoji_tokenizer" + } + }`, + }); + expect(template).toBeDefined(); + }); +}); diff --git a/frontend/src/@types/bot.d.ts b/frontend/src/@types/bot.d.ts index 2d9ae0c21..c771b3828 100644 --- a/frontend/src/@types/bot.d.ts +++ b/frontend/src/@types/bot.d.ts @@ -17,6 +17,7 @@ export type BotKnowledge = { // Sitemap cannot be used yet. sitemapUrls: string[]; filenames: string[]; + s3Urls: string[]; }; export type ConversationQuickStarter = { @@ -37,6 +38,7 @@ export type BotKnowledgeDiff = { addedFilenames: string[]; deletedFilenames: string[]; unchangedFilenames: string[]; + s3Urls: string[]; }; export type BotSyncStatus = 'QUEUED' | 'RUNNING' | 'SUCCEEDED' | 'FAILED'; diff --git a/frontend/src/pages/BotEditPage.tsx b/frontend/src/pages/BotEditPage.tsx index 0b20f91ef..447ca0660 100644 --- a/frontend/src/pages/BotEditPage.tsx +++ b/frontend/src/pages/BotEditPage.tsx @@ -478,6 +478,7 @@ const BotEditPage: React.FC = () => { sourceUrls: urls.filter((s) => s !== ''), // Sitemap cannot be used yet. sitemapUrls: [], + s3Urls: [], filenames: files.map((f) => f.filename), }, displayRetrievedChunks, @@ -544,6 +545,7 @@ const BotEditPage: React.FC = () => { sourceUrls: urls.filter((s) => s !== ''), // Sitemap cannot be used yet. sitemapUrls: [], + s3Urls: [], addedFilenames, deletedFilenames, unchangedFilenames,