├── .gitignore ├── examples ├── motherduck │ ├── samconfig.toml │ ├── pyproject.toml │ ├── app.py │ ├── Dockerfile │ ├── template.yaml │ └── poetry.lock ├── snowflake │ ├── samconfig.toml │ ├── pyproject.toml │ ├── Dockerfile │ ├── app.py │ └── template.yaml ├── sqs-athena │ ├── samconfig.toml │ ├── pyproject.toml │ ├── Dockerfile │ ├── app.py │ └── template.yaml └── sqs-snowflake │ ├── samconfig.toml │ ├── pyproject.toml │ ├── Dockerfile │ ├── app.py │ └── template.yaml ├── .vscode └── settings.json └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .aws-sam 2 | .mypy_cache 3 | .DS_Store 4 | __pycache__ 5 | credentials.json 6 | .ruff_cache 7 | -------------------------------------------------------------------------------- /examples/motherduck/samconfig.toml: -------------------------------------------------------------------------------- 1 | version = 0.1 2 | 3 | [default] 4 | [default.global] 5 | [default.global.parameters] 6 | stack_name = "dlt-motherduck-test" 7 | 8 | [default.build.parameters] 9 | cached = true 10 | parallel = true 11 | 12 | [default.deploy.parameters] 13 | capabilities = "CAPABILITY_IAM" 14 | confirm_changeset = false 15 | resolve_s3 = true 16 | resolve_image_repos = true 17 | 18 | -------------------------------------------------------------------------------- /examples/snowflake/samconfig.toml: -------------------------------------------------------------------------------- 1 | version = 0.1 2 | 3 | [default] 4 | [default.global] 5 | [default.global.parameters] 6 | stack_name = "dlt-snowflake-test" 7 | 8 | [default.build.parameters] 9 | cached = true 10 | parallel = true 11 | 12 | [default.deploy.parameters] 13 | capabilities = "CAPABILITY_IAM" 14 | confirm_changeset = false 15 | resolve_s3 = true 16 | resolve_image_repos = true 17 | 18 | -------------------------------------------------------------------------------- /examples/sqs-athena/samconfig.toml: -------------------------------------------------------------------------------- 1 | version = 0.1 2 | 3 | [default] 4 | [default.global] 5 | [default.global.parameters] 6 | stack_name = "dlt-sqs-athena-test" 7 | 8 | [default.build.parameters] 9 | cached = true 10 | parallel = true 11 | 12 | [default.deploy.parameters] 13 | capabilities = "CAPABILITY_IAM" 14 | confirm_changeset = false 15 | resolve_s3 = true 16 | resolve_image_repos = true 17 | 18 | -------------------------------------------------------------------------------- /examples/sqs-snowflake/samconfig.toml: -------------------------------------------------------------------------------- 1 | version = 0.1 2 | 3 | [default] 4 | [default.global] 5 | [default.global.parameters] 6 | stack_name = "dlt-sqs-snowflake-test" 7 | 8 | [default.build.parameters] 9 | cached = true 10 | parallel = true 11 | 12 | [default.deploy.parameters] 13 | capabilities = "CAPABILITY_IAM" 14 | confirm_changeset = false 15 | resolve_s3 = true 16 | resolve_image_repos = true 17 | 18 | -------------------------------------------------------------------------------- /examples/motherduck/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "dlt-aws-lambda-motherduck" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["codingcyclist "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = ">=3.12,<3.13" 10 | dlt = {version = "=1.3.0", extras = ["motherduck"]} 11 | aws-lambda-powertools = "^2.42.0" 12 | boto3 = "^1.34.152" 13 | 14 | 15 | [tool.poetry.group.dev.dependencies] 16 | ruff = "^0.11.0" 17 | 18 | [build-system] 19 | requires = ["poetry-core"] 20 | build-backend = "poetry.core.masonry.api" 21 | -------------------------------------------------------------------------------- /examples/sqs-athena/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "dlt-aws-sqs-lambda-athena" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["codingcyclist "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = ">=3.12,<3.13" 10 | dlt = {version = "=1.3.0", extras = ["athena"]} 11 | aws-lambda-powertools = "^2.42.0" 12 | boto3 = "^1.34.152" 13 | aws-xray-sdk = "^2.14.0" 14 | 15 | 16 | [tool.poetry.group.dev.dependencies] 17 | ruff = "^0.11.0" 18 | 19 | [build-system] 20 | requires = ["poetry-core"] 21 | build-backend = "poetry.core.masonry.api" 22 | -------------------------------------------------------------------------------- /examples/snowflake/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "dlt-aws-lambda-snowflake" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["codingcyclist "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = ">=3.12,<3.13" 10 | dlt = {version = "=1.3.0", extras = ["snowflake", "s3"]} 11 | aws-lambda-powertools = "^2.42.0" 12 | boto3 = "^1.34.152" 13 | aws-xray-sdk = "^2.14.0" 14 | 15 | 16 | [tool.poetry.group.dev.dependencies] 17 | ruff = "^0.11.0" 18 | 19 | [build-system] 20 | requires = ["poetry-core"] 21 | build-backend = "poetry.core.masonry.api" 22 | -------------------------------------------------------------------------------- /examples/sqs-snowflake/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "dlt-aws-sqs-lambda-athena" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["codingcyclist "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = ">=3.12,<3.13" 10 | dlt = {version = "=1.3.0", extras = ["s3", "snowflake"]} 11 | aws-lambda-powertools = "^2.42.0" 12 | boto3 = "^1.34.152" 13 | aws-xray-sdk = "^2.14.0" 14 | 15 | 16 | [tool.poetry.group.dev.dependencies] 17 | ruff = "^0.11.0" 18 | 19 | [build-system] 20 | requires = ["poetry-core"] 21 | build-backend = "poetry.core.masonry.api" 22 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.fontSize": 12, 3 | // Custom tags for the parser to use 4 | "yaml.customTags": [ 5 | "!And", 6 | "!If", 7 | "!Not", 8 | "!Equals", 9 | "!Or", 10 | "!FindInMap sequence", 11 | "!Base64", 12 | "!Cidr", 13 | "!Ref", 14 | "!Sub", 15 | "!GetAtt", 16 | "!GetAZs", 17 | "!ImportValue", 18 | "!Select", 19 | "!Select sequence", 20 | "!Split", 21 | "!Join sequence" 22 | ], 23 | // Enable/disable default YAML formatter (requires restart) 24 | "yaml.format.enable": true 25 | } 26 | -------------------------------------------------------------------------------- /examples/motherduck/app.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import typing as t 4 | 5 | import dlt 6 | from aws_lambda_powertools.utilities import parameters 7 | from aws_lambda_powertools.utilities.data_classes import ( 8 | APIGatewayProxyEventV2, 9 | event_source, 10 | ) 11 | from aws_lambda_powertools.utilities.typing import LambdaContext 12 | from botocore.config import Config 13 | from dlt.destinations.impl.motherduck.factory import motherduck 14 | 15 | ASM_PROVIDER = parameters.SecretsProvider( 16 | Config( 17 | region_name=os.environ[ 18 | "AWS_REGION" # a default environment variable on AWS Lambda 19 | ] 20 | ) 21 | ) 22 | 23 | 24 | @event_source(data_class=APIGatewayProxyEventV2) 25 | def lambda_handler( 26 | event: APIGatewayProxyEventV2, context: LambdaContext 27 | ) -> t.Dict[str, t.Any]: 28 | if not event.body: 29 | return {"statusCode": 204, "body": "No content", "isBase64Encoded": False} 30 | 31 | p = dlt.pipeline( 32 | pipeline_name="lambda", 33 | dataset_name="lambda", 34 | destination=motherduck( 35 | credentials=ASM_PROVIDER.get("DLT_MOTHERDUCK_CREDENTIALS", transform="json") 36 | ), 37 | progress="log", 38 | ) 39 | data = [json.loads(event.body)] 40 | _ = p.run(data, table_name="raw") 41 | 42 | return {"statusCode": 200, "body": "Success", "isBase64Encoded": False} 43 | -------------------------------------------------------------------------------- /examples/snowflake/Dockerfile: -------------------------------------------------------------------------------- 1 | # see https://dev.l1x.be/posts/2023/02/28/using-python-3.11-with-aws-lambda/ 2 | FROM python:3.12.7-slim-bullseye AS builder 3 | 4 | RUN apt-get update && \ 5 | apt-get install -y --no-install-recommends \ 6 | g++ \ 7 | make \ 8 | cmake \ 9 | unzip \ 10 | libcurl4-openssl-dev && \ 11 | apt-get clean && \ 12 | rm -rf /var/lib/apt/lists/* 13 | 14 | ENV LAMBDA_TASK_ROOT=/var/task 15 | RUN mkdir -p ${LAMBDA_TASK_ROOT} 16 | WORKDIR ${LAMBDA_TASK_ROOT} 17 | 18 | RUN python -m venv .venv 19 | ENV PATH=${LAMBDA_TASK_ROOT}/.venv/bin:$PATH 20 | RUN which pip && \ 21 | pip install pip --upgrade && \ 22 | pip install --no-cache-dir -U awslambdaric setuptools poetry==1.8.2 23 | 24 | # Copy & install requirements.txt 25 | COPY pyproject.toml ${LAMBDA_TASK_ROOT} 26 | COPY poetry.lock ${LAMBDA_TASK_ROOT} 27 | 28 | RUN cd ${LAMBDA_TASK_ROOT} && \ 29 | poetry export -o requirements.txt --without-hashes && \ 30 | pip install --no-cache-dir -r requirements.txt 31 | 32 | FROM python:3.12.7-slim-bullseye AS runner 33 | 34 | ENV LAMBDA_TASK_ROOT=/var/task 35 | 36 | RUN mkdir -p ${LAMBDA_TASK_ROOT} 37 | WORKDIR ${LAMBDA_TASK_ROOT} 38 | COPY --from=builder ${LAMBDA_TASK_ROOT} ${LAMBDA_TASK_ROOT} 39 | 40 | ENV PATH=${LAMBDA_TASK_ROOT}/.venv/bin:$PATH 41 | 42 | # Copy function code 43 | COPY app.py ${LAMBDA_TASK_ROOT}/app.py 44 | 45 | ENTRYPOINT [ "python", "-m", "awslambdaric" ] 46 | CMD [ "app.lambda_handler" ] 47 | -------------------------------------------------------------------------------- /examples/motherduck/Dockerfile: -------------------------------------------------------------------------------- 1 | # see https://dev.l1x.be/posts/2023/02/28/using-python-3.11-with-aws-lambda/ 2 | FROM python:3.12.7-slim-bullseye AS builder 3 | 4 | RUN apt-get update && \ 5 | apt-get install -y --no-install-recommends \ 6 | g++ \ 7 | make \ 8 | cmake \ 9 | unzip \ 10 | libcurl4-openssl-dev && \ 11 | apt-get clean && \ 12 | rm -rf /var/lib/apt/lists/* 13 | 14 | ENV LAMBDA_TASK_ROOT=/var/task 15 | RUN mkdir -p ${LAMBDA_TASK_ROOT} 16 | WORKDIR ${LAMBDA_TASK_ROOT} 17 | 18 | RUN python -m venv .venv 19 | ENV PATH=${LAMBDA_TASK_ROOT}/.venv/bin:$PATH 20 | RUN which pip && \ 21 | pip install pip --upgrade && \ 22 | pip install --no-cache-dir -U awslambdaric setuptools poetry==1.8.2 23 | 24 | # Copy & install requirements.txt 25 | COPY pyproject.toml ${LAMBDA_TASK_ROOT} 26 | COPY poetry.lock ${LAMBDA_TASK_ROOT} 27 | 28 | RUN cd ${LAMBDA_TASK_ROOT} && \ 29 | poetry export -o requirements.txt --without-hashes && \ 30 | pip install --no-cache-dir -r requirements.txt 31 | 32 | FROM python:3.12.7-slim-bullseye AS runner 33 | 34 | ENV LAMBDA_TASK_ROOT=/var/task 35 | 36 | RUN mkdir -p ${LAMBDA_TASK_ROOT} 37 | WORKDIR ${LAMBDA_TASK_ROOT} 38 | COPY --from=builder ${LAMBDA_TASK_ROOT} ${LAMBDA_TASK_ROOT} 39 | 40 | ENV PATH=${LAMBDA_TASK_ROOT}/.venv/bin:$PATH 41 | 42 | # Copy function code 43 | COPY app.py ${LAMBDA_TASK_ROOT}/app.py 44 | 45 | ENTRYPOINT [ "python", "-m", "awslambdaric" ] 46 | CMD [ "app.lambda_handler" ] 47 | -------------------------------------------------------------------------------- /examples/sqs-athena/Dockerfile: -------------------------------------------------------------------------------- 1 | # see https://dev.l1x.be/posts/2023/02/28/using-python-3.11-with-aws-lambda/ 2 | FROM python:3.12.7-slim-bullseye AS builder 3 | 4 | RUN apt-get update && \ 5 | apt-get install -y --no-install-recommends \ 6 | g++ \ 7 | make \ 8 | cmake \ 9 | unzip \ 10 | libcurl4-openssl-dev && \ 11 | apt-get clean && \ 12 | rm -rf /var/lib/apt/lists/* 13 | 14 | ENV LAMBDA_TASK_ROOT=/var/task 15 | RUN mkdir -p ${LAMBDA_TASK_ROOT} 16 | WORKDIR ${LAMBDA_TASK_ROOT} 17 | 18 | RUN python -m venv .venv 19 | ENV PATH=${LAMBDA_TASK_ROOT}/.venv/bin:$PATH 20 | RUN which pip && \ 21 | pip install pip --upgrade && \ 22 | pip install --no-cache-dir -U awslambdaric setuptools poetry==1.8.2 23 | 24 | # Copy & install requirements.txt 25 | COPY pyproject.toml ${LAMBDA_TASK_ROOT} 26 | COPY poetry.lock ${LAMBDA_TASK_ROOT} 27 | 28 | RUN cd ${LAMBDA_TASK_ROOT} && \ 29 | poetry export -o requirements.txt --without-hashes && \ 30 | pip install --no-cache-dir -r requirements.txt 31 | 32 | FROM python:3.12.7-slim-bullseye AS runner 33 | 34 | ENV LAMBDA_TASK_ROOT=/var/task 35 | 36 | RUN mkdir -p ${LAMBDA_TASK_ROOT} 37 | WORKDIR ${LAMBDA_TASK_ROOT} 38 | COPY --from=builder ${LAMBDA_TASK_ROOT} ${LAMBDA_TASK_ROOT} 39 | 40 | ENV PATH=${LAMBDA_TASK_ROOT}/.venv/bin:$PATH 41 | 42 | # Copy function code 43 | COPY app.py ${LAMBDA_TASK_ROOT}/app.py 44 | 45 | ENTRYPOINT [ "python", "-m", "awslambdaric" ] 46 | CMD [ "app.lambda_handler" ] 47 | -------------------------------------------------------------------------------- /examples/sqs-snowflake/Dockerfile: -------------------------------------------------------------------------------- 1 | # see https://dev.l1x.be/posts/2023/02/28/using-python-3.11-with-aws-lambda/ 2 | FROM python:3.12.7-slim-bullseye AS builder 3 | 4 | RUN apt-get update && \ 5 | apt-get install -y --no-install-recommends \ 6 | g++ \ 7 | make \ 8 | cmake \ 9 | unzip \ 10 | libcurl4-openssl-dev && \ 11 | apt-get clean && \ 12 | rm -rf /var/lib/apt/lists/* 13 | 14 | ENV LAMBDA_TASK_ROOT=/var/task 15 | RUN mkdir -p ${LAMBDA_TASK_ROOT} 16 | WORKDIR ${LAMBDA_TASK_ROOT} 17 | 18 | RUN python -m venv .venv 19 | ENV PATH=${LAMBDA_TASK_ROOT}/.venv/bin:$PATH 20 | RUN which pip && \ 21 | pip install pip --upgrade && \ 22 | pip install --no-cache-dir -U awslambdaric setuptools poetry==1.8.2 23 | 24 | # Copy & install requirements.txt 25 | COPY pyproject.toml ${LAMBDA_TASK_ROOT} 26 | COPY poetry.lock ${LAMBDA_TASK_ROOT} 27 | 28 | RUN cd ${LAMBDA_TASK_ROOT} && \ 29 | poetry export -o requirements.txt --without-hashes && \ 30 | pip install --no-cache-dir -r requirements.txt 31 | 32 | FROM python:3.12.7-slim-bullseye AS runner 33 | 34 | ENV LAMBDA_TASK_ROOT=/var/task 35 | 36 | RUN mkdir -p ${LAMBDA_TASK_ROOT} 37 | WORKDIR ${LAMBDA_TASK_ROOT} 38 | COPY --from=builder ${LAMBDA_TASK_ROOT} ${LAMBDA_TASK_ROOT} 39 | 40 | ENV PATH=${LAMBDA_TASK_ROOT}/.venv/bin:$PATH 41 | 42 | # Copy function code 43 | COPY app.py ${LAMBDA_TASK_ROOT}/app.py 44 | 45 | ENTRYPOINT [ "python", "-m", "awslambdaric" ] 46 | CMD [ "app.lambda_handler" ] 47 | -------------------------------------------------------------------------------- /examples/snowflake/app.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import typing as t 4 | 5 | import dlt 6 | from aws_lambda_powertools.logging import Logger 7 | from aws_lambda_powertools.tracing import Tracer 8 | from aws_lambda_powertools.utilities import parameters 9 | from aws_lambda_powertools.utilities.data_classes import ( 10 | APIGatewayProxyEventV2, 11 | event_source, 12 | ) 13 | from aws_lambda_powertools.utilities.typing import LambdaContext 14 | from botocore.config import Config 15 | from dlt.destinations.impl.snowflake.factory import snowflake 16 | 17 | ASM_PROVIDER = parameters.SecretsProvider( 18 | Config( 19 | region_name=os.environ[ 20 | "AWS_REGION" # a default environment variable on AWS Lambda 21 | ] 22 | ) 23 | ) 24 | 25 | logger = Logger() 26 | tracer = Tracer() 27 | 28 | 29 | @logger.inject_lambda_context(clear_state=True) 30 | @tracer.capture_lambda_handler 31 | @event_source(data_class=APIGatewayProxyEventV2) 32 | def lambda_handler( 33 | event: APIGatewayProxyEventV2, context: LambdaContext 34 | ) -> t.Dict[str, t.Any]: 35 | if not event.body: 36 | return {"statusCode": 204, "body": "No content", "isBase64Encoded": False} 37 | 38 | p = dlt.pipeline( 39 | pipeline_name="lambda", 40 | dataset_name="lambda", 41 | destination=snowflake( 42 | credentials=ASM_PROVIDER.get("DLT_SNOWFLAKE_CREDENTIALS", transform="json"), 43 | query_tag='{{"source":"{source}", "resource":"{resource}", "table": "{table}", "load_id":"{load_id}", "pipeline_name":"{pipeline_name}"}}', 44 | ), 45 | progress="log", 46 | ) 47 | data = [json.loads(event.body)] 48 | _ = p.run(data, table_name="raw") 49 | 50 | return {"statusCode": 200, "body": "Success", "isBase64Encoded": False} 51 | -------------------------------------------------------------------------------- /examples/motherduck/template.yaml: -------------------------------------------------------------------------------- 1 | AWSTemplateFormatVersion: "2010-09-09" 2 | Transform: AWS::Serverless-2016-10-31 3 | 4 | Resources: 5 | ApiGateway: 6 | Type: AWS::Serverless::Api 7 | Properties: 8 | Name: Dlt Motherduck Test Loader REST API 9 | StageName: v1 10 | Tags: 11 | stackName: !Ref AWS::StackName 12 | 13 | DltFunction: 14 | Type: AWS::Serverless::Function 15 | Metadata: 16 | DockerContext: . 17 | Dockerfile: Dockerfile 18 | DockerTag: latest 19 | DockerBuildTarget: runner 20 | Properties: 21 | PackageType: Image 22 | FunctionName: dlt-motherduck-test-loader 23 | Timeout: 30 # default is 3 seconds, which is usually too little 24 | MemorySize: 512 # default is 128mb, which is too little 25 | Events: 26 | CollectApi: 27 | Type: Api 28 | Properties: 29 | RestApiId: !Ref ApiGateway 30 | Path: /collect 31 | Method: POST 32 | Environment: 33 | Variables: 34 | DLT_PROJECT_DIR: "/tmp" # the only writeable directory on a lambda 35 | DLT_DATA_DIR: "/tmp" # the only writeable directory on a lambda 36 | DLT_PIPELINE_DIR: "/tmp" # the only writeable directory on a lambda 37 | Tags: 38 | stackName: !Ref AWS::StackName 39 | 40 | DltFunctionLogs: 41 | Type: "AWS::Logs::LogGroup" 42 | Properties: 43 | LogGroupName: !Sub "/aws/lambda/${DltFunction}" 44 | RetentionInDays: 30 45 | Tags: 46 | - Key: stackName 47 | Value: !Ref AWS::StackName 48 | 49 | Outputs: 50 | ApiGateway: 51 | Description: !Sub "API Gateway endpoint URL for dlt-motherduck-test-loader Lambda function" 52 | Value: !Sub "https://${ApiGateway}.execute-api.${AWS::Region}.amazonaws.com/v1/collect/" 53 | -------------------------------------------------------------------------------- /examples/snowflake/template.yaml: -------------------------------------------------------------------------------- 1 | AWSTemplateFormatVersion: "2010-09-09" 2 | Transform: AWS::Serverless-2016-10-31 3 | 4 | Resources: 5 | ApiGateway: 6 | Type: AWS::Serverless::Api 7 | Properties: 8 | Name: Dlt Snowflake Test Loader REST API 9 | StageName: v1 10 | Tags: 11 | stackName: !Ref AWS::StackName 12 | 13 | DltFunction: 14 | Type: AWS::Serverless::Function 15 | Metadata: 16 | DockerContext: . 17 | Dockerfile: Dockerfile 18 | DockerTag: latest 19 | DockerBuildTarget: runner 20 | Properties: 21 | PackageType: Image 22 | FunctionName: dlt-snowflake-test-loader 23 | Timeout: 30 # default is 3 seconds, which is usually too little 24 | MemorySize: 512 # default is 128mb, which is too little 25 | Events: 26 | CollectApi: 27 | Type: Api 28 | Properties: 29 | RestApiId: !Ref ApiGateway 30 | Path: /collect 31 | Method: POST 32 | Environment: 33 | Variables: 34 | DLT_PROJECT_DIR: "/tmp" # the only writeable directory on a lambda 35 | DLT_DATA_DIR: "/tmp" # the only writeable directory on a lambda 36 | DLT_PIPELINE_DIR: "/tmp" # the only writeable directory on a lambda 37 | Policies: 38 | - Statement: 39 | - Sid: AllowDLTSecretAccess 40 | Effect: Allow 41 | Action: 42 | - secretsmanager:GetSecretValue 43 | Resource: !Sub arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:DLT_* 44 | Tags: 45 | stackName: !Ref AWS::StackName 46 | 47 | DltFunctionLogs: 48 | Type: "AWS::Logs::LogGroup" 49 | Properties: 50 | LogGroupName: !Sub "/aws/lambda/${DltFunction}" 51 | RetentionInDays: 30 52 | Tags: 53 | - Key: stackName 54 | Value: !Ref AWS::StackName 55 | 56 | Outputs: 57 | ApiGateway: 58 | Description: !Sub "API Gateway endpoint URL for dlt-snowflake-test-loader Lambda function" 59 | Value: !Sub "https://${ApiGateway}.execute-api.${AWS::Region}.amazonaws.com/v1/collect/" 60 | -------------------------------------------------------------------------------- /examples/sqs-snowflake/app.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import typing as t 4 | 5 | import dlt 6 | from aws_lambda_powertools.logging import Logger 7 | from aws_lambda_powertools.tracing import Tracer 8 | from aws_lambda_powertools.utilities import parameters 9 | from aws_lambda_powertools.utilities.data_classes import ( 10 | SQSEvent, 11 | event_source, 12 | ) 13 | from aws_lambda_powertools.utilities.typing import LambdaContext 14 | from botocore.config import Config 15 | from dlt.destinations.impl.snowflake.factory import snowflake 16 | 17 | ASM_PROVIDER = parameters.SecretsProvider( 18 | Config( 19 | region_name=os.environ[ 20 | "AWS_REGION" # a default environment variable on AWS Lambda 21 | ] 22 | ) 23 | ) 24 | logger = Logger() 25 | tracer = Tracer() 26 | 27 | 28 | @logger.inject_lambda_context(clear_state=True) 29 | @tracer.capture_lambda_handler 30 | @event_source(data_class=SQSEvent) 31 | def lambda_handler(event: SQSEvent, context: LambdaContext) -> t.Dict[str, t.Any]: 32 | if not event.records: 33 | logger.info("No content") 34 | return {"statusCode": 204, "body": "No content", "isBase64Encoded": False} 35 | 36 | logger.info("Processing records...") 37 | dlt.config["destination.filesystem.bucket_url"] = os.environ["DESTINATION_BUCKET"] 38 | 39 | p = dlt.pipeline( 40 | pipeline_name="lambda", 41 | dataset_name="dlt-sqs-snowflake-example", 42 | # staging="filesystem", # don't use staging for snowflake as it would require an extra stage to be created in Snowflake 43 | destination=snowflake( 44 | credentials=ASM_PROVIDER.get("DLT_SNOWFLAKE_CREDENTIALS", transform="json"), 45 | query_tag='{{"source":"{source}", "resource":"{resource}", "table": "{table}", "load_id":"{load_id}", "pipeline_name":"{pipeline_name}"}}', 46 | stage="dlt_sqs_snowflake_example", 47 | ), 48 | progress="log", 49 | ) 50 | 51 | @dlt.resource(table_name="raw", write_disposition="append") 52 | def resource(): 53 | count = 0 54 | for record in event.records: 55 | data = json.loads(record.body) 56 | yield data 57 | count += 1 58 | logger.info(f"Processed {count} records.") 59 | 60 | _ = p.run(resource()) 61 | 62 | return {"statusCode": 200, "body": "Success", "isBase64Encoded": False} 63 | -------------------------------------------------------------------------------- /examples/sqs-athena/app.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import typing as t 4 | 5 | import dlt 6 | from aws_lambda_powertools.logging import Logger 7 | from aws_lambda_powertools.tracing import Tracer 8 | from aws_lambda_powertools.utilities.data_classes import ( 9 | SQSEvent, 10 | event_source, 11 | ) 12 | from aws_lambda_powertools.utilities.typing import LambdaContext 13 | from dlt.common.configuration.specs.aws_credentials import AwsCredentials 14 | from dlt.destinations.impl.athena.factory import athena 15 | 16 | logger = Logger() 17 | tracer = Tracer() 18 | 19 | 20 | @logger.inject_lambda_context(clear_state=True) 21 | @tracer.capture_lambda_handler 22 | @event_source(data_class=SQSEvent) 23 | def lambda_handler(event: SQSEvent, context: LambdaContext) -> t.Dict[str, t.Any]: 24 | if not event.records: 25 | logger.info("No content") 26 | return {"statusCode": 204, "body": "No content", "isBase64Encoded": False} 27 | 28 | logger.info("Processing records...") 29 | dlt.config["destination.filesystem.bucket_url"] = os.environ["DESTINATION_BUCKET"] 30 | 31 | p = dlt.pipeline( 32 | pipeline_name="lambda", 33 | dataset_name="dlt-athena-example", 34 | staging="filesystem", # required for athena destination 35 | destination=athena( 36 | query_result_bucket=os.environ["DESTINATION_BUCKET"], 37 | athena_work_group="dlt", 38 | credentials=AwsCredentials( 39 | # picked-up automatically from the environment variables on AWS Lambda 40 | aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"], 41 | aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"], 42 | aws_session_token=os.environ["AWS_SESSION_TOKEN"], 43 | region_name=os.environ["AWS_REGION"], 44 | ), 45 | aws_data_catalog="aws_data_catalog", 46 | truncate_tables_on_staging_destination_before_load=False, # prevents truncation of shared staging files, see https://dlthub.com/docs/dlt-ecosystem/staging#how-to-prevent-staging-files-truncation 47 | ), 48 | progress="log", 49 | ) 50 | 51 | @dlt.resource(table_name="raw", write_disposition="append") 52 | def resource(): 53 | count = 0 54 | for record in event.records: 55 | data = json.loads(record.body) 56 | yield data 57 | count += 1 58 | logger.info(f"Processed {count} records.") 59 | 60 | _ = p.run(resource()) 61 | 62 | return {"statusCode": 200, "body": "Success", "isBase64Encoded": False} 63 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Running DLT on AWS Lambda 2 | 3 | AWS Lambda is a pay-as-you-go compute service that lets you run code without provisioning or managing servers. Moreover, Lambda functions are particularly good at handling traffic volatility through built-in horizontal scaling. 4 | 5 | [DLT](https://dlthub.com/docs/getting-started) fits neatly into the paradigm of AWS Lambda as it’s a lightweight python library that runs on any infrastructure. All it takes to build a powerful and scalable event ingestion engine is to add a simple REST API and a few lines of DLT script. Without breaking a sweat, you can leverage all the mighty abstractions of DLT (normalization, schema migration, provisioning of staging destinations) to create well-structured, live datasets out of arbitrary JSON objects. 6 | 7 | ## Secrets 8 | 9 | DLT usually recommends providing database secrets either via TOML files or via environment variables ([docs](https://dlthub.com/docs/general-usage/credentials/configuration)). However, given that AWS Lambda does not support masking files or environment variables as secrets, both methods could easily leak confidential values. The recommended way for injecting confidential values into an AWS Lambda function is via AWS Secretsmanager (ASM). ASM secrets are simple key-value pairs, so you just need to create one ASM secret for all your destination credentials. 10 | 11 | ```shell 12 | # create secret (Snowflake example) 13 | # see: https://dlthub.com/docs/dlt-ecosystem/destinations/snowflake#authentication-types 14 | aws secretsmanager create-secret \ 15 | --name DLT_SNOWFLAKE_CREDENTIALS \ 16 | --secret-string '{"database":"","username":"","warehouse":"","role":"","host":"","private_key":"","private_key_passphrase":""}' 17 | 18 | # or if you want to read the credentials from a local json file 19 | aws secretsmanager create-secret \ 20 | --name DLT_SNOWFLAKE_CREDENTIALS \ 21 | --secret-string "$(cat credentials.json)" 22 | 23 | # create secret (Motherduck example) 24 | aws secretsmanager create-secret \ 25 | --name DLT_MOTHERDUCK_CREDENTIALS \ 26 | --secret-string '{"database":"","password":""}' 27 | 28 | # delete secret 29 | aws secretsmanager delete-secret \ 30 | --secret-id arn:aws:secretsmanager:::secret: \ 31 | --force-delete-without-recovery 32 | ``` 33 | 34 | ## Getting started 35 | 36 | All examples inside the `/examples` folder use AWS SAM to deploy DLT inside an AWS Lambda function. SAM is a lightweight Infrastructure-As-Code framework provided by AWS. Using SAM, you simply declare serverless resources like Lambda functions, API Gateways, etc. in a `.yml` file and deploy them to your AWS account with a lightweight CLI. Here's how to get started: 37 | 38 | ### Snowflake & Motherduck Examples 39 | 40 | These are two simple examples of how to use DLT with AWS Lambda to load events sent to an API Gateway endpoint one-by-one into a data warehouse (Snowflake or Motherduck). See the SQS-Athena example for a more scalable approach with a buffer queue between the API Gateway and the Lambda function. 41 | 42 | 1. Install the SAM CLI 43 | ```bash 44 | pip install aws-sam-cli 45 | ``` 46 | 2. Build a deployment package 47 | ``` 48 | sam build 49 | ``` 50 | 3. Test your setup locally 51 | 52 | ```bash 53 | sam local start-api 54 | 55 | > * Running on http://127.0.0.1:3000 56 | 57 | # in a second terminal window 58 | curl -X POST http://127.0.0.1:3000/collect -d '{"hello":"world"}' 59 | 60 | > -------------------------------- Extract lambda -------------------------------- 61 | > Resources: 1/1 (100.0%) | Time: 0.01s | Rate: 119.69/s 62 | > raw: 1 | Time: 0.01s | Rate: 133.59/s 63 | > 64 | > -------------------- Normalize lambda in 1701539812.689153 --------------------- 65 | > Files: 1/1 (100.0%) | Time: 0.37s | Rate: 2.74/s 66 | > Items: 1 | Time: 0.37s | Rate: 2.74/s 67 | > 68 | > ----------------------- Load lambda in 1701539812.689153 ----------------------- 69 | > Jobs: 0/1 (0.0%) | Time: 0.00s | Rate: 0.00/s 70 | > 71 | > ----------------------- Load lambda in 1701539812.689153 ----------------------- 72 | > Jobs: 1/1 (100.0%) | Time: 0.06s | Rate: 16.22/s 73 | > 74 | > ----------------------- Load lambda in 1701539812.689153 ----------------------- 75 | > 76 | > END RequestId: 535b9277-de0a-43a9-b65f-def690c3975d 77 | > REPORT RequestId: 535b9277-de0a-43a9-b65f-def690c3975d Init Duration: 1.62 ms Duration: 17855.55 ms Billed Duration: 17856 ms Memory Size: 512 MB Max Memory Used: 512 MB 78 | > No Content-Type given. Defaulting to 'application/json'. 79 | ``` 80 | 81 | 4. Deploy your resources to AWS 82 | 83 | ``` 84 | sam deploy 85 | 86 | > ------------------------------------------------------------------------------------------------ 87 | > Outputs 88 | > ------------------------------------------------------------------------------------------------ 89 | > Key ApiGateway 90 | > Description API Gateway endpoint URL for dlt-snowflake-test-loader Lambda function 91 | > Value https://ykvypgnm7g.execute-api.eu-central-1.amazonaws.com/v1/collect/ 92 | > ------------------------------------------------------------------------------------------------ 93 | ``` 94 | 95 | 5. Invoke your deployed Lambda function 96 | 97 | ``` 98 | curl -X POST https://ykvypgnm7g.execute-api.eu-central-1.amazonaws.com/v1/collect -d '{"hello":"world"}' 99 | ``` 100 | 101 | ### SQS-Athena and SQS-Snowflake Examples 102 | 103 | These examples are more sophisticated on how to use DLT with AWS Lambda to load larger volumes of events sent to an API Gateway endpoint into a data lake (AWS Athena/Snowflake). What makes this example more scalable is that it uses a buffer queue to decouple the API Gateway from the Lambda function and load events in batches. The SQS-Athena example also leverages AWS Athena + AWS Glue to de-couple storage from compute, which is an additional leaver to reduce costs. 104 | 105 | > Given the SQS queue, these examples cannot be tested locally. 106 | 107 | 1. Install the SAM CLI 108 | ```bash 109 | pip install aws-sam-cli 110 | ``` 111 | 2. Build a deployment package 112 | 113 | ``` 114 | sam build 115 | ``` 116 | 117 | 3. Deploy your resources to AWS 118 | 119 | ``` 120 | sam deploy 121 | > ------------------------------------------------------------------------------------------------ 122 | > Outputs 123 | > ------------------------------------------------------------------------------------------------ 124 | > Key ApiGateway 125 | > Description Http API endpoint for dlt-sqs-athena-test-loader Lambda function 126 | > Value https://pepl550twj.execute-api.eu-central-1.amazonaws.com/collect 127 | > ------------------------------------------------------------------------------------------------ 128 | ``` 129 | 130 | 4. Invoke your deployed Lambda function 131 | ``` 132 | curl -X POST https://pepl550twj.execute-api.eu-central-1.amazonaws.com/collect -d '{"id":"world"}' 133 | ``` 134 | -------------------------------------------------------------------------------- /examples/sqs-snowflake/template.yaml: -------------------------------------------------------------------------------- 1 | AWSTemplateFormatVersion: "2010-09-09" 2 | Transform: AWS::Serverless-2016-10-31 3 | 4 | Parameters: 5 | DestinationBucket: 6 | Type: String 7 | Default: "dlt-sqs-snowflake-test-bucket" 8 | 9 | Resources: 10 | HttpApi: 11 | Type: AWS::Serverless::HttpApi 12 | Properties: 13 | AccessLogSettings: 14 | DestinationArn: !GetAtt ApiGatewayAccessLogs.Arn 15 | Format: '{ "requestId":"$context.requestId", "ip": "$context.identity.sourceIp", 16 | "requestTime":"$context.requestTime", "httpMethod":"$context.httpMethod","routeKey":"$context.routeKey", 17 | "status":"$context.status","protocol":"$context.protocol", "responseLength":"$context.responseLength" 18 | }' 19 | DefinitionBody: 20 | openapi: "3.0.1" 21 | info: 22 | title: "Dlt SQS Snowflake Test Loader HTTP API" 23 | version: "2023-06-25 17:32:29UTC" 24 | paths: 25 | /collect: 26 | post: 27 | responses: 28 | default: 29 | description: "Response for POST /" 30 | x-amazon-apigateway-integration: 31 | type: "aws_proxy" 32 | integrationSubtype: "SQS-SendMessage" 33 | credentials: !GetAtt ApiGatewayRole.Arn 34 | connectionType: "INTERNET" 35 | payloadFormatVersion: "1.0" 36 | requestParameters: 37 | MessageBody: "$request.body" 38 | QueueUrl: 39 | Ref: BufferQueue 40 | 41 | x-amazon-apigateway-cors: 42 | allowMethods: 43 | - "*" 44 | maxAge: 0 45 | allowCredentials: false 46 | allowOrigins: 47 | - "*" 48 | x-amazon-apigateway-importexport-version: "1.0" 49 | Tags: 50 | stackName: !Ref AWS::StackName 51 | taktile:environment: !Sub analytics-${AWS::StackName} 52 | 53 | ApiGatewayAccessLogs: 54 | Type: AWS::Logs::LogGroup 55 | Properties: 56 | LogGroupName: dlt-sqs-snowflake-api-gateway-access-logs 57 | RetentionInDays: 1 58 | Tags: 59 | - Key: stackName 60 | Value: !Ref AWS::StackName 61 | - Key: taktile:environment 62 | Value: !Sub analytics-${AWS::StackName} 63 | 64 | ApiGatewayRole: 65 | Type: "AWS::IAM::Role" 66 | Properties: 67 | AssumeRolePolicyDocument: 68 | Version: "2012-10-17" 69 | Statement: 70 | - Effect: Allow 71 | Principal: 72 | Service: 73 | - apigateway.amazonaws.com 74 | Action: 75 | - "sts:AssumeRole" 76 | Policies: 77 | - PolicyName: dlt-sqs-snowflake-api-gateway-policy 78 | PolicyDocument: 79 | Version: "2012-10-17" 80 | Statement: 81 | - Effect: Allow 82 | Action: 83 | - "sqs:SendMessage" 84 | - "sqs:GetQueueUrl" 85 | - "sqs:SendMessageBatch" 86 | Resource: !GetAtt BufferQueue.Arn 87 | - Effect: Allow 88 | Action: 89 | - "logs:CreateLogGroup" 90 | - "logs:CreateLogStream" 91 | - "logs:DescribeLogGroups" 92 | - "logs:DescribeLogStreams" 93 | - "logs:PutLogEvents" 94 | - "logs:GetLogEvents" 95 | - "logs:FilterLogEvents" 96 | Resource: !GetAtt ApiGatewayAccessLogs.Arn 97 | Tags: 98 | - Key: stackName 99 | Value: !Ref AWS::StackName 100 | - Key: taktile:environment 101 | Value: !Sub analytics-${AWS::StackName} 102 | 103 | BufferQueue: 104 | Type: AWS::SQS::Queue 105 | Properties: 106 | QueueName: dlt-sqs-snowflake-buffer-queue 107 | SqsManagedSseEnabled: true 108 | VisibilityTimeout: 60 # has to be at least as long as the lambda timeout 109 | DltDataStorageBucket: 110 | Type: AWS::S3::Bucket 111 | Properties: 112 | BucketName: !Ref DestinationBucket 113 | Tags: 114 | - Key: stackName 115 | Value: !Ref AWS::StackName 116 | - Key: taktile:environment 117 | Value: !Sub analytics-${AWS::StackName} 118 | 119 | DltFunction: 120 | Type: AWS::Serverless::Function 121 | Metadata: 122 | DockerContext: . 123 | Dockerfile: Dockerfile 124 | DockerTag: latest 125 | DockerBuildTarget: runner 126 | Properties: 127 | FunctionName: dlt-sqs-snowflake-test-loader 128 | PackageType: Image 129 | Timeout: 60 # default is 3 seconds, which is usually too little 130 | MemorySize: 512 # default is 128mb, which is too little 131 | Events: 132 | SQSEvent: 133 | Type: SQS 134 | Properties: 135 | Queue: !GetAtt BufferQueue.Arn 136 | BatchSize: 10000 # default is 10 max is 10000. Batch size is bound by 6mb 137 | MaximumBatchingWindowInSeconds: 60 # seconds 138 | ScalingConfig: 139 | MaximumConcurrency: 2 # minimum is 2, max is 1000 140 | Environment: 141 | Variables: 142 | DLT_PROJECT_DIR: "/tmp" # the only writeable directory on a lambda 143 | DLT_DATA_DIR: "/tmp" # the only writeable directory on a lambda 144 | DLT_PIPELINE_DIR: "/tmp" # the only writeable directory on a lambda 145 | DESTINATION_BUCKET: !Sub s3://${DestinationBucket} 146 | Policies: 147 | - Statement: 148 | - Sid: AllowDLTSecretAccess 149 | Effect: Allow 150 | Action: 151 | - secretsmanager:GetSecretValue 152 | Resource: !Sub arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:DLT_* 153 | - Sid: AllowSQSAccess 154 | Effect: Allow 155 | Action: 156 | - "sqs:ReceiveMessage" 157 | - "sqs:DeleteMessage" 158 | - "sqs:GetQueueAttributes" 159 | Resource: !GetAtt BufferQueue.Arn 160 | - Sid: DestinationBucketFullAccess 161 | Effect: Allow 162 | Action: 163 | - "s3:*" 164 | Resource: 165 | - !GetAtt DltDataStorageBucket.Arn 166 | - !Sub ${DltDataStorageBucket.Arn}/* 167 | - Sid: AllowAthenaAccess 168 | Effect: Allow 169 | Action: 170 | - "athena:StartQueryExecution" 171 | - "athena:GetQueryExecution" 172 | - "athena:GetQueryResults" 173 | Resource: "*" 174 | - Sid: AllowGlueCatalogAccess 175 | Effect: Allow 176 | Action: 177 | - "glue:CreateDatabase" 178 | - "glue:GetDatabase" 179 | - "glue:GetDatabases" 180 | - "glue:CreateTable" 181 | - "glue:GetTables" 182 | - "glue:GetTable" 183 | - "glue:UpdateTable" 184 | - "glue:GetPartitions" 185 | Resource: 186 | - !Sub arn:aws:glue:${AWS::Region}:${AWS::AccountId}:catalog 187 | - !Sub arn:aws:glue:${AWS::Region}:${AWS::AccountId}:table/*/* 188 | - !Sub arn:aws:glue:${AWS::Region}:${AWS::AccountId}:database/* 189 | Tags: 190 | stackName: !Ref AWS::StackName 191 | taktile:environment: !Sub analytics-${AWS::StackName} 192 | 193 | DltFunctionLogs: 194 | Type: "AWS::Logs::LogGroup" 195 | Properties: 196 | LogGroupName: !Sub "/aws/lambda/${DltFunction}" 197 | RetentionInDays: 30 198 | Tags: 199 | - Key: stackName 200 | Value: !Ref AWS::StackName 201 | - Key: taktile:environment 202 | Value: !Sub analytics-${AWS::StackName} 203 | 204 | MonitoringDashboard: 205 | Type: AWS::CloudWatch::Dashboard 206 | Properties: 207 | DashboardName: DltSQSSnowflakeMonitoringDashboard 208 | DashboardBody: !Sub | 209 | { 210 | "widgets": [ 211 | { 212 | "height": 2, 213 | "width": 6, 214 | "y": 0, 215 | "x": 0, 216 | "type": "text", 217 | "properties": { 218 | "markdown": "# API Gateway" 219 | } 220 | }, 221 | { 222 | "height": 6, 223 | "width": 6, 224 | "y": 2, 225 | "x": 0, 226 | "type": "metric", 227 | "properties": { 228 | "title": "Load", 229 | "metrics": [ 230 | [ 231 | "AWS/ApiGateway", 232 | "Count", 233 | "ApiId", 234 | "${HttpApi}", 235 | { 236 | "stat": "Sum", 237 | "period": 60, 238 | "region": "eu-central-1" 239 | } 240 | ] 241 | ], 242 | "view": "timeSeries", 243 | "stacked": false, 244 | "region": "eu-central-1", 245 | "period": 300, 246 | "yAxis": { 247 | "left": { 248 | "showUnits": false, 249 | "label": "Requests/min", 250 | "min": 0 251 | } 252 | } 253 | } 254 | }, 255 | { 256 | "height": 6, 257 | "width": 6, 258 | "y": 14, 259 | "x": 0, 260 | "type": "metric", 261 | "properties": { 262 | "title": "Errors / Minute", 263 | "metrics": [ 264 | [ 265 | "AWS/ApiGateway", 266 | "4xx", 267 | "ApiId", 268 | "${HttpApi}", 269 | { 270 | "stat": "Sum", 271 | "period": 60 272 | } 273 | ], 274 | [ 275 | ".", 276 | "5xx", 277 | ".", 278 | ".", 279 | { 280 | "stat": "Sum", 281 | "period": 60 282 | } 283 | ] 284 | ], 285 | "view": "timeSeries", 286 | "stacked": true, 287 | "region": "eu-central-1", 288 | "yAxis": { 289 | "left": { 290 | "min": 0 291 | } 292 | } 293 | } 294 | }, 295 | { 296 | "height": 6, 297 | "width": 6, 298 | "y": 8, 299 | "x": 0, 300 | "type": "metric", 301 | "properties": { 302 | "title": "Latency", 303 | "metrics": [ 304 | [ 305 | "AWS/ApiGateway", 306 | "IntegrationLatency", 307 | "ApiId", 308 | "${HttpApi}", 309 | { 310 | "stat": "Average", 311 | "period": 60 312 | } 313 | ], 314 | [ 315 | ".", 316 | "Latency", 317 | ".", 318 | ".", 319 | { 320 | "stat": "Average", 321 | "period": 60 322 | } 323 | ] 324 | ], 325 | "view": "timeSeries", 326 | "stacked": false, 327 | "region": "eu-central-1", 328 | "yAxis": { 329 | "left": { 330 | "min": 0 331 | } 332 | } 333 | } 334 | }, 335 | { 336 | "height": 2, 337 | "width": 6, 338 | "y": 0, 339 | "x": 6, 340 | "type": "text", 341 | "properties": { 342 | "markdown": "# SQS Buffer Queue" 343 | } 344 | }, 345 | { 346 | "height": 6, 347 | "width": 6, 348 | "y": 2, 349 | "x": 6, 350 | "type": "metric", 351 | "properties": { 352 | "title": "Buffer Throughput", 353 | "metrics": [ 354 | [ 355 | "AWS/SQS", 356 | "NumberOfMessagesSent", 357 | "QueueName", 358 | "${BufferQueue.QueueName}", 359 | { 360 | "stat": "Sum", 361 | "period": 60, 362 | "region": "eu-central-1" 363 | } 364 | ], 365 | [ 366 | ".", 367 | "NumberOfMessagesReceived", 368 | ".", 369 | ".", 370 | { 371 | "stat": "Sum", 372 | "period": 60, 373 | "region": "eu-central-1" 374 | } 375 | ] 376 | ], 377 | "view": "timeSeries", 378 | "stacked": true, 379 | "region": "eu-central-1", 380 | "period": 300, 381 | "yAxis": { 382 | "left": { 383 | "label": "Reqests/min", 384 | "showUnits": false, 385 | "min": 0 386 | } 387 | } 388 | } 389 | }, 390 | { 391 | "height": 6, 392 | "width": 6, 393 | "y": 8, 394 | "x": 6, 395 | "type": "metric", 396 | "properties": { 397 | "metrics": [ 398 | [ 399 | { 400 | "expression": "METRICS()/60", 401 | "label": "ApproximateAgeOfOldestMessage", 402 | "id": "e1", 403 | "region": "eu-central-1" 404 | } 405 | ], 406 | [ 407 | "AWS/SQS", 408 | "ApproximateAgeOfOldestMessage", 409 | "QueueName", 410 | "${BufferQueue.QueueName}", 411 | { 412 | "stat": "Maximum", 413 | "period": 60, 414 | "region": "eu-central-1", 415 | "id": "m1", 416 | "visible": false 417 | } 418 | ] 419 | ], 420 | "title": "Buffer Delay", 421 | "view": "timeSeries", 422 | "stacked": false, 423 | "region": "eu-central-1", 424 | "period": 300, 425 | "stat": "Average", 426 | "yAxis": { 427 | "left": { 428 | "showUnits": false, 429 | "label": "min", 430 | "min": 0 431 | } 432 | } 433 | } 434 | }, 435 | { 436 | "height": 6, 437 | "width": 6, 438 | "y": 14, 439 | "x": 6, 440 | "type": "metric", 441 | "properties": { 442 | "title": "Payload Size", 443 | "metrics": [ 444 | [ 445 | "AWS/SQS", 446 | "SentMessageSize", 447 | "QueueName", 448 | "${BufferQueue.QueueName}", 449 | { 450 | "stat": "Average", 451 | "period": 60 452 | } 453 | ] 454 | ], 455 | "view": "timeSeries", 456 | "stacked": false, 457 | "region": "eu-central-1", 458 | "yAxis": { 459 | "left": { 460 | "min": 0 461 | } 462 | } 463 | } 464 | }, 465 | { 466 | "height": 2, 467 | "width": 6, 468 | "y": 0, 469 | "x": 12, 470 | "type": "text", 471 | "properties": { 472 | "markdown": "# Lambda Function" 473 | } 474 | }, 475 | { 476 | "height": 6, 477 | "width": 6, 478 | "y": 2, 479 | "x": 12, 480 | "type": "metric", 481 | "properties": { 482 | "title": "Invocations", 483 | "metrics": [ 484 | [ 485 | "AWS/Lambda", 486 | "Invocations", 487 | "FunctionName", 488 | "${DltFunction}", 489 | { 490 | "stat": "Sum", 491 | "period": 60 492 | } 493 | ], 494 | [ 495 | ".", 496 | "Errors", 497 | ".", 498 | ".", 499 | { 500 | "stat": "Sum", 501 | "period": 60 502 | } 503 | ] 504 | ], 505 | "view": "timeSeries", 506 | "stacked": true, 507 | "region": "eu-central-1", 508 | "yAxis": { 509 | "left": { 510 | "min": 0 511 | } 512 | } 513 | } 514 | }, 515 | { 516 | "height": 6, 517 | "width": 6, 518 | "y": 8, 519 | "x": 12, 520 | "type": "metric", 521 | "properties": { 522 | "title": "Concurrency", 523 | "metrics": [ 524 | [ 525 | "AWS/Lambda", 526 | "ConcurrentExecutions", 527 | "FunctionName", 528 | "${DltFunction}", 529 | { 530 | "stat": "Maximum", 531 | "period": 60 532 | } 533 | ] 534 | ], 535 | "view": "timeSeries", 536 | "stacked": false, 537 | "region": "eu-central-1", 538 | "yAxis": { 539 | "left": { 540 | "min": 0 541 | } 542 | } 543 | } 544 | }, 545 | { 546 | "height": 6, 547 | "width": 6, 548 | "y": 14, 549 | "x": 12, 550 | "type": "metric", 551 | "properties": { 552 | "title": "Latency", 553 | "metrics": [ 554 | [ 555 | "AWS/Lambda", 556 | "Duration", 557 | "FunctionName", 558 | "${DltFunction}", 559 | { 560 | "stat": "Average", 561 | "period": 60 562 | } 563 | ] 564 | ], 565 | "view": "timeSeries", 566 | "stacked": false, 567 | "region": "eu-central-1", 568 | "yAxis": { 569 | "left": { 570 | "min": 0 571 | } 572 | } 573 | } 574 | }, 575 | { 576 | "type": "log", 577 | "x": 0, 578 | "y": 22, 579 | "width": 18, 580 | "height": 6, 581 | "properties": { 582 | "query": "SOURCE '/aws/lambda/dlt-sqs-snowflake-test-loader' | fields @timestamp, @message, @logStream, @log\n| sort @timestamp desc\n| limit 10000", 583 | "region": "eu-central-1", 584 | "stacked": false, 585 | "view": "table" 586 | } 587 | }, 588 | { 589 | "height": 2, 590 | "width": 18, 591 | "y": 20, 592 | "x": 0, 593 | "type": "text", 594 | "properties": { 595 | "markdown": "# Lambda Logs" 596 | } 597 | } 598 | ] 599 | } 600 | 601 | Outputs: 602 | HttpApiEndpoint: 603 | Description: "Http API endpoint for dlt-sqs-snowflake-test-loader Lambda function" 604 | Value: !Sub "https://${HttpApi}.execute-api.${AWS::Region}.amazonaws.com/collect" 605 | 606 | -------------------------------------------------------------------------------- /examples/sqs-athena/template.yaml: -------------------------------------------------------------------------------- 1 | AWSTemplateFormatVersion: "2010-09-09" 2 | Transform: AWS::Serverless-2016-10-31 3 | 4 | Parameters: 5 | DestinationBucket: 6 | Type: String 7 | Default: "dlt-sqs-athena-test-bucket" 8 | 9 | Resources: 10 | HttpApi: 11 | Type: AWS::Serverless::HttpApi 12 | Properties: 13 | AccessLogSettings: 14 | DestinationArn: !GetAtt ApiGatewayAccessLogs.Arn 15 | Format: '{ "requestId":"$context.requestId", "ip": "$context.identity.sourceIp", 16 | "requestTime":"$context.requestTime", "httpMethod":"$context.httpMethod","routeKey":"$context.routeKey", 17 | "status":"$context.status","protocol":"$context.protocol", "responseLength":"$context.responseLength" 18 | }' 19 | DefinitionBody: 20 | openapi: "3.0.1" 21 | info: 22 | title: "Dlt SQS Athena Test Loader HTTP API" 23 | version: "2023-06-25 17:32:29UTC" 24 | paths: 25 | /collect: 26 | post: 27 | responses: 28 | default: 29 | description: "Response for POST /collect" 30 | x-amazon-apigateway-integration: 31 | type: "aws_proxy" 32 | integrationSubtype: "SQS-SendMessage" 33 | credentials: !GetAtt ApiGatewayRole.Arn 34 | connectionType: "INTERNET" 35 | payloadFormatVersion: "1.0" 36 | requestParameters: 37 | MessageBody: "$request.body" 38 | QueueUrl: 39 | Ref: BufferQueue 40 | 41 | x-amazon-apigateway-cors: 42 | allowMethods: 43 | - "*" 44 | maxAge: 0 45 | allowCredentials: false 46 | allowOrigins: 47 | - "*" 48 | x-amazon-apigateway-importexport-version: "1.0" 49 | Tags: 50 | stackName: !Ref AWS::StackName 51 | taktile:environment: !Sub analytics-${AWS::StackName} 52 | 53 | ApiGatewayAccessLogs: 54 | Type: AWS::Logs::LogGroup 55 | Properties: 56 | LogGroupName: dlt-sqs-athena-api-gateway-access-logs 57 | RetentionInDays: 1 58 | Tags: 59 | - Key: stackName 60 | Value: !Ref AWS::StackName 61 | - Key: taktile:environment 62 | Value: !Sub analytics-${AWS::StackName} 63 | 64 | ApiGatewayRole: 65 | Type: "AWS::IAM::Role" 66 | Properties: 67 | AssumeRolePolicyDocument: 68 | Version: "2012-10-17" 69 | Statement: 70 | - Effect: Allow 71 | Principal: 72 | Service: 73 | - apigateway.amazonaws.com 74 | Action: 75 | - "sts:AssumeRole" 76 | Policies: 77 | - PolicyName: dlt-sqs-athena-api-gateway-policy 78 | PolicyDocument: 79 | Version: "2012-10-17" 80 | Statement: 81 | - Effect: Allow 82 | Action: 83 | - "sqs:SendMessage" 84 | - "sqs:GetQueueUrl" 85 | - "sqs:SendMessageBatch" 86 | Resource: !GetAtt BufferQueue.Arn 87 | - Effect: Allow 88 | Action: 89 | - "logs:CreateLogGroup" 90 | - "logs:CreateLogStream" 91 | - "logs:DescribeLogGroups" 92 | - "logs:DescribeLogStreams" 93 | - "logs:PutLogEvents" 94 | - "logs:GetLogEvents" 95 | - "logs:FilterLogEvents" 96 | Resource: !GetAtt ApiGatewayAccessLogs.Arn 97 | Tags: 98 | - Key: stackName 99 | Value: !Ref AWS::StackName 100 | - Key: taktile:environment 101 | Value: !Sub analytics-${AWS::StackName} 102 | 103 | BufferQueue: 104 | Type: AWS::SQS::Queue 105 | Properties: 106 | QueueName: dlt-sqs-athena-buffer-queue 107 | SqsManagedSseEnabled: true 108 | VisibilityTimeout: 60 # has to be at least as long as the lambda timeout 109 | Tags: 110 | - Key: stackName 111 | Value: !Ref AWS::StackName 112 | - Key: taktile:environment 113 | Value: !Sub analytics-${AWS::StackName} 114 | 115 | DltDataStorageBucket: 116 | Type: AWS::S3::Bucket 117 | Properties: 118 | BucketName: !Ref DestinationBucket 119 | Tags: 120 | - Key: stackName 121 | Value: !Ref AWS::StackName 122 | - Key: taktile:environment 123 | Value: !Sub analytics-${AWS::StackName} 124 | 125 | DltFunction: 126 | Type: AWS::Serverless::Function 127 | Metadata: 128 | DockerContext: . 129 | Dockerfile: Dockerfile 130 | DockerTag: latest 131 | DockerBuildTarget: runner 132 | Properties: 133 | FunctionName: dlt-sqs-athena-test-loader 134 | PackageType: Image 135 | Timeout: 60 # default is 3 seconds, which is usually too little 136 | MemorySize: 512 # default is 128mb, which is too little 137 | Events: 138 | SQSEvent: 139 | Type: SQS 140 | Properties: 141 | Queue: !GetAtt BufferQueue.Arn 142 | BatchSize: 10000 # default is 10 max is 10000. Batch size is bound by 6mb 143 | MaximumBatchingWindowInSeconds: 60 # seconds 144 | ScalingConfig: 145 | MaximumConcurrency: 20 # minimum is 2, max is 1000 146 | Environment: 147 | Variables: 148 | DLT_PROJECT_DIR: "/tmp" # the only writeable directory on a lambda 149 | DLT_DATA_DIR: "/tmp" # the only writeable directory on a lambda 150 | DLT_PIPELINE_DIR: "/tmp" # the only writeable directory on a lambda 151 | DESTINATION_BUCKET: !Sub s3://${DestinationBucket} 152 | Policies: 153 | - Statement: 154 | - Sid: AllowDLTSecretAccess 155 | Effect: Allow 156 | Action: 157 | - secretsmanager:GetSecretValue 158 | Resource: !Sub arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:DLT_* 159 | - Sid: AllowSQSAccess 160 | Effect: Allow 161 | Action: 162 | - "sqs:ReceiveMessage" 163 | - "sqs:DeleteMessage" 164 | - "sqs:GetQueueAttributes" 165 | Resource: !GetAtt BufferQueue.Arn 166 | - Sid: DestinationBucketFullAccess 167 | Effect: Allow 168 | Action: 169 | - "s3:*" 170 | Resource: 171 | - !GetAtt DltDataStorageBucket.Arn 172 | - !Sub ${DltDataStorageBucket.Arn}/* 173 | - Sid: AllowAthenaAccess 174 | Effect: Allow 175 | Action: 176 | - "athena:StartQueryExecution" 177 | - "athena:GetQueryExecution" 178 | - "athena:GetQueryResults" 179 | Resource: "*" 180 | - Sid: AllowGlueCatalogAccess 181 | Effect: Allow 182 | Action: 183 | - "glue:CreateDatabase" 184 | - "glue:GetDatabase" 185 | - "glue:GetDatabases" 186 | - "glue:CreateTable" 187 | - "glue:GetTables" 188 | - "glue:GetTable" 189 | - "glue:UpdateTable" 190 | - "glue:GetPartitions" 191 | Resource: 192 | - !Sub arn:aws:glue:${AWS::Region}:${AWS::AccountId}:catalog 193 | - !Sub arn:aws:glue:${AWS::Region}:${AWS::AccountId}:table/*/* 194 | - !Sub arn:aws:glue:${AWS::Region}:${AWS::AccountId}:database/* 195 | Tags: 196 | stackName: !Ref AWS::StackName 197 | taktile:environment: !Sub analytics-${AWS::StackName} 198 | 199 | DltFunctionLogs: 200 | Type: "AWS::Logs::LogGroup" 201 | Properties: 202 | LogGroupName: !Sub "/aws/lambda/${DltFunction}" 203 | RetentionInDays: 30 204 | Tags: 205 | - Key: stackName 206 | Value: !Ref AWS::StackName 207 | - Key: taktile:environment 208 | Value: !Sub analytics-${AWS::StackName} 209 | 210 | MonitoringDashboard: 211 | Type: AWS::CloudWatch::Dashboard 212 | Properties: 213 | DashboardName: DltSQSAthenaMonitoringDashboard 214 | DashboardBody: !Sub | 215 | { 216 | "widgets": [ 217 | { 218 | "height": 2, 219 | "width": 6, 220 | "y": 0, 221 | "x": 0, 222 | "type": "text", 223 | "properties": { 224 | "markdown": "# API Gateway" 225 | } 226 | }, 227 | { 228 | "height": 6, 229 | "width": 6, 230 | "y": 2, 231 | "x": 0, 232 | "type": "metric", 233 | "properties": { 234 | "title": "Load", 235 | "metrics": [ 236 | [ 237 | "AWS/ApiGateway", 238 | "Count", 239 | "ApiId", 240 | "${HttpApi}", 241 | { 242 | "stat": "Sum", 243 | "period": 60, 244 | "region": "eu-central-1" 245 | } 246 | ] 247 | ], 248 | "view": "timeSeries", 249 | "stacked": false, 250 | "region": "eu-central-1", 251 | "period": 300, 252 | "yAxis": { 253 | "left": { 254 | "showUnits": false, 255 | "label": "Requests/min", 256 | "min": 0 257 | } 258 | } 259 | } 260 | }, 261 | { 262 | "height": 6, 263 | "width": 6, 264 | "y": 14, 265 | "x": 0, 266 | "type": "metric", 267 | "properties": { 268 | "title": "Errors / Minute", 269 | "metrics": [ 270 | [ 271 | "AWS/ApiGateway", 272 | "4xx", 273 | "ApiId", 274 | "${HttpApi}", 275 | { 276 | "stat": "Sum", 277 | "period": 60 278 | } 279 | ], 280 | [ 281 | ".", 282 | "5xx", 283 | ".", 284 | ".", 285 | { 286 | "stat": "Sum", 287 | "period": 60 288 | } 289 | ] 290 | ], 291 | "view": "timeSeries", 292 | "stacked": true, 293 | "region": "eu-central-1", 294 | "yAxis": { 295 | "left": { 296 | "min": 0 297 | } 298 | } 299 | } 300 | }, 301 | { 302 | "height": 6, 303 | "width": 6, 304 | "y": 8, 305 | "x": 0, 306 | "type": "metric", 307 | "properties": { 308 | "title": "Latency", 309 | "metrics": [ 310 | [ 311 | "AWS/ApiGateway", 312 | "IntegrationLatency", 313 | "ApiId", 314 | "${HttpApi}", 315 | { 316 | "stat": "Average", 317 | "period": 60 318 | } 319 | ], 320 | [ 321 | ".", 322 | "Latency", 323 | ".", 324 | ".", 325 | { 326 | "stat": "Average", 327 | "period": 60 328 | } 329 | ] 330 | ], 331 | "view": "timeSeries", 332 | "stacked": false, 333 | "region": "eu-central-1", 334 | "yAxis": { 335 | "left": { 336 | "min": 0 337 | } 338 | } 339 | } 340 | }, 341 | { 342 | "height": 2, 343 | "width": 6, 344 | "y": 0, 345 | "x": 6, 346 | "type": "text", 347 | "properties": { 348 | "markdown": "# SQS Buffer Queue" 349 | } 350 | }, 351 | { 352 | "height": 6, 353 | "width": 6, 354 | "y": 2, 355 | "x": 6, 356 | "type": "metric", 357 | "properties": { 358 | "title": "Buffer Throughput", 359 | "metrics": [ 360 | [ 361 | "AWS/SQS", 362 | "NumberOfMessagesSent", 363 | "QueueName", 364 | "${BufferQueue.QueueName}", 365 | { 366 | "stat": "Sum", 367 | "period": 60, 368 | "region": "eu-central-1" 369 | } 370 | ], 371 | [ 372 | ".", 373 | "NumberOfMessagesReceived", 374 | ".", 375 | ".", 376 | { 377 | "stat": "Sum", 378 | "period": 60, 379 | "region": "eu-central-1" 380 | } 381 | ] 382 | ], 383 | "view": "timeSeries", 384 | "stacked": true, 385 | "region": "eu-central-1", 386 | "period": 300, 387 | "yAxis": { 388 | "left": { 389 | "label": "Reqests/min", 390 | "showUnits": false, 391 | "min": 0 392 | } 393 | } 394 | } 395 | }, 396 | { 397 | "height": 6, 398 | "width": 6, 399 | "y": 8, 400 | "x": 6, 401 | "type": "metric", 402 | "properties": { 403 | "metrics": [ 404 | [ 405 | { 406 | "expression": "METRICS()/60", 407 | "label": "ApproximateAgeOfOldestMessage", 408 | "id": "e1", 409 | "region": "eu-central-1" 410 | } 411 | ], 412 | [ 413 | "AWS/SQS", 414 | "ApproximateAgeOfOldestMessage", 415 | "QueueName", 416 | "${BufferQueue.QueueName}", 417 | { 418 | "stat": "Maximum", 419 | "period": 60, 420 | "region": "eu-central-1", 421 | "id": "m1", 422 | "visible": false 423 | } 424 | ] 425 | ], 426 | "title": "Buffer Delay", 427 | "view": "timeSeries", 428 | "stacked": false, 429 | "region": "eu-central-1", 430 | "period": 300, 431 | "stat": "Average", 432 | "yAxis": { 433 | "left": { 434 | "showUnits": false, 435 | "label": "min", 436 | "min": 0 437 | } 438 | } 439 | } 440 | }, 441 | { 442 | "height": 6, 443 | "width": 6, 444 | "y": 14, 445 | "x": 6, 446 | "type": "metric", 447 | "properties": { 448 | "title": "Payload Size", 449 | "metrics": [ 450 | [ 451 | "AWS/SQS", 452 | "SentMessageSize", 453 | "QueueName", 454 | "${BufferQueue.QueueName}", 455 | { 456 | "stat": "Average", 457 | "period": 60 458 | } 459 | ] 460 | ], 461 | "view": "timeSeries", 462 | "stacked": false, 463 | "region": "eu-central-1", 464 | "yAxis": { 465 | "left": { 466 | "min": 0 467 | } 468 | } 469 | } 470 | }, 471 | { 472 | "height": 2, 473 | "width": 6, 474 | "y": 0, 475 | "x": 12, 476 | "type": "text", 477 | "properties": { 478 | "markdown": "# Lambda Function" 479 | } 480 | }, 481 | { 482 | "height": 6, 483 | "width": 6, 484 | "y": 2, 485 | "x": 12, 486 | "type": "metric", 487 | "properties": { 488 | "title": "Invocations", 489 | "metrics": [ 490 | [ 491 | "AWS/Lambda", 492 | "Invocations", 493 | "FunctionName", 494 | "${DltFunction}", 495 | { 496 | "stat": "Sum", 497 | "period": 60 498 | } 499 | ], 500 | [ 501 | ".", 502 | "Errors", 503 | ".", 504 | ".", 505 | { 506 | "stat": "Sum", 507 | "period": 60 508 | } 509 | ] 510 | ], 511 | "view": "timeSeries", 512 | "stacked": true, 513 | "region": "eu-central-1", 514 | "yAxis": { 515 | "left": { 516 | "min": 0 517 | } 518 | } 519 | } 520 | }, 521 | { 522 | "height": 6, 523 | "width": 6, 524 | "y": 8, 525 | "x": 12, 526 | "type": "metric", 527 | "properties": { 528 | "title": "Concurrency", 529 | "metrics": [ 530 | [ 531 | "AWS/Lambda", 532 | "ConcurrentExecutions", 533 | "FunctionName", 534 | "${DltFunction}", 535 | { 536 | "stat": "Maximum", 537 | "period": 60 538 | } 539 | ] 540 | ], 541 | "view": "timeSeries", 542 | "stacked": false, 543 | "region": "eu-central-1", 544 | "yAxis": { 545 | "left": { 546 | "min": 0 547 | } 548 | } 549 | } 550 | }, 551 | { 552 | "height": 6, 553 | "width": 6, 554 | "y": 14, 555 | "x": 12, 556 | "type": "metric", 557 | "properties": { 558 | "title": "Latency", 559 | "metrics": [ 560 | [ 561 | "AWS/Lambda", 562 | "Duration", 563 | "FunctionName", 564 | "${DltFunction}", 565 | { 566 | "stat": "Average", 567 | "period": 60 568 | } 569 | ] 570 | ], 571 | "view": "timeSeries", 572 | "stacked": false, 573 | "region": "eu-central-1", 574 | "yAxis": { 575 | "left": { 576 | "min": 0 577 | } 578 | } 579 | } 580 | }, 581 | { 582 | "type": "log", 583 | "x": 0, 584 | "y": 22, 585 | "width": 18, 586 | "height": 6, 587 | "properties": { 588 | "query": "SOURCE '/aws/lambda/dlt-sqs-snowflake-test-loader' | fields @timestamp, @message, @logStream, @log\n| sort @timestamp desc\n| limit 10000", 589 | "region": "eu-central-1", 590 | "stacked": false, 591 | "view": "table" 592 | } 593 | }, 594 | { 595 | "height": 2, 596 | "width": 18, 597 | "y": 20, 598 | "x": 0, 599 | "type": "text", 600 | "properties": { 601 | "markdown": "# Lambda Logs" 602 | } 603 | } 604 | ] 605 | } 606 | 607 | Outputs: 608 | HttpApiEndpoint: 609 | Description: "Http API endpoint for dlt-sqs-athena-test-loader Lambda function" 610 | Value: !Sub "https://${HttpApi}.execute-api.${AWS::Region}.amazonaws.com/collect" 611 | 612 | -------------------------------------------------------------------------------- /examples/motherduck/poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "astunparse" 5 | version = "1.6.3" 6 | description = "An AST unparser for Python" 7 | optional = false 8 | python-versions = "*" 9 | files = [ 10 | {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, 11 | {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, 12 | ] 13 | 14 | [package.dependencies] 15 | six = ">=1.6.1,<2.0" 16 | wheel = ">=0.23.0,<1.0" 17 | 18 | [[package]] 19 | name = "aws-lambda-powertools" 20 | version = "2.43.1" 21 | description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." 22 | optional = false 23 | python-versions = "<4.0.0,>=3.8" 24 | files = [ 25 | {file = "aws_lambda_powertools-2.43.1-py3-none-any.whl", hash = "sha256:48116250c1771c7b8d4977ad2d475271074d86964107ccfd3fc6775e51984d88"}, 26 | {file = "aws_lambda_powertools-2.43.1.tar.gz", hash = "sha256:5c371a0c0430cf7bca1696748cb0d85079aac2c51056cbee10e5435029b35ca4"}, 27 | ] 28 | 29 | [package.dependencies] 30 | jmespath = ">=1.0.1,<2.0.0" 31 | typing-extensions = ">=4.11.0,<5.0.0" 32 | 33 | [package.extras] 34 | all = ["aws-xray-sdk (>=2.8.0,<3.0.0)", "fastjsonschema (>=2.14.5,<3.0.0)", "pydantic (>=1.8.2,<2.0.0)"] 35 | aws-sdk = ["boto3 (>=1.26.164,<2.0.0)"] 36 | datadog = ["datadog-lambda (>=4.77,<7.0)"] 37 | datamasking = ["aws-encryption-sdk (>=3.1.1,<4.0.0)", "jsonpath-ng (>=1.6.0,<2.0.0)"] 38 | parser = ["pydantic (>=1.8.2,<2.0.0)"] 39 | redis = ["redis (>=4.4,<6.0)"] 40 | tracer = ["aws-xray-sdk (>=2.8.0,<3.0.0)"] 41 | validation = ["fastjsonschema (>=2.14.5,<3.0.0)"] 42 | 43 | [[package]] 44 | name = "boto3" 45 | version = "1.37.12" 46 | description = "The AWS SDK for Python" 47 | optional = false 48 | python-versions = ">=3.8" 49 | files = [ 50 | {file = "boto3-1.37.12-py3-none-any.whl", hash = "sha256:516feaa0d2afaeda1515216fd09291368a1215754bbccb0f28414c0a91a830a2"}, 51 | {file = "boto3-1.37.12.tar.gz", hash = "sha256:9412d404f103ad6d14f033eb29cd5e0cdca2b9b08cbfa9d4dabd1d7be2de2625"}, 52 | ] 53 | 54 | [package.dependencies] 55 | botocore = ">=1.37.12,<1.38.0" 56 | jmespath = ">=0.7.1,<2.0.0" 57 | s3transfer = ">=0.11.0,<0.12.0" 58 | 59 | [package.extras] 60 | crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] 61 | 62 | [[package]] 63 | name = "botocore" 64 | version = "1.37.12" 65 | description = "Low-level, data-driven core of boto 3." 66 | optional = false 67 | python-versions = ">=3.8" 68 | files = [ 69 | {file = "botocore-1.37.12-py3-none-any.whl", hash = "sha256:ba1948c883bbabe20d95ff62c3e36954c9269686f7db9361857835677ca3e676"}, 70 | {file = "botocore-1.37.12.tar.gz", hash = "sha256:ae2d5328ce6ad02eb615270507235a6e90fd3eeed615a6c0732b5a68b12f2017"}, 71 | ] 72 | 73 | [package.dependencies] 74 | jmespath = ">=0.7.1,<2.0.0" 75 | python-dateutil = ">=2.1,<3.0.0" 76 | urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} 77 | 78 | [package.extras] 79 | crt = ["awscrt (==0.23.8)"] 80 | 81 | [[package]] 82 | name = "certifi" 83 | version = "2025.1.31" 84 | description = "Python package for providing Mozilla's CA Bundle." 85 | optional = false 86 | python-versions = ">=3.6" 87 | files = [ 88 | {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, 89 | {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, 90 | ] 91 | 92 | [[package]] 93 | name = "charset-normalizer" 94 | version = "3.4.1" 95 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 96 | optional = false 97 | python-versions = ">=3.7" 98 | files = [ 99 | {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, 100 | {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, 101 | {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, 102 | {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, 103 | {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, 104 | {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, 105 | {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, 106 | {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, 107 | {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, 108 | {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, 109 | {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, 110 | {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, 111 | {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, 112 | {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, 113 | {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, 114 | {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, 115 | {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, 116 | {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, 117 | {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, 118 | {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, 119 | {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, 120 | {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, 121 | {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, 122 | {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, 123 | {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, 124 | {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, 125 | {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, 126 | {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, 127 | {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, 128 | {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, 129 | {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, 130 | {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, 131 | {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, 132 | {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, 133 | {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, 134 | {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, 135 | {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, 136 | {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, 137 | {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, 138 | {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, 139 | {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, 140 | {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, 141 | {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, 142 | {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, 143 | {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, 144 | {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, 145 | {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, 146 | {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, 147 | {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, 148 | {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, 149 | {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, 150 | {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, 151 | {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, 152 | {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, 153 | {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, 154 | {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, 155 | {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, 156 | {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, 157 | {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, 158 | {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, 159 | {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, 160 | {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, 161 | {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, 162 | {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, 163 | {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, 164 | {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, 165 | {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, 166 | {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, 167 | {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, 168 | {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, 169 | {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, 170 | {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, 171 | {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, 172 | {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, 173 | {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, 174 | {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, 175 | {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, 176 | {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, 177 | {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, 178 | {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, 179 | {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, 180 | {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, 181 | {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, 182 | {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, 183 | {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, 184 | {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, 185 | {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, 186 | {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, 187 | {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, 188 | {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, 189 | {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, 190 | {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, 191 | ] 192 | 193 | [[package]] 194 | name = "click" 195 | version = "8.1.8" 196 | description = "Composable command line interface toolkit" 197 | optional = false 198 | python-versions = ">=3.7" 199 | files = [ 200 | {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, 201 | {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, 202 | ] 203 | 204 | [package.dependencies] 205 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 206 | 207 | [[package]] 208 | name = "colorama" 209 | version = "0.4.6" 210 | description = "Cross-platform colored terminal text." 211 | optional = false 212 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 213 | files = [ 214 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 215 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 216 | ] 217 | 218 | [[package]] 219 | name = "dlt" 220 | version = "1.3.0" 221 | description = "dlt is an open-source python-first scalable data loading library that does not require any backend to run." 222 | optional = false 223 | python-versions = "<3.13,>=3.8.1" 224 | files = [ 225 | {file = "dlt-1.3.0-py3-none-any.whl", hash = "sha256:e2583ed0ad4a0d9941b8f9cb0e078f4443bcbeb0e1cf1cce586cf35107ccf266"}, 226 | {file = "dlt-1.3.0.tar.gz", hash = "sha256:57eecee99ace25b6d37027a78f59f8c735d1913cc81f1101e1b47bf96fc544b8"}, 227 | ] 228 | 229 | [package.dependencies] 230 | astunparse = ">=1.6.3" 231 | click = ">=7.1" 232 | duckdb = {version = ">=0.9", optional = true, markers = "extra == \"duckdb\" or extra == \"motherduck\""} 233 | fsspec = ">=2022.4.0" 234 | gitpython = ">=3.1.29" 235 | giturlparse = ">=0.10.0" 236 | hexbytes = ">=0.2.2" 237 | humanize = ">=4.4.0" 238 | jsonpath-ng = ">=1.5.3" 239 | makefun = ">=1.15.0" 240 | orjson = {version = ">=3.6.7,<3.9.11 || >3.9.11,<3.9.12 || >3.9.12,<3.9.13 || >3.9.13,<3.9.14 || >3.9.14,<3.10.1 || >3.10.1,<4", markers = "platform_python_implementation != \"PyPy\""} 241 | packaging = ">=21.1" 242 | pathvalidate = ">=2.5.2" 243 | pendulum = ">=2.1.2" 244 | pluggy = ">=1.3.0" 245 | pyarrow = {version = ">=12.0.0", optional = true, markers = "extra == \"bigquery\" or extra == \"parquet\" or extra == \"motherduck\" or extra == \"athena\" or extra == \"synapse\" or extra == \"clickhouse\" or extra == \"dremio\" or extra == \"lancedb\" or extra == \"deltalake\""} 246 | pytz = ">=2022.6" 247 | PyYAML = ">=5.4.1" 248 | requests = ">=2.26.0" 249 | requirements-parser = ">=0.5.0" 250 | semver = ">=2.13.0" 251 | setuptools = ">=65.6.0" 252 | simplejson = ">=3.17.5" 253 | tenacity = ">=8.0.2" 254 | tomlkit = ">=0.11.3" 255 | typing-extensions = ">=4.0.0" 256 | tzdata = ">=2022.1" 257 | win-precise-time = {version = ">=1.4.2", markers = "os_name == \"nt\""} 258 | 259 | [package.extras] 260 | athena = ["botocore (>=1.28)", "pyarrow (>=12.0.0)", "pyathena (>=2.9.6)", "s3fs (>=2022.4.0)"] 261 | az = ["adlfs (>=2022.4.0)"] 262 | bigquery = ["db-dtypes (>=1.2.0)", "gcsfs (>=2022.4.0)", "google-cloud-bigquery (>=2.26.0)", "grpcio (>=1.50.0)", "pyarrow (>=12.0.0)"] 263 | cli = ["cron-descriptor (>=1.2.32)", "pipdeptree (>=2.9.0,<2.10)"] 264 | clickhouse = ["adlfs (>=2022.4.0)", "clickhouse-connect (>=0.7.7)", "clickhouse-driver (>=0.2.7)", "gcsfs (>=2022.4.0)", "pyarrow (>=12.0.0)", "s3fs (>=2022.4.0)"] 265 | databricks = ["databricks-sql-connector (>=2.9.3)"] 266 | deltalake = ["deltalake (>=0.19.0)", "pyarrow (>=12.0.0)"] 267 | dremio = ["pyarrow (>=12.0.0)"] 268 | duckdb = ["duckdb (>=0.9)"] 269 | filesystem = ["botocore (>=1.28)", "s3fs (>=2022.4.0)", "sqlglot (>=20.0.0)"] 270 | gcp = ["db-dtypes (>=1.2.0)", "gcsfs (>=2022.4.0)", "google-cloud-bigquery (>=2.26.0)", "grpcio (>=1.50.0)"] 271 | gs = ["gcsfs (>=2022.4.0)"] 272 | lancedb = ["lancedb (>=0.8.2)", "pyarrow (>=12.0.0)", "tantivy (>=0.22.0)"] 273 | motherduck = ["duckdb (>=0.9)", "pyarrow (>=12.0.0)"] 274 | mssql = ["pyodbc (>=4.0.39)"] 275 | parquet = ["pyarrow (>=12.0.0)"] 276 | postgres = ["psycopg2-binary (>=2.9.1)", "psycopg2cffi (>=2.9.0)"] 277 | qdrant = ["qdrant-client[fastembed] (>=1.8)"] 278 | redshift = ["psycopg2-binary (>=2.9.1)", "psycopg2cffi (>=2.9.0)"] 279 | s3 = ["botocore (>=1.28)", "s3fs (>=2022.4.0)"] 280 | sftp = ["paramiko (>=3.3.0)"] 281 | snowflake = ["snowflake-connector-python (>=3.5.0)"] 282 | sql-database = ["sqlalchemy (>=1.4)"] 283 | sqlalchemy = ["alembic (>1.10.0)", "sqlalchemy (>=1.4)"] 284 | synapse = ["adlfs (>=2022.4.0)", "pyarrow (>=12.0.0)", "pyodbc (>=4.0.39)"] 285 | weaviate = ["weaviate-client (>=3.22)"] 286 | 287 | [[package]] 288 | name = "duckdb" 289 | version = "1.2.1" 290 | description = "DuckDB in-process database" 291 | optional = false 292 | python-versions = ">=3.7.0" 293 | files = [ 294 | {file = "duckdb-1.2.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b1b26271c22d1265379949b71b1d13a413f8048ea49ed04b3a33f257c384fa7c"}, 295 | {file = "duckdb-1.2.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:47946714d3aa423782678d37bfface082a9c43d232c44c4b79d70a1137e4c356"}, 296 | {file = "duckdb-1.2.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:2c3d3f069a114cfb4ebf5e35798953c93491cfb5866cfc57a4921f8b5d38cc05"}, 297 | {file = "duckdb-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:433406949970f4a8ab5416f62af224d418d3bbafe81585ede77057752c04017e"}, 298 | {file = "duckdb-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42d156dacb1fd39b7293ee200d16af2cc9d08e57f7f7b5e800aa35bd265fc41f"}, 299 | {file = "duckdb-1.2.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e11ccbfd088dbac68dc35f4119fb385a878ca1cce720111c394f513d89a8b5f"}, 300 | {file = "duckdb-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:66322686a31a566b4c98f079513b1eba21a7de1d716b5b7d3a55aef8f97ee369"}, 301 | {file = "duckdb-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:c1cbb84c65f8ef2fe32f4cbc8c7ed339c3ae6cf3e5814a314fa4b79a8ce9686a"}, 302 | {file = "duckdb-1.2.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:99c47ea82df549c284e4e4d8c89a940af4f19c03427f6f42cafeb3c152536bc5"}, 303 | {file = "duckdb-1.2.1-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:203ebdf401d049135492cc3d49146cfd704d866ee9cc52b18e80a586aceabb69"}, 304 | {file = "duckdb-1.2.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ac5f7c15176b6fb90f1f3bed08a99b9d32f55b58cd3d9d2ed6a1037a8fda2024"}, 305 | {file = "duckdb-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b2c13f4f9290db60c783b93b79ce521a3890ff8d817a6670afb760e030043b"}, 306 | {file = "duckdb-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d493e051f594175a2a5bdcae5c008d3cc424805e3282292c1204f597880de8ea"}, 307 | {file = "duckdb-1.2.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c252be2ed07817916342823b271253459932c60d7f7ee4e28f33650552cda24"}, 308 | {file = "duckdb-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:832627f11b370d708543a86d18d5eda4eacb7ca51fdc83c74629adfff2ec1bf2"}, 309 | {file = "duckdb-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:d05e5914857b4d93b136de385d81a65165a6c24a6ecf6eee3dcd0017233bff6c"}, 310 | {file = "duckdb-1.2.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:7e587410e05343ffaf9a21bacb6811aad253bd443ab4ff869fdaa645908f47a4"}, 311 | {file = "duckdb-1.2.1-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:8cb84295cafbf2510326f4ae18d401fc2d45b6d4811c43f1b7451a69a0a74f5f"}, 312 | {file = "duckdb-1.2.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:1b6dfefadc455347a2c649d41ebd561b32574b4191508043c9ee81fa0da95485"}, 313 | {file = "duckdb-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d75d9fdf5865399f634d824c8d427c7666d1f2c640115178115459fa69b20b0"}, 314 | {file = "duckdb-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4a05d182d1dec1ff4acb53a266b3b8024afcc1ed0d399f5784ff1607a4271e9"}, 315 | {file = "duckdb-1.2.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:317af7385b4f1d0c90ca029a71ce3d4f9571549c162798d58a0b20ba0a11762e"}, 316 | {file = "duckdb-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41fca1666d0905e929ede0899a4275d67835a285b98e28fce446e8c3e53cfe8c"}, 317 | {file = "duckdb-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:f8f19f145442dbdfae029b68208fc237816f70b3d25bb77ed31ace79b6059fa5"}, 318 | {file = "duckdb-1.2.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:bc9ed3adea35e7e688750e80330b5b93cd430483d68a5f880dac76bedca14c0e"}, 319 | {file = "duckdb-1.2.1-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:b26ff415d89860b7013d711fce916f919ad058dbf0a3fc4bcdff5323ec4bbfa0"}, 320 | {file = "duckdb-1.2.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:0e26037b138a22f72fe44697b605ccac06e223c108b3f4a3e91e7ffad45ee673"}, 321 | {file = "duckdb-1.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e2f530e8290e4b2d2c341bc709a6a0c9ec7a0e1c7a4679afa7bd4db972fcf12"}, 322 | {file = "duckdb-1.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7985129c4bc810cb08938043822bb1fc4b67c11f4c1b025527f9c888e0638b6a"}, 323 | {file = "duckdb-1.2.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be76e55e9a36febcb0c7c7c28b8fae0b33bbcf6a84b3b23eb23e7ee3e65e3394"}, 324 | {file = "duckdb-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d8f5066ae9acc6cee22c7a455696511d993bdbfc55bb9466360b073b5c8cba67"}, 325 | {file = "duckdb-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:6112711457b6014ac041492bedf8b6a97403666aefa20a4a4f3479db10136501"}, 326 | {file = "duckdb-1.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1b5e4f1ef608b9276fef880d31b84304683f08035b5c177a0848310de37c6e5"}, 327 | {file = "duckdb-1.2.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d03872cd8e4a8b571e21c3628ea9cb1610b6d739ed41c1cee5dae49a23d1886"}, 328 | {file = "duckdb-1.2.1-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a30e6bff4dbe6686ef3ff2d69aa0a4a09ad87b99ddc3933c4d118b1413fda51"}, 329 | {file = "duckdb-1.2.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:922288c3b5933f58bdaac5f0357dada68f472cf5458d64b954509bbbbc11c391"}, 330 | {file = "duckdb-1.2.1-cp38-cp38-macosx_12_0_universal2.whl", hash = "sha256:0648d763a36bf058c9dd30ce46b06b7753600101ffb1519e66fa85fbf4c02d91"}, 331 | {file = "duckdb-1.2.1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:577537f3be6b05e28b9844d8a06835764053552c9974e42e0c3a1711fbf59054"}, 332 | {file = "duckdb-1.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716fa104d5a1a6f81a8bd6febf579cb45c20920cdfbcafd55131bfeef61330f0"}, 333 | {file = "duckdb-1.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11a8a275777b8174a1fdca660689dd0335642b30ae425fe16892f9f9cd285129"}, 334 | {file = "duckdb-1.2.1-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a6ea26a899b05aeaadd23c9182978a266d5cd4f62e4ef7d9f197f889a441a9d"}, 335 | {file = "duckdb-1.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:ab84599120b0f835b67b897a4febcb0326b206201773f0673891378e16f850f5"}, 336 | {file = "duckdb-1.2.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:18a3ebb6895e53ddcc9f677625576d85a54236a0fc060927bc356de365c8d382"}, 337 | {file = "duckdb-1.2.1-cp39-cp39-macosx_12_0_universal2.whl", hash = "sha256:7928a1f7a0568e3f384dbb2896d33fe96061444033692c8a954ac75a06efbda3"}, 338 | {file = "duckdb-1.2.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:1adecebea8369b289232ec57e0fab87b572bca960acbeff89e8b7c2d202636a3"}, 339 | {file = "duckdb-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e728ab0415d3e9ff575806304482bf89f39e55df660ab8ed194335b045e5a0"}, 340 | {file = "duckdb-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:594dcf9f7637e5db3d8d9e676a95721be5cf9657ffa22b27e19dddd519bca6fb"}, 341 | {file = "duckdb-1.2.1-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a874d242f489bf649e6f03f3132d8d278371a8baf0ce55b48200af0de70d8f1f"}, 342 | {file = "duckdb-1.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:55c9b4214dd80e6adf73c7224529e0df290426d9fe5b6568dcd004916e690b84"}, 343 | {file = "duckdb-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:6043d37e289df828fada6245381c3d1b67b71e0245f1b599b6c4c2634318aed2"}, 344 | {file = "duckdb-1.2.1.tar.gz", hash = "sha256:15d49030d04572540cc1c8ad8a491ce018a590ec995d5d38c8f5f75b6422413e"}, 345 | ] 346 | 347 | [[package]] 348 | name = "fsspec" 349 | version = "2025.3.0" 350 | description = "File-system specification" 351 | optional = false 352 | python-versions = ">=3.8" 353 | files = [ 354 | {file = "fsspec-2025.3.0-py3-none-any.whl", hash = "sha256:efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3"}, 355 | {file = "fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972"}, 356 | ] 357 | 358 | [package.extras] 359 | abfs = ["adlfs"] 360 | adl = ["adlfs"] 361 | arrow = ["pyarrow (>=1)"] 362 | dask = ["dask", "distributed"] 363 | dev = ["pre-commit", "ruff"] 364 | doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] 365 | dropbox = ["dropbox", "dropboxdrivefs", "requests"] 366 | full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] 367 | fuse = ["fusepy"] 368 | gcs = ["gcsfs"] 369 | git = ["pygit2"] 370 | github = ["requests"] 371 | gs = ["gcsfs"] 372 | gui = ["panel"] 373 | hdfs = ["pyarrow (>=1)"] 374 | http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] 375 | libarchive = ["libarchive-c"] 376 | oci = ["ocifs"] 377 | s3 = ["s3fs"] 378 | sftp = ["paramiko"] 379 | smb = ["smbprotocol"] 380 | ssh = ["paramiko"] 381 | test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] 382 | test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] 383 | test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] 384 | tqdm = ["tqdm"] 385 | 386 | [[package]] 387 | name = "gitdb" 388 | version = "4.0.12" 389 | description = "Git Object Database" 390 | optional = false 391 | python-versions = ">=3.7" 392 | files = [ 393 | {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, 394 | {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, 395 | ] 396 | 397 | [package.dependencies] 398 | smmap = ">=3.0.1,<6" 399 | 400 | [[package]] 401 | name = "gitpython" 402 | version = "3.1.44" 403 | description = "GitPython is a Python library used to interact with Git repositories" 404 | optional = false 405 | python-versions = ">=3.7" 406 | files = [ 407 | {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, 408 | {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, 409 | ] 410 | 411 | [package.dependencies] 412 | gitdb = ">=4.0.1,<5" 413 | 414 | [package.extras] 415 | doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] 416 | test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] 417 | 418 | [[package]] 419 | name = "giturlparse" 420 | version = "0.12.0" 421 | description = "A Git URL parsing module (supports parsing and rewriting)" 422 | optional = false 423 | python-versions = ">=3.8" 424 | files = [ 425 | {file = "giturlparse-0.12.0-py2.py3-none-any.whl", hash = "sha256:412b74f2855f1da2fefa89fd8dde62df48476077a72fc19b62039554d27360eb"}, 426 | {file = "giturlparse-0.12.0.tar.gz", hash = "sha256:c0fff7c21acc435491b1779566e038757a205c1ffdcb47e4f81ea52ad8c3859a"}, 427 | ] 428 | 429 | [[package]] 430 | name = "hexbytes" 431 | version = "1.3.0" 432 | description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" 433 | optional = false 434 | python-versions = "<4,>=3.8" 435 | files = [ 436 | {file = "hexbytes-1.3.0-py3-none-any.whl", hash = "sha256:83720b529c6e15ed21627962938dc2dec9bb1010f17bbbd66bf1e6a8287d522c"}, 437 | {file = "hexbytes-1.3.0.tar.gz", hash = "sha256:4a61840c24b0909a6534350e2d28ee50159ca1c9e89ce275fd31c110312cf684"}, 438 | ] 439 | 440 | [package.extras] 441 | dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth_utils (>=2.0.0)", "hypothesis (>=3.44.24,<=6.31.6)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] 442 | docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] 443 | test = ["eth_utils (>=2.0.0)", "hypothesis (>=3.44.24,<=6.31.6)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] 444 | 445 | [[package]] 446 | name = "humanize" 447 | version = "4.12.1" 448 | description = "Python humanize utilities" 449 | optional = false 450 | python-versions = ">=3.9" 451 | files = [ 452 | {file = "humanize-4.12.1-py3-none-any.whl", hash = "sha256:86014ca5c52675dffa1d404491952f1f5bf03b07c175a51891a343daebf01fea"}, 453 | {file = "humanize-4.12.1.tar.gz", hash = "sha256:1338ba97415c96556758a6e2f65977ed406dddf4620d4c6db9bbdfd07f0f1232"}, 454 | ] 455 | 456 | [package.extras] 457 | tests = ["freezegun", "pytest", "pytest-cov"] 458 | 459 | [[package]] 460 | name = "idna" 461 | version = "3.10" 462 | description = "Internationalized Domain Names in Applications (IDNA)" 463 | optional = false 464 | python-versions = ">=3.6" 465 | files = [ 466 | {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, 467 | {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, 468 | ] 469 | 470 | [package.extras] 471 | all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] 472 | 473 | [[package]] 474 | name = "jmespath" 475 | version = "1.0.1" 476 | description = "JSON Matching Expressions" 477 | optional = false 478 | python-versions = ">=3.7" 479 | files = [ 480 | {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, 481 | {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, 482 | ] 483 | 484 | [[package]] 485 | name = "jsonpath-ng" 486 | version = "1.7.0" 487 | description = "A final implementation of JSONPath for Python that aims to be standard compliant, including arithmetic and binary comparison operators and providing clear AST for metaprogramming." 488 | optional = false 489 | python-versions = "*" 490 | files = [ 491 | {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, 492 | ] 493 | 494 | [package.dependencies] 495 | ply = "*" 496 | 497 | [[package]] 498 | name = "makefun" 499 | version = "1.15.6" 500 | description = "Small library to dynamically create python functions." 501 | optional = false 502 | python-versions = "*" 503 | files = [ 504 | {file = "makefun-1.15.6-py2.py3-none-any.whl", hash = "sha256:e69b870f0bb60304765b1e3db576aaecf2f9b3e5105afe8cfeff8f2afe6ad067"}, 505 | {file = "makefun-1.15.6.tar.gz", hash = "sha256:26bc63442a6182fb75efed8b51741dd2d1db2f176bec8c64e20a586256b8f149"}, 506 | ] 507 | 508 | [[package]] 509 | name = "orjson" 510 | version = "3.10.15" 511 | description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" 512 | optional = false 513 | python-versions = ">=3.8" 514 | files = [ 515 | {file = "orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04"}, 516 | {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8"}, 517 | {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c2c79fa308e6edb0ffab0a31fd75a7841bf2a79a20ef08a3c6e3b26814c8ca8"}, 518 | {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cb85490aa6bf98abd20607ab5c8324c0acb48d6da7863a51be48505646c814"}, 519 | {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763dadac05e4e9d2bc14938a45a2d0560549561287d41c465d3c58aec818b164"}, 520 | {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a330b9b4734f09a623f74a7490db713695e13b67c959713b78369f26b3dee6bf"}, 521 | {file = "orjson-3.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a61a4622b7ff861f019974f73d8165be1bd9a0855e1cad18ee167acacabeb061"}, 522 | {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd271247691574416b3228db667b84775c497b245fa275c6ab90dc1ffbbd2b3"}, 523 | {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4759b109c37f635aa5c5cc93a1b26927bfde24b254bcc0e1149a9fada253d2d"}, 524 | {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e992fd5cfb8b9f00bfad2fd7a05a4299db2bbe92e6440d9dd2fab27655b3182"}, 525 | {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f95fb363d79366af56c3f26b71df40b9a583b07bbaaf5b317407c4d58497852e"}, 526 | {file = "orjson-3.10.15-cp310-cp310-win32.whl", hash = "sha256:f9875f5fea7492da8ec2444839dcc439b0ef298978f311103d0b7dfd775898ab"}, 527 | {file = "orjson-3.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:17085a6aa91e1cd70ca8533989a18b5433e15d29c574582f76f821737c8d5806"}, 528 | {file = "orjson-3.10.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c4cc83960ab79a4031f3119cc4b1a1c627a3dc09df125b27c4201dff2af7eaa6"}, 529 | {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddbeef2481d895ab8be5185f2432c334d6dec1f5d1933a9c83014d188e102cef"}, 530 | {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e590a0477b23ecd5b0ac865b1b907b01b3c5535f5e8a8f6ab0e503efb896334"}, 531 | {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6be38bd103d2fd9bdfa31c2720b23b5d47c6796bcb1d1b598e3924441b4298d"}, 532 | {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff4f6edb1578960ed628a3b998fa54d78d9bb3e2eb2cfc5c2a09732431c678d0"}, 533 | {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0482b21d0462eddd67e7fce10b89e0b6ac56570424662b685a0d6fccf581e13"}, 534 | {file = "orjson-3.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bb5cc3527036ae3d98b65e37b7986a918955f85332c1ee07f9d3f82f3a6899b5"}, 535 | {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d569c1c462912acdd119ccbf719cf7102ea2c67dd03b99edcb1a3048651ac96b"}, 536 | {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1e6d33efab6b71d67f22bf2962895d3dc6f82a6273a965fab762e64fa90dc399"}, 537 | {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c33be3795e299f565681d69852ac8c1bc5c84863c0b0030b2b3468843be90388"}, 538 | {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eea80037b9fae5339b214f59308ef0589fc06dc870578b7cce6d71eb2096764c"}, 539 | {file = "orjson-3.10.15-cp311-cp311-win32.whl", hash = "sha256:d5ac11b659fd798228a7adba3e37c010e0152b78b1982897020a8e019a94882e"}, 540 | {file = "orjson-3.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:cf45e0214c593660339ef63e875f32ddd5aa3b4adc15e662cdb80dc49e194f8e"}, 541 | {file = "orjson-3.10.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d11c0714fc85bfcf36ada1179400862da3288fc785c30e8297844c867d7505a"}, 542 | {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba5a1e85d554e3897fa9fe6fbcff2ed32d55008973ec9a2b992bd9a65d2352d"}, 543 | {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7723ad949a0ea502df656948ddd8b392780a5beaa4c3b5f97e525191b102fff0"}, 544 | {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fd9bc64421e9fe9bd88039e7ce8e58d4fead67ca88e3a4014b143cec7684fd4"}, 545 | {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dadba0e7b6594216c214ef7894c4bd5f08d7c0135f4dd0145600be4fbcc16767"}, 546 | {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48f59114fe318f33bbaee8ebeda696d8ccc94c9e90bc27dbe72153094e26f41"}, 547 | {file = "orjson-3.10.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:035fb83585e0f15e076759b6fedaf0abb460d1765b6a36f48018a52858443514"}, 548 | {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d13b7fe322d75bf84464b075eafd8e7dd9eae05649aa2a5354cfa32f43c59f17"}, 549 | {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7066b74f9f259849629e0d04db6609db4cf5b973248f455ba5d3bd58a4daaa5b"}, 550 | {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88dc3f65a026bd3175eb157fea994fca6ac7c4c8579fc5a86fc2114ad05705b7"}, 551 | {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b342567e5465bd99faa559507fe45e33fc76b9fb868a63f1642c6bc0735ad02a"}, 552 | {file = "orjson-3.10.15-cp312-cp312-win32.whl", hash = "sha256:0a4f27ea5617828e6b58922fdbec67b0aa4bb844e2d363b9244c47fa2180e665"}, 553 | {file = "orjson-3.10.15-cp312-cp312-win_amd64.whl", hash = "sha256:ef5b87e7aa9545ddadd2309efe6824bd3dd64ac101c15dae0f2f597911d46eaa"}, 554 | {file = "orjson-3.10.15-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bae0e6ec2b7ba6895198cd981b7cca95d1487d0147c8ed751e5632ad16f031a6"}, 555 | {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93ce145b2db1252dd86af37d4165b6faa83072b46e3995ecc95d4b2301b725a"}, 556 | {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c203f6f969210128af3acae0ef9ea6aab9782939f45f6fe02d05958fe761ef9"}, 557 | {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8918719572d662e18b8af66aef699d8c21072e54b6c82a3f8f6404c1f5ccd5e0"}, 558 | {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f71eae9651465dff70aa80db92586ad5b92df46a9373ee55252109bb6b703307"}, 559 | {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e117eb299a35f2634e25ed120c37c641398826c2f5a3d3cc39f5993b96171b9e"}, 560 | {file = "orjson-3.10.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13242f12d295e83c2955756a574ddd6741c81e5b99f2bef8ed8d53e47a01e4b7"}, 561 | {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7946922ada8f3e0b7b958cc3eb22cfcf6c0df83d1fe5521b4a100103e3fa84c8"}, 562 | {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b7155eb1623347f0f22c38c9abdd738b287e39b9982e1da227503387b81b34ca"}, 563 | {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:208beedfa807c922da4e81061dafa9c8489c6328934ca2a562efa707e049e561"}, 564 | {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eca81f83b1b8c07449e1d6ff7074e82e3fd6777e588f1a6632127f286a968825"}, 565 | {file = "orjson-3.10.15-cp313-cp313-win32.whl", hash = "sha256:c03cd6eea1bd3b949d0d007c8d57049aa2b39bd49f58b4b2af571a5d3833d890"}, 566 | {file = "orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf"}, 567 | {file = "orjson-3.10.15-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5e8afd6200e12771467a1a44e5ad780614b86abb4b11862ec54861a82d677746"}, 568 | {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da9a18c500f19273e9e104cca8c1f0b40a6470bcccfc33afcc088045d0bf5ea6"}, 569 | {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb00b7bfbdf5d34a13180e4805d76b4567025da19a197645ca746fc2fb536586"}, 570 | {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33aedc3d903378e257047fee506f11e0833146ca3e57a1a1fb0ddb789876c1e1"}, 571 | {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd0099ae6aed5eb1fc84c9eb72b95505a3df4267e6962eb93cdd5af03be71c98"}, 572 | {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c864a80a2d467d7786274fce0e4f93ef2a7ca4ff31f7fc5634225aaa4e9e98c"}, 573 | {file = "orjson-3.10.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c25774c9e88a3e0013d7d1a6c8056926b607a61edd423b50eb5c88fd7f2823ae"}, 574 | {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e78c211d0074e783d824ce7bb85bf459f93a233eb67a5b5003498232ddfb0e8a"}, 575 | {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:43e17289ffdbbac8f39243916c893d2ae41a2ea1a9cbb060a56a4d75286351ae"}, 576 | {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:781d54657063f361e89714293c095f506c533582ee40a426cb6489c48a637b81"}, 577 | {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6875210307d36c94873f553786a808af2788e362bd0cf4c8e66d976791e7b528"}, 578 | {file = "orjson-3.10.15-cp38-cp38-win32.whl", hash = "sha256:305b38b2b8f8083cc3d618927d7f424349afce5975b316d33075ef0f73576b60"}, 579 | {file = "orjson-3.10.15-cp38-cp38-win_amd64.whl", hash = "sha256:5dd9ef1639878cc3efffed349543cbf9372bdbd79f478615a1c633fe4e4180d1"}, 580 | {file = "orjson-3.10.15-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ffe19f3e8d68111e8644d4f4e267a069ca427926855582ff01fc012496d19969"}, 581 | {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d433bf32a363823863a96561a555227c18a522a8217a6f9400f00ddc70139ae2"}, 582 | {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da03392674f59a95d03fa5fb9fe3a160b0511ad84b7a3914699ea5a1b3a38da2"}, 583 | {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a63bb41559b05360ded9132032239e47983a39b151af1201f07ec9370715c82"}, 584 | {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3766ac4702f8f795ff3fa067968e806b4344af257011858cc3d6d8721588b53f"}, 585 | {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a1c73dcc8fadbd7c55802d9aa093b36878d34a3b3222c41052ce6b0fc65f8e8"}, 586 | {file = "orjson-3.10.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b299383825eafe642cbab34be762ccff9fd3408d72726a6b2a4506d410a71ab3"}, 587 | {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:abc7abecdbf67a173ef1316036ebbf54ce400ef2300b4e26a7b843bd446c2480"}, 588 | {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:3614ea508d522a621384c1d6639016a5a2e4f027f3e4a1c93a51867615d28829"}, 589 | {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:295c70f9dc154307777ba30fe29ff15c1bcc9dfc5c48632f37d20a607e9ba85a"}, 590 | {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:63309e3ff924c62404923c80b9e2048c1f74ba4b615e7584584389ada50ed428"}, 591 | {file = "orjson-3.10.15-cp39-cp39-win32.whl", hash = "sha256:a2f708c62d026fb5340788ba94a55c23df4e1869fec74be455e0b2f5363b8507"}, 592 | {file = "orjson-3.10.15-cp39-cp39-win_amd64.whl", hash = "sha256:efcf6c735c3d22ef60c4aa27a5238f1a477df85e9b15f2142f9d669beb2d13fd"}, 593 | {file = "orjson-3.10.15.tar.gz", hash = "sha256:05ca7fe452a2e9d8d9d706a2984c95b9c2ebc5db417ce0b7a49b91d50642a23e"}, 594 | ] 595 | 596 | [[package]] 597 | name = "packaging" 598 | version = "24.2" 599 | description = "Core utilities for Python packages" 600 | optional = false 601 | python-versions = ">=3.8" 602 | files = [ 603 | {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, 604 | {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, 605 | ] 606 | 607 | [[package]] 608 | name = "pathvalidate" 609 | version = "3.2.3" 610 | description = "pathvalidate is a Python library to sanitize/validate a string such as filenames/file-paths/etc." 611 | optional = false 612 | python-versions = ">=3.9" 613 | files = [ 614 | {file = "pathvalidate-3.2.3-py3-none-any.whl", hash = "sha256:5eaf0562e345d4b6d0c0239d0f690c3bd84d2a9a3c4c73b99ea667401b27bee1"}, 615 | {file = "pathvalidate-3.2.3.tar.gz", hash = "sha256:59b5b9278e30382d6d213497623043ebe63f10e29055be4419a9c04c721739cb"}, 616 | ] 617 | 618 | [package.extras] 619 | docs = ["Sphinx (>=2.4)", "sphinx_rtd_theme (>=1.2.2)", "urllib3 (<2)"] 620 | readme = ["path (>=13,<18)", "readmemaker (>=1.2.0)"] 621 | test = ["Faker (>=1.0.8)", "allpairspy (>=2)", "click (>=6.2)", "pytest (>=6.0.1)", "pytest-md-report (>=0.6.2)"] 622 | 623 | [[package]] 624 | name = "pendulum" 625 | version = "3.0.0" 626 | description = "Python datetimes made easy" 627 | optional = false 628 | python-versions = ">=3.8" 629 | files = [ 630 | {file = "pendulum-3.0.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2cf9e53ef11668e07f73190c805dbdf07a1939c3298b78d5a9203a86775d1bfd"}, 631 | {file = "pendulum-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fb551b9b5e6059377889d2d878d940fd0bbb80ae4810543db18e6f77b02c5ef6"}, 632 | {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c58227ac260d5b01fc1025176d7b31858c9f62595737f350d22124a9a3ad82d"}, 633 | {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60fb6f415fea93a11c52578eaa10594568a6716602be8430b167eb0d730f3332"}, 634 | {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b69f6b4dbcb86f2c2fe696ba991e67347bcf87fe601362a1aba6431454b46bde"}, 635 | {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:138afa9c373ee450ede206db5a5e9004fd3011b3c6bbe1e57015395cd076a09f"}, 636 | {file = "pendulum-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:83d9031f39c6da9677164241fd0d37fbfc9dc8ade7043b5d6d62f56e81af8ad2"}, 637 | {file = "pendulum-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c2308af4033fa534f089595bcd40a95a39988ce4059ccd3dc6acb9ef14ca44a"}, 638 | {file = "pendulum-3.0.0-cp310-none-win_amd64.whl", hash = "sha256:9a59637cdb8462bdf2dbcb9d389518c0263799189d773ad5c11db6b13064fa79"}, 639 | {file = "pendulum-3.0.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3725245c0352c95d6ca297193192020d1b0c0f83d5ee6bb09964edc2b5a2d508"}, 640 | {file = "pendulum-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6c035f03a3e565ed132927e2c1b691de0dbf4eb53b02a5a3c5a97e1a64e17bec"}, 641 | {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597e66e63cbd68dd6d58ac46cb7a92363d2088d37ccde2dae4332ef23e95cd00"}, 642 | {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99a0f8172e19f3f0c0e4ace0ad1595134d5243cf75985dc2233e8f9e8de263ca"}, 643 | {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:77d8839e20f54706aed425bec82a83b4aec74db07f26acd039905d1237a5e1d4"}, 644 | {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afde30e8146292b059020fbc8b6f8fd4a60ae7c5e6f0afef937bbb24880bdf01"}, 645 | {file = "pendulum-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:660434a6fcf6303c4efd36713ca9212c753140107ee169a3fc6c49c4711c2a05"}, 646 | {file = "pendulum-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dee9e5a48c6999dc1106eb7eea3e3a50e98a50651b72c08a87ee2154e544b33e"}, 647 | {file = "pendulum-3.0.0-cp311-none-win_amd64.whl", hash = "sha256:d4cdecde90aec2d67cebe4042fd2a87a4441cc02152ed7ed8fb3ebb110b94ec4"}, 648 | {file = "pendulum-3.0.0-cp311-none-win_arm64.whl", hash = "sha256:773c3bc4ddda2dda9f1b9d51fe06762f9200f3293d75c4660c19b2614b991d83"}, 649 | {file = "pendulum-3.0.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:409e64e41418c49f973d43a28afe5df1df4f1dd87c41c7c90f1a63f61ae0f1f7"}, 650 | {file = "pendulum-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a38ad2121c5ec7c4c190c7334e789c3b4624798859156b138fcc4d92295835dc"}, 651 | {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fde4d0b2024b9785f66b7f30ed59281bd60d63d9213cda0eb0910ead777f6d37"}, 652 | {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b2c5675769fb6d4c11238132962939b960fcb365436b6d623c5864287faa319"}, 653 | {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8af95e03e066826f0f4c65811cbee1b3123d4a45a1c3a2b4fc23c4b0dff893b5"}, 654 | {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2165a8f33cb15e06c67070b8afc87a62b85c5a273e3aaa6bc9d15c93a4920d6f"}, 655 | {file = "pendulum-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ad5e65b874b5e56bd942546ea7ba9dd1d6a25121db1c517700f1c9de91b28518"}, 656 | {file = "pendulum-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17fe4b2c844bbf5f0ece69cfd959fa02957c61317b2161763950d88fed8e13b9"}, 657 | {file = "pendulum-3.0.0-cp312-none-win_amd64.whl", hash = "sha256:78f8f4e7efe5066aca24a7a57511b9c2119f5c2b5eb81c46ff9222ce11e0a7a5"}, 658 | {file = "pendulum-3.0.0-cp312-none-win_arm64.whl", hash = "sha256:28f49d8d1e32aae9c284a90b6bb3873eee15ec6e1d9042edd611b22a94ac462f"}, 659 | {file = "pendulum-3.0.0-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d4e2512f4e1a4670284a153b214db9719eb5d14ac55ada5b76cbdb8c5c00399d"}, 660 | {file = "pendulum-3.0.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:3d897eb50883cc58d9b92f6405245f84b9286cd2de6e8694cb9ea5cb15195a32"}, 661 | {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e169cc2ca419517f397811bbe4589cf3cd13fca6dc38bb352ba15ea90739ebb"}, 662 | {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f17c3084a4524ebefd9255513692f7e7360e23c8853dc6f10c64cc184e1217ab"}, 663 | {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:826d6e258052715f64d05ae0fc9040c0151e6a87aae7c109ba9a0ed930ce4000"}, 664 | {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2aae97087872ef152a0c40e06100b3665d8cb86b59bc8471ca7c26132fccd0f"}, 665 | {file = "pendulum-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ac65eeec2250d03106b5e81284ad47f0d417ca299a45e89ccc69e36130ca8bc7"}, 666 | {file = "pendulum-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a5346d08f3f4a6e9e672187faa179c7bf9227897081d7121866358af369f44f9"}, 667 | {file = "pendulum-3.0.0-cp37-none-win_amd64.whl", hash = "sha256:235d64e87946d8f95c796af34818c76e0f88c94d624c268693c85b723b698aa9"}, 668 | {file = "pendulum-3.0.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:6a881d9c2a7f85bc9adafcfe671df5207f51f5715ae61f5d838b77a1356e8b7b"}, 669 | {file = "pendulum-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d7762d2076b9b1cb718a6631ad6c16c23fc3fac76cbb8c454e81e80be98daa34"}, 670 | {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e8e36a8130819d97a479a0e7bf379b66b3b1b520e5dc46bd7eb14634338df8c"}, 671 | {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dc843253ac373358ffc0711960e2dd5b94ab67530a3e204d85c6e8cb2c5fa10"}, 672 | {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a78ad3635d609ceb1e97d6aedef6a6a6f93433ddb2312888e668365908c7120"}, 673 | {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30a137e9e0d1f751e60e67d11fc67781a572db76b2296f7b4d44554761049d6"}, 674 | {file = "pendulum-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c95984037987f4a457bb760455d9ca80467be792236b69d0084f228a8ada0162"}, 675 | {file = "pendulum-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d29c6e578fe0f893766c0d286adbf0b3c726a4e2341eba0917ec79c50274ec16"}, 676 | {file = "pendulum-3.0.0-cp38-none-win_amd64.whl", hash = "sha256:deaba8e16dbfcb3d7a6b5fabdd5a38b7c982809567479987b9c89572df62e027"}, 677 | {file = "pendulum-3.0.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b11aceea5b20b4b5382962b321dbc354af0defe35daa84e9ff3aae3c230df694"}, 678 | {file = "pendulum-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a90d4d504e82ad236afac9adca4d6a19e4865f717034fc69bafb112c320dcc8f"}, 679 | {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:825799c6b66e3734227756fa746cc34b3549c48693325b8b9f823cb7d21b19ac"}, 680 | {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad769e98dc07972e24afe0cff8d365cb6f0ebc7e65620aa1976fcfbcadc4c6f3"}, 681 | {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6fc26907eb5fb8cc6188cc620bc2075a6c534d981a2f045daa5f79dfe50d512"}, 682 | {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c717eab1b6d898c00a3e0fa7781d615b5c5136bbd40abe82be100bb06df7a56"}, 683 | {file = "pendulum-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3ddd1d66d1a714ce43acfe337190be055cdc221d911fc886d5a3aae28e14b76d"}, 684 | {file = "pendulum-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:822172853d7a9cf6da95d7b66a16c7160cb99ae6df55d44373888181d7a06edc"}, 685 | {file = "pendulum-3.0.0-cp39-none-win_amd64.whl", hash = "sha256:840de1b49cf1ec54c225a2a6f4f0784d50bd47f68e41dc005b7f67c7d5b5f3ae"}, 686 | {file = "pendulum-3.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b1f74d1e6ffe5d01d6023870e2ce5c2191486928823196f8575dcc786e107b1"}, 687 | {file = "pendulum-3.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:729e9f93756a2cdfa77d0fc82068346e9731c7e884097160603872686e570f07"}, 688 | {file = "pendulum-3.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e586acc0b450cd21cbf0db6bae386237011b75260a3adceddc4be15334689a9a"}, 689 | {file = "pendulum-3.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22e7944ffc1f0099a79ff468ee9630c73f8c7835cd76fdb57ef7320e6a409df4"}, 690 | {file = "pendulum-3.0.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:fa30af36bd8e50686846bdace37cf6707bdd044e5cb6e1109acbad3277232e04"}, 691 | {file = "pendulum-3.0.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:440215347b11914ae707981b9a57ab9c7b6983ab0babde07063c6ee75c0dc6e7"}, 692 | {file = "pendulum-3.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:314c4038dc5e6a52991570f50edb2f08c339debdf8cea68ac355b32c4174e820"}, 693 | {file = "pendulum-3.0.0-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5acb1d386337415f74f4d1955c4ce8d0201978c162927d07df8eb0692b2d8533"}, 694 | {file = "pendulum-3.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a789e12fbdefaffb7b8ac67f9d8f22ba17a3050ceaaa635cd1cc4645773a4b1e"}, 695 | {file = "pendulum-3.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:860aa9b8a888e5913bd70d819306749e5eb488e6b99cd6c47beb701b22bdecf5"}, 696 | {file = "pendulum-3.0.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5ebc65ea033ef0281368217fbf59f5cb05b338ac4dd23d60959c7afcd79a60a0"}, 697 | {file = "pendulum-3.0.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d9fef18ab0386ef6a9ac7bad7e43ded42c83ff7ad412f950633854f90d59afa8"}, 698 | {file = "pendulum-3.0.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1c134ba2f0571d0b68b83f6972e2307a55a5a849e7dac8505c715c531d2a8795"}, 699 | {file = "pendulum-3.0.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:385680812e7e18af200bb9b4a49777418c32422d05ad5a8eb85144c4a285907b"}, 700 | {file = "pendulum-3.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eec91cd87c59fb32ec49eb722f375bd58f4be790cae11c1b70fac3ee4f00da0"}, 701 | {file = "pendulum-3.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4386bffeca23c4b69ad50a36211f75b35a4deb6210bdca112ac3043deb7e494a"}, 702 | {file = "pendulum-3.0.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dfbcf1661d7146d7698da4b86e7f04814221081e9fe154183e34f4c5f5fa3bf8"}, 703 | {file = "pendulum-3.0.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:04a1094a5aa1daa34a6b57c865b25f691848c61583fb22722a4df5699f6bf74c"}, 704 | {file = "pendulum-3.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5b0ec85b9045bd49dd3a3493a5e7ddfd31c36a2a60da387c419fa04abcaecb23"}, 705 | {file = "pendulum-3.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0a15b90129765b705eb2039062a6daf4d22c4e28d1a54fa260892e8c3ae6e157"}, 706 | {file = "pendulum-3.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:bb8f6d7acd67a67d6fedd361ad2958ff0539445ef51cbe8cd288db4306503cd0"}, 707 | {file = "pendulum-3.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd69b15374bef7e4b4440612915315cc42e8575fcda2a3d7586a0d88192d0c88"}, 708 | {file = "pendulum-3.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc00f8110db6898360c53c812872662e077eaf9c75515d53ecc65d886eec209a"}, 709 | {file = "pendulum-3.0.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:83a44e8b40655d0ba565a5c3d1365d27e3e6778ae2a05b69124db9e471255c4a"}, 710 | {file = "pendulum-3.0.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1a3604e9fbc06b788041b2a8b78f75c243021e0f512447806a6d37ee5214905d"}, 711 | {file = "pendulum-3.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:92c307ae7accebd06cbae4729f0ba9fa724df5f7d91a0964b1b972a22baa482b"}, 712 | {file = "pendulum-3.0.0.tar.gz", hash = "sha256:5d034998dea404ec31fae27af6b22cff1708f830a1ed7353be4d1019bb9f584e"}, 713 | ] 714 | 715 | [package.dependencies] 716 | python-dateutil = ">=2.6" 717 | tzdata = ">=2020.1" 718 | 719 | [package.extras] 720 | test = ["time-machine (>=2.6.0)"] 721 | 722 | [[package]] 723 | name = "pluggy" 724 | version = "1.5.0" 725 | description = "plugin and hook calling mechanisms for python" 726 | optional = false 727 | python-versions = ">=3.8" 728 | files = [ 729 | {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, 730 | {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, 731 | ] 732 | 733 | [package.extras] 734 | dev = ["pre-commit", "tox"] 735 | testing = ["pytest", "pytest-benchmark"] 736 | 737 | [[package]] 738 | name = "ply" 739 | version = "3.11" 740 | description = "Python Lex & Yacc" 741 | optional = false 742 | python-versions = "*" 743 | files = [ 744 | {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, 745 | {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, 746 | ] 747 | 748 | [[package]] 749 | name = "pyarrow" 750 | version = "19.0.1" 751 | description = "Python library for Apache Arrow" 752 | optional = false 753 | python-versions = ">=3.9" 754 | files = [ 755 | {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fc28912a2dc924dddc2087679cc8b7263accc71b9ff025a1362b004711661a69"}, 756 | {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fca15aabbe9b8355800d923cc2e82c8ef514af321e18b437c3d782aa884eaeec"}, 757 | {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad76aef7f5f7e4a757fddcdcf010a8290958f09e3470ea458c80d26f4316ae89"}, 758 | {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d03c9d6f2a3dffbd62671ca070f13fc527bb1867b4ec2b98c7eeed381d4f389a"}, 759 | {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:65cf9feebab489b19cdfcfe4aa82f62147218558d8d3f0fc1e9dea0ab8e7905a"}, 760 | {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:41f9706fbe505e0abc10e84bf3a906a1338905cbbcf1177b71486b03e6ea6608"}, 761 | {file = "pyarrow-19.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6cb2335a411b713fdf1e82a752162f72d4a7b5dbc588e32aa18383318b05866"}, 762 | {file = "pyarrow-19.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc55d71898ea30dc95900297d191377caba257612f384207fe9f8293b5850f90"}, 763 | {file = "pyarrow-19.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7a544ec12de66769612b2d6988c36adc96fb9767ecc8ee0a4d270b10b1c51e00"}, 764 | {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0148bb4fc158bfbc3d6dfe5001d93ebeed253793fff4435167f6ce1dc4bddeae"}, 765 | {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f24faab6ed18f216a37870d8c5623f9c044566d75ec586ef884e13a02a9d62c5"}, 766 | {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:4982f8e2b7afd6dae8608d70ba5bd91699077323f812a0448d8b7abdff6cb5d3"}, 767 | {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:49a3aecb62c1be1d822f8bf629226d4a96418228a42f5b40835c1f10d42e4db6"}, 768 | {file = "pyarrow-19.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:008a4009efdb4ea3d2e18f05cd31f9d43c388aad29c636112c2966605ba33466"}, 769 | {file = "pyarrow-19.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b"}, 770 | {file = "pyarrow-19.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294"}, 771 | {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14"}, 772 | {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34"}, 773 | {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6"}, 774 | {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832"}, 775 | {file = "pyarrow-19.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960"}, 776 | {file = "pyarrow-19.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c"}, 777 | {file = "pyarrow-19.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae"}, 778 | {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4"}, 779 | {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2"}, 780 | {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6"}, 781 | {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136"}, 782 | {file = "pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef"}, 783 | {file = "pyarrow-19.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0"}, 784 | {file = "pyarrow-19.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9"}, 785 | {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3"}, 786 | {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6"}, 787 | {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a"}, 788 | {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8"}, 789 | {file = "pyarrow-19.0.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b9766a47a9cb56fefe95cb27f535038b5a195707a08bf61b180e642324963b46"}, 790 | {file = "pyarrow-19.0.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:6c5941c1aac89a6c2f2b16cd64fe76bcdb94b2b1e99ca6459de4e6f07638d755"}, 791 | {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd44d66093a239358d07c42a91eebf5015aa54fccba959db899f932218ac9cc8"}, 792 | {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:335d170e050bcc7da867a1ed8ffb8b44c57aaa6e0843b156a501298657b1e972"}, 793 | {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:1c7556165bd38cf0cd992df2636f8bcdd2d4b26916c6b7e646101aff3c16f76f"}, 794 | {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:699799f9c80bebcf1da0983ba86d7f289c5a2a5c04b945e2f2bcf7e874a91911"}, 795 | {file = "pyarrow-19.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8464c9fbe6d94a7fe1599e7e8965f350fd233532868232ab2596a71586c5a429"}, 796 | {file = "pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e"}, 797 | ] 798 | 799 | [package.extras] 800 | test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] 801 | 802 | [[package]] 803 | name = "python-dateutil" 804 | version = "2.9.0.post0" 805 | description = "Extensions to the standard Python datetime module" 806 | optional = false 807 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 808 | files = [ 809 | {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, 810 | {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, 811 | ] 812 | 813 | [package.dependencies] 814 | six = ">=1.5" 815 | 816 | [[package]] 817 | name = "pytz" 818 | version = "2025.1" 819 | description = "World timezone definitions, modern and historical" 820 | optional = false 821 | python-versions = "*" 822 | files = [ 823 | {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, 824 | {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, 825 | ] 826 | 827 | [[package]] 828 | name = "pyyaml" 829 | version = "6.0.2" 830 | description = "YAML parser and emitter for Python" 831 | optional = false 832 | python-versions = ">=3.8" 833 | files = [ 834 | {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, 835 | {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, 836 | {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, 837 | {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, 838 | {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, 839 | {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, 840 | {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, 841 | {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, 842 | {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, 843 | {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, 844 | {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, 845 | {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, 846 | {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, 847 | {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, 848 | {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, 849 | {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, 850 | {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, 851 | {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, 852 | {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, 853 | {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, 854 | {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, 855 | {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, 856 | {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, 857 | {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, 858 | {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, 859 | {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, 860 | {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, 861 | {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, 862 | {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, 863 | {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, 864 | {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, 865 | {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, 866 | {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, 867 | {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, 868 | {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, 869 | {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, 870 | {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, 871 | {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, 872 | {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, 873 | {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, 874 | {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, 875 | {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, 876 | {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, 877 | {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, 878 | {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, 879 | {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, 880 | {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, 881 | {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, 882 | {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, 883 | {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, 884 | {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, 885 | {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, 886 | {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, 887 | ] 888 | 889 | [[package]] 890 | name = "requests" 891 | version = "2.32.3" 892 | description = "Python HTTP for Humans." 893 | optional = false 894 | python-versions = ">=3.8" 895 | files = [ 896 | {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, 897 | {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, 898 | ] 899 | 900 | [package.dependencies] 901 | certifi = ">=2017.4.17" 902 | charset-normalizer = ">=2,<4" 903 | idna = ">=2.5,<4" 904 | urllib3 = ">=1.21.1,<3" 905 | 906 | [package.extras] 907 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 908 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 909 | 910 | [[package]] 911 | name = "requirements-parser" 912 | version = "0.11.0" 913 | description = "This is a small Python module for parsing Pip requirement files." 914 | optional = false 915 | python-versions = "<4.0,>=3.8" 916 | files = [ 917 | {file = "requirements_parser-0.11.0-py3-none-any.whl", hash = "sha256:50379eb50311834386c2568263ae5225d7b9d0867fb55cf4ecc93959de2c2684"}, 918 | {file = "requirements_parser-0.11.0.tar.gz", hash = "sha256:35f36dc969d14830bf459803da84f314dc3d17c802592e9e970f63d0359e5920"}, 919 | ] 920 | 921 | [package.dependencies] 922 | packaging = ">=23.2" 923 | types-setuptools = ">=69.1.0" 924 | 925 | [[package]] 926 | name = "ruff" 927 | version = "0.11.0" 928 | description = "An extremely fast Python linter and code formatter, written in Rust." 929 | optional = false 930 | python-versions = ">=3.7" 931 | files = [ 932 | {file = "ruff-0.11.0-py3-none-linux_armv6l.whl", hash = "sha256:dc67e32bc3b29557513eb7eeabb23efdb25753684b913bebb8a0c62495095acb"}, 933 | {file = "ruff-0.11.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38c23fd9bdec4eb437b4c1e3595905a0a8edfccd63a790f818b28c78fe345639"}, 934 | {file = "ruff-0.11.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7c8661b0be91a38bd56db593e9331beaf9064a79028adee2d5f392674bbc5e88"}, 935 | {file = "ruff-0.11.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6c0e8d3d2db7e9f6efd884f44b8dc542d5b6b590fc4bb334fdbc624d93a29a2"}, 936 | {file = "ruff-0.11.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c3156d3f4b42e57247275a0a7e15a851c165a4fc89c5e8fa30ea6da4f7407b8"}, 937 | {file = "ruff-0.11.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:490b1e147c1260545f6d041c4092483e3f6d8eba81dc2875eaebcf9140b53905"}, 938 | {file = "ruff-0.11.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1bc09a7419e09662983b1312f6fa5dab829d6ab5d11f18c3760be7ca521c9329"}, 939 | {file = "ruff-0.11.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcfa478daf61ac8002214eb2ca5f3e9365048506a9d52b11bea3ecea822bb844"}, 940 | {file = "ruff-0.11.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fbb2aed66fe742a6a3a0075ed467a459b7cedc5ae01008340075909d819df1e"}, 941 | {file = "ruff-0.11.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92c0c1ff014351c0b0cdfdb1e35fa83b780f1e065667167bb9502d47ca41e6db"}, 942 | {file = "ruff-0.11.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e4fd5ff5de5f83e0458a138e8a869c7c5e907541aec32b707f57cf9a5e124445"}, 943 | {file = "ruff-0.11.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:96bc89a5c5fd21a04939773f9e0e276308be0935de06845110f43fd5c2e4ead7"}, 944 | {file = "ruff-0.11.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a9352b9d767889ec5df1483f94870564e8102d4d7e99da52ebf564b882cdc2c7"}, 945 | {file = "ruff-0.11.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:049a191969a10897fe052ef9cc7491b3ef6de79acd7790af7d7897b7a9bfbcb6"}, 946 | {file = "ruff-0.11.0-py3-none-win32.whl", hash = "sha256:3191e9116b6b5bbe187447656f0c8526f0d36b6fd89ad78ccaad6bdc2fad7df2"}, 947 | {file = "ruff-0.11.0-py3-none-win_amd64.whl", hash = "sha256:c58bfa00e740ca0a6c43d41fb004cd22d165302f360aaa56f7126d544db31a21"}, 948 | {file = "ruff-0.11.0-py3-none-win_arm64.whl", hash = "sha256:868364fc23f5aa122b00c6f794211e85f7e78f5dffdf7c590ab90b8c4e69b657"}, 949 | {file = "ruff-0.11.0.tar.gz", hash = "sha256:e55c620690a4a7ee6f1cccb256ec2157dc597d109400ae75bbf944fc9d6462e2"}, 950 | ] 951 | 952 | [[package]] 953 | name = "s3transfer" 954 | version = "0.11.4" 955 | description = "An Amazon S3 Transfer Manager" 956 | optional = false 957 | python-versions = ">=3.8" 958 | files = [ 959 | {file = "s3transfer-0.11.4-py3-none-any.whl", hash = "sha256:ac265fa68318763a03bf2dc4f39d5cbd6a9e178d81cc9483ad27da33637e320d"}, 960 | {file = "s3transfer-0.11.4.tar.gz", hash = "sha256:559f161658e1cf0a911f45940552c696735f5c74e64362e515f333ebed87d679"}, 961 | ] 962 | 963 | [package.dependencies] 964 | botocore = ">=1.37.4,<2.0a.0" 965 | 966 | [package.extras] 967 | crt = ["botocore[crt] (>=1.37.4,<2.0a.0)"] 968 | 969 | [[package]] 970 | name = "semver" 971 | version = "3.0.4" 972 | description = "Python helper for Semantic Versioning (https://semver.org)" 973 | optional = false 974 | python-versions = ">=3.7" 975 | files = [ 976 | {file = "semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746"}, 977 | {file = "semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602"}, 978 | ] 979 | 980 | [[package]] 981 | name = "setuptools" 982 | version = "76.0.0" 983 | description = "Easily download, build, install, upgrade, and uninstall Python packages" 984 | optional = false 985 | python-versions = ">=3.9" 986 | files = [ 987 | {file = "setuptools-76.0.0-py3-none-any.whl", hash = "sha256:199466a166ff664970d0ee145839f5582cb9bca7a0a3a2e795b6a9cb2308e9c6"}, 988 | {file = "setuptools-76.0.0.tar.gz", hash = "sha256:43b4ee60e10b0d0ee98ad11918e114c70701bc6051662a9a675a0496c1a158f4"}, 989 | ] 990 | 991 | [package.extras] 992 | check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] 993 | core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] 994 | cover = ["pytest-cov"] 995 | doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] 996 | enabler = ["pytest-enabler (>=2.2)"] 997 | test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] 998 | type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] 999 | 1000 | [[package]] 1001 | name = "simplejson" 1002 | version = "3.20.1" 1003 | description = "Simple, fast, extensible JSON encoder/decoder for Python" 1004 | optional = false 1005 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.5" 1006 | files = [ 1007 | {file = "simplejson-3.20.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f5272b5866b259fe6c33c4a8c5073bf8b359c3c97b70c298a2f09a69b52c7c41"}, 1008 | {file = "simplejson-3.20.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5c0de368f3052a59a1acf21f8b2dd28686a9e4eba2da7efae7ed9554cb31e7bc"}, 1009 | {file = "simplejson-3.20.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0821871404a537fd0e22eba240c74c0467c28af6cc435903eca394cfc74a0497"}, 1010 | {file = "simplejson-3.20.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:c939a1e576bded47d7d03aa2afc2ae90b928b2cf1d9dc2070ceec51fd463f430"}, 1011 | {file = "simplejson-3.20.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:3c4f0a61cdc05550782ca4a2cdb311ea196c2e6be6b24a09bf71360ca8c3ca9b"}, 1012 | {file = "simplejson-3.20.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:6c21f5c026ca633cfffcb6bc1fac2e99f65cb2b24657d3bef21aed9916cc3bbf"}, 1013 | {file = "simplejson-3.20.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:8d23b7f8d6b72319d6d55a0261089ff621ce87e54731c2d3de6a9bf7be5c028c"}, 1014 | {file = "simplejson-3.20.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:cda5c32a98f392909088111ecec23f2b0d39346ceae1a0fea23ab2d1f84ec21d"}, 1015 | {file = "simplejson-3.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e580aa65d5f6c3bf41b9b4afe74be5d5ddba9576701c107c772d936ea2b5043a"}, 1016 | {file = "simplejson-3.20.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4a586ce4f78cec11f22fe55c5bee0f067e803aab9bad3441afe2181693b5ebb5"}, 1017 | {file = "simplejson-3.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74a1608f9e6e8c27a4008d70a54270868306d80ed48c9df7872f9f4b8ac87808"}, 1018 | {file = "simplejson-3.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03db8cb64154189a92a7786209f24e391644f3a3fa335658be2df2af1960b8d8"}, 1019 | {file = "simplejson-3.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eea7e2b7d858f6fdfbf0fe3cb846d6bd8a45446865bc09960e51f3d473c2271b"}, 1020 | {file = "simplejson-3.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e66712b17d8425bb7ff8968d4c7c7fd5a2dd7bd63728b28356223c000dd2f91f"}, 1021 | {file = "simplejson-3.20.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2cc4f6486f9f515b62f5831ff1888886619b84fc837de68f26d919ba7bbdcbc"}, 1022 | {file = "simplejson-3.20.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a3c2df555ee4016148fa192e2b9cd9e60bc1d40769366134882685e90aee2a1e"}, 1023 | {file = "simplejson-3.20.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:78520f04b7548a5e476b5396c0847e066f1e0a4c0c5e920da1ad65e95f410b11"}, 1024 | {file = "simplejson-3.20.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f4bd49ecde87b0fe9f55cc971449a32832bca9910821f7072bbfae1155eaa007"}, 1025 | {file = "simplejson-3.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7eaae2b88eb5da53caaffdfa50e2e12022553949b88c0df4f9a9663609373f72"}, 1026 | {file = "simplejson-3.20.1-cp310-cp310-win32.whl", hash = "sha256:e836fb88902799eac8debc2b642300748f4860a197fa3d9ea502112b6bb8e142"}, 1027 | {file = "simplejson-3.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:b122a19b552b212fc3b5b96fc5ce92333d4a9ac0a800803e1f17ebb16dac4be5"}, 1028 | {file = "simplejson-3.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:325b8c107253d3217e89d7b50c71015b5b31e2433e6c5bf38967b2f80630a8ca"}, 1029 | {file = "simplejson-3.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88a7baa8211089b9e58d78fbc1b0b322103f3f3d459ff16f03a36cece0d0fcf0"}, 1030 | {file = "simplejson-3.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:299b1007b8101d50d95bc0db1bf5c38dc372e85b504cf77f596462083ee77e3f"}, 1031 | {file = "simplejson-3.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ec618ed65caab48e81e3ed29586236a8e57daef792f1f3bb59504a7e98cd10"}, 1032 | {file = "simplejson-3.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2cdead1d3197f0ff43373cf4730213420523ba48697743e135e26f3d179f38"}, 1033 | {file = "simplejson-3.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3466d2839fdc83e1af42e07b90bc8ff361c4e8796cd66722a40ba14e458faddd"}, 1034 | {file = "simplejson-3.20.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d492ed8e92f3a9f9be829205f44b1d0a89af6582f0cf43e0d129fa477b93fe0c"}, 1035 | {file = "simplejson-3.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f924b485537b640dc69434565463fd6fc0c68c65a8c6e01a823dd26c9983cf79"}, 1036 | {file = "simplejson-3.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e8eacf6a3491bf76ea91a8d46726368a6be0eb94993f60b8583550baae9439e"}, 1037 | {file = "simplejson-3.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d04bf90b4cea7c22d8b19091633908f14a096caa301b24c2f3d85b5068fb8"}, 1038 | {file = "simplejson-3.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:69dd28d4ce38390ea4aaf212902712c0fd1093dc4c1ff67e09687c3c3e15a749"}, 1039 | {file = "simplejson-3.20.1-cp311-cp311-win32.whl", hash = "sha256:dfe7a9da5fd2a3499436cd350f31539e0a6ded5da6b5b3d422df016444d65e43"}, 1040 | {file = "simplejson-3.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:896a6c04d7861d507d800da7642479c3547060bf97419d9ef73d98ced8258766"}, 1041 | {file = "simplejson-3.20.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f31c4a3a7ab18467ee73a27f3e59158255d1520f3aad74315edde7a940f1be23"}, 1042 | {file = "simplejson-3.20.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884e6183d16b725e113b83a6fc0230152ab6627d4d36cb05c89c2c5bccfa7bc6"}, 1043 | {file = "simplejson-3.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03d7a426e416fe0d3337115f04164cd9427eb4256e843a6b8751cacf70abc832"}, 1044 | {file = "simplejson-3.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:000602141d0bddfcff60ea6a6e97d5e10c9db6b17fd2d6c66199fa481b6214bb"}, 1045 | {file = "simplejson-3.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af8377a8af78226e82e3a4349efdde59ffa421ae88be67e18cef915e4023a595"}, 1046 | {file = "simplejson-3.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c7de4c88ab2fbcb8781a3b982ef883696736134e20b1210bca43fb42ff1acf"}, 1047 | {file = "simplejson-3.20.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:455a882ff3f97d810709f7b620007d4e0aca8da71d06fc5c18ba11daf1c4df49"}, 1048 | {file = "simplejson-3.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc0f523ce923e7f38eb67804bc80e0a028c76d7868500aa3f59225574b5d0453"}, 1049 | {file = "simplejson-3.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76461ec929282dde4a08061071a47281ad939d0202dc4e63cdd135844e162fbc"}, 1050 | {file = "simplejson-3.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19c2da8c043607bde4d4ef3a6b633e668a7d2e3d56f40a476a74c5ea71949f"}, 1051 | {file = "simplejson-3.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2578bedaedf6294415197b267d4ef678fea336dd78ee2a6d2f4b028e9d07be3"}, 1052 | {file = "simplejson-3.20.1-cp312-cp312-win32.whl", hash = "sha256:339f407373325a36b7fd744b688ba5bae0666b5d340ec6d98aebc3014bf3d8ea"}, 1053 | {file = "simplejson-3.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:627d4486a1ea7edf1f66bb044ace1ce6b4c1698acd1b05353c97ba4864ea2e17"}, 1054 | {file = "simplejson-3.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:71e849e7ceb2178344998cbe5ade101f1b329460243c79c27fbfc51c0447a7c3"}, 1055 | {file = "simplejson-3.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b63fdbab29dc3868d6f009a59797cefaba315fd43cd32ddd998ee1da28e50e29"}, 1056 | {file = "simplejson-3.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1190f9a3ce644fd50ec277ac4a98c0517f532cfebdcc4bd975c0979a9f05e1fb"}, 1057 | {file = "simplejson-3.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1336ba7bcb722ad487cd265701ff0583c0bb6de638364ca947bb84ecc0015d1"}, 1058 | {file = "simplejson-3.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e975aac6a5acd8b510eba58d5591e10a03e3d16c1cf8a8624ca177491f7230f0"}, 1059 | {file = "simplejson-3.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a6dd11ee282937ad749da6f3b8d87952ad585b26e5edfa10da3ae2536c73078"}, 1060 | {file = "simplejson-3.20.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab980fcc446ab87ea0879edad41a5c28f2d86020014eb035cf5161e8de4474c6"}, 1061 | {file = "simplejson-3.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f5aee2a4cb6b146bd17333ac623610f069f34e8f31d2f4f0c1a2186e50c594f0"}, 1062 | {file = "simplejson-3.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:652d8eecbb9a3b6461b21ec7cf11fd0acbab144e45e600c817ecf18e4580b99e"}, 1063 | {file = "simplejson-3.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c09948f1a486a89251ee3a67c9f8c969b379f6ffff1a6064b41fea3bce0a112"}, 1064 | {file = "simplejson-3.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cbbd7b215ad4fc6f058b5dd4c26ee5c59f72e031dfda3ac183d7968a99e4ca3a"}, 1065 | {file = "simplejson-3.20.1-cp313-cp313-win32.whl", hash = "sha256:ae81e482476eaa088ef9d0120ae5345de924f23962c0c1e20abbdff597631f87"}, 1066 | {file = "simplejson-3.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:1b9fd15853b90aec3b1739f4471efbf1ac05066a2c7041bf8db821bb73cd2ddc"}, 1067 | {file = "simplejson-3.20.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c7edf279c1376f28bf41e916c015a2a08896597869d57d621f55b6a30c7e1e6d"}, 1068 | {file = "simplejson-3.20.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9202b9de38f12e99a40addd1a8d508a13c77f46d87ab1f9095f154667f4fe81"}, 1069 | {file = "simplejson-3.20.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:391345b4157cc4e120027e013bd35c45e2c191e2bf48b8913af488cdc3b9243c"}, 1070 | {file = "simplejson-3.20.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6fdcc9debb711ddd2ad6d69f9386a3d9e8e253234bbb30513e0a7caa9510c51"}, 1071 | {file = "simplejson-3.20.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9daf8cdc7ee8a9e9f7a3b313ba0a003391857e90d0e82fbcd4d614aa05cb7c3b"}, 1072 | {file = "simplejson-3.20.1-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:c02f4868a3a46ffe284a51a88d134dc96feff6079a7115164885331a1ba8ed9f"}, 1073 | {file = "simplejson-3.20.1-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:3d7310172d5340febd258cb147f46aae30ad57c445f4d7e1ae8461c10aaf43b0"}, 1074 | {file = "simplejson-3.20.1-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:4762e05577955312a4c6802f58dd02e040cc79ae59cda510aa1564d84449c102"}, 1075 | {file = "simplejson-3.20.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:8bb98fdf318c05aefd08a92583bd6ee148e93c6756fb1befb7b2d5f27824be78"}, 1076 | {file = "simplejson-3.20.1-cp36-cp36m-win32.whl", hash = "sha256:9a74e70818818981294b8e6956ce3496c5e1bd4726ac864fae473197671f7b85"}, 1077 | {file = "simplejson-3.20.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e041add470e8f8535cc05509485eb7205729a84441f03b25cde80ad48823792e"}, 1078 | {file = "simplejson-3.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7e9d73f46119240e4f4f07868241749d67d09873f40cb968d639aa9ccc488b86"}, 1079 | {file = "simplejson-3.20.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae6e637dc24f8fee332ed23dd070e81394138e42cd4fd9d0923e5045ba122e27"}, 1080 | {file = "simplejson-3.20.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:efd3bc6c6b17e3d4620eb6be5196f0d1c08b6ce7c3101fa8e292b79e0908944b"}, 1081 | {file = "simplejson-3.20.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87fc623d457173a0213bc9ca4e346b83c9d443f63ed5cca847fb0cacea3cfc95"}, 1082 | {file = "simplejson-3.20.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec6a1e0a7aff76f0e008bebfa950188b9c50b58c1885d898145f48fc8e189a56"}, 1083 | {file = "simplejson-3.20.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:9c079606f461a6e950099167e21e13985147c8a24be8eea66c9ad68f73fad744"}, 1084 | {file = "simplejson-3.20.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:9faceb68fba27ef17eda306e4cd97a7b4b14fdadca5fbb15790ba8b26ebeec0c"}, 1085 | {file = "simplejson-3.20.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:7ceed598e4bacbf5133fe7a418f7991bb2df0683f3ac11fbf9e36a2bc7aa4b85"}, 1086 | {file = "simplejson-3.20.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ede69c765e9901861ad7c6139023b7b7d5807c48a2539d817b4ab40018002d5f"}, 1087 | {file = "simplejson-3.20.1-cp37-cp37m-win32.whl", hash = "sha256:d8853c269a4c5146ddca4aa7c70e631795e9d11239d5fedb1c6bbc91ffdebcac"}, 1088 | {file = "simplejson-3.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ed6a17fd397f0e2b3ad668fc9e19253ed2e3875ad9086bd7f795c29a3223f4a1"}, 1089 | {file = "simplejson-3.20.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7551682b60bba3a9e2780742e101cf0a64250e76de7d09b1c4b0c8a7c7cc6834"}, 1090 | {file = "simplejson-3.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd9577ec1c8c3a43040e3787711e4c257c70035b7551a21854b5dec88dad09e1"}, 1091 | {file = "simplejson-3.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8e197e4cf6d42c2c57e7c52cd7c1e7b3e37c5911df1314fb393320131e2101"}, 1092 | {file = "simplejson-3.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bd09c8c75666e7f62a33d2f1fb57f81da1fcbb19a9fe7d7910b5756e1dd6048"}, 1093 | {file = "simplejson-3.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bd6bfe5678d73fbd5328eea6a35216503796428fc47f1237432522febaf3a0c"}, 1094 | {file = "simplejson-3.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b75d448fd0ceb2e7c90e72bb82c41f8462550d48529980bc0bab1d2495bfbb"}, 1095 | {file = "simplejson-3.20.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7e15b716d09f318c8cda3e20f82fae81684ce3d3acd1d7770fa3007df1769de"}, 1096 | {file = "simplejson-3.20.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3e7963197d958fcf9e98b212b80977d56c022384621ff463d98afc3b6b1ce7e8"}, 1097 | {file = "simplejson-3.20.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:2e671dd62051129185d3a9a92c60101f56cbc174854a1a3dfb69114ebd9e1699"}, 1098 | {file = "simplejson-3.20.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e25b2a0c396f3b84fb89573d07b0e1846ed563eb364f2ea8230ca92b8a8cb786"}, 1099 | {file = "simplejson-3.20.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:489c3a43116082bad56795215786313832ba3991cca1f55838e52a553f451ab6"}, 1100 | {file = "simplejson-3.20.1-cp38-cp38-win32.whl", hash = "sha256:4a92e948bad8df7fa900ba2ba0667a98303f3db206cbaac574935c332838208e"}, 1101 | {file = "simplejson-3.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:49d059b8363327eee3c94799dd96782314b2dbd7bcc293b4ad48db69d6f4d362"}, 1102 | {file = "simplejson-3.20.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a8011f1dd1d676befcd4d675ebdbfdbbefd3bf350052b956ba8c699fca7d8cef"}, 1103 | {file = "simplejson-3.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e91703a4c5fec53e36875ae426ad785f4120bd1d93b65bed4752eeccd1789e0c"}, 1104 | {file = "simplejson-3.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e39eaa57c7757daa25bcd21f976c46be443b73dd6c3da47fe5ce7b7048ccefe2"}, 1105 | {file = "simplejson-3.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceab2ce2acdc7fbaa433a93006758db6ba9a659e80c4faa13b80b9d2318e9b17"}, 1106 | {file = "simplejson-3.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d4f320c33277a5b715db5bf5b10dae10c19076bd6d66c2843e04bd12d1f1ea5"}, 1107 | {file = "simplejson-3.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b6436c48e64378fa844d8c9e58a5ed0352bbcfd4028369a9b46679b7ab79d2d"}, 1108 | {file = "simplejson-3.20.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e18345c8dda5d699be8166b61f9d80aaee4545b709f1363f60813dc032dac53"}, 1109 | {file = "simplejson-3.20.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:90b573693d1526bed576f6817e2a492eaaef68f088b57d7a9e83d122bbb49e51"}, 1110 | {file = "simplejson-3.20.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:272cc767826e924a6bd369ea3dbf18e166ded29059c7a4d64d21a9a22424b5b5"}, 1111 | {file = "simplejson-3.20.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:51b41f284d603c4380732d7d619f8b34bd04bc4aa0ed0ed5f4ffd0539b14da44"}, 1112 | {file = "simplejson-3.20.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6e6697a3067d281f01de0fe96fc7cba4ea870d96d7deb7bfcf85186d74456503"}, 1113 | {file = "simplejson-3.20.1-cp39-cp39-win32.whl", hash = "sha256:6dd3a1d5aca87bf947f3339b0f8e8e329f1badf548bdbff37fac63c17936da8e"}, 1114 | {file = "simplejson-3.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:463f1fca8fbf23d088e5850fdd0dd4d5faea8900a9f9680270bd98fd649814ca"}, 1115 | {file = "simplejson-3.20.1-py3-none-any.whl", hash = "sha256:8a6c1bbac39fa4a79f83cbf1df6ccd8ff7069582a9fd8db1e52cea073bc2c697"}, 1116 | {file = "simplejson-3.20.1.tar.gz", hash = "sha256:e64139b4ec4f1f24c142ff7dcafe55a22b811a74d86d66560c8815687143037d"}, 1117 | ] 1118 | 1119 | [[package]] 1120 | name = "six" 1121 | version = "1.17.0" 1122 | description = "Python 2 and 3 compatibility utilities" 1123 | optional = false 1124 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 1125 | files = [ 1126 | {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, 1127 | {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, 1128 | ] 1129 | 1130 | [[package]] 1131 | name = "smmap" 1132 | version = "5.0.2" 1133 | description = "A pure Python implementation of a sliding window memory map manager" 1134 | optional = false 1135 | python-versions = ">=3.7" 1136 | files = [ 1137 | {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, 1138 | {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, 1139 | ] 1140 | 1141 | [[package]] 1142 | name = "tenacity" 1143 | version = "9.0.0" 1144 | description = "Retry code until it succeeds" 1145 | optional = false 1146 | python-versions = ">=3.8" 1147 | files = [ 1148 | {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, 1149 | {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, 1150 | ] 1151 | 1152 | [package.extras] 1153 | doc = ["reno", "sphinx"] 1154 | test = ["pytest", "tornado (>=4.5)", "typeguard"] 1155 | 1156 | [[package]] 1157 | name = "tomlkit" 1158 | version = "0.13.2" 1159 | description = "Style preserving TOML library" 1160 | optional = false 1161 | python-versions = ">=3.8" 1162 | files = [ 1163 | {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, 1164 | {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, 1165 | ] 1166 | 1167 | [[package]] 1168 | name = "types-setuptools" 1169 | version = "76.0.0.20250313" 1170 | description = "Typing stubs for setuptools" 1171 | optional = false 1172 | python-versions = ">=3.9" 1173 | files = [ 1174 | {file = "types_setuptools-76.0.0.20250313-py3-none-any.whl", hash = "sha256:bf454b2a49b8cfd7ebcf5844d4dd5fe4c8666782df1e3663c5866fd51a47460e"}, 1175 | {file = "types_setuptools-76.0.0.20250313.tar.gz", hash = "sha256:b2be66f550f95f3cad2a7d46177b273c7e9c80df7d257fa57addbbcfc8126a9e"}, 1176 | ] 1177 | 1178 | [package.dependencies] 1179 | setuptools = "*" 1180 | 1181 | [[package]] 1182 | name = "typing-extensions" 1183 | version = "4.12.2" 1184 | description = "Backported and Experimental Type Hints for Python 3.8+" 1185 | optional = false 1186 | python-versions = ">=3.8" 1187 | files = [ 1188 | {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, 1189 | {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, 1190 | ] 1191 | 1192 | [[package]] 1193 | name = "tzdata" 1194 | version = "2025.1" 1195 | description = "Provider of IANA time zone data" 1196 | optional = false 1197 | python-versions = ">=2" 1198 | files = [ 1199 | {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, 1200 | {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, 1201 | ] 1202 | 1203 | [[package]] 1204 | name = "urllib3" 1205 | version = "2.3.0" 1206 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1207 | optional = false 1208 | python-versions = ">=3.9" 1209 | files = [ 1210 | {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, 1211 | {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, 1212 | ] 1213 | 1214 | [package.extras] 1215 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] 1216 | h2 = ["h2 (>=4,<5)"] 1217 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 1218 | zstd = ["zstandard (>=0.18.0)"] 1219 | 1220 | [[package]] 1221 | name = "wheel" 1222 | version = "0.45.1" 1223 | description = "A built-package format for Python" 1224 | optional = false 1225 | python-versions = ">=3.8" 1226 | files = [ 1227 | {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"}, 1228 | {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"}, 1229 | ] 1230 | 1231 | [package.extras] 1232 | test = ["pytest (>=6.0.0)", "setuptools (>=65)"] 1233 | 1234 | [[package]] 1235 | name = "win-precise-time" 1236 | version = "1.4.2" 1237 | description = "" 1238 | optional = false 1239 | python-versions = ">=3.7" 1240 | files = [ 1241 | {file = "win-precise-time-1.4.2.tar.gz", hash = "sha256:89274785cbc5f2997e01675206da3203835a442c60fd97798415c6b3c179c0b9"}, 1242 | {file = "win_precise_time-1.4.2-cp310-cp310-win32.whl", hash = "sha256:7fa13a2247c2ef41cd5e9b930f40716eacc7fc1f079ea72853bd5613fe087a1a"}, 1243 | {file = "win_precise_time-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:bb8e44b0fc35fde268e8a781cdcd9f47d47abcd8089465d2d1d1063976411c8e"}, 1244 | {file = "win_precise_time-1.4.2-cp311-cp311-win32.whl", hash = "sha256:59272655ad6f36910d0b585969402386fa627fca3be24acc9a21be1d550e5db8"}, 1245 | {file = "win_precise_time-1.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:0897bb055f19f3b4336e2ba6bee0115ac20fd7ec615a6d736632e2df77f8851a"}, 1246 | {file = "win_precise_time-1.4.2-cp312-cp312-win32.whl", hash = "sha256:0210dcea88a520c91de1708ae4c881e3c0ddc956daa08b9eabf2b7c35f3109f5"}, 1247 | {file = "win_precise_time-1.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:85670f77cc8accd8f1e6d05073999f77561c23012a9ee988cbd44bb7ce655062"}, 1248 | {file = "win_precise_time-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:3e23693201a0fc6ca39f016871e2581e20c91123734bd48a69259f8c8724eedb"}, 1249 | {file = "win_precise_time-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:07ef644d1bb7705039bc54abfe4b45e99e8dc326dfd1dad5831dab19670508cb"}, 1250 | {file = "win_precise_time-1.4.2-cp38-cp38-win32.whl", hash = "sha256:0a953b00772f205602fa712ef68387b8fb213a30b267ae310aa56bf17605e11b"}, 1251 | {file = "win_precise_time-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b5d83420925beca302b386b19c3e7414ada84b47b42f0680207f1508917a1731"}, 1252 | {file = "win_precise_time-1.4.2-cp39-cp39-win32.whl", hash = "sha256:50d11a6ff92e1be96a8d4bee99ff6dc07a0ea0e2a392b0956bb2192e334f41ba"}, 1253 | {file = "win_precise_time-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f510fa92d9c39ea533c983e1d62c7bc66fdf0a3e3c3bdda48d4ebb634ff7034"}, 1254 | ] 1255 | 1256 | [metadata] 1257 | lock-version = "2.0" 1258 | python-versions = ">=3.12,<3.13" 1259 | content-hash = "ff93df8518ef7f24f5025c08b66936fb278e1888cd71f6de4969d7e334956c7a" 1260 | --------------------------------------------------------------------------------