From 8582444e5656a3dd15eb85a792dbb2482e76d25f Mon Sep 17 00:00:00 2001
From: Jonathon Broughton <760691+jsdbroughton@users.noreply.github.com>
Date: Mon, 17 Feb 2025 23:50:34 +0000
Subject: [PATCH] Add V3 compatibility (#23)
* Update project configuration and name
- Excluded virtual environment folder from module content.
- Changed JDK name to "WSL Checker" for clarity.
- Updated project name in the configuration file.
* Update project configuration and dependencies
- Added source folders for `src` and `tests`.
- Excluded `.devcontainer` and `.idea` directories.
- Updated Black settings in the project configuration.
- Changed Ruff version from 0.9.5 to 0.9.6.
- Enhanced rule processing by grouping rules before application.
- Introduced a new property match mode for better parameter matching.
- Removed unused test files and configurations to clean up the codebase.
* Shifting to local uv - editing toml
* Update CI workflow and project dependencies
- Added steps to the CI workflow for better clarity.
- Switched from Poetry to pip for dependency management.
- Removed poetry.lock file as it's no longer needed.
- Updated Python version specification to 3.12.
- Adjusted project configuration files for new environment settings.
* Update dependencies for pydantic and related packages
- Added pydantic version 2.11.0a2 to dependencies.
- Updated pydantic-core to version 2.29.0.
- Adjusted URLs and hashes for the new package versions in lock file.
- Ensured compatibility with existing requirements in project configuration.
* Update dependencies to stable versions
- Downgraded Pydantic from 2.11.0a2 to 2.10.6
- Updated Pydantic-core version from 2.29.0 to 2.27.2
- Adjusted URLs and hashes for the new package versions in lock file
* Update dependencies to latest versions
- Upgraded Pydantic from 2.10.6 to 2.11.0a2
- Updated Pydantic Core from 2.27.2 to 2.29.0
- Adjusted source URLs and hashes for new package versions
* Update dependencies to stable versions
- Downgraded Pydantic from 2.11.0a2 to 2.10.6
- Updated Pydantic-core version from 2.29.0 to 2.27.2
- Adjusted URLs and hashes for the new package versions in lock file
* Add pre-commit hook and setup script
- Introduced a pre-commit hook to manage dependencies.
- Automatically installs and exports requirements before commits.
- Added a setup script to copy the hook and set permissions.
* Update project config and clean up unused files
- Removed Black configuration options from the project settings.
- Changed Ruff to run on save instead of reformat.
- Deleted example function inputs JSON file.
- Removed flatten helper module as it's no longer needed.
- Updated pyproject.toml with new line length and ignore rules.
- Cleaned up import statements in local test file.
* Update line length and tidy up code comments
- Increased the maximum line length from 100 to 120.
- Cleaned up import statements for better readability.
- Improved docstrings for clarity and consistency.
- Removed unnecessary blank lines and commented-out code.
* Refactor rules handling and improve documentation
- Updated class names from `RevitRules` to `PropertyRules`.
- Adjusted method calls to reflect the new class structure.
- Cleaned up code formatting for better readability.
- Enhanced developer README with clearer setup instructions.
* Add filtering and rule processing features
- Introduced a new filter function to sort objects by category.
- Created a predicates module for mapping spreadsheet predicates to rule methods.
- Refactored rules handling, simplifying parameter checks and value retrievals.
- Enhanced the main automation function with improved input handling and context management.
* Past WIP rules for processing Speckle parameters
- Introduced a new class to manage parameter rules.
- Added methods to check and retrieve display values from Speckle objects.
- Implemented filtering for displayable objects based on defined criteria.
- Created functions to handle Revit parameter checks and value retrievals.
- Included various utility methods for comparing parameter values against thresholds, ranges, and lists.
* Add new JSON test data for building elements
- Introduced a new JSON file containing detailed specifications for various building elements.
- Included parameters such as ID, type, level details, and multiple attributes related to structural components.
- Added information on dimensions, materials, and classifications relevant to the construction context.
* Rename test files and add new parameter tests
- Renamed localtest.py to test_function.py for clarity.
- Added a new test file for parameter checks, covering:
- Object deserialization structure
- Parameter existence and value retrieval in v2 and v3 objects
- Numeric comparisons and pattern matching on parameters
- List-based and boolean parameter checks
* Enhance helper functions and add rule processing
- Updated helper functions for better item retrieval and checks.
- Added new functions to evaluate conditions and process rules against Speckle objects.
- Improved logging with a dedicated print function.
- Streamlined flattening logic in existing methods.
* Add test runner config and new web resources
- Added pytest as the project test runner.
- Created a new XML file for web resource paths.
- Included pytest-assertcount in development dependencies.
* Add robust value comparison methods
- Introduced new static methods for comparing values:
- `is_equal_value`: Compares two values with type handling and optional case sensitivity.
- `is_not_equal_value`: Checks if two values are not equal.
- `is_identical_value`: Verifies if two values are exactly identical, considering case sensitivity and no tolerance for floats.
- `is_not_identical_value`: Checks if two values are not identical.
- Enhanced handling of strings that represent numbers.
* Refactor rules and parameter handling
- Commented out large sections of code for clarity
* Update predicates and enhance tests
- Renamed equality-related methods for clarity.
- Added new methods for "not equal" and "not identical" checks.
- Updated test to return specific objects instead of walls.
- Changed property access in tests to use `.keys()`.
- Introduced multiple tests for stringified number comparisons, case sensitivity, and floating-point precision.
* Add tests for severity level conversion
Created a new test file to validate the `get_severity` function.
- Added parameterised tests for various input cases including valid and invalid severity strings, empty inputs, and non-string types.
- Ensured that all edge cases default to the correct enum value.
* Refactor parameter tests for clarity and efficiency
- Simplified assertions in parameter existence tests.
- Added parameterisation to reduce redundancy across tests.
- Enhanced error messages for better debugging.
- Consolidated similar test cases for v2 and v3 objects.
- Improved structure of boolean and numeric comparison tests.
* Enhance spreadsheet data handling
- Added a function to convert mixed column types.
- Updated the main reading function to use this new conversion.
- Improved error handling for reading TSV files.
* Update version handling in automation function
- Added a global VERSION variable for tracking.
- Updated comments to reflect changes from 'version' to 'VERSION'.
- Adjusted logic to retrieve the version from the root object.
- Enhanced success message to include the current version.
* Improve boolean handling and property search
- Added None handling in boolean conversion.
- Enhanced `find_property` to return raw values if needed.
- Updated traversal logic to avoid revisiting objects.
- Refined comparison methods for better type handling and tolerance.
- Introduced new methods for strict value comparisons with detailed arguments.
* Update predicate method mappings
Switched from string references to actual method names in the predicate mapping. This improves clarity and reduces errors by directly linking predicates to their corresponding methods in PropertyRules. Adjusted some predicate phrases for consistency as well.
* Enhance rule evaluation with severity handling
- Added optional parameters for rule and case numbers in condition evaluation.
- Introduced an Enum for severity levels to standardise reporting.
- Created a function to convert string severities into the SeverityLevel enum, handling various input formats.
- Refactored metadata generation to use the new severity function.
---
.github/workflows/main.yml | 29 +-
.idea/Checker.iml | 11 +-
.idea/misc.xml | 4 +-
.idea/ruff.xml | 2 +
.idea/webResources.xml | 14 +
.python-version | 1 +
DEVELOPER_README.md | 4 +-
example.function_inputs.json | 20 -
flatten.py | 27 -
hooks/pre-commit | 13 +
poetry.lock | 1797 --------------------
pyproject.toml | 52 +-
requirements.txt | 54 +
setup.sh | 9 +
src/filters.py | 31 +
src/function.py | 46 +-
src/helpers.py | 52 +-
src/inputs.py | 22 +
src/predicates.py | 19 +
src/rule_processor.py | 244 +++
src/rules.py | 1004 +++++------
src/rules_old.py | 756 +++++++++
src/spreadsheet.py | 24 +-
test_data/v2_object.json | 3085 ++++++++++++++++++++++++++++++++++
test_data/v3_object.json | 696 ++++++++
tests/conftest.py | 144 +-
tests/localtest.py | 32 -
tests/test_function.py | 30 +-
tests/test_parameters.py | 404 +++++
tests/test_user_entry.py | 33 +
uv.lock | 977 +++++++++++
31 files changed, 7038 insertions(+), 2598 deletions(-)
create mode 100644 .idea/webResources.xml
create mode 100644 .python-version
delete mode 100644 example.function_inputs.json
delete mode 100644 flatten.py
create mode 100644 hooks/pre-commit
delete mode 100644 poetry.lock
create mode 100644 requirements.txt
create mode 100644 setup.sh
create mode 100644 src/filters.py
create mode 100644 src/predicates.py
create mode 100644 src/rule_processor.py
create mode 100644 src/rules_old.py
create mode 100644 test_data/v2_object.json
create mode 100644 test_data/v3_object.json
delete mode 100644 tests/localtest.py
create mode 100644 tests/test_parameters.py
create mode 100644 tests/test_user_entry.py
create mode 100644 uv.lock
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index f753527..6ecf140 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -11,26 +11,33 @@ jobs:
FUNCTION_SCHEMA_FILE_NAME: functionSchema.json
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4.2.2
- - uses: actions/setup-python@v5
+ # Step 1: Checkout the repository
+ - name: Checkout Repository
+ uses: actions/checkout@v4.2.2
+
+ # Step 2: Set up Python
+ - name: Setup Python
+ uses: actions/setup-python@v5
with:
python-version: '3.11'
- - name: Install poetry
+
+ # Step 3: Install dependencies using pip
+ - name: Install Dependencies
run: |
- pip install poetry==1.8.4 &&
- poetry config virtualenvs.create false &&
- poetry config virtualenvs.in-project false &&
- poetry config installer.parallel true
- - name: Restore dependencies
- run: poetry install --no-root
+ python -m pip install --upgrade pip
+ pip install -r requirements.txt
+
+ # Step 4: Generate the schema
- name: Extract functionInputSchema
id: extract_schema
run: |
- python main.py generate_schema ${HOME}/${{ env.FUNCTION_SCHEMA_FILE_NAME }}
+ python main.py generate_schema "${{ env.FUNCTION_SCHEMA_FILE_NAME }}"
+
+ # Step 5: Build and publish the Speckle function
- name: Speckle Automate Function - Build and Publish
uses: specklesystems/speckle-automate-github-composite-action@0.9.0
with:
- speckle_automate_url: ${{ env.SPECKLE_AUTOMATE_URL || vars.SPECKLE_AUTOMATE_URL || 'https://automate.speckle.dev' }}
+ speckle_automate_url: ${{ env.SPECKLE_AUTOMATE_URL || 'https://automate.speckle.dev' }}
speckle_token: ${{ secrets.SPECKLE_FUNCTION_TOKEN }}
speckle_function_id: ${{ secrets.SPECKLE_FUNCTION_ID }}
speckle_function_input_schema_file_path: ${{ env.FUNCTION_SCHEMA_FILE_NAME }}
diff --git a/.idea/Checker.iml b/.idea/Checker.iml
index de5ac07..7d26e2f 100644
--- a/.idea/Checker.iml
+++ b/.idea/Checker.iml
@@ -1,12 +1,19 @@
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 217df23..379246e 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,7 +1,7 @@
-
+
-
+
\ No newline at end of file
diff --git a/.idea/ruff.xml b/.idea/ruff.xml
index 5a28fc5..67c9b85 100644
--- a/.idea/ruff.xml
+++ b/.idea/ruff.xml
@@ -1,7 +1,9 @@
+
+
\ No newline at end of file
diff --git a/.idea/webResources.xml b/.idea/webResources.xml
new file mode 100644
index 0000000..f752b54
--- /dev/null
+++ b/.idea/webResources.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.python-version b/.python-version
new file mode 100644
index 0000000..e4fba21
--- /dev/null
+++ b/.python-version
@@ -0,0 +1 @@
+3.12
diff --git a/DEVELOPER_README.md b/DEVELOPER_README.md
index 2e28c90..6ceae07 100644
--- a/DEVELOPER_README.md
+++ b/DEVELOPER_README.md
@@ -3,11 +3,13 @@
## Setup
1. Install dependencies:
+
```bash
poetry shell && poetry install
```
2. Configure `.env`:
+
```
SPECKLE_TOKEN=your_speckle_token
SPECKLE_SERVER_URL=app.speckle.systems
@@ -32,7 +34,7 @@ poetry run pytest
## Extending Rules
1. Add new predicate to `input_predicate_mapping` in `rules.py`
-2. Create corresponding method in `RevitRules` class
+2. Create corresponding method in `PropertyRules` class
3. Update tests
## Building
diff --git a/example.function_inputs.json b/example.function_inputs.json
deleted file mode 100644
index 71f3160..0000000
--- a/example.function_inputs.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "speckleToken": "YOUR SPEKCLE TOKEN",
- "functionInputs": {
- "whisperMessage": "you are doing something weird",
- "forbiddenSpeckleType": "wall"
- },
- "automationRunData": {
- "project_id": "project id",
- "speckle_server_url": "https://latest.speckle.systems",
- "automation_id": "automation id",
- "automation_run_id": "automation run id",
- "function_run_id": "function run id",
- "triggers": [
- {
- "payload": { "modelId": "model id", "versionId": "version id" },
- "triggerType": "versionCreation"
- }
- ]
- }
-}
diff --git a/flatten.py b/flatten.py
deleted file mode 100644
index 574c118..0000000
--- a/flatten.py
+++ /dev/null
@@ -1,27 +0,0 @@
-"""Helper module for a simple speckle object tree flattening."""
-
-from collections.abc import Iterable
-
-from specklepy.objects import Base
-
-
-def flatten_base(base: Base) -> Iterable[Base]:
- """Flatten a base object into an iterable of bases.
-
- This function recursively traverses the `elements` or `@elements` attribute of the
- base object, yielding each nested base object.
-
- Args:
- base (Base): The base object to flatten.
-
- Yields:
- Base: Each nested base object in the hierarchy.
- """
- # Attempt to get the elements attribute, fallback to @elements if necessary
- elements = getattr(base, "elements", getattr(base, "@elements", None))
-
- if elements is not None:
- for element in elements:
- yield from flatten_base(element)
-
- yield base
diff --git a/hooks/pre-commit b/hooks/pre-commit
new file mode 100644
index 0000000..efdb38a
--- /dev/null
+++ b/hooks/pre-commit
@@ -0,0 +1,13 @@
+#!/bin/bash
+echo "Running pre-commit hook..."
+
+# Ensure dependencies are installed with uv
+uv pip install --requirement requirements.txt
+
+# Export dependencies with uv (and overwrite requirements.txt)
+uv pip freeze > requirements.txt
+
+# Add generated requirements.txt to git
+git add requirements.txt
+
+echo "Pre-commit hook completed successfully!"
diff --git a/poetry.lock b/poetry.lock
deleted file mode 100644
index d038864..0000000
--- a/poetry.lock
+++ /dev/null
@@ -1,1797 +0,0 @@
-# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
-
-[[package]]
-name = "annotated-types"
-version = "0.7.0"
-description = "Reusable constraint types to use with typing.Annotated"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
- {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
-]
-
-[[package]]
-name = "anyio"
-version = "4.8.0"
-description = "High level compatibility layer for multiple asynchronous event loop implementations"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"},
- {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"},
-]
-
-[package.dependencies]
-idna = ">=2.8"
-sniffio = ">=1.1"
-typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""}
-
-[package.extras]
-doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"]
-test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"]
-trio = ["trio (>=0.26.1)"]
-
-[[package]]
-name = "appdirs"
-version = "1.4.4"
-description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
-optional = false
-python-versions = "*"
-files = [
- {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"},
- {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
-]
-
-[[package]]
-name = "attrs"
-version = "23.2.0"
-description = "Classes Without Boilerplate"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"},
- {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"},
-]
-
-[package.extras]
-cov = ["attrs[tests]", "coverage[toml] (>=5.3)"]
-dev = ["attrs[tests]", "pre-commit"]
-docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"]
-tests = ["attrs[tests-no-zope]", "zope-interface"]
-tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"]
-tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"]
-
-[[package]]
-name = "backoff"
-version = "2.2.1"
-description = "Function decoration for backoff and retry"
-optional = false
-python-versions = ">=3.7,<4.0"
-files = [
- {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"},
- {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"},
-]
-
-[[package]]
-name = "black"
-version = "25.1.0"
-description = "The uncompromising code formatter."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"},
- {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"},
- {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"},
- {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"},
- {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"},
- {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"},
- {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"},
- {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"},
- {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"},
- {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"},
- {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"},
- {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"},
- {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"},
- {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"},
- {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"},
- {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"},
- {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"},
- {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"},
- {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"},
- {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"},
- {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"},
- {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"},
-]
-
-[package.dependencies]
-click = ">=8.0.0"
-mypy-extensions = ">=0.4.3"
-packaging = ">=22.0"
-pathspec = ">=0.9.0"
-platformdirs = ">=2"
-
-[package.extras]
-colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.10)"]
-jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
-uvloop = ["uvloop (>=0.15.2)"]
-
-[[package]]
-name = "certifi"
-version = "2025.1.31"
-description = "Python package for providing Mozilla's CA Bundle."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
- {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
-]
-
-[[package]]
-name = "charset-normalizer"
-version = "3.4.1"
-description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"},
- {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
- {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
-]
-
-[[package]]
-name = "click"
-version = "8.1.8"
-description = "Composable command line interface toolkit"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
- {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
-[[package]]
-name = "colorama"
-version = "0.4.6"
-description = "Cross-platform colored terminal text."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-files = [
- {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
- {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
-]
-
-[[package]]
-name = "deprecated"
-version = "1.2.18"
-description = "Python @deprecated decorator to deprecate old python classes, functions or methods."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
-files = [
- {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"},
- {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"},
-]
-
-[package.dependencies]
-wrapt = ">=1.10,<2"
-
-[package.extras]
-dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools", "tox"]
-
-[[package]]
-name = "gql"
-version = "3.5.0"
-description = "GraphQL client for Python"
-optional = false
-python-versions = "*"
-files = [
- {file = "gql-3.5.0-py2.py3-none-any.whl", hash = "sha256:70dda5694a5b194a8441f077aa5fb70cc94e4ec08016117523f013680901ecb7"},
- {file = "gql-3.5.0.tar.gz", hash = "sha256:ccb9c5db543682b28f577069950488218ed65d4ac70bb03b6929aaadaf636de9"},
-]
-
-[package.dependencies]
-anyio = ">=3.0,<5"
-backoff = ">=1.11.1,<3.0"
-graphql-core = ">=3.2,<3.3"
-requests = {version = ">=2.26,<3", optional = true, markers = "extra == \"requests\""}
-requests-toolbelt = {version = ">=1.0.0,<2", optional = true, markers = "extra == \"requests\""}
-websockets = {version = ">=10,<12", optional = true, markers = "extra == \"websockets\""}
-yarl = ">=1.6,<2.0"
-
-[package.extras]
-aiohttp = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)"]
-all = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "websockets (>=10,<12)"]
-botocore = ["botocore (>=1.21,<2)"]
-dev = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "black (==22.3.0)", "botocore (>=1.21,<2)", "check-manifest (>=0.42,<1)", "flake8 (==3.8.1)", "httpx (>=0.23.1,<1)", "isort (==4.3.21)", "mock (==4.0.2)", "mypy (==0.910)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "sphinx (>=5.3.0,<6)", "sphinx-argparse (==0.2.5)", "sphinx-rtd-theme (>=0.4,<1)", "types-aiofiles", "types-mock", "types-requests", "vcrpy (==4.4.0)", "websockets (>=10,<12)"]
-httpx = ["httpx (>=0.23.1,<1)"]
-requests = ["requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)"]
-test = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "vcrpy (==4.4.0)", "websockets (>=10,<12)"]
-test-no-transport = ["aiofiles", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "vcrpy (==4.4.0)"]
-websockets = ["websockets (>=10,<12)"]
-
-[[package]]
-name = "graphql-core"
-version = "3.2.6"
-description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL."
-optional = false
-python-versions = "<4,>=3.6"
-files = [
- {file = "graphql_core-3.2.6-py3-none-any.whl", hash = "sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f"},
- {file = "graphql_core-3.2.6.tar.gz", hash = "sha256:c08eec22f9e40f0bd61d805907e3b3b1b9a320bc606e23dc145eebca07c8fbab"},
-]
-
-[[package]]
-name = "h11"
-version = "0.14.0"
-description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
- {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
-]
-
-[[package]]
-name = "httpcore"
-version = "1.0.7"
-description = "A minimal low-level HTTP client."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"},
- {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"},
-]
-
-[package.dependencies]
-certifi = "*"
-h11 = ">=0.13,<0.15"
-
-[package.extras]
-asyncio = ["anyio (>=4.0,<5.0)"]
-http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (==1.*)"]
-trio = ["trio (>=0.22.0,<1.0)"]
-
-[[package]]
-name = "httpx"
-version = "0.25.2"
-description = "The next generation HTTP client."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "httpx-0.25.2-py3-none-any.whl", hash = "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118"},
- {file = "httpx-0.25.2.tar.gz", hash = "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8"},
-]
-
-[package.dependencies]
-anyio = "*"
-certifi = "*"
-httpcore = "==1.*"
-idna = "*"
-sniffio = "*"
-
-[package.extras]
-brotli = ["brotli", "brotlicffi"]
-cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
-http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (==1.*)"]
-
-[[package]]
-name = "idna"
-version = "3.10"
-description = "Internationalized Domain Names in Applications (IDNA)"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
- {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
-]
-
-[package.extras]
-all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
-
-[[package]]
-name = "iniconfig"
-version = "2.0.0"
-description = "brain-dead simple config-ini parsing"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
- {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
-]
-
-[[package]]
-name = "levenshtein"
-version = "0.26.1"
-description = "Python extension for computing string edit distances and similarities."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "levenshtein-0.26.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8dc4a4aecad538d944a1264c12769c99e3c0bf8e741fc5e454cc954913befb2e"},
- {file = "levenshtein-0.26.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec108f368c12b25787c8b1a4537a1452bc53861c3ee4abc810cc74098278edcd"},
- {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69229d651c97ed5b55b7ce92481ed00635cdbb80fbfb282a22636e6945dc52d5"},
- {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79dcd157046d62482a7719b08ba9e3ce9ed3fc5b015af8ea989c734c702aedd4"},
- {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f53f9173ae21b650b4ed8aef1d0ad0c37821f367c221a982f4d2922b3044e0d"},
- {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3956f3c5c229257dbeabe0b6aacd2c083ebcc1e335842a6ff2217fe6cc03b6b"},
- {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1e83af732726987d2c4cd736f415dae8b966ba17b7a2239c8b7ffe70bfb5543"},
- {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4f052c55046c2a9c9b5f742f39e02fa6e8db8039048b8c1c9e9fdd27c8a240a1"},
- {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9895b3a98f6709e293615fde0dcd1bb0982364278fa2072361a1a31b3e388b7a"},
- {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a3777de1d8bfca054465229beed23994f926311ce666f5a392c8859bb2722f16"},
- {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:81c57e1135c38c5e6e3675b5e2077d8a8d3be32bf0a46c57276c092b1dffc697"},
- {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:91d5e7d984891df3eff7ea9fec8cf06fdfacc03cd074fd1a410435706f73b079"},
- {file = "levenshtein-0.26.1-cp310-cp310-win32.whl", hash = "sha256:f48abff54054b4142ad03b323e80aa89b1d15cabc48ff49eb7a6ff7621829a56"},
- {file = "levenshtein-0.26.1-cp310-cp310-win_amd64.whl", hash = "sha256:79dd6ad799784ea7b23edd56e3bf94b3ca866c4c6dee845658ee75bb4aefdabf"},
- {file = "levenshtein-0.26.1-cp310-cp310-win_arm64.whl", hash = "sha256:3351ddb105ef010cc2ce474894c5d213c83dddb7abb96400beaa4926b0b745bd"},
- {file = "levenshtein-0.26.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:44c51f5d33b3cfb9db518b36f1288437a509edd82da94c4400f6a681758e0cb6"},
- {file = "levenshtein-0.26.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56b93203e725f9df660e2afe3d26ba07d71871b6d6e05b8b767e688e23dfb076"},
- {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:270d36c5da04a0d89990660aea8542227cbd8f5bc34e9fdfadd34916ff904520"},
- {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:480674c05077eeb0b0f748546d4fcbb386d7c737f9fff0010400da3e8b552942"},
- {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13946e37323728695ba7a22f3345c2e907d23f4600bc700bf9b4352fb0c72a48"},
- {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ceb673f572d1d0dc9b1cd75792bb8bad2ae8eb78a7c6721e23a3867d318cb6f2"},
- {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42d6fa242e3b310ce6bfd5af0c83e65ef10b608b885b3bb69863c01fb2fcff98"},
- {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b8b68295808893a81e0a1dbc2274c30dd90880f14d23078e8eb4325ee615fc68"},
- {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b01061d377d1944eb67bc40bef5d4d2f762c6ab01598efd9297ce5d0047eb1b5"},
- {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9d12c8390f156745e533d01b30773b9753e41d8bbf8bf9dac4b97628cdf16314"},
- {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:48825c9f967f922061329d1481b70e9fee937fc68322d6979bc623f69f75bc91"},
- {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d8ec137170b95736842f99c0e7a9fd8f5641d0c1b63b08ce027198545d983e2b"},
- {file = "levenshtein-0.26.1-cp311-cp311-win32.whl", hash = "sha256:798f2b525a2e90562f1ba9da21010dde0d73730e277acaa5c52d2a6364fd3e2a"},
- {file = "levenshtein-0.26.1-cp311-cp311-win_amd64.whl", hash = "sha256:55b1024516c59df55f1cf1a8651659a568f2c5929d863d3da1ce8893753153bd"},
- {file = "levenshtein-0.26.1-cp311-cp311-win_arm64.whl", hash = "sha256:e52575cbc6b9764ea138a6f82d73d3b1bc685fe62e207ff46a963d4c773799f6"},
- {file = "levenshtein-0.26.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc741ca406d3704dc331a69c04b061fc952509a069b79cab8287413f434684bd"},
- {file = "levenshtein-0.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:821ace3b4e1c2e02b43cf5dc61aac2ea43bdb39837ac890919c225a2c3f2fea4"},
- {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92694c9396f55d4c91087efacf81297bef152893806fc54c289fc0254b45384"},
- {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51ba374de7a1797d04a14a4f0ad3602d2d71fef4206bb20a6baaa6b6a502da58"},
- {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7aa5c3327dda4ef952769bacec09c09ff5bf426e07fdc94478c37955681885b"},
- {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e2517e8d3c221de2d1183f400aed64211fcfc77077b291ed9f3bb64f141cdc"},
- {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9092b622765c7649dd1d8af0f43354723dd6f4e570ac079ffd90b41033957438"},
- {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc16796c85d7d8b259881d59cc8b5e22e940901928c2ff6924b2c967924e8a0b"},
- {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4370733967f5994ceeed8dc211089bedd45832ee688cecea17bfd35a9eb22b9"},
- {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3535ecfd88c9b283976b5bc61265855f59bba361881e92ed2b5367b6990c93fe"},
- {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:90236e93d98bdfd708883a6767826fafd976dac8af8fc4a0fb423d4fa08e1bf0"},
- {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:04b7cabb82edf566b1579b3ed60aac0eec116655af75a3c551fee8754ffce2ea"},
- {file = "levenshtein-0.26.1-cp312-cp312-win32.whl", hash = "sha256:ae382af8c76f6d2a040c0d9ca978baf461702ceb3f79a0a3f6da8d596a484c5b"},
- {file = "levenshtein-0.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:fd091209798cfdce53746f5769987b4108fe941c54fb2e058c016ffc47872918"},
- {file = "levenshtein-0.26.1-cp312-cp312-win_arm64.whl", hash = "sha256:7e82f2ea44a81ad6b30d92a110e04cd3c8c7c6034b629aca30a3067fa174ae89"},
- {file = "levenshtein-0.26.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:790374a9f5d2cbdb30ee780403a62e59bef51453ac020668c1564d1e43438f0e"},
- {file = "levenshtein-0.26.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7b05c0415c386d00efda83d48db9db68edd02878d6dbc6df01194f12062be1bb"},
- {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3114586032361722ddededf28401ce5baf1cf617f9f49fb86b8766a45a423ff"},
- {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2532f8a13b68bf09f152d906f118a88da2063da22f44c90e904b142b0a53d534"},
- {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:219c30be6aa734bf927188d1208b7d78d202a3eb017b1c5f01ab2034d2d4ccca"},
- {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397e245e77f87836308bd56305bba630010cd8298c34c4c44bd94990cdb3b7b1"},
- {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeff6ea3576f72e26901544c6c55c72a7b79b9983b6f913cba0e9edbf2f87a97"},
- {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a19862e3539a697df722a08793994e334cd12791e8144851e8a1dee95a17ff63"},
- {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:dc3b5a64f57c3c078d58b1e447f7d68cad7ae1b23abe689215d03fc434f8f176"},
- {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bb6c7347424a91317c5e1b68041677e4c8ed3e7823b5bbaedb95bffb3c3497ea"},
- {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b817376de4195a207cc0e4ca37754c0e1e1078c2a2d35a6ae502afde87212f9e"},
- {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b50c3620ff47c9887debbb4c154aaaac3e46be7fc2e5789ee8dbe128bce6a17"},
- {file = "levenshtein-0.26.1-cp313-cp313-win32.whl", hash = "sha256:9fb859da90262eb474c190b3ca1e61dee83add022c676520f5c05fdd60df902a"},
- {file = "levenshtein-0.26.1-cp313-cp313-win_amd64.whl", hash = "sha256:8adcc90e3a5bfb0a463581d85e599d950fe3c2938ac6247b29388b64997f6e2d"},
- {file = "levenshtein-0.26.1-cp313-cp313-win_arm64.whl", hash = "sha256:c2599407e029865dc66d210b8804c7768cbdbf60f061d993bb488d5242b0b73e"},
- {file = "levenshtein-0.26.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc54ced948fc3feafce8ad4ba4239d8ffc733a0d70e40c0363ac2a7ab2b7251e"},
- {file = "levenshtein-0.26.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6516f69213ae393a220e904332f1a6bfc299ba22cf27a6520a1663a08eba0fb"},
- {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4cfea4eada1746d0c75a864bc7e9e63d4a6e987c852d6cec8d9cb0c83afe25b"},
- {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a323161dfeeac6800eb13cfe76a8194aec589cd948bcf1cdc03f66cc3ec26b72"},
- {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c23e749b68ebc9a20b9047317b5cd2053b5856315bc8636037a8adcbb98bed1"},
- {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f80dd7432d4b6cf493d012d22148db7af769017deb31273e43406b1fb7f091c"},
- {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ae7cd6e4312c6ef34b2e273836d18f9fff518d84d823feff5ad7c49668256e0"},
- {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dcdad740e841d791b805421c2b20e859b4ed556396d3063b3aa64cd055be648c"},
- {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e07afb1613d6f5fd99abd4e53ad3b446b4efaa0f0d8e9dfb1d6d1b9f3f884d32"},
- {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:f1add8f1d83099a98ae4ac472d896b7e36db48c39d3db25adf12b373823cdeff"},
- {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1010814b1d7a60833a951f2756dfc5c10b61d09976ce96a0edae8fecdfb0ea7c"},
- {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:33fa329d1bb65ce85e83ceda281aea31cee9f2f6e167092cea54f922080bcc66"},
- {file = "levenshtein-0.26.1-cp39-cp39-win32.whl", hash = "sha256:488a945312f2f16460ab61df5b4beb1ea2254c521668fd142ce6298006296c98"},
- {file = "levenshtein-0.26.1-cp39-cp39-win_amd64.whl", hash = "sha256:9f942104adfddd4b336c3997050121328c39479f69de702d7d144abb69ea7ab9"},
- {file = "levenshtein-0.26.1-cp39-cp39-win_arm64.whl", hash = "sha256:c1d8f85b2672939f85086ed75effcf768f6077516a3e299c2ba1f91bc4644c22"},
- {file = "levenshtein-0.26.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6cf8f1efaf90ca585640c5d418c30b7d66d9ac215cee114593957161f63acde0"},
- {file = "levenshtein-0.26.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d5b2953978b8c158dd5cd93af8216a5cfddbf9de66cf5481c2955f44bb20767a"},
- {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b952b3732c4631c49917d4b15d78cb4a2aa006c1d5c12e2a23ba8e18a307a055"},
- {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07227281e12071168e6ae59238918a56d2a0682e529f747b5431664f302c0b42"},
- {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8191241cd8934feaf4d05d0cc0e5e72877cbb17c53bbf8c92af9f1aedaa247e9"},
- {file = "levenshtein-0.26.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9e70d7ee157a9b698c73014f6e2b160830e7d2d64d2e342fefc3079af3c356fc"},
- {file = "levenshtein-0.26.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0eb3059f826f6cb0a5bca4a85928070f01e8202e7ccafcba94453470f83e49d4"},
- {file = "levenshtein-0.26.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:6c389e44da12d6fb1d7ba0a709a32a96c9391e9be4160ccb9269f37e040599ee"},
- {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e9de292f2c51a7d34a0ae23bec05391b8f61f35781cd3e4c6d0533e06250c55"},
- {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d87215113259efdca8716e53b6d59ab6d6009e119d95d45eccc083148855f33"},
- {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f00a3eebf68a82fb651d8d0e810c10bfaa60c555d21dde3ff81350c74fb4c2"},
- {file = "levenshtein-0.26.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b3554c1b59de63d05075577380340c185ff41b028e541c0888fddab3c259a2b4"},
- {file = "levenshtein-0.26.1.tar.gz", hash = "sha256:0d19ba22330d50609b2349021ec3cf7d905c6fe21195a2d0d876a146e7ed2575"},
-]
-
-[package.dependencies]
-rapidfuzz = ">=3.9.0,<4.0.0"
-
-[[package]]
-name = "more-itertools"
-version = "10.6.0"
-description = "More routines for operating on iterables, beyond itertools"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"},
- {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"},
-]
-
-[[package]]
-name = "multidict"
-version = "6.1.0"
-description = "multidict implementation"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"},
- {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"},
- {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"},
- {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"},
- {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"},
- {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"},
- {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"},
- {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"},
- {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"},
- {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"},
- {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"},
- {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"},
- {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"},
- {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"},
- {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"},
- {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"},
- {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"},
- {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"},
- {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"},
- {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"},
- {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"},
- {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"},
- {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"},
- {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"},
- {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"},
- {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"},
- {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"},
- {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"},
- {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"},
- {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"},
- {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"},
- {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"},
- {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"},
- {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"},
- {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"},
- {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"},
- {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"},
- {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"},
- {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"},
- {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"},
- {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"},
- {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"},
- {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"},
- {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"},
- {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"},
- {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"},
- {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"},
- {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"},
- {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"},
- {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"},
- {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"},
- {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"},
- {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"},
- {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"},
- {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"},
- {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"},
- {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"},
- {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"},
- {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"},
- {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"},
- {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"},
- {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"},
- {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"},
- {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"},
- {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"},
- {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"},
- {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"},
- {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"},
- {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"},
- {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"},
- {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"},
- {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"},
- {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"},
- {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"},
- {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"},
- {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"},
- {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"},
- {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"},
- {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"},
- {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"},
- {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"},
- {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"},
- {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"},
- {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"},
- {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"},
- {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"},
- {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"},
- {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"},
- {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"},
- {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"},
- {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"},
- {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"},
-]
-
-[[package]]
-name = "mypy"
-version = "1.15.0"
-description = "Optional static typing for Python"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"},
- {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"},
- {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b"},
- {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3"},
- {file = "mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b"},
- {file = "mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828"},
- {file = "mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f"},
- {file = "mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5"},
- {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e"},
- {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c"},
- {file = "mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f"},
- {file = "mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f"},
- {file = "mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd"},
- {file = "mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f"},
- {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464"},
- {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee"},
- {file = "mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e"},
- {file = "mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22"},
- {file = "mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445"},
- {file = "mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d"},
- {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5"},
- {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036"},
- {file = "mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357"},
- {file = "mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf"},
- {file = "mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078"},
- {file = "mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba"},
- {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5"},
- {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b"},
- {file = "mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2"},
- {file = "mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980"},
- {file = "mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e"},
- {file = "mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43"},
-]
-
-[package.dependencies]
-mypy_extensions = ">=1.0.0"
-typing_extensions = ">=4.6.0"
-
-[package.extras]
-dmypy = ["psutil (>=4.0)"]
-faster-cache = ["orjson"]
-install-types = ["pip"]
-mypyc = ["setuptools (>=50)"]
-reports = ["lxml"]
-
-[[package]]
-name = "mypy-extensions"
-version = "1.0.0"
-description = "Type system extensions for programs checked with the mypy type checker."
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
- {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
-]
-
-[[package]]
-name = "numpy"
-version = "2.2.2"
-description = "Fundamental package for array computing in Python"
-optional = false
-python-versions = ">=3.10"
-files = [
- {file = "numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e"},
- {file = "numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e"},
- {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715"},
- {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a"},
- {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97"},
- {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957"},
- {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d"},
- {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd"},
- {file = "numpy-2.2.2-cp310-cp310-win32.whl", hash = "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160"},
- {file = "numpy-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014"},
- {file = "numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189"},
- {file = "numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323"},
- {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac"},
- {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e"},
- {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c"},
- {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f"},
- {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826"},
- {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8"},
- {file = "numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50"},
- {file = "numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2"},
- {file = "numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467"},
- {file = "numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a"},
- {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825"},
- {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37"},
- {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748"},
- {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0"},
- {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278"},
- {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba"},
- {file = "numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283"},
- {file = "numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb"},
- {file = "numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc"},
- {file = "numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369"},
- {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd"},
- {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be"},
- {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84"},
- {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff"},
- {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0"},
- {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de"},
- {file = "numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9"},
- {file = "numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369"},
- {file = "numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391"},
- {file = "numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39"},
- {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317"},
- {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49"},
- {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2"},
- {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7"},
- {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb"},
- {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648"},
- {file = "numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4"},
- {file = "numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576"},
- {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495"},
- {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df"},
- {file = "numpy-2.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a"},
- {file = "numpy-2.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60"},
- {file = "numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f"},
-]
-
-[[package]]
-name = "packaging"
-version = "24.2"
-description = "Core utilities for Python packages"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
- {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
-]
-
-[[package]]
-name = "pandas"
-version = "2.2.3"
-description = "Powerful data structures for data analysis, time series, and statistics"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"},
- {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"},
- {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"},
- {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"},
- {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"},
- {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"},
- {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"},
- {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"},
- {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"},
- {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"},
- {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"},
- {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"},
- {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"},
- {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"},
- {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"},
- {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"},
- {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"},
- {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"},
- {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"},
- {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"},
- {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"},
- {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"},
- {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"},
- {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"},
- {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"},
- {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"},
- {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"},
- {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"},
- {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"},
- {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"},
- {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"},
- {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"},
- {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"},
- {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"},
- {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"},
- {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"},
- {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"},
- {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"},
- {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"},
- {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"},
- {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"},
- {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"},
-]
-
-[package.dependencies]
-numpy = [
- {version = ">=1.23.2", markers = "python_version == \"3.11\""},
- {version = ">=1.26.0", markers = "python_version >= \"3.12\""},
-]
-python-dateutil = ">=2.8.2"
-pytz = ">=2020.1"
-tzdata = ">=2022.7"
-
-[package.extras]
-all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"]
-aws = ["s3fs (>=2022.11.0)"]
-clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"]
-compression = ["zstandard (>=0.19.0)"]
-computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"]
-consortium-standard = ["dataframe-api-compat (>=0.1.7)"]
-excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"]
-feather = ["pyarrow (>=10.0.1)"]
-fss = ["fsspec (>=2022.11.0)"]
-gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"]
-hdf5 = ["tables (>=3.8.0)"]
-html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"]
-mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"]
-output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"]
-parquet = ["pyarrow (>=10.0.1)"]
-performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"]
-plot = ["matplotlib (>=3.6.3)"]
-postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"]
-pyarrow = ["pyarrow (>=10.0.1)"]
-spss = ["pyreadstat (>=1.2.0)"]
-sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"]
-test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"]
-xml = ["lxml (>=4.9.2)"]
-
-[[package]]
-name = "pathspec"
-version = "0.12.1"
-description = "Utility library for gitignore style pattern matching of file paths."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
- {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
-]
-
-[[package]]
-name = "platformdirs"
-version = "4.3.6"
-description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"},
- {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"},
-]
-
-[package.extras]
-docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"]
-test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"]
-type = ["mypy (>=1.11.2)"]
-
-[[package]]
-name = "pluggy"
-version = "1.5.0"
-description = "plugin and hook calling mechanisms for python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
- {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
-]
-
-[package.extras]
-dev = ["pre-commit", "tox"]
-testing = ["pytest", "pytest-benchmark"]
-
-[[package]]
-name = "propcache"
-version = "0.2.1"
-description = "Accelerated property cache"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"},
- {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"},
- {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"},
- {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"},
- {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"},
- {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"},
- {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"},
- {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"},
- {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"},
- {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"},
- {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"},
- {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"},
- {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"},
- {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"},
- {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"},
- {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"},
- {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"},
- {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"},
- {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"},
- {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"},
- {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"},
- {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"},
- {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"},
- {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"},
- {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"},
- {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"},
- {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"},
- {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"},
- {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"},
- {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"},
- {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"},
- {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"},
- {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"},
- {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"},
- {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"},
- {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"},
- {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"},
- {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"},
- {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"},
- {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"},
- {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"},
- {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"},
- {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"},
- {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"},
- {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"},
- {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"},
- {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"},
- {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"},
- {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"},
- {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"},
- {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"},
- {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"},
- {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"},
- {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"},
- {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"},
- {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"},
- {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"},
- {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"},
- {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"},
- {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"},
- {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"},
- {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"},
- {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"},
- {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"},
- {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"},
- {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"},
- {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"},
- {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"},
- {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"},
- {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"},
- {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"},
- {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"},
- {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"},
- {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"},
- {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"},
- {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"},
- {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"},
- {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"},
- {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"},
- {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"},
- {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"},
- {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"},
-]
-
-[[package]]
-name = "pydantic"
-version = "2.10.6"
-description = "Data validation using Python type hints"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"},
- {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"},
-]
-
-[package.dependencies]
-annotated-types = ">=0.6.0"
-pydantic-core = "2.27.2"
-typing-extensions = ">=4.12.2"
-
-[package.extras]
-email = ["email-validator (>=2.0.0)"]
-timezone = ["tzdata"]
-
-[[package]]
-name = "pydantic-core"
-version = "2.27.2"
-description = "Core functionality for Pydantic validation and serialization"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"},
- {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"},
- {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"},
- {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"},
- {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"},
- {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"},
- {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"},
- {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"},
- {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"},
- {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"},
- {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"},
- {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"},
- {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"},
- {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"},
- {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"},
- {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"},
- {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"},
- {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"},
- {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"},
- {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"},
- {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"},
- {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"},
- {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"},
- {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"},
- {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"},
- {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"},
- {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"},
- {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"},
- {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"},
- {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"},
- {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"},
- {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"},
- {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"},
- {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"},
- {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"},
- {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"},
- {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"},
- {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"},
- {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"},
- {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"},
- {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"},
- {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"},
- {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"},
- {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"},
- {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"},
- {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"},
-]
-
-[package.dependencies]
-typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
-
-[[package]]
-name = "pydantic-settings"
-version = "2.7.1"
-description = "Settings management using Pydantic"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"},
- {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"},
-]
-
-[package.dependencies]
-pydantic = ">=2.7.0"
-python-dotenv = ">=0.21.0"
-
-[package.extras]
-azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"]
-toml = ["tomli (>=2.0.1)"]
-yaml = ["pyyaml (>=6.0.1)"]
-
-[[package]]
-name = "pytest"
-version = "8.3.4"
-description = "pytest: simple powerful testing with Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"},
- {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-iniconfig = "*"
-packaging = "*"
-pluggy = ">=1.5,<2"
-
-[package.extras]
-dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
-
-[[package]]
-name = "python-dateutil"
-version = "2.9.0.post0"
-description = "Extensions to the standard Python datetime module"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-files = [
- {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
- {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
-]
-
-[package.dependencies]
-six = ">=1.5"
-
-[[package]]
-name = "python-dotenv"
-version = "1.0.1"
-description = "Read key-value pairs from a .env file and set them as environment variables"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
- {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
-]
-
-[package.extras]
-cli = ["click (>=5.0)"]
-
-[[package]]
-name = "python-levenshtein"
-version = "0.26.1"
-description = "Python extension for computing string edit distances and similarities."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "python_Levenshtein-0.26.1-py3-none-any.whl", hash = "sha256:8ef5e529dd640fb00f05ee62d998d2ee862f19566b641ace775d5ae16167b2ef"},
- {file = "python_levenshtein-0.26.1.tar.gz", hash = "sha256:24ba578e28058ebb4afa2700057e1678d7adf27e43cd1f17700c09a9009d5d3a"},
-]
-
-[package.dependencies]
-Levenshtein = "0.26.1"
-
-[[package]]
-name = "pytz"
-version = "2025.1"
-description = "World timezone definitions, modern and historical"
-optional = false
-python-versions = "*"
-files = [
- {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"},
- {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"},
-]
-
-[[package]]
-name = "rapidfuzz"
-version = "3.12.1"
-description = "rapid fuzzy string matching"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "rapidfuzz-3.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbb7ea2fd786e6d66f225ef6eef1728832314f47e82fee877cb2a793ebda9579"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ae41361de05762c1eaa3955e5355de7c4c6f30d1ef1ea23d29bf738a35809ab"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc3c39e0317e7f68ba01bac056e210dd13c7a0abf823e7b6a5fe7e451ddfc496"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69f2520296f1ae1165b724a3aad28c56fd0ac7dd2e4cff101a5d986e840f02d4"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34dcbf5a7daecebc242f72e2500665f0bde9dd11b779246c6d64d106a7d57c99"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:773ab37fccf6e0513891f8eb4393961ddd1053c6eb7e62eaa876e94668fc6d31"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ecf0e6de84c0bc2c0f48bc03ba23cef2c5f1245db7b26bc860c11c6fd7a097c"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4dc2ebad4adb29d84a661f6a42494df48ad2b72993ff43fad2b9794804f91e45"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8389d98b9f54cb4f8a95f1fa34bf0ceee639e919807bb931ca479c7a5f2930bf"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:165bcdecbfed9978962da1d3ec9c191b2ff9f1ccc2668fbaf0613a975b9aa326"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:129d536740ab0048c1a06ccff73c683f282a2347c68069affae8dbc423a37c50"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b67e390261ffe98ec86c771b89425a78b60ccb610c3b5874660216fcdbded4b"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-win32.whl", hash = "sha256:a66520180d3426b9dc2f8d312f38e19bc1fc5601f374bae5c916f53fa3534a7d"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:82260b20bc7a76556cecb0c063c87dad19246a570425d38f8107b8404ca3ac97"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-win_arm64.whl", hash = "sha256:3a860d103bbb25c69c2e995fdf4fac8cb9f77fb69ec0a00469d7fd87ff148f46"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d9afad7b16d01c9e8929b6a205a18163c7e61b6cd9bcf9c81be77d5afc1067a"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb424ae7240f2d2f7d8dda66a61ebf603f74d92f109452c63b0dbf400204a437"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42149e6d13bd6d06437d2a954dae2184dadbbdec0fdb82dafe92860d99f80519"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:760ac95d788f2964b73da01e0bdffbe1bf2ad8273d0437565ce9092ae6ad1fbc"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cf27e8e4bf7bf9d92ef04f3d2b769e91c3f30ba99208c29f5b41e77271a2614"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00ceb8ff3c44ab0d6014106c71709c85dee9feedd6890eff77c814aa3798952b"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b61c558574fbc093d85940c3264c08c2b857b8916f8e8f222e7b86b0bb7d12"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:346a2d8f17224e99f9ef988606c83d809d5917d17ad00207237e0965e54f9730"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d60d1db1b7e470e71ae096b6456e20ec56b52bde6198e2dbbc5e6769fa6797dc"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2477da227e266f9c712f11393182c69a99d3c8007ea27f68c5afc3faf401cc43"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8499c7d963ddea8adb6cffac2861ee39a1053e22ca8a5ee9de1197f8dc0275a5"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:12802e5c4d8ae104fb6efeeb436098325ce0dca33b461c46e8df015c84fbef26"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-win32.whl", hash = "sha256:e1061311d07e7cdcffa92c9b50c2ab4192907e70ca01b2e8e1c0b6b4495faa37"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6e4ed63e204daa863a802eec09feea5448617981ba5d150f843ad8e3ae071a4"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-win_arm64.whl", hash = "sha256:920733a28c3af47870835d59ca9879579f66238f10de91d2b4b3f809d1ebfc5b"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f6235b57ae3faa3f85cb3f90c9fee49b21bd671b76e90fc99e8ca2bdf0b5e4a3"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af4585e5812632c357fee5ab781c29f00cd06bea58f8882ff244cc4906ba6c9e"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5942dc4460e5030c5f9e1d4c9383de2f3564a2503fe25e13e89021bcbfea2f44"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b31ab59e1a0df5afc21f3109b6cfd77b34040dbf54f1bad3989f885cfae1e60"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97c885a7a480b21164f57a706418c9bbc9a496ec6da087e554424358cadde445"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d844c0587d969ce36fbf4b7cbf0860380ffeafc9ac5e17a7cbe8abf528d07bb"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93c95dce8917bf428064c64024de43ffd34ec5949dd4425780c72bd41f9d969"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:834f6113d538af358f39296604a1953e55f8eeffc20cb4caf82250edbb8bf679"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a940aa71a7f37d7f0daac186066bf6668d4d3b7e7ef464cb50bc7ba89eae1f51"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ec9eaf73501c9a7de2c6938cb3050392e2ee0c5ca3921482acf01476b85a7226"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c5ec360694ac14bfaeb6aea95737cf1a6cf805b5fe8ea7fd28814706c7fa838"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6b5e176524653ac46f1802bdd273a4b44a5f8d0054ed5013a8e8a4b72f254599"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-win32.whl", hash = "sha256:6f463c6f1c42ec90e45d12a6379e18eddd5cdf74138804d8215619b6f4d31cea"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:b894fa2b30cd6498a29e5c470cb01c6ea898540b7e048a0342775a5000531334"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-win_arm64.whl", hash = "sha256:43bb17056c5d1332f517b888c4e57846c4b5f936ed304917eeb5c9ac85d940d4"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:97f824c15bc6933a31d6e3cbfa90188ba0e5043cf2b6dd342c2b90ee8b3fd47c"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a973b3f5cabf931029a3ae4a0f72e3222e53d412ea85fc37ddc49e1774f00fbf"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7880e012228722dec1be02b9ef3898ed023388b8a24d6fa8213d7581932510"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c78582f50e75e6c2bc38c791ed291cb89cf26a3148c47860c1a04d6e5379c8e"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d7d9e6a04d8344b0198c96394c28874086888d0a2b2f605f30d1b27b9377b7d"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5620001fd4d6644a2f56880388179cc8f3767670f0670160fcb97c3b46c828af"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0666ab4c52e500af7ba5cc17389f5d15c0cdad06412c80312088519fdc25686d"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:27b4d440fa50b50c515a91a01ee17e8ede719dca06eef4c0cccf1a111a4cfad3"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83dccfd5a754f2a0e8555b23dde31f0f7920601bfa807aa76829391ea81e7c67"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b572b634740e047c53743ed27a1bb3b4f93cf4abbac258cd7af377b2c4a9ba5b"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7fa7b81fb52902d5f78dac42b3d6c835a6633b01ddf9b202a3ca8443be4b2d6a"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1d4fbff980cb6baef4ee675963c081f7b5d6580a105d6a4962b20f1f880e1fb"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-win32.whl", hash = "sha256:3fe8da12ea77271097b303fa7624cfaf5afd90261002314e3b0047d36f4afd8d"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:6f7e92fc7d2a7f02e1e01fe4f539324dfab80f27cb70a30dd63a95445566946b"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-win_arm64.whl", hash = "sha256:e31be53d7f4905a6a038296d8b773a79da9ee9f0cd19af9490c5c5a22e37d2e5"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bef5c91d5db776523530073cda5b2a276283258d2f86764be4a008c83caf7acd"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:841e0c2a5fbe8fc8b9b1a56e924c871899932c0ece7fbd970aa1c32bfd12d4bf"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046fc67f3885d94693a2151dd913aaf08b10931639cbb953dfeef3151cb1027c"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4d2d39b2e76c17f92edd6d384dc21fa020871c73251cdfa017149358937a41d"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5857dda85165b986c26a474b22907db6b93932c99397c818bcdec96340a76d5"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c26cd1b9969ea70dbf0dbda3d2b54ab4b2e683d0fd0f17282169a19563efeb1"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf56ea4edd69005786e6c80a9049d95003aeb5798803e7a2906194e7a3cb6472"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fbe7580b5fb2db8ebd53819171ff671124237a55ada3f64d20fc9a149d133960"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:018506a53c3b20dcbda8c93d4484b9eb1764c93d5ea16be103cf6b0d8b11d860"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:325c9c71b737fcd32e2a4e634c430c07dd3d374cfe134eded3fe46e4c6f9bf5d"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:930756639643e3aa02d3136b6fec74e5b9370a24f8796e1065cd8a857a6a6c50"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0acbd27543b158cb915fde03877383816a9e83257832818f1e803bac9b394900"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-win32.whl", hash = "sha256:80ff9283c54d7d29b2d954181e137deee89bec62f4a54675d8b6dbb6b15d3e03"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:fd37e53f0ed239d0cec27b250cec958982a8ba252ce64aa5e6052de3a82fa8db"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-win_arm64.whl", hash = "sha256:4a4422e4f73a579755ab60abccb3ff148b5c224b3c7454a13ca217dfbad54da6"},
- {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b7cba636c32a6fc3a402d1cb2c70c6c9f8e6319380aaf15559db09d868a23e56"},
- {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b79286738a43e8df8420c4b30a92712dec6247430b130f8e015c3a78b6d61ac2"},
- {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dc1937198e7ff67e217e60bfa339f05da268d91bb15fec710452d11fe2fdf60"},
- {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b85817a57cf8db32dd5d2d66ccfba656d299b09eaf86234295f89f91be1a0db2"},
- {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04283c6f3e79f13a784f844cd5b1df4f518ad0f70c789aea733d106c26e1b4fb"},
- {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a718f740553aad5f4daef790191511da9c6eae893ee1fc2677627e4b624ae2db"},
- {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cbdf145c7e4ebf2e81c794ed7a582c4acad19e886d5ad6676086369bd6760753"},
- {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0d03ad14a26a477be221fddc002954ae68a9e2402b9d85433f2d0a6af01aa2bb"},
- {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1187aeae9c89e838d2a0a2b954b4052e4897e5f62e5794ef42527bf039d469e"},
- {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd47dfb1bca9673a48b923b3d988b7668ee8efd0562027f58b0f2b7abf27144c"},
- {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187cdb402e223264eebed2fe671e367e636a499a7a9c82090b8d4b75aa416c2a"},
- {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6899b41bf6c30282179f77096c1939f1454836440a8ab05b48ebf7026a3b590"},
- {file = "rapidfuzz-3.12.1.tar.gz", hash = "sha256:6a98bbca18b4a37adddf2d8201856441c26e9c981d8895491b5bc857b5f780eb"},
-]
-
-[package.extras]
-all = ["numpy"]
-
-[[package]]
-name = "requests"
-version = "2.32.3"
-description = "Python HTTP for Humans."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
- {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
-]
-
-[package.dependencies]
-certifi = ">=2017.4.17"
-charset-normalizer = ">=2,<4"
-idna = ">=2.5,<4"
-urllib3 = ">=1.21.1,<3"
-
-[package.extras]
-socks = ["PySocks (>=1.5.6,!=1.5.7)"]
-use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
-
-[[package]]
-name = "requests-toolbelt"
-version = "1.0.0"
-description = "A utility belt for advanced users of python-requests"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-files = [
- {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"},
- {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"},
-]
-
-[package.dependencies]
-requests = ">=2.0.1,<3.0.0"
-
-[[package]]
-name = "ruff"
-version = "0.9.5"
-description = "An extremely fast Python linter and code formatter, written in Rust."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "ruff-0.9.5-py3-none-linux_armv6l.whl", hash = "sha256:d466d2abc05f39018d53f681fa1c0ffe9570e6d73cde1b65d23bb557c846f442"},
- {file = "ruff-0.9.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38840dbcef63948657fa7605ca363194d2fe8c26ce8f9ae12eee7f098c85ac8a"},
- {file = "ruff-0.9.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d56ba06da53536b575fbd2b56517f6f95774ff7be0f62c80b9e67430391eeb36"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7cb2a01da08244c50b20ccfaeb5972e4228c3c3a1989d3ece2bc4b1f996001"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:96d5c76358419bc63a671caac70c18732d4fd0341646ecd01641ddda5c39ca0b"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:deb8304636ed394211f3a6d46c0e7d9535b016f53adaa8340139859b2359a070"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:df455000bf59e62b3e8c7ba5ed88a4a2bc64896f900f311dc23ff2dc38156440"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de92170dfa50c32a2b8206a647949590e752aca8100a0f6b8cefa02ae29dce80"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d28532d73b1f3f627ba88e1456f50748b37f3a345d2be76e4c653bec6c3e393"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c746d7d1df64f31d90503ece5cc34d7007c06751a7a3bbeee10e5f2463d52d2"},
- {file = "ruff-0.9.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11417521d6f2d121fda376f0d2169fb529976c544d653d1d6044f4c5562516ee"},
- {file = "ruff-0.9.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b9d71c3879eb32de700f2f6fac3d46566f644a91d3130119a6378f9312a38e1"},
- {file = "ruff-0.9.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2e36c61145e70febcb78483903c43444c6b9d40f6d2f800b5552fec6e4a7bb9a"},
- {file = "ruff-0.9.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:2f71d09aeba026c922aa7aa19a08d7bd27c867aedb2f74285a2639644c1c12f5"},
- {file = "ruff-0.9.5-py3-none-win32.whl", hash = "sha256:134f958d52aa6fdec3b294b8ebe2320a950d10c041473c4316d2e7d7c2544723"},
- {file = "ruff-0.9.5-py3-none-win_amd64.whl", hash = "sha256:78cc6067f6d80b6745b67498fb84e87d32c6fc34992b52bffefbdae3442967d6"},
- {file = "ruff-0.9.5-py3-none-win_arm64.whl", hash = "sha256:18a29f1a005bddb229e580795627d297dfa99f16b30c7039e73278cf6b5f9fa9"},
- {file = "ruff-0.9.5.tar.gz", hash = "sha256:11aecd7a633932875ab3cb05a484c99970b9d52606ce9ea912b690b02653d56c"},
-]
-
-[[package]]
-name = "six"
-version = "1.17.0"
-description = "Python 2 and 3 compatibility utilities"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-files = [
- {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
- {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
-]
-
-[[package]]
-name = "sniffio"
-version = "1.3.1"
-description = "Sniff out which async library your code is running under"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
- {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
-]
-
-[[package]]
-name = "specklepy"
-version = "2.21.2"
-description = "The Python SDK for Speckle 2.0"
-optional = false
-python-versions = "<4.0,>=3.9.0"
-files = [
- {file = "specklepy-2.21.2-py3-none-any.whl", hash = "sha256:bb34bb0de56f8731f88ac9a1ada4cddfbf2d71e52d4e9cce07bab95c1dac2b2d"},
- {file = "specklepy-2.21.2.tar.gz", hash = "sha256:ba44bb9167ced32e52ba7e5717d0b1d0ece1aa23ca02243ce75f0eaba08e8107"},
-]
-
-[package.dependencies]
-appdirs = ">=1.4.4,<2.0.0"
-attrs = ">=23.1.0,<24.0.0"
-Deprecated = ">=1.2.13,<2.0.0"
-gql = {version = ">=3.3.0,<4.0.0", extras = ["requests", "websockets"]}
-httpx = ">=0.25.0,<0.26.0"
-pydantic = ">=2.5,<3.0"
-stringcase = ">=1.2.0,<2.0.0"
-ujson = ">=5.3.0,<6.0.0"
-
-[[package]]
-name = "stringcase"
-version = "1.2.0"
-description = "String case converter."
-optional = false
-python-versions = "*"
-files = [
- {file = "stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008"},
-]
-
-[[package]]
-name = "typing-extensions"
-version = "4.12.2"
-description = "Backported and Experimental Type Hints for Python 3.8+"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
- {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
-]
-
-[[package]]
-name = "tzdata"
-version = "2025.1"
-description = "Provider of IANA time zone data"
-optional = false
-python-versions = ">=2"
-files = [
- {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"},
- {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"},
-]
-
-[[package]]
-name = "ujson"
-version = "5.10.0"
-description = "Ultra fast JSON encoder and decoder for Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"},
- {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"},
- {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"},
- {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"},
- {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"},
- {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"},
- {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"},
- {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"},
- {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"},
- {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"},
- {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"},
- {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"},
- {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"},
- {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"},
- {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"},
- {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"},
- {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"},
- {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"},
- {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"},
- {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"},
- {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"},
- {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"},
- {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"},
- {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"},
- {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"},
- {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"},
- {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"},
- {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"},
- {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"},
- {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"},
- {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"},
- {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"},
- {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"},
- {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"},
- {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"},
- {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"},
- {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"},
- {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"},
- {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"},
- {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"},
- {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"},
- {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"},
- {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"},
- {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"},
- {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"},
- {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"},
- {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"},
- {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"},
- {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"},
- {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"},
- {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"},
- {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"},
- {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"},
- {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"},
- {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"},
- {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"},
- {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"},
- {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"},
- {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"},
- {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"},
- {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"},
- {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"},
- {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"},
- {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"},
- {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"},
- {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"},
- {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"},
- {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"},
- {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"},
- {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"},
- {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"},
- {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"},
- {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"},
- {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"},
- {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"},
- {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"},
- {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"},
- {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"},
-]
-
-[[package]]
-name = "urllib3"
-version = "2.3.0"
-description = "HTTP library with thread-safe connection pooling, file post, and more."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
- {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
-]
-
-[package.extras]
-brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
-h2 = ["h2 (>=4,<5)"]
-socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
-zstd = ["zstandard (>=0.18.0)"]
-
-[[package]]
-name = "websockets"
-version = "11.0.3"
-description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"},
- {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"},
- {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"},
- {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"},
- {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"},
- {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"},
- {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"},
- {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"},
- {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"},
- {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"},
- {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"},
- {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"},
- {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"},
- {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"},
- {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"},
- {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"},
- {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"},
- {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"},
- {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"},
- {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"},
- {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"},
- {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"},
- {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"},
- {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"},
- {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"},
- {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"},
- {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"},
- {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"},
- {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"},
- {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"},
- {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"},
- {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"},
- {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"},
- {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"},
- {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"},
- {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"},
- {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"},
- {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"},
- {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"},
- {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"},
- {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"},
- {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"},
- {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"},
- {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"},
- {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"},
- {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"},
- {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"},
- {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"},
- {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"},
- {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"},
- {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"},
- {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"},
- {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"},
- {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"},
- {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"},
-]
-
-[[package]]
-name = "wrapt"
-version = "1.17.2"
-description = "Module for decorators, wrappers and monkey patching."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"},
- {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"},
- {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"},
- {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"},
- {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"},
- {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"},
- {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"},
- {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"},
- {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"},
- {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"},
- {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"},
- {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"},
- {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"},
- {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"},
- {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"},
- {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"},
- {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"},
- {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"},
- {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"},
- {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"},
- {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"},
- {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"},
- {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"},
- {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"},
- {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"},
- {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"},
- {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"},
- {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"},
- {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"},
- {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"},
- {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"},
- {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"},
- {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"},
- {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"},
- {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"},
- {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"},
- {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"},
- {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"},
- {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"},
- {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"},
- {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"},
- {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"},
- {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"},
- {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"},
- {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"},
- {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"},
- {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"},
- {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"},
- {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"},
- {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"},
- {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"},
- {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"},
- {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"},
- {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"},
- {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"},
- {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"},
- {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"},
- {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"},
- {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"},
- {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"},
- {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"},
- {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"},
- {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"},
- {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"},
- {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"},
- {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"},
- {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"},
- {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"},
- {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"},
- {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"},
- {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"},
- {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"},
- {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"},
- {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"},
- {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"},
- {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"},
- {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"},
- {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"},
- {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"},
-]
-
-[[package]]
-name = "yarl"
-version = "1.18.3"
-description = "Yet another URL library"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"},
- {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"},
- {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"},
- {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"},
- {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"},
- {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"},
- {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"},
- {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"},
- {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"},
- {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"},
- {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"},
- {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"},
- {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"},
- {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"},
- {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"},
- {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"},
- {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"},
- {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"},
- {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"},
- {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"},
- {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"},
- {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"},
- {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"},
- {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"},
- {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"},
- {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"},
- {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"},
-]
-
-[package.dependencies]
-idna = ">=2.0"
-multidict = ">=4.0"
-propcache = ">=0.2.0"
-
-[metadata]
-lock-version = "2.0"
-python-versions = "^3.11"
-content-hash = "21a0f6e687ee3c43ee58824b834c4dfe3731328c3161270e55924ee4de39dc7d"
diff --git a/pyproject.toml b/pyproject.toml
index 349478e..7024309 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,39 +1,41 @@
-[tool.poetry]
-name = "speckle-automate-py"
+[project]
+name = "speckle-automate-checker"
version = "0.1.0"
description = "Allows for QAQC property checking with Speckle"
authors = ["Jonathon Broughton "]
readme = "README.md"
-package-mode = false
+requires-python = ">=3.12"
+dependencies = [
+ "more-itertools>=10.6.0",
+ "pandas>=2.2.3",
+ "pydantic==2.10.6",
+ "python-dotenv>=1.0.1",
+ "python-levenshtein>=0.26.1",
+ "specklepy>=2.21.2",
+]
-[tool.poetry.dependencies]
-more-itertools = "^10.6.0"
-pandas = "^2.2.3"
-python = "^3.11"
-python-dotenv = "^1.0.1"
-python-levenshtein = "^0.26.1"
-specklepy = "^2.21.0"
-[tool.poetry.group.dev.dependencies]
-black = "^25.0.0"
-mypy = "^1.3.0"
-pydantic-settings = "^2.3.0"
-pytest = "^8.0.0"
-ruff = "^0.9.5"
-# specklepy = { path = "../specklepy", develop = true }
+[dependency-groups]
+dev = [
+ "pytest-assertcount>=1.0.0",
+ "black>=25.1.0",
+ "mypy>=1.15.0",
+ "pydantic-settings>=2.7.1",
+ "pytest>=8.3.4",
+ "ruff>=0.9.6",
+]
-[build-system]
-requires = ["poetry-core"]
-build-backend = "poetry.core.masonry.api"
[tool.ruff]
select = [
- "E", # pycodestyle
- "F", # pyflakes
- "UP", # pyupgrade
- "D", # pydocstyle
- "I", # isort
+ "E", # pycodestyle
+ "F", # pyflakes
+ "UP", # pyupgrade
+ "D", # pydocstyle
+ "I", # isort
]
+line-length = 120
+ignore = ["F401", "F403"]
[tool.ruff.pydocstyle]
convention = "google"
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..ea5ee7d
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,54 @@
+annotated-types==0.7.0
+anyio==4.8.0
+appdirs==1.4.4
+attrs==23.2.0
+backoff==2.2.1
+black==25.1.0
+certifi==2025.1.31
+charset-normalizer==3.4.1
+click==8.1.8
+colorama==0.4.6
+deprecated==1.2.18
+gql==3.5.0
+graphql-core==3.2.6
+h11==0.14.0
+httpcore==1.0.7
+httpx==0.25.2
+idna==3.10
+iniconfig==2.0.0
+levenshtein==0.26.1
+more-itertools==10.6.0
+multidict==6.1.0
+mypy==1.15.0
+mypy-extensions==1.0.0
+numpy==2.2.2
+packaging==24.2
+pandas==2.2.3
+pathspec==0.12.1
+platformdirs==4.3.6
+pluggy==1.5.0
+propcache==0.2.1
+pydantic==2.10.6
+pydantic-core==2.27.2
+pydantic-settings==2.7.1
+pytest==8.3.4
+pytest-assertcount==1.0.0
+python-dateutil==2.9.0.post0
+python-dotenv==1.0.1
+python-levenshtein==0.26.1
+pytz==2025.1
+rapidfuzz==3.12.1
+requests==2.32.3
+requests-toolbelt==1.0.0
+ruff==0.9.6
+six==1.17.0
+sniffio==1.3.1
+specklepy==2.21.2
+stringcase==1.2.0
+typing-extensions==4.12.2
+tzdata==2025.1
+ujson==5.10.0
+urllib3==2.3.0
+websockets==11.0.3
+wrapt==1.17.2
+yarl==1.18.3
diff --git a/setup.sh b/setup.sh
new file mode 100644
index 0000000..e6e5b7c
--- /dev/null
+++ b/setup.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+# Copy the pre-commit hook to the .git/hooks/ directory
+cp hooks/pre-commit .git/hooks/pre-commit
+
+# Ensure the hook is executable
+chmod +x .git/hooks/pre-commit
+
+echo "Git hooks have been set up!"
diff --git a/src/filters.py b/src/filters.py
new file mode 100644
index 0000000..3d9dd96
--- /dev/null
+++ b/src/filters.py
@@ -0,0 +1,31 @@
+from specklepy.objects.base import Base
+
+from src.rules import PropertyRules
+
+
+def filter_objects_by_category(speckle_objects: list[Base], category_input: str) -> tuple[list[Base], list[Base]]:
+ """Filters objects by category value and test.
+
+ This function takes a list of Speckle objects, filters out the objects
+ with a matching category value and satisfies the test, and returns
+ both the matching and non-matching objects.
+
+ Args:
+ speckle_objects (List[Base]): The list of Speckle objects to filter.
+ category_input (str): The category value to match against.
+
+ Returns:
+ Tuple[List[Base], List[Base]]: A tuple containing two lists:
+ - The first list contains objects with matching category and test.
+ - The second list contains objects without matching category or test.
+ """
+ matching_objects = []
+ non_matching_objects = []
+
+ for obj in speckle_objects:
+ if PropertyRules.is_category(obj, category_input):
+ matching_objects.append(obj)
+ else:
+ non_matching_objects.append(obj)
+
+ return matching_objects, non_matching_objects
diff --git a/src/function.py b/src/function.py
index fb17b85..1a2973d 100644
--- a/src/function.py
+++ b/src/function.py
@@ -1,21 +1,24 @@
-"""This module contains the function's business logic.
+# This is the main function that will be executed when the automation is triggered.
+# It will receive the inputs from the user, and the context of the run.
+# It will then apply the rules to the objects in the model, and report back the results.
-Use the automation_context module to wrap your function in an Automate context helper.
-"""
+from pandas import DataFrame
+from speckle_automate import AutomationContext
+from specklepy.objects.base import Base
-from speckle_automate import AutomationContext, AutomateBase
-
-from src.rules import apply_rules_to_objects
-from src.inputs import FunctionInputs
from src.helpers import flatten_base
+from src.inputs import FunctionInputs
+from src.rule_processor import apply_rules_to_objects
from src.spreadsheet import read_rules_from_spreadsheet
+VERSION: int = 2
+
def automate_function(
- automate_context: AutomationContext,
- function_inputs: FunctionInputs,
+ automate_context: AutomationContext,
+ function_inputs: FunctionInputs,
) -> None:
- """This version of the function will add a check for the new provide inputs.
+ """This VERSION of the function will add a check for the new provide inputs.
Args:
automate_context: A context helper object, that carries relevant information
@@ -24,23 +27,32 @@ def automate_function(
It also has convenience methods attach result data to the Speckle model.
function_inputs: An instance object matching the defined schema.
"""
-
- # the context provides a convenient way, to receive the triggering version
- version_root_object = automate_context.receive_version()
+ # the context provides a convenient way, to receive the triggering VERSION
+ version_root_object: Base = automate_context.receive_version()
# We can continue to work with a flattened list of objects.
flat_list_of_objects = list(flatten_base(version_root_object))
+ # If it is a next_gen model, we can get the VERSION from the root object
+ # This function's rules don't make use of this check, but it is here for reference if you want to.
+ global VERSION
+ VERSION = getattr(version_root_object, "version", 2) # noqa: F841SION = getattr(version_root_object,"version", 2) # noqa: F841 # noqa: F841
+
# read the rules from the spreadsheet
- rules = read_rules_from_spreadsheet(function_inputs.spreadsheet_url)
+ rules: DataFrame = read_rules_from_spreadsheet(function_inputs.spreadsheet_url)
+
+ if (rules is None) or (len(rules) == 0):
+ automate_context.mark_run_exception("No rules defined")
+
+ grouped_rules = rules.groupby("Rule Number")
# apply the rules to the objects
- apply_rules_to_objects(flat_list_of_objects, rules, automate_context)
+ apply_rules_to_objects(flat_list_of_objects, grouped_rules, automate_context)
- # set the automation context view, to the original model / version view
+ # set the automation context view, to the original model / VERSION view
automate_context.set_context_view()
# report success
automate_context.mark_run_success(
- f"Successfully applied rules to {len(flat_list_of_objects)} objects."
+ f"Successfully applied {len(grouped_rules)} rules to {len(flat_list_of_objects)} version {VERSION} objects."
)
diff --git a/src/helpers.py b/src/helpers.py
index 9f28bb0..9d6632a 100644
--- a/src/helpers.py
+++ b/src/helpers.py
@@ -1,14 +1,14 @@
"""Helper module for a speckle object tree flattening."""
-from collections.abc import Iterable
-from typing import Optional, Tuple, List
+from collections.abc import Generator, Iterable
+from typing import Any
from specklepy.objects import Base
from specklepy.objects.other import Instance, Transform
def speckle_print(log_string: str = "banana") -> None:
-
+ """Print a string to the console with a green color."""
print("\033[92m" + str(log_string) + "\033[0m")
@@ -21,6 +21,24 @@ def flatten_base(base: Base) -> Iterable[Base]:
yield base
+def get_item(obj: Base | dict[str, Any], key, default=None):
+ """Get an item from a dictionary or an object with a default value."""
+ if isinstance(obj, dict): # If it's a dictionary
+ return obj.get(key, default)
+ elif hasattr(obj, key): # If it's an object with the attribute
+ return getattr(obj, key, default)
+ return default # Return default if it's neither a dict nor an object with the attribute
+
+
+def has_item(obj: Base | dict[str, Any], key: str) -> bool:
+ """Check if an object has a key or an attribute."""
+ if isinstance(obj, dict):
+ return key in obj
+ elif hasattr(obj, key):
+ return True
+ return False
+
+
def flatten_base_thorough(base: Base, parent_type: str = None) -> Iterable[Base]:
"""Take a base and flatten it to an iterable of bases.
@@ -51,9 +69,7 @@ def flatten_base_thorough(base: Base, parent_type: str = None) -> Iterable[Base]
print(category)
if category.startswith("@"):
category_object: Base = getattr(base, category)[0]
- yield from flatten_base_thorough(
- category_object, category_object.speckle_type
- )
+ yield from flatten_base_thorough(category_object, category_object.speckle_type)
except KeyError:
pass
@@ -63,11 +79,13 @@ def flatten_base_thorough(base: Base, parent_type: str = None) -> Iterable[Base]
def extract_base_and_transform(
base: Base,
- inherited_instance_id: Optional[str] = None,
- transform_list: Optional[List[Transform]] = None,
-) -> Tuple[Base, str, Optional[List[Transform]]]:
- """
- Traverses Speckle object hierarchies to yield `Base` objects and their transformations.
+ inherited_instance_id: str | None = None,
+ transform_list: list[Transform] | None = None,
+) -> Generator[
+ Base | str | list[Transform] | None | tuple[Base, Any | None, list[Transform] | None | list[Any]], Any | None, None
+]:
+ """Traverses Speckle object hierarchies to yield `Base` objects and their transformations.
+
Tailored to Speckle's AEC data structures, it covers the newer hierarchical structures
with Collections and also with patterns found in older Revit specific data.
@@ -91,9 +109,7 @@ def extract_base_and_transform(
if base.transform:
transform_list.append(base.transform)
if base.definition:
- yield from extract_base_and_transform(
- base.definition, current_id, transform_list.copy()
- )
+ yield from extract_base_and_transform(base.definition, current_id, transform_list.copy())
else:
# Initial yield for the current `Base` object.
yield base, current_id, transform_list
@@ -103,9 +119,7 @@ def extract_base_and_transform(
for element in elements_attr:
if isinstance(element, Base):
# Recurse into each `Base` object within 'elements' or '@elements'.
- yield from extract_base_and_transform(
- element, current_id, transform_list.copy()
- )
+ yield from extract_base_and_transform(element, current_id, transform_list.copy())
# Recursively process '@'-prefixed properties that are Base objects with 'elements'.
# This is a common pattern in older Speckle data models, such as those used for Revit commits.
@@ -114,6 +128,4 @@ def extract_base_and_transform(
attr_value = getattr(base, attr_name)
# If the attribute is a Base object containing 'elements', recurse into it.
if isinstance(attr_value, Base) and hasattr(attr_value, "elements"):
- yield from extract_base_and_transform(
- attr_value, current_id, transform_list.copy()
- )
+ yield from extract_base_and_transform(attr_value, current_id, transform_list.copy())
diff --git a/src/inputs.py b/src/inputs.py
index f11ec33..45bd24d 100644
--- a/src/inputs.py
+++ b/src/inputs.py
@@ -1,7 +1,14 @@
+from enum import Enum
+
from pydantic import Field
from speckle_automate import AutomateBase
+class PropertyMatchMode(Enum):
+ STRICT = "strict" # Exact parameter path match
+ FUZZY = "fuzzy" # Search all parameters ignoring hierarchy
+ MIXED = "mixed" # Exact match first, fuzzy fallback
+
class FunctionInputs(AutomateBase):
"""These are function author defined values.
@@ -10,8 +17,23 @@ class FunctionInputs(AutomateBase):
https://docs.pydantic.dev/latest/usage/models/
"""
+
+
+
+
+
+
# In this exercise, we will move rules to an external source so not to hardcode them.
spreadsheet_url: str = Field(
title="Spreadsheet URL",
description="This is the URL of the spreadsheet to check. It should be a TSV format data source.",
)
+
+ property_match_mode: PropertyMatchMode = Field(
+ default=PropertyMatchMode.MIXED,
+ title="Property Match Mode",
+ description='Controls how strictly parameter names must match. ' +
+ 'STRICT will only match exact parameter paths, ' +
+ 'FUZZY will search all parameters ignoring hierarchy, ' +
+ 'MIXED will exact match first, fuzzy fallback.'
+ )
diff --git a/src/predicates.py b/src/predicates.py
new file mode 100644
index 0000000..8f3108e
--- /dev/null
+++ b/src/predicates.py
@@ -0,0 +1,19 @@
+"""Configuration module defining mappings between spreadsheet predicates and rule methods."""
+
+from src.rules import PropertyRules
+
+# Mapping of input predicates to the corresponding methods in PropertyRules
+PREDICATE_METHOD_MAP = {
+ "exists": PropertyRules.has_parameter.__name__,
+ "matches": PropertyRules.is_parameter_value.__name__,
+ "greater than": PropertyRules.is_parameter_value_greater_than.__name__,
+ "less than": PropertyRules.is_parameter_value_less_than.__name__,
+ "in range": PropertyRules.is_parameter_value_in_range.__name__,
+ "in list": PropertyRules.is_parameter_value_in_list.__name__,
+ "equal to": PropertyRules.is_equal_value.__name__,
+ "is true": PropertyRules.is_parameter_value_true.__name__,
+ "is false": PropertyRules.is_parameter_value_false.__name__,
+ "is like": PropertyRules.is_parameter_value_like.__name__,
+ "identical to": PropertyRules.is_identical_value.__name__,
+ "not equal": PropertyRules.is_not_equal_value.__name__,
+}
diff --git a/src/rule_processor.py b/src/rule_processor.py
new file mode 100644
index 0000000..dcf2701
--- /dev/null
+++ b/src/rule_processor.py
@@ -0,0 +1,244 @@
+from enum import Enum
+from typing import Any
+
+import pandas as pd
+from pandas.core.groupby import DataFrameGroupBy
+from speckle_automate import AutomationContext, ObjectResultLevel
+from specklepy.objects.base import Base
+
+from src.helpers import speckle_print
+from src.predicates import PREDICATE_METHOD_MAP
+from src.rules import PropertyRules
+
+
+def evaluate_condition(
+ speckle_object: Base, condition: pd.Series, rule_number: str | None = None, case_number: int | None = None
+) -> bool:
+ """Given a Speckle object and a condition, evaluates the condition and returns a boolean value.
+
+ A condition is a pandas Series object with the following keys:
+ - 'Property Name': The name of the property to evaluate.
+ - 'Predicate': The predicate to use for evaluation.
+ - 'Value': The value to compare against.
+
+ Args:
+ rule_number (string): For information the rule number.
+ case_number (int): For information the rule clause number.
+ speckle_object (Base): The Speckle object to evaluate.
+ condition (pd.Series): The condition to evaluate.
+
+ Returns:
+ bool: The result of the evaluation. True if the condition is met, False otherwise.
+ """
+ property_name = condition["Property Name"]
+ predicate_key = condition["Predicate"]
+ value = condition["Value"]
+
+ _ = rule_number
+ _ = case_number
+
+ if predicate_key in PREDICATE_METHOD_MAP:
+ method_name = PREDICATE_METHOD_MAP[predicate_key]
+ method = getattr(PropertyRules, method_name, None)
+
+ if method:
+ check_answer = method(speckle_object, property_name, value)
+
+ return check_answer
+ return False
+
+
+def process_rule(
+ speckle_objects: list[Base], rule_group: pd.DataFrame
+) -> tuple[list[Any], list[Any]] | tuple[list[Base], list[Base]]:
+ """Processes a set of rules against Speckle objects, returning those that pass and fail.
+
+ The first rule is used as a filter ('WHERE'), and subsequent rules as conditions ('AND').
+
+ Args:
+ speckle_objects: List of Speckle objects to be processed.
+ rule_group: DataFrame defining the filter and conditions.
+
+ Returns:
+ A tuple of lists containing objects that passed and failed the rule.
+ """
+ # Extract the 'WHERE' condition and subsequent 'AND' conditions
+ filter_condition = rule_group.iloc[0]
+ subsequent_conditions = rule_group.iloc[1:]
+
+ # get the last row of the rule_group and get the Message and Report Severity
+ rule_info = rule_group.iloc[-1]
+ rule_number = rule_info["Rule Number"]
+
+ # Filter objects based on the 'WHERE' condition
+ filtered_objects = [
+ speckle_object for speckle_object in speckle_objects if evaluate_condition(speckle_object, filter_condition)
+ ]
+
+ if not filtered_objects or len(list(filtered_objects)) == 0:
+ return [], []
+
+ # Initialize lists for passed and failed objects
+ pass_objects, fail_objects = [], []
+
+ # Evaluate each filtered object against the 'AND' conditions
+ for speckle_object in filtered_objects:
+ if all(
+ evaluate_condition(
+ speckle_object=speckle_object, condition=condition, rule_number=rule_number, case_number=index
+ )
+ for index, condition in subsequent_conditions.iterrows()
+ ):
+ pass_objects.append(speckle_object)
+ else:
+ fail_objects.append(speckle_object)
+
+ return pass_objects, fail_objects
+
+
+def apply_rules_to_objects(
+ speckle_objects: list[Base],
+ grouped_rules: DataFrameGroupBy,
+ automate_context: AutomationContext,
+) -> dict[str, tuple[list[Base], list[Base]]]:
+ """Applies defined rules to a list of objects and updates the automate context based on the results.
+
+ Args:
+ speckle_objects (List[Base]): The list of objects to which rules are applied.
+ grouped_rules (pd.DataFrameGroupBy): The DataFrame containing rule definitions.
+ automate_context (Any): Context manager for attaching rule results.
+ """
+ grouped_results = {}
+
+ rules_processed = 0
+
+ for rule_id, rule_group in grouped_rules:
+ rule_id_str = str(rule_id) # Convert rule_id to string
+
+ rules_processed += 1
+
+ # Ensure rule_group has necessary columns
+ if "Message" not in rule_group.columns or "Report Severity" not in rule_group.columns:
+ continue # Or raise an exception if these columns are mandatory
+
+ pass_objects, fail_objects = process_rule(speckle_objects, rule_group)
+
+ attach_results(pass_objects, rule_group.iloc[-1], rule_id_str, automate_context, True)
+ attach_results(fail_objects, rule_group.iloc[-1], rule_id_str, automate_context, False)
+
+ if len(pass_objects) == 0 and len(fail_objects) == 0:
+ automate_context.attach_info_to_objects(
+ category=f"Rule {rule_id_str} Skipped",
+ object_ids=["0"], # This is a hack to get a rule to report with no valid objects
+ message=f"No objects found for rule {rule_id_str}",
+ metadata={},
+ )
+ # pass
+
+ grouped_results[rule_id_str] = (pass_objects, fail_objects)
+
+ # return pass_objects, fail_objects for each rule
+ return grouped_results
+
+
+class SeverityLevel(Enum):
+ """Enum for severity levels."""
+
+ INFO = "Info"
+ WARNING = "Warning"
+ ERROR = "Error"
+
+
+def get_severity(rule_info: pd.Series) -> SeverityLevel:
+ """Convert a string severity level to the corresponding SeverityLevel enum.
+
+ This function normalizes input strings (because processing user entered dead is hard), handling:
+ - Case insensitivity (e.g., "info", "WARNING" → "Info", "Warning")
+ - Shorthand mappings (e.g., "WARN" → "Warning")
+ - Stripping whitespace
+ - Defaults to SeverityLevel.ERROR if the input is invalid
+ """
+ severity = rule_info.get("Report Severity") # Extract severity from input data
+
+ # If severity is None or not a string (e.g., numeric input), default to ERROR
+ if not isinstance(severity, str):
+ return SeverityLevel.ERROR
+
+ severity = severity.strip().upper() # Remove leading/trailing spaces & normalize case
+
+ # Define a mapping for shorthand or alternate spellings
+ alias_map = {
+ "WARN": "WARNING", # Treat "WARN" as "WARNING"
+ }
+
+ # Replace shorthand values if applicable
+ severity = alias_map.get(severity, severity)
+
+ # Attempt to match with an existing SeverityLevel enum value (case-insensitive)
+ return next(
+ (level for level in SeverityLevel if level.value.upper() == severity),
+ SeverityLevel.ERROR, # Default to ERROR if no match is found
+ )
+
+
+def get_metadata(
+ rule_id: str, rule_info: pd.Series, passed: bool, speckle_objects: list[Base]
+) -> dict[str, str | int | Any]:
+ """Function that generates metadata with severity validation."""
+ metadata = {
+ "rule_id": rule_id,
+ "status": "PASS" if passed else "FAIL",
+ "severity": get_severity(rule_info).value, # Keep proper casing
+ "rule_message": rule_info["Message"],
+ "object_count": len(speckle_objects),
+ }
+ return metadata
+
+
+def attach_results(
+ speckle_objects: list[Base],
+ rule_info: pd.Series,
+ rule_id: str,
+ context: AutomationContext,
+ passed: bool,
+) -> None:
+ """Attaches the results of a rule to the objects in the context.
+
+ Args:
+ speckle_objects (List[Base]): The list of objects to which the rule was applied.
+ rule_info (pd.Series): The information about the rule.
+ rule_id (str): The ID of the rule.
+ context (AutomationContext): The context manager for attaching results.
+ passed (bool): Whether the rule passed or failed.
+ """
+ if not speckle_objects:
+ return
+
+ # Create structured metadata for onward data analysis uses
+
+ metadata = get_metadata(rule_id, rule_info, passed, speckle_objects)
+
+ message = f"{rule_info['Message']}"
+
+ if not passed:
+ speckle_print(rule_info["Report Severity"])
+
+ severity = (
+ ObjectResultLevel.WARNING
+ if rule_info["Report Severity"].capitalize() in ["Warning", "Warn"]
+ else ObjectResultLevel.ERROR
+ )
+ context.attach_result_to_objects(
+ category=f"Rule {rule_id}",
+ object_ids=[speckle_object.id for speckle_object in speckle_objects],
+ message=message,
+ level=severity,
+ metadata=metadata,
+ )
+ else:
+ context.attach_info_to_objects(
+ category=f"Rule {rule_id}",
+ object_ids=[speckle_object.id for speckle_object in speckle_objects],
+ message=message,
+ metadata=metadata,
+ )
diff --git a/src/rules.py b/src/rules.py
index ba6e39c..08c07cb 100644
--- a/src/rules.py
+++ b/src/rules.py
@@ -1,59 +1,30 @@
+import math
import re
-from typing import Any, cast
+from typing import Any
-import pandas as pd
from Levenshtein import ratio
-from speckle_automate import AutomationContext, ObjectResultLevel
from specklepy.objects.base import Base
-from src.helpers import speckle_print
-
-# We're going to define a set of rules that will allow us to filter and
-# process parameters in our Speckle objects. These rules will be encapsulated
-# in a class called `ParameterRules`.
+PRIMITIVE_TYPES = (bool, int, float, str, type(None))
class Rules:
- """A collection of rules for processing properties in Speckle objects.
-
- Simple rules can be straightforwardly implemented as static methods that
- return boolean value to be used either as a filter or a condition.
- These can then be abstracted into returning lambda functions that we can
- use in our main processing logic. By encapsulating these rules, we can easily
- extend or modify them in the future.
- """
+ """A collection of rules for processing properties in Speckle objects."""
@staticmethod
def try_get_display_value(
- speckle_object: Base,
+ speckle_object: Base,
) -> list[Base] | None:
- """Try fetching the display value from a Speckle object.
-
- This method encapsulates the logic for attempting to retrieve the display value from a Speckle object.
- It returns a list containing the display values if found, otherwise it returns None.
-
- Args:
- speckle_object (Base): The Speckle object to extract the display value from.
-
- Returns:
- Optional[List[Base]]: A list containing the display values. If no display value is found,
- returns None.
- """
- # Attempt to get the display value from the speckle_object
+ """Try fetching the display value from a Speckle object."""
raw_display_value = getattr(speckle_object, "displayValue", None) or getattr(
speckle_object, "@displayValue", None
)
- # If no display value found, return None
if raw_display_value is None:
return None
- # If display value found, filter out non-Base objects
- display_values = [
- value for value in raw_display_value if isinstance(value, Base)
- ]
+ display_values = [value for value in raw_display_value if isinstance(value, Base)]
- # If no valid display values found, return None
if not display_values:
return None
@@ -61,231 +32,260 @@ class Rules:
@staticmethod
def is_displayable_object(speckle_object: Base) -> bool:
- """Determines if a given Speckle object is displayable.
-
- This method encapsulates the logic for determining if a Speckle object is displayable.
- It checks if the speckle_object has a display value and returns True if it does, otherwise it returns False.
-
- Args:
- speckle_object (Base): The Speckle object to check.
-
- Returns:
- bool: True if the object has a display value, False otherwise.
- """
- # Check for direct displayable state using try_get_display_value
+ """Determines if a given Speckle object is displayable."""
display_values = Rules.try_get_display_value(speckle_object)
if display_values and getattr(speckle_object, "id", None) is not None:
return True
- # Check for displayable state via definition, using try_get_display_value on the definition object
definition = getattr(speckle_object, "definition", None)
if definition:
definition_display_values = Rules.try_get_display_value(definition)
- if (
- definition_display_values
- and getattr(definition, "id", None) is not None
- ):
+ if definition_display_values and getattr(definition, "id", None) is not None:
return True
return False
-
-def get_displayable_objects(flat_list_of_objects: list[Base]) -> list[Base]:
- # modify this lambda from before to use the static method from the Checks class
- return [
- speckle_object
- for speckle_object in flat_list_of_objects
- if Rules.is_displayable_object(speckle_object)
- and getattr(speckle_object, "id", None)
- ]
-
- # and the same logic that could be modified to traverse a tree of objects
-
-
-def filter_objects_by_category(
- speckle_objects: list[Base], category_input: str
-) -> tuple[list[Base], list[Base]]:
- """Filters objects by category value and test.
-
- This function takes a list of Speckle objects, filters out the objects
- with a matching category value and satisfies the test, and returns
- both the matching and non-matching objects.
-
- Args:
- speckle_objects (List[Base]): The list of Speckle objects to filter.
- category_input (str): The category value to match against.
-
- Returns:
- Tuple[List[Base], List[Base]]: A tuple containing two lists:
- - The first list contains objects with matching category and test.
- - The second list contains objects without matching category or test.
- """
- matching_objects = []
- non_matching_objects = []
-
- for obj in speckle_objects:
- if RevitRules.is_category(obj, category_input):
- matching_objects.append(obj)
- else:
- non_matching_objects.append(obj)
-
- return matching_objects, non_matching_objects
-
-
-class RevitRules:
@staticmethod
- def has_parameter(
- speckle_object: Base, parameter_name: str, *_args, **_kwargs
- ) -> bool:
- """Checks if the speckle_object has a Revit parameter with the given name.
+ def get_displayable_objects(flat_list_of_objects: list[Base]) -> list[Base]:
+ """Filters a list of Speckle objects to only include displayable objects."""
+ return [
+ speckle_object
+ for speckle_object in flat_list_of_objects
+ if Rules.is_displayable_object(speckle_object) and getattr(speckle_object, "id", None)
+ ]
- This method checks if the speckle_object has a parameter with the specified name,
- considering the following cases:
- 1. The parameter is a named property at the root object level.
- 2. The parameter is stored as a key in the "parameters" dictionary.
- 3. The parameter is stored as a nested dictionary within the "parameters" property,
- and the parameter name is stored as the value of the "name" property within each nested dictionary.
- If the parameter exists, it returns True; otherwise, it returns False.
+class PropertyRules:
+ """A collection of rules for processing parameters in Speckle objects."""
+
+ @staticmethod
+ def normalize_path(path: str) -> str:
+ """Remove technical path prefixes like 'properties' and 'parameters'."""
+ parts = path.split(".")
+ filtered = [p for p in parts if p.lower() not in ("properties", "parameters")]
+ return ".".join(filtered)
+
+ @staticmethod
+ def convert_revit_boolean(value: Any) -> Any:
+ """Convert Revit-style Yes/No strings to boolean values."""
+ # Handle None case
+ if value is None:
+ return None
+
+ # Already a boolean
+ if isinstance(value, bool):
+ return value
+
+ # Handle string case with proper type checking
+ if isinstance(value, str):
+ value_lower = value.lower()
+ if value_lower == "yes":
+ return True
+ if value_lower == "no":
+ return False
+
+ # Return original value if no conversion applied
+ return value
+
+ @staticmethod
+ def get_obj_value(obj: Any, get_raw: bool = False) -> Any:
+ """Extract appropriate value from an object, handling special cases."""
+ if get_raw:
+ return obj
+
+ # Handle primitive types directly
+ if isinstance(obj, PRIMITIVE_TYPES):
+ return PropertyRules.convert_revit_boolean(obj)
+
+ # Handle dict
+ if isinstance(obj, dict):
+ if "value" in obj:
+ return PropertyRules.convert_revit_boolean(obj["value"])
+ return obj
+
+ # Handle Base object
+ if isinstance(obj, Base):
+ if hasattr(obj, "value"):
+ return PropertyRules.convert_revit_boolean(obj.value)
+ return obj
+
+ return obj
+
+ @staticmethod
+ def search_obj(obj: Any, parts: list[str]) -> tuple[bool, Any]:
+ """Recursively search an object following a path."""
+ if not parts:
+ return True, obj
+
+ current = parts[0]
+ remaining = parts[1:]
+
+ # Handle dict
+ if isinstance(obj, dict):
+ for key in obj:
+ if key.lower() == current.lower():
+ if remaining:
+ return PropertyRules.search_obj(obj[key], remaining)
+ return True, obj[key]
+
+ # Handle Base
+ elif isinstance(obj, Base):
+ for key in obj.get_member_names():
+ if key.lower() == current.lower():
+ if remaining:
+ return PropertyRules.search_obj(getattr(obj, key), remaining)
+ return True, getattr(obj, key)
+
+ return False, None
+
+ @staticmethod
+ def find_property(root: Any, search_path: str, get_raw: bool = False) -> tuple[bool, Any]:
+ """Find a property by searching through nested objects.
Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check for.
- *_args: Extra positional arguments which are ignored.
- **_kwargs: Extra keyword arguments which are ignored.
+ root: The root object to search
+ search_path: Path to the property to find
+ get_raw: Whether to return raw values without conversion
Returns:
- bool: True if the object has the parameter, False otherwise.
+ Tuple of (found: bool, value: Any)
"""
- if hasattr(speckle_object, parameter_name):
- return True
+ # Normalize the search path
+ norm_path = PropertyRules.normalize_path(search_path)
+ parts = norm_path.split(".")
- parameters = cast(Base, getattr(speckle_object, "parameters", None))
+ # Search through object hierarchy
+ def traverse(obj: Any, visited: set[int] | None = None) -> tuple[bool, Any]:
+ if visited is None:
+ visited = set()
- if parameters is None:
- return False
+ # Skip if already visited or not a container type
+ if not isinstance(obj, dict | Base):
+ return False, None
- # the parameters object can function like a dict but isn't one.
- # convert a Base object to a dict
- parameters_dict = {}
+ obj_id = id(obj)
+ if obj_id in visited:
+ return False, None
- for parameter_key in parameters.get_dynamic_member_names():
- parameters_dict[parameter_key] = getattr(parameters, parameter_key, None)
+ visited.add(obj_id)
- if parameter_name in parameters_dict:
- return True
+ # Try direct path match
+ found, value = PropertyRules.search_obj(obj, parts)
+ if found:
+ return True, PropertyRules.get_obj_value(value, get_raw)
- return any(
- getattr(param_value, "name", None) == parameter_name
- for param_value in parameters_dict.values()
- )
+ # Handle dict
+ if isinstance(obj, dict):
+ for key, val in obj.items():
+ if isinstance(val, dict | Base):
+ found, value = traverse(val, visited)
+ if found:
+ return True, value
+
+ # Handle Base
+ elif isinstance(obj, Base):
+ for key in obj.get_member_names():
+ if not key.startswith("_"):
+ val = getattr(obj, key)
+ if isinstance(val, dict | Base):
+ found, value = traverse(val, visited)
+ if found:
+ return True, value
+
+ visited.remove(obj_id) # Clean up visited set
+ return False, None
+
+ return traverse(root)
+
+ @staticmethod
+ def has_parameter(speckle_object: Base, parameter_name: str, *_args, **_kwargs) -> bool:
+ """Check if a parameter exists in the Speckle object."""
+ found, _ = PropertyRules.find_property(speckle_object, parameter_name)
+ return found
@staticmethod
def get_parameter_value(
- speckle_object: Base,
- parameter_name: str,
- default_value: Any = None,
- ) -> Any | None:
- """Retrieves the value of the specified Revit parameter from the speckle_object.
-
- This method checks if the speckle_object has a parameter with the specified name,
- considering the following cases:
- 1. The parameter is a named property at the root object level.
- 2. The parameter is stored as a key in the "parameters" dictionary.
- 3. The parameter is stored as a nested dictionary within the "parameters" property,
- and the parameter name is stored as the value of the "name" property within each nested dictionary.
-
- If the parameter exists and its value is not None or the specified default_value, it returns the value.
- If the parameter does not exist or its value is None or the specified default_value, it returns None.
+ speckle_object: Base,
+ parameter_name: str,
+ default_value: Any = None,
+ get_raw: bool = False,
+ ) -> Any:
+ """Get a parameter value from the Speckle object using strict path matching.
Args:
- speckle_object (Base): The Speckle object to retrieve the parameter value from.
- parameter_name (str): The name of the parameter to retrieve the value for.
- default_value: The default value to compare against. If the parameter value matches this value,
- it will be treated the same as None.
+ speckle_object: The Speckle object to search
+ parameter_name: Exact parameter path to find
+ default_value: Value to return if parameter not found
+ get_raw: Whether to return raw values without conversion
Returns:
- The value of the parameter if it exists and is not None or the specified default_value, or None otherwise.
+ The parameter value if found using exact path matching, otherwise default_value
"""
- # Attempt to retrieve the parameter from the root object level
- value = getattr(speckle_object, parameter_name, None)
- if value not in [None, default_value]:
- return value
-
- # If the "parameters" attribute is a Base object, extract its dynamic members
- parameters = getattr(speckle_object, "parameters", None)
- if parameters is None:
- return None
-
- # Prepare a dictionary of parameter values from the dynamic members of the parameters attribute
- parameters_dict = {
- key: getattr(parameters, key)
- for key in parameters.get_dynamic_member_names()
- }
-
- # Search for a direct match or a nested match in the parameters dictionary
- param_value = parameters_dict.get(parameter_name)
- if param_value is not None:
- if isinstance(param_value, Base):
- # Extract the nested value from a Base object if available
- nested_value = getattr(param_value, "value", None)
- if nested_value not in [None, default_value]:
- return nested_value
- elif param_value not in [None, default_value]:
- return param_value
-
- # Use a generator to find the first matching 'value' for shared parameters stored in Base objects
- return next(
- (
- getattr(p, "value", None)
- for p in parameters_dict.values()
- if isinstance(p, Base) and getattr(p, "name", None) == parameter_name
- ),
- None,
- )
-
- from typing import Any
+ found, value = PropertyRules.find_property(speckle_object, parameter_name, get_raw)
+ return value if found else default_value
@staticmethod
- def is_parameter_value(
- speckle_object: Base, parameter_name: str, value_to_match: Any
- ) -> bool:
- """Checks if the value of the specified parameter matches the given value.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- value_to_match (Any): The value to match against.
-
- Returns:
- bool: True if the parameter value matches the given value, False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
+ def is_parameter_value(speckle_object: Base, parameter_name: str, value_to_match: Any) -> bool:
+ """Checks if the value of the specified parameter matches the given value."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
return parameter_value == value_to_match
+ @staticmethod
+ def parse_number_from_string(input_string: str):
+ """Attempts to parse a number from a string."""
+ try:
+ return int(input_string)
+ except ValueError:
+ try:
+ return float(input_string)
+ except ValueError:
+ raise ValueError("Input string is not a valid integer or float")
+
+ @staticmethod
+ def is_parameter_value_greater_than(speckle_object: Base, parameter_name: str, threshold: str) -> bool:
+ """Checks if parameter value is greater than threshold."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ if parameter_value is None:
+ return False
+ if not isinstance(parameter_value, int | float):
+ raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+ return parameter_value > PropertyRules.parse_number_from_string(threshold)
+
+ @staticmethod
+ def is_parameter_value_less_than(speckle_object: Base, parameter_name: str, threshold: str) -> bool:
+ """Checks if parameter value is less than threshold."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ if parameter_value is None:
+ return False
+ if not isinstance(parameter_value, int | float):
+ raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+ return parameter_value < PropertyRules.parse_number_from_string(threshold)
+
+ @staticmethod
+ def is_parameter_value_in_range(speckle_object: Base, parameter_name: str, value_range: str) -> bool:
+ """Checks if parameter value falls within range."""
+ min_value, max_value = value_range.split(",")
+ min_value = PropertyRules.parse_number_from_string(min_value)
+ max_value = PropertyRules.parse_number_from_string(max_value)
+
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ if parameter_value is None:
+ return False
+ if not isinstance(parameter_value, int | float):
+ raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+
+ return min_value <= parameter_value <= max_value
+
@staticmethod
def is_parameter_value_like(
- speckle_object: Base,
- parameter_name: str,
- pattern: str,
- fuzzy: bool = False,
- threshold: float = 0.8,
+ speckle_object: Base,
+ parameter_name: str,
+ pattern: str,
+ fuzzy: bool = False,
+ threshold: float = 0.8,
) -> bool:
- """Checks if the value of the specified parameter matches the given pattern.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- pattern (str): The pattern to match against.
- fuzzy (bool): If True, performs fuzzy matching using Levenshtein distance.
- If False (default), performs exact pattern matching using regular expressions.
- threshold (float): The similarity threshold for fuzzy matching (default: 0.8).
- Only applicable when fuzzy=True.
-
- Returns:
- bool: True if the parameter value matches the pattern (exact or fuzzy), False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
+ """Checks if parameter value matches pattern."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
if parameter_value is None:
return False
@@ -296,434 +296,210 @@ class RevitRules:
return bool(re.match(pattern, str(parameter_value)))
@staticmethod
- def parse_number_from_string(input_string: str):
- """Attempts to parse an integer or float from a given string.
-
- Args:
- input_string (str): The string containing the number to be parsed.
-
- Returns:
- int or float: The parsed number, or raises ValueError if parsing is not possible.
- """
- try:
- # First try to convert it to an integer
- return int(input_string)
- except ValueError:
- # If it fails to convert to an integer, try to convert to a float
- try:
- return float(input_string)
- except ValueError:
- # Raise an error if neither conversion is possible
- raise ValueError("Input string is not a valid integer or float")
-
- @staticmethod
- def is_parameter_value_greater_than(
- speckle_object: Base, parameter_name: str, threshold: str
- ) -> bool:
- """Checks if the value of the specified parameter is greater than the given threshold.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- threshold (Union[int, float]): The threshold value to compare against.
-
- Returns:
- bool: True if the parameter value is greater than the threshold, False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
- if parameter_value is None:
- return False
-
- if not isinstance(parameter_value, int | float):
- raise ValueError(
- f"Parameter value must be a number, got {type(parameter_value)}"
- )
- return parameter_value > RevitRules.parse_number_from_string(threshold)
-
- @staticmethod
- def is_parameter_value_less_than(
- speckle_object: Base, parameter_name: str, threshold: str
- ) -> bool:
- """Checks if the value of the specified parameter is less than the given threshold.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- threshold (Union[int, float]): The threshold value to compare against.
-
- Returns:
- bool: True if the parameter value is less than the threshold, False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
- if parameter_value is None:
- return False
- if not isinstance(parameter_value, int | float):
- raise ValueError(
- f"Parameter value must be a number, got {type(parameter_value)}"
- )
- return parameter_value < RevitRules.parse_number_from_string(threshold)
-
- @staticmethod
- def is_parameter_value_in_range(
- speckle_object: Base, parameter_name: str, range: str
- ) -> bool:
- """Checks if the value of the specified parameter falls within the given range.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- range (str): The range to check against, in the format "min_value, max_value".
-
- Returns:
- bool: True if the parameter value falls within the range (inclusive), False otherwise.
- """
- min_value, max_value = range.split(",")
- min_value = RevitRules.parse_number_from_string(min_value)
- max_value = RevitRules.parse_number_from_string(max_value)
-
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
- if parameter_value is None:
- return False
- if not isinstance(parameter_value, int | float):
- raise ValueError(
- f"Parameter value must be a number, got {type(parameter_value)}"
- )
-
- return min_value <= parameter_value <= max_value
-
- @staticmethod
- def is_parameter_value_in_range_expanded(
- speckle_object: Base,
- parameter_name: str,
- min_value: int | float,
- max_value: int | float,
- inclusive: bool = True,
- ) -> bool:
- """Checks if the value of the specified parameter falls within the given range.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- min_value (Union[int, float]): The minimum value of the range.
- max_value (Union[int, float]): The maximum value of the range.
- inclusive (bool): If True (default), the range is inclusive (min <= value <= max).
- If False, the range is exclusive (min < value < max).
-
- Returns:
- bool: True if the parameter value falls within the range (inclusive), False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
- if parameter_value is None:
- return False
- if not isinstance(parameter_value, int | float):
- raise ValueError(
- f"Parameter value must be a number, got {type(parameter_value)}"
- )
-
- return (
- min_value <= parameter_value <= max_value
- if inclusive
- else min_value < parameter_value < max_value
- )
-
- @staticmethod
- def is_parameter_value_in_list(
- speckle_object: Base, parameter_name: str, value_list: list[Any]
- ) -> bool:
- """Checks if the value of the specified parameter is present in the given list of values.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- value_list (List[Any]): The list of values to check against.
-
- Returns:
- bool: True if the parameter value is found in the list, False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
+ def is_parameter_value_in_list(speckle_object: Base, parameter_name: str, value_list: list[Any] | str) -> bool:
+ """Checks if parameter value is in list."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
if isinstance(value_list, str):
- value_list = [value.strip() for value in value_list.split(",")]
+ value_list = [v.strip() for v in value_list.split(",") if v.strip()]
- # parameter_value is effectively Any type, so to find its value in the value_list
def is_value_in_list(value: Any, my_list: Any) -> bool:
- # Ensure that my_list is actually a list
if isinstance(my_list, list):
return value in my_list or str(value) in my_list
- else:
- speckle_print(f"Expected a list, got {type(my_list)} instead.")
- return False
+ return False
return is_value_in_list(parameter_value, value_list)
+ @staticmethod
+ def _check_boolean_value(value: Any, values_to_match: tuple[str, ...]) -> bool:
+ """Check if a value matches any target value in expected format."""
+ if isinstance(value, bool):
+ return value is (True if "true" in values_to_match else False)
+
+ if isinstance(value, str):
+ return value.lower() in values_to_match
+
+ return False
+
@staticmethod
def is_parameter_value_true(speckle_object: Base, parameter_name: str) -> bool:
- """Checks if the value of the specified parameter is True.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
-
- Returns:
- bool: True if the parameter value is True, False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
- return parameter_value is True
+ """Check if parameter value represents true."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ return PropertyRules._check_boolean_value(parameter_value, ("yes", "true", "1"))
@staticmethod
def is_parameter_value_false(speckle_object: Base, parameter_name: str) -> bool:
- """Checks if the value of the specified parameter is False.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
-
- Returns:
- bool: True if the parameter value is False, False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
- return parameter_value is False
+ """Check if parameter value represents false."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ return PropertyRules._check_boolean_value(parameter_value, ("no", "false", "0"))
@staticmethod
def has_category(speckle_object: Base) -> bool:
- """Checks if the speckle_object has a 'category' parameter.
-
- This method checks if the speckle_object has a 'category' parameter.
- If the 'category' parameter exists, it returns True; otherwise, it returns False.
-
- Args:
- speckle_object (Base): The Speckle object to check.
-
- Returns:
- bool: True if the object has the 'category' parameter, False otherwise.
- """
- return RevitRules.has_parameter(speckle_object, "category")
+ """Check if object has category."""
+ return PropertyRules.has_parameter(speckle_object, "category")
@staticmethod
def is_category(speckle_object: Base, category_input: str) -> bool:
- """Checks if the value of the 'category' property matches the given input.
-
- This method checks if the 'category' property of the speckle_object
- matches the given category_input. If they match, it returns True;
- otherwise, it returns False.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- category_input (str): The category value to compare against.
-
- Returns:
- bool: True if the 'category' property matches the input, False otherwise.
- """
- category_value = RevitRules.get_parameter_value(speckle_object, "category")
+ """Check if object matches category."""
+ category_value = PropertyRules.get_parameter_value(speckle_object, "category")
return category_value == category_input
@staticmethod
def get_category_value(speckle_object: Base) -> str:
- """Retrieves the value of the 'category' parameter from the speckle_object.
+ """Get object's category value."""
+ return PropertyRules.get_parameter_value(speckle_object, "category")
- This method retrieves the value of the 'category' parameter from the speckle_object.
- If the 'category' parameter exists and its value is not None, it returns the value.
- If the 'category' parameter does not exist or its value is None, it returns an empty string.
+ @staticmethod
+ def _try_boolean_comparison(value1: Any, value2: Any, allow_yes_no: bool) -> tuple[bool, bool]:
+ """Attempts to compare two values as booleans."""
+
+ def strict_convert_boolean(value: Any) -> Any:
+ """Convert 'True'/'False' strings to booleans, and use `convert_revit_boolean` for Yes/No."""
+ if value is None:
+ return None
+ if isinstance(value, bool):
+ return value
+ if isinstance(value, str):
+ value_lower = value.strip().lower()
+ if value_lower == "true":
+ return True
+ if value_lower == "false":
+ return False
+ # Use convert_revit_boolean for Yes/No conversion
+ return PropertyRules.convert_revit_boolean(value) if allow_yes_no else value
+
+ return value
+
+ bool1 = strict_convert_boolean(value1)
+ bool2 = strict_convert_boolean(value2)
+
+ # If both are valid booleans, compare them
+ if isinstance(bool1, bool) and isinstance(bool2, bool):
+ return True, bool1 == bool2
+
+ return False, False
+
+ @staticmethod
+ def _compare_values(
+ value1: Any,
+ value2: Any,
+ case_sensitive: bool = False,
+ tolerance: float = 1e-6,
+ allow_yes_no_bools: bool = True,
+ use_exact: bool = False,
+ ) -> bool:
+ """Core logic for comparing two values with type handling and tolerance.
Args:
- speckle_object (Base): The Speckle object to retrieve the 'category' parameter value from.
+ value1: First value to compare
+ value2: Second value to compare
+ case_sensitive: Whether to perform case-sensitive string comparison
+ tolerance: Tolerance for floating point comparisons
+ allow_yes_no_bools: Whether to convert Yes/No strings to booleans when comparing with boolean values
+ use_exact: Whether to use exact equality for numeric comparisons
+ Returns:
+ bool: True if values are considered equal, False otherwise
+ """
+ # Try boolean comparison first
+ can_compare, result = PropertyRules._try_boolean_comparison(value1, value2, allow_yes_no_bools)
+ if can_compare:
+ return result
+
+ # Handle case where one value is a string that can be interpreted as a number
+ if isinstance(value1, str) and value1.replace(".", "", 1).isdigit():
+ value1 = float(value1)
+ if isinstance(value2, str) and value2.replace(".", "", 1).isdigit():
+ value2 = float(value2)
+
+ # For strings: Allow case insensitivity if specified
+ if isinstance(value1, str) and isinstance(value2, str):
+ if not case_sensitive:
+ return value1.lower() == value2.lower()
+ return value1 == value2
+
+ # For floats and ints, check using math.isclose for floating-point precision
+ if isinstance(value1, float | int) and isinstance(value2, float | int):
+ if use_exact:
+ return value1 == value2 # Strict equality for identical comparisons
+ return math.isclose(value1, value2, abs_tol=tolerance)
+
+ # Fallback: Use regular equality for other cases
+ return value1 == value2
+
+ @staticmethod
+ def is_equal_value(
+ speckle_object: Base,
+ parameter_name: str,
+ value_to_match: Any,
+ case_sensitive: bool = False,
+ tolerance: float = 1e-6,
+ ) -> bool:
+ """Compares a parameter value from a Speckle object with the provided value.
+
+ Args:
+ speckle_object (Base): The Speckle object containing the parameter
+ parameter_name (str): Name of the parameter to compare
+ value_to_match: The value to compare against (float, string, int, etc.)
+ case_sensitive (bool): Whether to perform case-sensitive comparison for strings
+ tolerance (float): Tolerance for floating point comparisons
Returns:
- str: The value of the 'category' parameter if it exists and is not None, or an empty string otherwise.
+ bool: True if values are considered equal, False otherwise
"""
- return RevitRules.get_parameter_value(speckle_object, "category")
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ if parameter_value is None:
+ return False
-
-# Mapping of input predicates to the corresponding methods in RevitRules
-input_predicate_mapping = {
- "exists": "has_parameter",
- "matches": "is_parameter_value",
- "greater than": "is_parameter_value_greater_than",
- "less than": "is_parameter_value_less_than",
- "in range": "is_parameter_value_in_range",
- "in list": "is_parameter_value_in_list",
- "equals": "is_parameter_value",
- "true": "is_parameter_value_true",
- "false": "is_parameter_value_false",
- "is like": "is_parameter_value_like",
-}
-
-
-def evaluate_condition(speckle_object: Base, condition: pd.Series) -> bool:
- """Given a Speckle object and a condition, evaluates the condition and returns a boolean value.
- A condition is a pandas Series object with the following keys:
- - 'Property Name': The name of the property to evaluate.
- - 'Predicate': The predicate to use for evaluation.
- - 'Value': The value to compare against.
-
- Args:
- speckle_object (Base): The Speckle object to evaluate.
- condition (pd.Series): The condition to evaluate.
-
- Returns:
- bool: The result of the evaluation. True if the condition is met, False otherwise.
- """
- property_name = condition["Property Name"]
- predicate_key = condition["Predicate"]
- value = condition["Value"]
-
- if predicate_key in input_predicate_mapping:
- method_name = input_predicate_mapping[predicate_key]
- method = getattr(RevitRules, method_name, None)
-
- # speckle_print(f"Checking {property_name} {predicate_key} {value}")
-
- if method:
- check_answer = method(speckle_object, property_name, value)
-
- return check_answer
- return False
-
-
-def process_rule(
- speckle_objects: list[Base], rule_group: pd.DataFrame
-) -> tuple[list[Base], list[Base]]:
- """Processes a set of rules against Speckle objects, returning those that pass and fail.
- The first rule is used as a filter ('WHERE'), and subsequent rules as conditions ('AND').
-
- Args:
- speckle_objects: List of Speckle objects to be processed.
- rule_group: DataFrame defining the filter and conditions.
-
- Returns:
- A tuple of lists containing objects that passed and failed the rule.
- """
- # Extract the 'WHERE' condition and subsequent 'AND' conditions
- filter_condition = rule_group.iloc[0]
- subsequent_conditions = rule_group.iloc[1:]
-
- # get the last row of the rule_group and get the Message and Report Severity
- rule_info = rule_group.iloc[-1]
-
- # Filter objects based on the 'WHERE' condition
- filtered_objects = [
- speckle_object
- for speckle_object in speckle_objects
- if evaluate_condition(speckle_object, filter_condition)
- ]
-
- rule_number = rule_info["Rule Number"]
-
- speckle_print(
- f"{filter_condition['Logic']} {filter_condition['Property Name']} "
- f"{filter_condition['Predicate']} {filter_condition['Value']}"
- )
-
- speckle_print(
- f"{rule_number}: {len(list(filtered_objects))} objects passed the filter."
- )
-
- # Initialize lists for passed and failed objects
- pass_objects, fail_objects = [], []
-
- # Evaluate each filtered object against the 'AND' conditions
- for speckle_object in filtered_objects:
- if all(
- evaluate_condition(speckle_object, cond)
- for _, cond in subsequent_conditions.iterrows()
- ):
- pass_objects.append(speckle_object)
- else:
- fail_objects.append(speckle_object)
-
- return pass_objects, fail_objects
-
-
-def apply_rules_to_objects(
- speckle_objects: list[Base],
- rules_df: pd.DataFrame,
- automate_context: AutomationContext,
-) -> dict[str, tuple[list[Base], list[Base]]]:
- """Applies defined rules to a list of objects and updates the automate context based on the results.
-
- Args:
- speckle_objects (List[Base]): The list of objects to which rules are applied.
- rules_df (pd.DataFrame): The DataFrame containing rule definitions.
- automate_context (Any): Context manager for attaching rule results.
- """
- grouped_rules = rules_df.groupby("Rule Number")
-
- grouped_results = {}
-
- for rule_id, rule_group in grouped_rules:
- rule_id_str = str(rule_id) # Convert rule_id to string
-
- # Ensure rule_group has necessary columns
- if (
- "Message" not in rule_group.columns
- or "Report Severity" not in rule_group.columns
- ):
- continue # Or raise an exception if these columns are mandatory
-
- pass_objects, fail_objects = process_rule(speckle_objects, rule_group)
-
- attach_results(
- pass_objects, rule_group.iloc[-1], rule_id_str, automate_context, True
- )
- attach_results(
- fail_objects, rule_group.iloc[-1], rule_id_str, automate_context, False
+ return PropertyRules._compare_values(
+ parameter_value, value_to_match, case_sensitive, tolerance, allow_yes_no_bools=True
)
- grouped_results[rule_id_str] = (pass_objects, fail_objects)
+ @staticmethod
+ def is_not_equal_value(
+ speckle_object: Base,
+ parameter_name: str,
+ value_to_match: Any,
+ case_sensitive: bool = False,
+ tolerance: float = 1e-6,
+ ) -> bool:
+ """Checks if a parameter value from a Speckle object is not equal to the provided value.
- # return pass_objects, fail_objects for each rule
- return grouped_results
+ Args:
+ speckle_object (Base): The Speckle object containing the parameter
+ parameter_name (str): Name of the parameter to compare
+ value_to_match: The value to compare against (float, string, int, etc.)
+ case_sensitive (bool): Whether to perform case-sensitive comparison for strings
+ tolerance (float): Tolerance for floating point comparisons
+ Returns:
+ bool: True if values are not equal or parameter doesn't exist, False if they are equal
+ """
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ if parameter_value is None:
+ return True # Non-existent parameters are considered not equal
-def attach_results(
- speckle_objects: list[Base],
- rule_info: pd.Series,
- rule_id: str,
- context: AutomationContext,
- passed: bool,
-) -> None:
- """Attaches the results of a rule to the objects in the context.
-
- Args:
- speckle_objects (List[Base]): The list of objects to which the rule was applied.
- rule_info (pd.Series): The information about the rule.
- rule_id (str): The ID of the rule.
- context (AutomationContext): The context manager for attaching results.
- passed (bool): Whether the rule passed or failed.
- """
- if not speckle_objects:
- return
-
- # Create structured metadata for onward data analysis uses
- metadata = {
- "rule_id": rule_id,
- "status": "PASS" if passed else "FAIL",
- "severity": rule_info["Report Severity"],
- "rule_message": rule_info["Message"],
- "object_count": len(speckle_objects)
- }
-
- message = f"{rule_info['Message']}"
-
- if not passed:
- speckle_print(rule_info["Report Severity"])
-
- severity = (
- ObjectResultLevel.WARNING
- if rule_info["Report Severity"].capitalize() in ["Warning", "Warn"]
- else ObjectResultLevel.ERROR
+ return not PropertyRules._compare_values(
+ parameter_value, value_to_match, case_sensitive, tolerance, allow_yes_no_bools=True
)
- context.attach_result_to_objects(
- category=f"Rule {rule_id}",
- object_ids=[speckle_object.id for speckle_object in speckle_objects],
- message=message,
- level=severity,
- metadata=metadata,
- )
- else:
- context.attach_info_to_objects(
- category=f"Rule {rule_id}",
- object_ids=[speckle_object.id for speckle_object in speckle_objects],
- message=message,
- metadata=metadata,
+
+ @staticmethod
+ def is_identical_value(speckle_object: Base, parameter_name: str, value_to_match: Any) -> bool:
+ """Checks if a parameter value from a Speckle object is exactly identical to the provided value.
+
+ Uses strict comparison with no type coercion, case sensitivity, or Yes/No conversion.
+
+ Args:
+ speckle_object (Base): The Speckle object containing the parameter
+ parameter_name (str): Name of the parameter to compare
+ value_to_match: The value to compare against
+
+ Returns:
+ bool: True if values are identical, False otherwise
+ """
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name, get_raw=True)
+ if parameter_value is None:
+ return False
+
+ return PropertyRules._compare_values(
+ parameter_value, value_to_match, case_sensitive=True, tolerance=0, allow_yes_no_bools=False, use_exact=True
)
diff --git a/src/rules_old.py b/src/rules_old.py
new file mode 100644
index 0000000..e445931
--- /dev/null
+++ b/src/rules_old.py
@@ -0,0 +1,756 @@
+# import re
+# from typing import Any
+#
+# from Levenshtein import ratio
+# from specklepy.objects.base import Base
+#
+# from src.helpers import get_item, has_item, speckle_print
+# from src.inputs import PropertyMatchMode
+
+# We're going to define a set of rules that will allow us to filter and
+# process parameters in our Speckle objects. These rules will be encapsulated
+# in a class called `ParameterRules`.
+
+
+# class Rules:
+# """A collection of rules for processing properties in Speckle objects.
+#
+# Simple rules can be straightforwardly implemented as static methods that
+# return boolean value to be used either as a filter or a condition.
+# These can then be abstracted into returning lambda functions that we can
+# use in our main processing logic. By encapsulating these rules, we can easily
+# extend or modify them in the future.
+# """
+#
+# @staticmethod
+# def try_get_display_value(
+# speckle_object: Base,
+# ) -> list[Base] | None:
+# """Try fetching the display value from a Speckle object.
+#
+# This method encapsulates the logic for attempting to retrieve the display value from a
+# Speckle object. It returns a list containing the display values if found,
+# otherwise it returns None.
+#
+# Args:
+# speckle_object (Base): The Speckle object to extract the display value from.
+#
+# Returns:
+# Optional[List[Base]]: A list containing the display values.
+# If no display value is found, returns None.
+# """
+# # Attempt to get the display value from the speckle_object
+# raw_display_value = getattr(speckle_object, "displayValue", None) or getattr(
+# speckle_object, "@displayValue", None
+# )
+#
+# # If no display value found, return None
+# if raw_display_value is None:
+# return None
+#
+# # If display value found, filter out non-Base objects
+# display_values = [value for value in raw_display_value if isinstance(value, Base)]
+#
+# # If no valid display values found, return None
+# if not display_values:
+# return None
+#
+# return display_values
+#
+# @staticmethod
+# def is_displayable_object(speckle_object: Base) -> bool:
+# """Determines if a given Speckle object is displayable.
+#
+# This method encapsulates the logic for determining if a Speckle object is displayable.
+# It checks if the speckle_object has a display value and returns True if it does, otherwise it returns False.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+#
+# Returns:
+# bool: True if the object has a display value, False otherwise.
+# """
+# # Check for direct displayable state using try_get_display_value
+# display_values = Rules.try_get_display_value(speckle_object)
+# if display_values and getattr(speckle_object, "id", None) is not None:
+# return True
+#
+# # Check for displayable state via definition, using try_get_display_value on the definition object
+# definition = getattr(speckle_object, "definition", None)
+# if definition:
+# definition_display_values = Rules.try_get_display_value(definition)
+# if definition_display_values and getattr(definition, "id", None) is not None:
+# return True
+#
+# return False
+#
+# @staticmethod
+# def get_displayable_objects(flat_list_of_objects: list[Base]) -> list[Base]:
+# """Filters a list of Speckle objects to only include displayable objects.
+#
+# This function takes a list of Speckle objects and filters out the objects that are displayable.
+# It returns a list containing only the displayable objects.
+#
+# Args:
+# flat_list_of_objects (List[Base]): The list of Speckle objects to filter.
+# """
+# return [
+# speckle_object
+# for speckle_object in flat_list_of_objects
+# if Rules.is_displayable_object(speckle_object) and getattr(speckle_object, "id", None)
+# ]
+#
+#
+# class PropertyRules:
+# """A collection of rules for processing Revit parameters in Speckle objects."""
+#
+# @staticmethod
+# def has_parameter(speckle_object: Base, parameter_name: str, *_args, **_kwargs) -> bool:
+# """Checks if the speckle_object has a parameter with the given name."""
+# found, _ = ParameterSearch.lookup_parameter(speckle_object, parameter_name)
+# return found
+#
+# @staticmethod
+# def get_parameter_value(
+# speckle_object: Base,
+# parameter_name: str,
+# match_mode: PropertyMatchMode = PropertyMatchMode.MIXED,
+# default_value: Any = None,
+# ) -> Any:
+# """Gets the value of a parameter if it exists."""
+# found, value = ParameterSearch.lookup_parameter(speckle_object, parameter_name, match_mode)
+# return value if found else default_value
+#
+# @staticmethod
+# def is_v3(speckle_object: Base) -> bool:
+# """Determines if a Speckle object uses v3 parameter structure.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check
+#
+# Returns:
+# bool: True if object uses v3 structure, False otherwise
+# """
+# properties = get_item(speckle_object, "properties")
+# return bool(properties and has_item(properties, "Parameters"))
+#
+# # @staticmethod
+# # def has_parameter(speckle_object: Base, parameter_name: str, *_args, **_kwargs) -> bool:
+# # """Checks if the speckle_object has a Revit parameter with the given name.
+# #
+# # First checks direct properties, then determines if it's a v2 or v3 object structure
+# # and searches in the appropriate parameter hierarchy.
+# #
+# # Args:
+# # speckle_object (Base): The Speckle object to check.
+# # parameter_name (str): The name of the parameter to check for.
+# # *_args: Extra positional arguments which are ignored.
+# # **_kwargs: Extra keyword arguments which are ignored.
+# #
+# # Returns:
+# # bool: True if the object has the parameter, False otherwise.
+# # """
+# # # Check direct property first regardless of version
+# # if has_item(speckle_object, parameter_name):
+# # return True
+# #
+# # if PropertyRules.is_v3(speckle_object):
+# # properties = get_item(speckle_object, "properties")
+# # parameters = get_item(properties, "Parameters")
+# # if parameters:
+# #
+# # def search_v3_params(params: dict, search_name: str) -> bool:
+# # for key, value in params.items():
+# # if isinstance(value, dict):
+# # # Check direct name match
+# # if key.lower() == search_name.lower():
+# # return True
+# # # Check nested parameters
+# # if search_v3_params(value, search_name):
+# # return True
+# # return False
+# #
+# # return search_v3_params(parameters, parameter_name)
+# # else:
+# # # Handle v2 structure
+# # parameters = get_item(speckle_object, "parameters")
+# # if not parameters:
+# # return False
+# #
+# # # Check direct parameter name match
+# # if has_item(parameters, parameter_name):
+# # return True
+# #
+# # # Check nested parameters with name property
+# # def check_nested_name(value: Any) -> bool:
+# # if isinstance(value, dict):
+# # return get_item(value, "name") == parameter_name
+# # return get_item(value, "name") == parameter_name if hasattr(value, "name") else False
+# #
+# # return any(check_nested_name(param_value) for param_value in parameters.values() if param_value is not None)
+# #
+# # return False
+# #
+# # @staticmethod
+# # def get_parameter_value(
+# # speckle_object: Base,
+# # parameter_name: str,
+# # match_mode: PropertyMatchMode = PropertyMatchMode.MIXED,
+# # default_value: Any = None,
+# # ) -> Any | None:
+# # """Retrieves the value of the specified parameter from the speckle_object.
+# #
+# # First checks direct properties, then determines if it's a v2 or v3 object structure
+# # and retrieves from the appropriate parameter hierarchy.
+# #
+# # Args:
+# # speckle_object (Base): The Speckle object to retrieve the parameter value from.
+# # parameter_name (str): The name of the parameter to retrieve the value for.
+# # match_mode (PropertyMatchMode): The matching mode to use for parameter lookup
+# # default_value: The default value to return if parameter not found.
+# #
+# # Returns:
+# # The value of the parameter if found, else default_value.
+# # """
+# # # Check direct property first regardless of version
+# # if has_item(speckle_object, parameter_name):
+# # value = get_item(speckle_object, parameter_name)
+# # return value if value is not None else default_value
+# #
+# # if PropertyRules.is_v3(speckle_object):
+# # return PropertyRules.get_v3_parameter(speckle_object, parameter_name, match_mode, default_value)
+# # else:
+# # return PropertyRules.get_v2_parameter(speckle_object, parameter_name, match_mode, default_value)
+#
+# # @staticmethod
+# # def get_v2_parameter(obj: Base, name: str, mode: PropertyMatchMode, default: Any) -> Any:
+# # """Get parameter value from v2 Speckle object structure.
+# #
+# # Args:
+# # obj: Speckle object to get parameter from
+# # name: Parameter name to retrieve
+# # mode: Match mode for parameter lookup
+# # default: Default value if parameter not found
+# #
+# # Returns:
+# # Parameter value if found, else default
+# # """
+# # parameters = get_item(obj, "parameters")
+# # if not parameters:
+# # return default
+# #
+# # if mode == PropertyMatchMode.STRICT:
+# # return PropertyRules.strict_parameter_lookup(name, parameters, default)
+# #
+# # def search_params(param_dict: dict, search_name: str, fuzzy: bool) -> Any:
+# # for key, value in param_dict.items():
+# # key_match = (key.lower() == search_name.lower()) or (fuzzy and search_name.lower() in key.lower())
+# # if key_match:
+# # # Handle both direct values and nested parameter objects
+# # return get_item(value, "value", value)
+# # return None
+# #
+# # result = search_params(parameters, name, mode == PropertyMatchMode.FUZZY)
+# # return result if result is not None else default
+# #
+# # @staticmethod
+# # def get_v3_parameter(obj: Base, name: str, mode: PropertyMatchMode, default: Any) -> Any:
+# # """Get parameter value from v3 Speckle object structure.
+# #
+# # Args:
+# # obj: Speckle object to get parameter from
+# # name: Parameter name to retrieve
+# # mode: Match mode for parameter lookup
+# # default: Default value if parameter not found
+# #
+# # Returns:
+# # Parameter value if found, else default
+# # """
+# # properties = get_item(obj, "properties")
+# # if not properties or not has_item(properties, "Parameters"):
+# # return default
+# #
+# # parameters = get_item(properties, "Parameters")
+# # if not parameters:
+# # return default
+# #
+# # if mode == PropertyMatchMode.STRICT:
+# # return PropertyRules.strict_parameter_lookup(name, parameters, default)
+# #
+# # def search_nested(data: dict, search_name: str, fuzzy: bool) -> Any:
+# # for nested_key, value in data.items():
+# # if isinstance(value, dict):
+# # key_match = (nested_key.lower() == search_name.lower()) or (
+# # fuzzy and search_name.lower() in nested_key.lower()
+# # )
+# #
+# # if key_match and has_item(value, "value"):
+# # return get_item(value, "value")
+# #
+# # nested_result = search_nested(value, search_name, fuzzy)
+# # if nested_result is not None:
+# # return nested_result
+# # return None
+# #
+# # result = search_nested(parameters, name, mode == PropertyMatchMode.FUZZY)
+# # return result if result is not None else default
+# #
+# # @staticmethod
+# # def strict_parameter_lookup(name: str, parameters: dict, default: Any) -> Any:
+# # """Perform strict parameter lookup following exact path.
+# #
+# # Args:
+# # name: Parameter path (dot separated)
+# # parameters: Parameters dictionary
+# # default: Default value if not found
+# #
+# # Returns:
+# # Parameter value if found, else default
+# # """
+# # path_parts = name.split(".")
+# # current = parameters
+# #
+# # for part in path_parts:
+# # if not current or not isinstance(current, dict):
+# # return default
+# #
+# # # Find exact case-insensitive match
+# # key = next((k for k in current.keys() if k.lower() == part.lower()), None)
+# # if not key:
+# # return default
+# #
+# # current = get_item(current, key)
+# #
+# # # Handle both direct values and parameter objects
+# # if isinstance(current, dict):
+# # return get_item(current, "value", current)
+# # return current
+#
+# @staticmethod
+# def is_parameter_value(speckle_object: Base, parameter_name: str, value_to_match: Any) -> bool:
+# """Checks if the value of the specified parameter matches the given value.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# value_to_match (Any): The value to match against.
+#
+# Returns:
+# bool: True if the parameter value matches the given value, False otherwise.
+# """
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# return parameter_value == value_to_match
+#
+# @staticmethod
+# def is_parameter_value_like(
+# speckle_object: Base,
+# parameter_name: str,
+# pattern: str,
+# fuzzy: bool = False,
+# threshold: float = 0.8,
+# ) -> bool:
+# """Checks if the value of the specified parameter matches the given pattern.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# pattern (str): The pattern to match against.
+# fuzzy (bool): If True, performs fuzzy matching using Levenshtein distance.
+# If False (default), performs exact pattern matching using regular expressions.
+# threshold (float): The similarity threshold for fuzzy matching (default: 0.8).
+# Only applicable when fuzzy=True.
+#
+# Returns:
+# bool: True if the parameter value matches the pattern (exact or fuzzy), False otherwise.
+# """
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# if parameter_value is None:
+# return False
+#
+# if fuzzy:
+# similarity = ratio(str(parameter_value), pattern)
+# return similarity >= threshold
+# else:
+# return bool(re.match(pattern, str(parameter_value)))
+#
+# @staticmethod
+# def parse_number_from_string(input_string: str):
+# """Attempts to parse an integer or float from a given string.
+#
+# Args:
+# input_string (str): The string containing the number to be parsed.
+#
+# Returns:
+# int or float: The parsed number, or raises ValueError if parsing is not possible.
+# """
+# try:
+# # First try to convert it to an integer
+# return int(input_string)
+# except ValueError:
+# # If it fails to convert to an integer, try to convert to a float
+# try:
+# return float(input_string)
+# except ValueError:
+# # Raise an error if neither conversion is possible
+# raise ValueError("Input string is not a valid integer or float")
+#
+# @staticmethod
+# def is_parameter_value_greater_than(speckle_object: Base, parameter_name: str, threshold: str) -> bool:
+# """Checks if the value of the specified parameter is greater than the given threshold.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# threshold (Union[int, float]): The threshold value to compare against.
+#
+# Returns:
+# bool: True if the parameter value is greater than the threshold, False otherwise.
+# """
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# if parameter_value is None:
+# return False
+#
+# if not isinstance(parameter_value, int | float):
+# raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+# return parameter_value > PropertyRules.parse_number_from_string(threshold)
+#
+# @staticmethod
+# def is_parameter_value_less_than(speckle_object: Base, parameter_name: str, threshold: str) -> bool:
+# """Checks if the value of the specified parameter is less than the given threshold.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# threshold (Union[int, float]): The threshold value to compare against.
+#
+# Returns:
+# bool: True if the parameter value is less than the threshold, False otherwise.
+# """
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# if parameter_value is None:
+# return False
+# if not isinstance(parameter_value, int | float):
+# raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+# return parameter_value < PropertyRules.parse_number_from_string(threshold)
+#
+# @staticmethod
+# def is_parameter_value_in_range(speckle_object: Base, parameter_name: str, value_range: str) -> bool:
+# """Checks if the value of the specified parameter falls within the given range.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# value_range (str): The range to check against, in the format "min_value, max_value".
+#
+# Returns:
+# bool: True if the parameter value falls within the range (inclusive), False otherwise.
+# """
+# min_value, max_value = value_range.split(",")
+# min_value = PropertyRules.parse_number_from_string(min_value)
+# max_value = PropertyRules.parse_number_from_string(max_value)
+#
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# if parameter_value is None:
+# return False
+# if not isinstance(parameter_value, int | float):
+# raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+#
+# return min_value <= parameter_value <= max_value
+#
+# @staticmethod
+# def is_parameter_value_in_range_expanded(
+# speckle_object: Base,
+# parameter_name: str,
+# min_value: int | float,
+# max_value: int | float,
+# inclusive: bool = True,
+# ) -> bool:
+# """Checks if the value of the specified parameter falls within the given range.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# min_value (Union[int, float]): The minimum value of the range.
+# max_value (Union[int, float]): The maximum value of the range.
+# inclusive (bool): If True (default), the range is inclusive (min <= value <= max).
+# If False, the range is exclusive (min < value < max).
+#
+# Returns:
+# bool: True if the parameter value falls within the range (inclusive), False otherwise.
+# """
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# if parameter_value is None:
+# return False
+# if not isinstance(parameter_value, int | float):
+# raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+#
+# return min_value <= parameter_value <= max_value if inclusive else min_value < parameter_value < max_value
+#
+# @staticmethod
+# def is_parameter_value_in_list(speckle_object: Base, parameter_name: str, value_list: list[Any] | str) -> bool:
+# """Checks if the value of the specified parameter is present in the given list of values.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# value_list (List[Any]): The list of values to check against.
+#
+# Returns:
+# bool: True if the parameter value is found in the list, False otherwise.
+# """
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+#
+# if isinstance(value_list, str):
+# value_list = [value.strip() for value in value_list.split(",")]
+#
+# # parameter_value is effectively Any type, so to find its value in the value_list
+# def is_value_in_list(value: Any, my_list: Any) -> bool:
+# # Ensure that my_list is actually a list
+# if isinstance(my_list, list):
+# return value in my_list or str(value) in my_list
+# else:
+# speckle_print(f"Expected a list, got {type(my_list)} instead.")
+# return False
+#
+# return is_value_in_list(parameter_value, value_list)
+#
+# @staticmethod
+# def _check_boolean_value(value: Any, values_to_match: tuple[str, ...]) -> bool:
+# """Check if a value matches any target value in expected format."""
+# if isinstance(value, bool):
+# return value is (True if "true" in values_to_match else False)
+#
+# if isinstance(value, str):
+# return value.lower() in values_to_match
+#
+# return False
+#
+# @staticmethod
+# def is_parameter_value_true(speckle_object: Base, parameter_name: str) -> bool:
+# """Check if parameter value represents true (boolean True, 'yes', 'true', '1')."""
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# return PropertyRules._check_boolean_value(parameter_value, ("yes", "true", "1"))
+#
+# @staticmethod
+# def is_parameter_value_false(speckle_object: Base, parameter_name: str) -> bool:
+# """Check if parameter value represents false (boolean False, 'no', 'false', '0')."""
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# return PropertyRules._check_boolean_value(parameter_value, ("no", "false", "0"))
+#
+# @staticmethod
+# def has_category(speckle_object: Base) -> bool:
+# """Checks if the speckle_object has a 'category' parameter.
+#
+# This method checks if the speckle_object has a 'category' parameter.
+# If the 'category' parameter exists, it returns True; otherwise, it returns False.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+#
+# Returns:
+# bool: True if the object has the 'category' parameter, False otherwise.
+# """
+# return PropertyRules.has_parameter(speckle_object, "category")
+#
+# @staticmethod
+# def is_category(speckle_object: Base, category_input: str) -> bool:
+# """Checks if the value of the 'category' property matches the given input.
+#
+# This method checks if the 'category' property of the speckle_object
+# matches the given category_input. If they match, it returns True;
+# otherwise, it returns False.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# category_input (str): The category value to compare against.
+#
+# Returns:
+# bool: True if the 'category' property matches the input, False otherwise.
+# """
+# category_value = PropertyRules.get_parameter_value(speckle_object, "category")
+# return category_value == category_input
+#
+# @staticmethod
+# def get_category_value(speckle_object: Base) -> str:
+# """Retrieves the value of the 'category' parameter from the speckle_object.
+#
+# This method retrieves the value of the 'category' parameter from the speckle_object.
+# If the 'category' parameter exists and its value is not None, it returns the value.
+# If the 'category' parameter does not exist or its value is None, it returns an empty string.
+#
+# Args:
+# speckle_object (Base): The Speckle object to retrieve the 'category' parameter value from.
+#
+# Returns:
+# str: The value of the 'category' parameter if it exists and is not None, or an empty string otherwise.
+# """
+# return PropertyRules.get_parameter_value(speckle_object, "category")
+#
+#
+# class ParameterSearch:
+# """Unified parameter search functionality for Speckle objects."""
+#
+# @staticmethod
+# def convert_revit_boolean(value: Any) -> Any:
+# """Convert Revit-style Yes/No strings to boolean values.
+#
+# Args:
+# value: The value to potentially convert
+#
+# Returns:
+# bool if value is a Revit boolean string, original value otherwise
+# """
+# if isinstance(value, str):
+# if value.lower() == "yes":
+# return True
+# if value.lower() == "no":
+# return False
+# return value
+#
+# @staticmethod
+# def search_parameters(
+# params: dict, search_name: str, mode: PropertyMatchMode = PropertyMatchMode.STRICT
+# ) -> tuple[bool, Any]:
+# """Search for parameters using consistent matching logic.
+#
+# Supports flexible property chain matching that can find paths like "Instance Parameters.Dimensions.Length"
+# within longer chains like "properties.Parameters.Instance Parameters.Dimensions.Length.value".
+# Uses STRICT matching by default for more predictable results.
+#
+# Args:
+# params: Parameter dictionary to search
+# search_name: Name of parameter to find, can be dot-separated chain
+# mode: Matching mode to use (STRICT by default, or FUZZY/MIXED for looser matching)
+#
+# Returns:
+# Tuple of (value_found: bool, value: Any)
+# """
+#
+# def matches_name(match_key: str, target: str, match_mode: PropertyMatchMode) -> bool:
+# if match_mode == PropertyMatchMode.STRICT:
+# return match_key.lower() == target.lower()
+# elif match_mode == PropertyMatchMode.FUZZY:
+# return target.lower() in match_key.lower()
+# else: # MIXED mode
+# return match_key.lower() == target.lower() or target.lower() in match_key.lower()
+#
+# def try_get_value(obj: Any) -> Any:
+# """Extract value from parameter object or return as is.
+#
+# Handles both dict and Base objects, checking for 'value' property in both cases.
+# Returns the 'value' if found, otherwise returns the original object.
+# """
+# # Handle dictionary objects
+# if isinstance(obj, dict):
+# return obj.get("value", obj)
+#
+# # Handle Base objects
+# if isinstance(obj, Base):
+# return getattr(obj, "value", obj)
+#
+# # For all other types, return as is
+# return obj
+#
+# # First try property chain lookup
+# if "." in search_name:
+# search_parts = search_name.split(".")
+#
+# def try_match_path(current: dict, remaining_search_parts: list[str], depth: int = 0) -> tuple[bool, Any]:
+# if not isinstance(current, dict):
+# return False, None
+#
+# if not remaining_search_parts: # We've matched all parts
+# return True, try_get_value(current)
+#
+# current_search = remaining_search_parts[0]
+#
+# # Try each key at current level
+# for key, item_value in current.items():
+# if matches_name(key, current_search, mode):
+# # Found a match for current part, recurse with rest
+# match_found, result = try_match_path(item_value, remaining_search_parts[1:], depth + 1)
+# if match_found:
+# return True, result
+#
+# # If no match found and value is a dict, try searching deeper
+# if isinstance(item_value, dict):
+# match_found, result = try_match_path(item_value, remaining_search_parts, depth)
+# if match_found:
+# return True, result
+#
+# return False, None
+#
+# try:
+# found, value = try_match_path(params, search_parts)
+# if found:
+# return True, value
+# except Exception:
+# pass # Fall through to recursive search if chain lookup fails
+#
+# # Recursive search through nested dictionaries
+# def recursive_search(data: dict | Base, target: str) -> tuple[bool, Any]:
+# if not isinstance(data, dict | Base):
+# return False, None
+#
+# # Handle both dict and Base objects for iteration
+# if isinstance(data, dict):
+# items = data.items()
+# else:
+# items = [(k, getattr(data, k)) for k in dir(data) if not k.startswith("_")]
+#
+# # First check current level
+# for key, item_value in items:
+# if matches_name(key, target, mode):
+# return True, try_get_value(item_value)
+#
+# # Then check nested levels
+# for _, item_value in items:
+# if isinstance(item_value, dict | Base):
+# item_found, result = recursive_search(item_value, target)
+# if item_found:
+# return True, result
+#
+# return False, None
+#
+# return recursive_search(params, search_name.split(".")[-1] if "." in search_name else search_name)
+#
+# @staticmethod
+# def lookup_parameter(
+# obj: Base, param_name: str, mode: PropertyMatchMode = PropertyMatchMode.MIXED
+# ) -> tuple[bool, Any]:
+# """Unified parameter lookup for both checking existence and getting values.
+#
+# Args:
+# obj: Speckle object to search
+# param_name: Parameter name to find
+# mode: Matching mode to use
+#
+# Returns:
+# Tuple of (found: bool, value: Any)
+# """
+# # Check direct property first
+# if has_item(obj, param_name):
+# value = get_item(obj, param_name)
+# # Check if the direct property has a value field
+# if isinstance(value, dict) and "value" in value:
+# return True, value["value"]
+# return True, value
+#
+# # Handle v3 structure
+# if PropertyRules.is_v3(obj):
+# properties = get_item(obj, "properties")
+# if not properties or not has_item(properties, "Parameters"):
+# return False, None
+#
+# parameters = get_item(properties, "Parameters")
+# if not parameters:
+# return False, None
+#
+# return ParameterSearch.search_parameters(parameters, param_name, mode)
+#
+# # Handle v2 structure
+# parameters = get_item(obj, "parameters")
+# if not parameters:
+# return False, None
+#
+# return ParameterSearch.search_parameters(parameters, param_name, mode)
diff --git a/src/spreadsheet.py b/src/spreadsheet.py
index 265d683..f9880a3 100644
--- a/src/spreadsheet.py
+++ b/src/spreadsheet.py
@@ -1,7 +1,8 @@
import pandas as pd
+from pandas import DataFrame
-def read_rules_from_spreadsheet(url):
+def read_rules_from_spreadsheet(url: str) -> DataFrame | None:
"""Reads a TSV file from a provided URL and returns a DataFrame.
Args:
@@ -12,7 +13,26 @@ def read_rules_from_spreadsheet(url):
"""
try:
# Since the output is a TSV, we use `pd.read_csv` with `sep='\t'` to specify tab-separated values.
- return pd.read_csv(url, sep="\t")
+ df = pd.read_csv(url, sep="\t")
+ df = convert_mixed_columns(df)
+
+ # Convert columns to appropriate types based on their content.
+ return df
+
except Exception as e:
print(f"Failed to read the TSV from the URL: {e}")
return None
+
+
+def convert_mixed_columns(df):
+ """Converts columns in a DataFrame to appropriate types based on their content.
+
+ Args:
+ df (DataFrame): The DataFrame whose columns are to be converted.
+
+ Returns:
+ DataFrame: The DataFrame with columns converted to appropriate types.
+ """
+ df = df.apply(lambda c: c.astype(object) if any(str(x).replace(".", "", 1).isdigit() for x in c) else c.astype(str))
+
+ return df
diff --git a/test_data/v2_object.json b/test_data/v2_object.json
new file mode 100644
index 0000000..204eb94
--- /dev/null
+++ b/test_data/v2_object.json
@@ -0,0 +1,3085 @@
+[
+ {
+ "id": "cdb18060dc48281909e94f0f1d8d3cc0",
+ "type": "W30(Fc24)",
+ "level": {
+ "id": "83f0777fe353eb77263ca71578e12dcf",
+ "name": "1FL",
+ "units": "mm",
+ "category": "Levels",
+ "elementId": "3150442",
+ "elevation": 0,
+ "worksetId": "0",
+ "createView": true,
+ "parameters": {
+ "id": "43d0efa83cf272385e920a560e7e9ebf",
+ "IFC_GUID": {
+ "id": "ceb8ed674bbdf0e139c95a628bca09e5",
+ "name": "IfcGUID",
+ "units": null,
+ "value": "3xtuTNAO5BSg6cTEbLBATq",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_GUID"
+ },
+ "DATUM_TEXT": {
+ "id": "32f5ba880945a5bc78419171ea58cfa6",
+ "name": "Name",
+ "units": null,
+ "value": "1FL",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DATUM_TEXT"
+ },
+ "LEVEL_ELEV": {
+ "id": "4e81dd4ac0c395974f54245b438ae147",
+ "name": "Elevation",
+ "units": "mm",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_ELEV"
+ },
+ "speckle_type": "Base",
+ "applicationId": null,
+ "ELEM_TYPE_PARAM": {
+ "id": "cb42b32c7f51cde44a287ca1bff0982b",
+ "name": "Type",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_TYPE_PARAM"
+ },
+ "SYMBOL_ID_PARAM": {
+ "id": "51f0ee3d4bdbed11d72db3d53cdf3706",
+ "name": "Type Id",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_ID_PARAM"
+ },
+ "DESIGN_OPTION_ID": {
+ "id": "88f4af03d8e3506766765215a5b87813",
+ "name": "Design Option",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DESIGN_OPTION_ID"
+ },
+ "ELEM_FAMILY_PARAM": {
+ "id": "5c94a45c58d4bbfd90819146fb5174a8",
+ "name": "Family",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_FAMILY_PARAM"
+ },
+ "LEVEL_UP_TO_LEVEL": {
+ "id": "688a38b54fd75e52da54c164508aeb0f",
+ "name": "Story Above",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_UP_TO_LEVEL"
+ },
+ "SYMBOL_NAME_PARAM": {
+ "id": "fe43cb940741f29b6cd508611db70c0a",
+ "name": "Type Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_NAME_PARAM"
+ },
+ "IFC_EXPORT_ELEMENT": {
+ "id": "ac8493ea527ffedf1d7bcf5826dab455",
+ "name": "Export to IFC",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT"
+ },
+ "totalChildrenCount": 0,
+ "ELEM_CATEGORY_PARAM": {
+ "id": "9ed3143148c3e478c4d5fa4aad0f84cb",
+ "name": "Category",
+ "units": null,
+ "value": "-2000240",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM"
+ },
+ "LEVEL_IS_STRUCTURAL": {
+ "id": "7d81c0e17bc7d3826774591634ee068b",
+ "name": "Structural",
+ "units": null,
+ "value": true,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_IS_STRUCTURAL"
+ },
+ "ELEM_CATEGORY_PARAM_MT": {
+ "id": "73cbfffc73fd323071a9111d157f9a18",
+ "name": "Category",
+ "units": null,
+ "value": "-2000240",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM_MT"
+ },
+ "SPECKLE_Classification": {
+ "id": "2138dca3e3a7c852aeaa3fa65e5a5e8c",
+ "name": "SPECKLE_Classification",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SPECKLE_Classification"
+ },
+ "LEVEL_IS_BUILDING_STORY": {
+ "id": "231a4045f2fd0e013b9b45e71ddb653c",
+ "name": "Building Story",
+ "units": null,
+ "value": true,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_IS_BUILDING_STORY"
+ },
+ "DATUM_VOLUME_OF_INTEREST": {
+ "id": "695f0dbc445b52836935ac062f46de41",
+ "name": "Scope Box",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DATUM_VOLUME_OF_INTEREST"
+ },
+ "SYMBOL_FAMILY_NAME_PARAM": {
+ "id": "a52788d3716a07ca198833a2024a2f04",
+ "name": "Family Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_FAMILY_NAME_PARAM"
+ },
+ "ELEM_FAMILY_AND_TYPE_PARAM": {
+ "id": "1bbc8fadc19823adb9a9c99e725102c1",
+ "name": "Family and Type",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_FAMILY_AND_TYPE_PARAM"
+ },
+ "LEVEL_ROOM_COMPUTATION_HEIGHT": {
+ "id": "e54df704e19c7a0c73431dc943ce4fc3",
+ "name": "Computation Height",
+ "units": "mm",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_ROOM_COMPUTATION_HEIGHT"
+ }
+ },
+ "speckle_type": "Objects.BuiltElements.Level:Objects.BuiltElements.Revit.RevitLevel",
+ "applicationId": "fbdf8757-2981-4b72-a1a6-74e9551cb51e-0030126a",
+ "referenceOnly": false,
+ "builtInCategory": "OST_Levels",
+ "isRevitLinkedModel": false,
+ "materialQuantities": [],
+ "totalChildrenCount": 0,
+ "revitLinkedModelPath": "C:\\Program Files\\Autodesk\\Revit 2024\\Samples\\サンプル構造.rvt"
+ },
+ "units": "mm",
+ "family": "Basic Wall",
+ "height": 1400,
+ "flipped": false,
+ "baseLine": {
+ "id": "f1e5d19719cd0c6dd7f95cb68e710696",
+ "end": {
+ "x": 22400.000000000015,
+ "y": 20500,
+ "z": -2000.0000000000002,
+ "id": "e95624f6dede918858ee2ac26d04e0ea",
+ "units": "mm",
+ "speckle_type": "Objects.Geometry.Point",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ "area": 0,
+ "bbox": null,
+ "start": {
+ "x": 22400.000000000007,
+ "y": 15199.999999999998,
+ "z": -2000.0000000000002,
+ "id": "243d9fbf9c56cc8964b0808af2ca6ec5",
+ "units": "mm",
+ "speckle_type": "Objects.Geometry.Point",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ "units": "mm",
+ "domain": {
+ "id": "88c63fda9f81bcce66810de695592b69",
+ "end": 17.388451443569522,
+ "start": -3.552713668866051e-14,
+ "speckle_type": "Objects.Primitive.Interval",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ "length": 5300.000000000002,
+ "speckle_type": "Objects.Geometry.Line",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ "category": "Walls",
+ "elements": null,
+ "topLevel": {
+ "id": "83f0777fe353eb77263ca71578e12dcf",
+ "name": "1FL",
+ "units": "mm",
+ "category": "Levels",
+ "elementId": "3150442",
+ "elevation": 0,
+ "worksetId": "0",
+ "createView": true,
+ "parameters": {
+ "id": "43d0efa83cf272385e920a560e7e9ebf",
+ "IFC_GUID": {
+ "id": "ceb8ed674bbdf0e139c95a628bca09e5",
+ "name": "IfcGUID",
+ "units": null,
+ "value": "3xtuTNAO5BSg6cTEbLBATq",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_GUID"
+ },
+ "DATUM_TEXT": {
+ "id": "32f5ba880945a5bc78419171ea58cfa6",
+ "name": "Name",
+ "units": null,
+ "value": "1FL",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DATUM_TEXT"
+ },
+ "LEVEL_ELEV": {
+ "id": "4e81dd4ac0c395974f54245b438ae147",
+ "name": "Elevation",
+ "units": "mm",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_ELEV"
+ },
+ "speckle_type": "Base",
+ "applicationId": null,
+ "ELEM_TYPE_PARAM": {
+ "id": "cb42b32c7f51cde44a287ca1bff0982b",
+ "name": "Type",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_TYPE_PARAM"
+ },
+ "SYMBOL_ID_PARAM": {
+ "id": "51f0ee3d4bdbed11d72db3d53cdf3706",
+ "name": "Type Id",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_ID_PARAM"
+ },
+ "DESIGN_OPTION_ID": {
+ "id": "88f4af03d8e3506766765215a5b87813",
+ "name": "Design Option",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DESIGN_OPTION_ID"
+ },
+ "ELEM_FAMILY_PARAM": {
+ "id": "5c94a45c58d4bbfd90819146fb5174a8",
+ "name": "Family",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_FAMILY_PARAM"
+ },
+ "LEVEL_UP_TO_LEVEL": {
+ "id": "688a38b54fd75e52da54c164508aeb0f",
+ "name": "Story Above",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_UP_TO_LEVEL"
+ },
+ "SYMBOL_NAME_PARAM": {
+ "id": "fe43cb940741f29b6cd508611db70c0a",
+ "name": "Type Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_NAME_PARAM"
+ },
+ "IFC_EXPORT_ELEMENT": {
+ "id": "ac8493ea527ffedf1d7bcf5826dab455",
+ "name": "Export to IFC",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT"
+ },
+ "totalChildrenCount": 0,
+ "ELEM_CATEGORY_PARAM": {
+ "id": "9ed3143148c3e478c4d5fa4aad0f84cb",
+ "name": "Category",
+ "units": null,
+ "value": "-2000240",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM"
+ },
+ "LEVEL_IS_STRUCTURAL": {
+ "id": "7d81c0e17bc7d3826774591634ee068b",
+ "name": "Structural",
+ "units": null,
+ "value": true,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_IS_STRUCTURAL"
+ },
+ "ELEM_CATEGORY_PARAM_MT": {
+ "id": "73cbfffc73fd323071a9111d157f9a18",
+ "name": "Category",
+ "units": null,
+ "value": "-2000240",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM_MT"
+ },
+ "SPECKLE_Classification": {
+ "id": "2138dca3e3a7c852aeaa3fa65e5a5e8c",
+ "name": "SPECKLE_Classification",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SPECKLE_Classification"
+ },
+ "LEVEL_IS_BUILDING_STORY": {
+ "id": "231a4045f2fd0e013b9b45e71ddb653c",
+ "name": "Building Story",
+ "units": null,
+ "value": true,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_IS_BUILDING_STORY"
+ },
+ "DATUM_VOLUME_OF_INTEREST": {
+ "id": "695f0dbc445b52836935ac062f46de41",
+ "name": "Scope Box",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DATUM_VOLUME_OF_INTEREST"
+ },
+ "SYMBOL_FAMILY_NAME_PARAM": {
+ "id": "a52788d3716a07ca198833a2024a2f04",
+ "name": "Family Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_FAMILY_NAME_PARAM"
+ },
+ "ELEM_FAMILY_AND_TYPE_PARAM": {
+ "id": "1bbc8fadc19823adb9a9c99e725102c1",
+ "name": "Family and Type",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_FAMILY_AND_TYPE_PARAM"
+ },
+ "LEVEL_ROOM_COMPUTATION_HEIGHT": {
+ "id": "e54df704e19c7a0c73431dc943ce4fc3",
+ "name": "Computation Height",
+ "units": "mm",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_ROOM_COMPUTATION_HEIGHT"
+ }
+ },
+ "speckle_type": "Objects.BuiltElements.Level:Objects.BuiltElements.Revit.RevitLevel",
+ "applicationId": "fbdf8757-2981-4b72-a1a6-74e9551cb51e-0030126a",
+ "referenceOnly": false,
+ "builtInCategory": "OST_Levels",
+ "isRevitLinkedModel": false,
+ "materialQuantities": [],
+ "totalChildrenCount": 0,
+ "revitLinkedModelPath": "C:\\Program Files\\Autodesk\\Revit 2024\\Samples\\サンプル構造.rvt"
+ },
+ "__closure": {
+ "210e0ea727c735970c576cd0beab0493": 2,
+ "30ba0a6aba886a2e800b12bb37656ab3": 2,
+ "78b63dbbe244fafafc0a95cf61f1cbc1": 1,
+ "d1b4feed8d71926a25a42d86f9a81209": 1
+ },
+ "elementId": "4479852",
+ "topOffset": -600,
+ "worksetId": "0",
+ "baseOffset": -2000,
+ "parameters": {
+ "id": "8c69297da2b6fb17718cf44fe2388878",
+ "IFC_GUID": {
+ "id": "4cabbecef7398cbdf463f847708318c6",
+ "name": "IfcGUID",
+ "units": null,
+ "value": "0oqavz9$zDZxycDyfZdYsW",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_GUID"
+ },
+ "speckle_type": "Base",
+ "幅止筋径": {
+ "id": "51840c4a0fffeac7376571395296647e",
+ "name": "幅止筋径",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "幅止筋径"
+ },
+ "鉄筋種別": {
+ "id": "3e5981bc5228393fdc84574037bfb9be",
+ "name": "鉄筋種別",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "鉄筋種別"
+ },
+ "ALL_MODEL_URL": {
+ "id": "a261c811f92fec62c296a2265435f559",
+ "name": "URL",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_URL"
+ },
+ "IFC_TYPE_GUID": {
+ "id": "5215d1101225d3415a966c4788774948",
+ "name": "Type IfcGUID",
+ "units": null,
+ "value": "0oqavz9$zDZxycDyfZdYh0",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_TYPE_GUID"
+ },
+ "KEYNOTE_PARAM": {
+ "id": "bf39776cf4e2104a4622d209b0b26e4b",
+ "name": "Keynote",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "KEYNOTE_PARAM"
+ },
+ "PHASE_CREATED": {
+ "id": "17ebb53fa91f8f8ada5c558038c48cc0",
+ "name": "Phase Created",
+ "units": null,
+ "value": "フェーズ1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHASE_CREATED"
+ },
+ "applicationId": null,
+ "ALL_MODEL_COST": {
+ "id": "8e9a24da6f88b5899ce25d3cd5c5a8ba",
+ "name": "Cost",
+ "units": "฿",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:currency-1.0.0",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_COST"
+ },
+ "ALL_MODEL_MARK": {
+ "id": "336e23f6debcf6df695750fa4ee20180",
+ "name": "Mark",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_MARK"
+ },
+ "FUNCTION_PARAM": {
+ "id": "4b63739868e772bb7da43d201a3800ea",
+ "name": "Function",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "FUNCTION_PARAM"
+ },
+ "UNIFORMAT_CODE": {
+ "id": "ccb23a319130de9a96ecc397b365e278",
+ "name": "Assembly Code",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "UNIFORMAT_CODE"
+ },
+ "WINDOW_TYPE_ID": {
+ "id": "b505347b6abc4073e7c35bc42dcdc6ad",
+ "name": "Type Mark",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WINDOW_TYPE_ID"
+ },
+ "ALL_MODEL_IMAGE": {
+ "id": "0bbd2950d953cd6769260720039799ce",
+ "name": "Image",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_IMAGE"
+ },
+ "ALL_MODEL_MODEL": {
+ "id": "ed0938df07a2290e25d65b5b300d2552",
+ "name": "Model",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_MODEL"
+ },
+ "ELEM_TYPE_PARAM": {
+ "id": "f16829ce4a87b686dcf3aebd8399c93a",
+ "name": "Type",
+ "units": null,
+ "value": "W30(Fc24)",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_TYPE_PARAM"
+ },
+ "RELATED_TO_MASS": {
+ "id": "566cb4feb80d5a985cbdf2eb64f8cce3",
+ "name": "Related to Mass",
+ "units": null,
+ "value": false,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "RELATED_TO_MASS"
+ },
+ "SYMBOL_ID_PARAM": {
+ "id": "5d10f05ef6db71c2ead565b0a5061af0",
+ "name": "Type Id",
+ "units": null,
+ "value": "W30(Fc24)",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_ID_PARAM"
+ },
+ "DESIGN_OPTION_ID": {
+ "id": "88f4af03d8e3506766765215a5b87813",
+ "name": "Design Option",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DESIGN_OPTION_ID"
+ },
+ "DOOR_FIRE_RATING": {
+ "id": "879b74bf9a25a16ff9e86ce673536b90",
+ "name": "Fire Rating",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DOOR_FIRE_RATING"
+ },
+ "PHASE_DEMOLISHED": {
+ "id": "49ca987163ba4376ad129ff75ec6921e",
+ "name": "Phase Demolished",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHASE_DEMOLISHED"
+ },
+ "CLEAR_COVER_OTHER": {
+ "id": "e7fe31274592f7688e3b7aed5f49efac",
+ "name": "Rebar Cover - Other Faces",
+ "units": null,
+ "value": "内壁(フレーム、柱、および耐力壁)",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "CLEAR_COVER_OTHER"
+ },
+ "CURVE_ELEM_LENGTH": {
+ "id": "2068c7dfb9911a544963580bc57701e4",
+ "name": "Length",
+ "units": "mm",
+ "value": 5300.000000000001,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "CURVE_ELEM_LENGTH"
+ },
+ "ELEM_FAMILY_PARAM": {
+ "id": "d6d47e2729a7d1df6f74acd2bfe10d07",
+ "name": "Family",
+ "units": null,
+ "value": "W30(Fc24)",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_FAMILY_PARAM"
+ },
+ "SYMBOL_NAME_PARAM": {
+ "id": "fe43cb940741f29b6cd508611db70c0a",
+ "name": "Type Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_NAME_PARAM"
+ },
+ "横筋 主筋径1": {
+ "id": "d379ca5a49a082cc8ac8b63edb16fae4",
+ "name": "横筋 主筋径1",
+ "units": null,
+ "value": "D13",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "横筋 主筋径1"
+ },
+ "横筋 主筋径2": {
+ "id": "b38afc05d4877b9a36e4663160e12f51",
+ "name": "横筋 主筋径2",
+ "units": null,
+ "value": "D16",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "横筋 主筋径2"
+ },
+ "縦筋 主筋径1": {
+ "id": "54201159455aa6bbca506518e4b2ab4e",
+ "name": "縦筋 主筋径1",
+ "units": null,
+ "value": "D13",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "縦筋 主筋径1"
+ },
+ "縦筋 主筋径2": {
+ "id": "8271e5b08899d0360b78f00413f3d54d",
+ "name": "縦筋 主筋径2",
+ "units": null,
+ "value": "D16",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "縦筋 主筋径2"
+ },
+ "HOST_AREA_COMPUTED": {
+ "id": "d6a8c04bf4df2b3778c3675963ffe31a",
+ "name": "Area",
+ "units": "m²",
+ "value": 7.630000000000015,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:squareMeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "HOST_AREA_COMPUTED"
+ },
+ "IFC_EXPORT_ELEMENT": {
+ "id": "ac8493ea527ffedf1d7bcf5826dab455",
+ "name": "Export to IFC",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT"
+ },
+ "WALL_CROSS_SECTION": {
+ "id": "698002bd237038be0e85c9f9f97e3bb5",
+ "name": "Cross-Section",
+ "units": null,
+ "value": 1,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_CROSS_SECTION"
+ },
+ "WALL_KEY_REF_PARAM": {
+ "id": "3f331fae4795eec71ea562f7482c4902",
+ "name": "Location Line",
+ "units": null,
+ "value": 1,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_KEY_REF_PARAM"
+ },
+ "totalChildrenCount": 0,
+ "幅止筋ピッチ": {
+ "id": "34242c23582387b0fe4c654e71bec03f",
+ "name": "幅止筋ピッチ",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "幅止筋ピッチ"
+ },
+ "ELEM_CATEGORY_PARAM": {
+ "id": "e2466248896b57cb44bd84d8e03acc85",
+ "name": "Category",
+ "units": null,
+ "value": "-2000011",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM"
+ },
+ "ALL_MODEL_TYPE_IMAGE": {
+ "id": "22e221a13bd5fcb3f9a549813cf136ae",
+ "name": "Type Image",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_TYPE_IMAGE"
+ },
+ "ANALYTICAL_ROUGHNESS": {
+ "id": "fdaeba96e8698f1032f90bd219038cd1",
+ "name": "Roughness",
+ "units": null,
+ "value": 1,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ANALYTICAL_ROUGHNESS"
+ },
+ "CLEAR_COVER_EXTERIOR": {
+ "id": "cb380885a1464f46ed4e6eca5ce0903e",
+ "name": "Rebar Cover - Exterior Face",
+ "units": null,
+ "value": "内壁(フレーム、柱、および耐力壁)",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "CLEAR_COVER_EXTERIOR"
+ },
+ "CLEAR_COVER_INTERIOR": {
+ "id": "72c0b38414d91d0a4c15e4cc55273791",
+ "name": "Rebar Cover - Interior Face",
+ "units": null,
+ "value": "内壁(フレーム、柱、および耐力壁)",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "CLEAR_COVER_INTERIOR"
+ },
+ "HOST_VOLUME_COMPUTED": {
+ "id": "a58e3bbee4814e42c6f27dd04ec4b2c4",
+ "name": "Volume",
+ "units": "m³",
+ "value": 2.2890000000000135,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:cubicMeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "HOST_VOLUME_COMPUTED"
+ },
+ "WALL_TOP_IS_ATTACHED": {
+ "id": "bb79e6923a9a1a5ad7776fcd687e9948",
+ "name": "Top is Attached",
+ "units": null,
+ "value": false,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_TOP_IS_ATTACHED"
+ },
+ "ALL_MODEL_DESCRIPTION": {
+ "id": "c674714a0e0f8f3ace46457be507bde7",
+ "name": "Description",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_DESCRIPTION"
+ },
+ "IFC_EXPORT_ELEMENT_AS": {
+ "id": "beab0eef32c6a433e7c996a75f6d46d9",
+ "name": "Export to IFC As",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT_AS"
+ },
+ "UNIFORMAT_DESCRIPTION": {
+ "id": "8e056ac453940541c2d6f1b84560967e",
+ "name": "Assembly Description",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "UNIFORMAT_DESCRIPTION"
+ },
+ "WALL_ATTR_WIDTH_PARAM": {
+ "id": "6ca4606560c24174ba9e8c29fd8aaa2b",
+ "name": "Width",
+ "units": "mm",
+ "value": 300,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_ATTR_WIDTH_PARAM"
+ },
+ "ALL_MODEL_MANUFACTURER": {
+ "id": "6bf6926a1116ba2e3bf17fa8456cc1b1",
+ "name": "Manufacturer",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_MANUFACTURER"
+ },
+ "ANALYTICAL_ABSORPTANCE": {
+ "id": "5a8796dffbd22a111b19fc15413c50d9",
+ "name": "Absorptance",
+ "units": null,
+ "value": 0.1,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ANALYTICAL_ABSORPTANCE"
+ },
+ "ELEM_CATEGORY_PARAM_MT": {
+ "id": "c251e0548d16c42db1af0881126d5691",
+ "name": "Category",
+ "units": null,
+ "value": "-2000011",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM_MT"
+ },
+ "SPECKLE_Classification": {
+ "id": "29dc1191e21fa4dceda0ed60881f32bf",
+ "name": "SPECKLE_Classification",
+ "units": null,
+ "value": "Wall",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SPECKLE_Classification"
+ },
+ "WRAPPING_AT_ENDS_PARAM": {
+ "id": "91f83fbeb00a751ed03bcf251aeb0474",
+ "name": "Wrapping at Ends",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WRAPPING_AT_ENDS_PARAM"
+ },
+ "横筋 主筋ピッチ": {
+ "id": "ad6a3787ecba15b3d8356d970d5d8b2e",
+ "name": "横筋 主筋ピッチ",
+ "units": null,
+ "value": "200",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "横筋 主筋ピッチ"
+ },
+ "縦筋 主筋ピッチ": {
+ "id": "0381ecfe263b4b47be4fdf1e24d3eb92",
+ "name": "縦筋 主筋ピッチ",
+ "units": null,
+ "value": "200",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "縦筋 主筋ピッチ"
+ },
+ "ALL_MODEL_TYPE_COMMENTS": {
+ "id": "66ccc5a8cdfe28320bf955039e82d179",
+ "name": "Type Comments",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_TYPE_COMMENTS"
+ },
+ "ANALYTICAL_THERMAL_MASS": {
+ "id": "af19fd7af543d723026757132eaaf0e0",
+ "name": "Thermal Mass",
+ "units": "kJ/(m²·K)",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:kilojoulesPerSquareMeterKelvin-1.0.0",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ANALYTICAL_THERMAL_MASS"
+ },
+ "IFC_EXPORT_ELEMENT_TYPE": {
+ "id": "9ec1631edc0b1ea8989dbaadace6f99a",
+ "name": "Export Type to IFC",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT_TYPE"
+ },
+ "WALL_ATTR_ROOM_BOUNDING": {
+ "id": "392a751844d378da83ff7b7b52350c2f",
+ "name": "Room Bounding",
+ "units": null,
+ "value": true,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_ATTR_ROOM_BOUNDING"
+ },
+ "WALL_BOTTOM_IS_ATTACHED": {
+ "id": "bf83fa521e6b4772698625a616b564d6",
+ "name": "Base is Attached",
+ "units": null,
+ "value": false,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_BOTTOM_IS_ATTACHED"
+ },
+ "WALL_STRUCTURE_ID_PARAM": {
+ "id": "3f264fcd24517cc263b25c00c67dcb3a",
+ "name": "Structure",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_STRUCTURE_ID_PARAM"
+ },
+ "SYMBOL_FAMILY_NAME_PARAM": {
+ "id": "a52788d3716a07ca198833a2024a2f04",
+ "name": "Family Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_FAMILY_NAME_PARAM"
+ },
+ "IFC_EXPORT_PREDEFINEDTYPE": {
+ "id": "bef8079e3ea573218fef71b15b7a3b3d",
+ "name": "IFC Predefined Type",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_PREDEFINEDTYPE"
+ },
+ "STRUCTURAL_MATERIAL_PARAM": {
+ "id": "121e411a45f3bea248cc2f765d8675bb",
+ "name": "Structural Material",
+ "units": null,
+ "value": "Fc24",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "STRUCTURAL_MATERIAL_PARAM"
+ },
+ "WRAPPING_AT_INSERTS_PARAM": {
+ "id": "6eba8d341daac476193f20335df00061",
+ "name": "Wrapping at Inserts",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WRAPPING_AT_INSERTS_PARAM"
+ },
+ "開口補強筋 斜筋径": {
+ "id": "31066a58041f9df55276aae87d6cf5ad",
+ "name": "開口補強筋 斜筋径",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "開口補強筋 斜筋径"
+ },
+ "開口補強筋 横筋径": {
+ "id": "982eb88059ea7999e47e8f9b8fece66b",
+ "name": "開口補強筋 横筋径",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "開口補強筋 横筋径"
+ },
+ "開口補強筋 縦筋径": {
+ "id": "95ce337d39eb9cd006358b01bc3f3867",
+ "name": "開口補強筋 縦筋径",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "開口補強筋 縦筋径"
+ },
+ "ELEM_FAMILY_AND_TYPE_PARAM": {
+ "id": "8df6a5d7d61a24f5760864d4ebcccc5a",
+ "name": "Family and Type",
+ "units": null,
+ "value": "W30(Fc24)",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_FAMILY_AND_TYPE_PARAM"
+ },
+ "IFC_EXPORT_ELEMENT_TYPE_AS": {
+ "id": "08ef7fe13e19f78ee030301957ed685f",
+ "name": "Export Type to IFC As",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT_TYPE_AS"
+ },
+ "ALL_MODEL_INSTANCE_COMMENTS": {
+ "id": "a6151cb13456ef39b86fd79c833dd574",
+ "name": "Comments",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_INSTANCE_COMMENTS"
+ },
+ "WALL_STRUCTURAL_USAGE_PARAM": {
+ "id": "b8bb8937c07a425ab818632ed1103491",
+ "name": "Structural Usage",
+ "units": null,
+ "value": 1,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_STRUCTURAL_USAGE_PARAM"
+ },
+ "横筋 主筋配列タイプ": {
+ "id": "f3e191564aa79490e296764e28f3549d",
+ "name": "横筋 主筋配列タイプ",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "横筋 主筋配列タイプ"
+ },
+ "縦筋 主筋配列タイプ": {
+ "id": "134feeab85c34c7c4282287266ada0d3",
+ "name": "縦筋 主筋配列タイプ",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "縦筋 主筋配列タイプ"
+ },
+ "ANALYTICAL_THERMAL_RESISTANCE": {
+ "id": "7245343997d68e458c6b381dd279f15c",
+ "name": "Thermal Resistance (R)",
+ "units": "(m²·K)/W",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:squareMeterKelvinsPerWatt-1.0.1",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ANALYTICAL_THERMAL_RESISTANCE"
+ },
+ "WALL_TOP_EXTENSION_DIST_PARAM": {
+ "id": "9b78bb419c97b74813b28719a9bfcaf4",
+ "name": "Top Extension Distance",
+ "units": "mm",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_TOP_EXTENSION_DIST_PARAM"
+ },
+ "開口補強筋 斜筋 本数": {
+ "id": "2d4fd7106ab9c96557e51ee988bed498",
+ "name": "開口補強筋 斜筋 本数",
+ "units": null,
+ "value": "―",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "開口補強筋 斜筋 本数"
+ },
+ "開口補強筋 横筋 本数": {
+ "id": "dc3b743b5b31f35e0f003260dbab5ab7",
+ "name": "開口補強筋 横筋 本数",
+ "units": null,
+ "value": "―",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "開口補強筋 横筋 本数"
+ },
+ "開口補強筋 縦筋 本数": {
+ "id": "259c67c82b4bda585ee2d63becad3f32",
+ "name": "開口補強筋 縦筋 本数",
+ "units": null,
+ "value": "―",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "開口補強筋 縦筋 本数"
+ },
+ "IFC_EXPORT_PREDEFINEDTYPE_TYPE": {
+ "id": "f13c388136536408dacc5e0ee89fd9e0",
+ "name": "Type IFC Predefined Type",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_PREDEFINEDTYPE_TYPE"
+ },
+ "COARSE_SCALE_FILL_PATTERN_COLOR": {
+ "id": "cc2dc46bbd456ed85ceae83affbc8d1d",
+ "name": "Coarse Scale Fill Color",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "COARSE_SCALE_FILL_PATTERN_COLOR"
+ },
+ "WALL_BOTTOM_EXTENSION_DIST_PARAM": {
+ "id": "94108dc85de8611fee053504bee85812",
+ "name": "Base Extension Distance",
+ "units": "mm",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_BOTTOM_EXTENSION_DIST_PARAM"
+ },
+ "ANALYTICAL_ELEMENT_HAS_ASSOCIATION": {
+ "id": "7b62e323ef4e0c70504e5da33355a8cf",
+ "name": "Has Association",
+ "units": null,
+ "value": true,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ANALYTICAL_ELEMENT_HAS_ASSOCIATION"
+ },
+ "COARSE_SCALE_FILL_PATTERN_ID_PARAM": {
+ "id": "04fc11a30d5cee03c44ad04ff8efa3c8",
+ "name": "Coarse Scale Fill Pattern",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "COARSE_SCALE_FILL_PATTERN_ID_PARAM"
+ },
+ "031a6ed6-93a1-44a6-a9ce-ccb9d550178c": {
+ "id": "3eee0f1c3b6af014e4826800611fe4df",
+ "name": "横筋径1",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "031a6ed6-93a1-44a6-a9ce-ccb9d550178c"
+ },
+ "03a6aadb-5f60-4d1e-9664-3a0dfa8a903c": {
+ "id": "f889e20acb8e539be4ec203b7027f253",
+ "name": "配筋タイプ",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "03a6aadb-5f60-4d1e-9664-3a0dfa8a903c"
+ },
+ "0560d1bb-007b-45e4-b8c3-87f9c6a3d73c": {
+ "id": "9808b00361e296ccb7e5770c6eed5d56",
+ "name": "構造スリット 下端",
+ "units": null,
+ "value": false,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "0560d1bb-007b-45e4-b8c3-87f9c6a3d73c"
+ },
+ "3750828c-ca7b-4501-8866-2912e0f9c9c9": {
+ "id": "64254415a3dfb963d9ca89878168e237",
+ "name": "構造スリット 上端",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "3750828c-ca7b-4501-8866-2912e0f9c9c9"
+ },
+ "60795a90-8c91-4e11-90a0-b77b819c2403": {
+ "id": "cf84f8413f59389326154a5e3aa72a8c",
+ "name": "構造スリット 始端",
+ "units": null,
+ "value": false,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "60795a90-8c91-4e11-90a0-b77b819c2403"
+ },
+ "65e579b4-1073-4d12-80da-a40b34734cc0": {
+ "id": "b276b69010e7d152a3afe6826e548d5f",
+ "name": "配置位置情報",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "65e579b4-1073-4d12-80da-a40b34734cc0"
+ },
+ "6796d143-ef09-4441-9ecc-3411fe837a65": {
+ "id": "817ec1a0d32f3de0fcca6d7eb5b446d6",
+ "name": "縦筋ピッチ",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "6796d143-ef09-4441-9ecc-3411fe837a65"
+ },
+ "99066c2f-d804-4cf9-a413-4d558c2c2c11": {
+ "id": "5703496021b5efda82b890c3f8539ea8",
+ "name": "横筋径2",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "99066c2f-d804-4cf9-a413-4d558c2c2c11"
+ },
+ "ANALYTICAL_HEAT_TRANSFER_COEFFICIENT": {
+ "id": "18ca50476c9acc7270223f29480df80d",
+ "name": "Heat Transfer Coefficient (U)",
+ "units": "W/(m²·K)",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:wattsPerSquareMeterKelvin-1.0.1",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ANALYTICAL_HEAT_TRANSFER_COEFFICIENT"
+ },
+ "bd6a1903-5430-45a0-a493-703ff58a94d5": {
+ "id": "4a2083826f7fe05eb467138bef859f6f",
+ "name": "縦筋径2",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "bd6a1903-5430-45a0-a493-703ff58a94d5"
+ },
+ "cc4ea676-5014-4905-ae83-a9508800fa35": {
+ "id": "a48e39f9b6ef12235c45e762fdc8dd7d",
+ "name": "縦筋径1",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "cc4ea676-5014-4905-ae83-a9508800fa35"
+ },
+ "cd19c040-0788-4424-8a67-7127427e311f": {
+ "id": "67b1bf6c3e8202d72527c2215076e408",
+ "name": "横筋ピッチ",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "cd19c040-0788-4424-8a67-7127427e311f"
+ },
+ "e3223f14-6158-4d4f-8697-0de2bcc7f737": {
+ "id": "760ab37568b5c8ade3fbddd92500420c",
+ "name": "構造スリット 終端",
+ "units": null,
+ "value": false,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "e3223f14-6158-4d4f-8697-0de2bcc7f737"
+ },
+ "ee1f33e1-5506-4a64-b87b-7b98d30aea52": {
+ "id": "27cb51ebdf21d4fe5cb4da8874b801f3",
+ "name": "符号",
+ "units": null,
+ "value": "W30",
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ee1f33e1-5506-4a64-b87b-7b98d30aea52"
+ }
+ },
+ "structural": true,
+ "displayValue": [
+ {
+ "referencedId": "d1b4feed8d71926a25a42d86f9a81209",
+ "speckle_type": "reference"
+ }
+ ],
+ "phaseCreated": "フェーズ1",
+ "speckle_type": "Objects.BuiltElements.Wall:Objects.BuiltElements.Revit.RevitWall",
+ "applicationId": "32d24e7d-27ff-4d8f-bf26-37ca63da76cc-00445b6c",
+ "builtInCategory": "OST_Walls",
+ "isRevitLinkedModel": false,
+ "materialQuantities": [
+ {
+ "id": "cbc89c0323c9555b9770a1510587a145",
+ "area": 7630000.000000016,
+ "units": "mm",
+ "length": 5300.000000000002,
+ "volume": 2289000000.0000134,
+ "material": {
+ "referencedId": "78b63dbbe244fafafc0a95cf61f1cbc1",
+ "speckle_type": "reference"
+ },
+ "speckle_type": "Objects.Other.MaterialQuantity",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ }
+ ],
+ "totalChildrenCount": null,
+ "revitLinkedModelPath": "C:\\Program Files\\Autodesk\\Revit 2024\\Samples\\サンプル構造.rvt"
+ },
+ {
+ "id": "210e0ea727c735970c576cd0beab0493",
+ "data": [
+ 22550.00031738281,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22550.00031738281,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15350.000262451173,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15350.000262451173,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22550.00031738281,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15350.000262451173,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22550.00031738281,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15350.000262451173,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22550.00031738281,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22550.00031738281,
+ 15049.999969482422,
+ -2000.000015258789
+ ],
+ "speckle_type": "Speckle.Core.Models.DataChunk",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ {
+ "id": "30ba0a6aba886a2e800b12bb37656ab3",
+ "data": [
+ 3,
+ 5,
+ 0,
+ 1,
+ 3,
+ 5,
+ 1,
+ 4,
+ 3,
+ 4,
+ 2,
+ 3,
+ 3,
+ 2,
+ 4,
+ 1,
+ 3,
+ 11,
+ 12,
+ 9,
+ 3,
+ 9,
+ 10,
+ 11,
+ 3,
+ 12,
+ 13,
+ 9,
+ 3,
+ 13,
+ 6,
+ 8,
+ 3,
+ 7,
+ 8,
+ 6,
+ 3,
+ 13,
+ 8,
+ 9,
+ 3,
+ 15,
+ 16,
+ 18,
+ 3,
+ 14,
+ 15,
+ 19,
+ 3,
+ 17,
+ 18,
+ 16,
+ 3,
+ 19,
+ 20,
+ 14,
+ 3,
+ 18,
+ 19,
+ 15,
+ 3,
+ 21,
+ 22,
+ 23,
+ 3,
+ 23,
+ 24,
+ 21,
+ 3,
+ 26,
+ 27,
+ 29,
+ 3,
+ 25,
+ 26,
+ 30,
+ 3,
+ 28,
+ 29,
+ 27,
+ 3,
+ 30,
+ 31,
+ 25,
+ 3,
+ 29,
+ 30,
+ 26,
+ 3,
+ 32,
+ 33,
+ 34,
+ 3,
+ 34,
+ 35,
+ 32
+ ],
+ "speckle_type": "Speckle.Core.Models.DataChunk",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ {
+ "id": "78b63dbbe244fafafc0a95cf61f1cbc1",
+ "name": "Fc24",
+ "units": "mm",
+ "category": "Materials",
+ "elementId": "3536906",
+ "shininess": 64,
+ "worksetId": "0",
+ "parameters": {
+ "id": "e12bca490aebaff501c5b406919d815f",
+ "IFC_GUID": {
+ "id": "17c3bf4d76621a920526f6575976399f",
+ "name": "IfcGUID",
+ "units": null,
+ "value": "3Fptj$rfjDy8TIvUXScHaX",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_GUID"
+ },
+ "speckle_type": "Base",
+ "ALL_MODEL_URL": {
+ "id": "77d61973d49275f7d998a3571a0a25fa",
+ "name": "URL",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_URL"
+ },
+ "KEYNOTE_PARAM": {
+ "id": "914f16b47a4a306b6e82cca879a470d7",
+ "name": "Keynote",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "KEYNOTE_PARAM"
+ },
+ "MATERIAL_NAME": {
+ "id": "b8c8d905ba449a911e8be72271a9ed85",
+ "name": "Name",
+ "units": null,
+ "value": "Fc24",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "MATERIAL_NAME"
+ },
+ "applicationId": null,
+ "ALL_MODEL_COST": {
+ "id": "5f73704463c7c1506d06d8440bc587a9",
+ "name": "Cost",
+ "units": "฿",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:currency-1.0.0",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_COST"
+ },
+ "ALL_MODEL_MARK": {
+ "id": "790542e881b00e4ab74d4901c8c34357",
+ "name": "Mark",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_MARK"
+ },
+ "ALL_MODEL_IMAGE": {
+ "id": "0bbd2950d953cd6769260720039799ce",
+ "name": "Image",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_IMAGE"
+ },
+ "ALL_MODEL_MODEL": {
+ "id": "dda0363a01f2ec975cc16cfba9a53274",
+ "name": "Model",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_MODEL"
+ },
+ "DESIGN_OPTION_ID": {
+ "id": "88f4af03d8e3506766765215a5b87813",
+ "name": "Design Option",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DESIGN_OPTION_ID"
+ },
+ "SYMBOL_NAME_PARAM": {
+ "id": "fe43cb940741f29b6cd508611db70c0a",
+ "name": "Type Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_NAME_PARAM"
+ },
+ "IFC_EXPORT_ELEMENT": {
+ "id": "ac8493ea527ffedf1d7bcf5826dab455",
+ "name": "Export to IFC",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT"
+ },
+ "totalChildrenCount": 0,
+ "ELEM_CATEGORY_PARAM": {
+ "id": "9afb27a0af34166ffc2fdadfa999b71d",
+ "name": "Category",
+ "units": null,
+ "value": "-2000700",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM"
+ },
+ "MATERIAL_PARAM_GLOW": {
+ "id": "07ce2bab8200d4c162d967a56c012b7b",
+ "name": "Glow",
+ "units": null,
+ "value": false,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "MATERIAL_PARAM_GLOW"
+ },
+ "MATERIAL_PARAM_COLOR": {
+ "id": "249d80bc79d53c21f7a7d90eec4591bc",
+ "name": "Color",
+ "units": null,
+ "value": 13816530,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "MATERIAL_PARAM_COLOR"
+ },
+ "ALL_MODEL_DESCRIPTION": {
+ "id": "9176e6b7f2fb3fc5e6ec34323ed39851",
+ "name": "Description",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_DESCRIPTION"
+ },
+ "IFC_EXPORT_ELEMENT_AS": {
+ "id": "beab0eef32c6a433e7c996a75f6d46d9",
+ "name": "Export to IFC As",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT_AS"
+ },
+ "ALL_MODEL_MANUFACTURER": {
+ "id": "4f80f3bdf4c9fb907121b3514b073700",
+ "name": "Manufacturer",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_MANUFACTURER"
+ },
+ "ELEM_CATEGORY_PARAM_MT": {
+ "id": "9b0b5169fad84379d3744cbf899a827b",
+ "name": "Category",
+ "units": null,
+ "value": "-2000700",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM_MT"
+ },
+ "SPECKLE_Classification": {
+ "id": "2138dca3e3a7c852aeaa3fa65e5a5e8c",
+ "name": "SPECKLE_Classification",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SPECKLE_Classification"
+ },
+ "PHY_MATERIAL_PARAM_TYPE": {
+ "id": "3a2b1c0217cdf12101ff2d4730ed29a3",
+ "name": "Material Type",
+ "units": null,
+ "value": 2,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_TYPE"
+ },
+ "MATERIAL_PARAM_SHININESS": {
+ "id": "048455a2c06efa01c8f54b1ac6ae9d6c",
+ "name": "Shininess",
+ "units": null,
+ "value": 64,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "MATERIAL_PARAM_SHININESS"
+ },
+ "PHY_MATERIAL_PARAM_CLASS": {
+ "id": "9e21d1a407f3eeb3fa18350d9bdec69d",
+ "name": "Class",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_CLASS"
+ },
+ "SYMBOL_FAMILY_NAME_PARAM": {
+ "id": "a52788d3716a07ca198833a2024a2f04",
+ "name": "Family Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_FAMILY_NAME_PARAM"
+ },
+ "IFC_EXPORT_PREDEFINEDTYPE": {
+ "id": "bef8079e3ea573218fef71b15b7a3b3d",
+ "name": "IFC Predefined Type",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_PREDEFINEDTYPE"
+ },
+ "MATERIAL_PARAM_SMOOTHNESS": {
+ "id": "1b829d7baefd372729cd0ffffcc1428b",
+ "name": "Smoothness",
+ "units": null,
+ "value": 50,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "MATERIAL_PARAM_SMOOTHNESS"
+ },
+ "ALL_MODEL_INSTANCE_COMMENTS": {
+ "id": "a6151cb13456ef39b86fd79c833dd574",
+ "name": "Comments",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_INSTANCE_COMMENTS"
+ },
+ "MATERIAL_PARAM_TRANSPARENCY": {
+ "id": "e87ecc901cb24535734c4ec126c3ff42",
+ "name": "Transparency",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "MATERIAL_PARAM_TRANSPARENCY"
+ },
+ "PHY_MATERIAL_PARAM_BEHAVIOR": {
+ "id": "80e17a634518cc49f2395e87276a988a",
+ "name": "Behavior",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_BEHAVIOR"
+ },
+ "PHY_MATERIAL_PARAM_SUBCLASS": {
+ "id": "f6596da11827db5d37f43d8305faa368",
+ "name": "Subclass",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_SUBCLASS"
+ },
+ "PHY_MATERIAL_PARAM_EXP_COEFF1": {
+ "id": "0c7b51a7d39920fbffa32b1f6a227a79",
+ "name": "Thermal expansion coefficient X",
+ "units": "1/°C",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:inverseDegreesCelsius-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_EXP_COEFF1"
+ },
+ "PHY_MATERIAL_PARAM_EXP_COEFF2": {
+ "id": "2f09b81f7ae8a11b9f86cf0d15487b32",
+ "name": "Thermal expansion coefficient Y",
+ "units": "1/°C",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:inverseDegreesCelsius-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_EXP_COEFF2"
+ },
+ "PHY_MATERIAL_PARAM_EXP_COEFF3": {
+ "id": "4bc9d38a99eb309b5a905cf5e012d9ca",
+ "name": "Thermal expansion coefficient Z",
+ "units": "1/°C",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:inverseDegreesCelsius-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_EXP_COEFF3"
+ },
+ "PHY_MATERIAL_PARAM_SHEAR_MOD1": {
+ "id": "89395fb2129a5376c0b3361ca5467a32",
+ "name": "Shear modulus X",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_SHEAR_MOD1"
+ },
+ "PHY_MATERIAL_PARAM_SHEAR_MOD2": {
+ "id": "c716c6a5f3a3ae95c457e65322d983b6",
+ "name": "Shear modulus Y",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_SHEAR_MOD2"
+ },
+ "PHY_MATERIAL_PARAM_SHEAR_MOD3": {
+ "id": "fdfedb97c328d8c33b589aa1f963e7e5",
+ "name": "Shear modulus Z",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_SHEAR_MOD3"
+ },
+ "PHY_MATERIAL_PARAM_YOUNG_MOD1": {
+ "id": "8e6aa66401295da7acd0937d8fd60bf0",
+ "name": "Young modulus X",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_YOUNG_MOD1"
+ },
+ "PHY_MATERIAL_PARAM_YOUNG_MOD2": {
+ "id": "3f397a6665eba57524da0f5710001fd3",
+ "name": "Young modulus Y",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_YOUNG_MOD2"
+ },
+ "PHY_MATERIAL_PARAM_YOUNG_MOD3": {
+ "id": "1ef77b2612c40e2f1c3fbeb60dabaf8c",
+ "name": "Young modulus Z",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_YOUNG_MOD3"
+ },
+ "PHY_MATERIAL_PARAM_UNIT_WEIGHT": {
+ "id": "b896141f21ada1a1b1ef36f2992dec16",
+ "name": "Unit weight",
+ "units": "kN/m³",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:kilonewtonsPerCubicMeter-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_UNIT_WEIGHT"
+ },
+ "PHY_MATERIAL_PARAM_LIGHT_WEIGHT": {
+ "id": "b94f75bc88fb5b1c30d82c9c20de648b",
+ "name": "Lightweight",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_LIGHT_WEIGHT"
+ },
+ "PHY_MATERIAL_PARAM_POISSON_MOD1": {
+ "id": "0c963ab07b678e7a50996ef93eb62523",
+ "name": "Poisson ratio X",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_POISSON_MOD1"
+ },
+ "PHY_MATERIAL_PARAM_POISSON_MOD2": {
+ "id": "86eff39b70fafdf2cc4543e954557118",
+ "name": "Poisson ratio Y",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_POISSON_MOD2"
+ },
+ "PHY_MATERIAL_PARAM_POISSON_MOD3": {
+ "id": "4aa2bc74b0de7c770e2a52eba3334039",
+ "name": "Poisson ratio Z",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_POISSON_MOD3"
+ },
+ "PHY_MATERIAL_PARAM_CONCRETE_COMPRESSION": {
+ "id": "9843373c83b401049b8377f35e518a70",
+ "name": "Concrete compression",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_CONCRETE_COMPRESSION"
+ },
+ "PHY_MATERIAL_PARAM_SHEAR_STRENGTH_REDUCTION": {
+ "id": "487360a05edba93fcddd9e901bd8032b",
+ "name": "Shear strength modification",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_SHEAR_STRENGTH_REDUCTION"
+ }
+ },
+ "smoothness": 50,
+ "speckle_type": "Objects.Other.Material:Objects.Other.Revit.RevitMaterial",
+ "transparency": 0,
+ "applicationId": "cfcf7b7f-d69b-4df0-8752-e5e85cace12b-0035f80a",
+ "materialClass": "コンクリート",
+ "builtInCategory": "OST_Materials",
+ "materialCategory": "コンクリート",
+ "isRevitLinkedModel": false,
+ "materialQuantities": [],
+ "totalChildrenCount": 0,
+ "revitLinkedModelPath": "C:\\Program Files\\Autodesk\\Revit 2024\\Samples\\サンプル構造.rvt"
+ },
+ {
+ "id": "d1b4feed8d71926a25a42d86f9a81209",
+ "area": 0,
+ "bbox": null,
+ "faces": [
+ {
+ "referencedId": "30ba0a6aba886a2e800b12bb37656ab3",
+ "speckle_type": "reference"
+ }
+ ],
+ "units": "mm",
+ "colors": [],
+ "volume": 0,
+ "vertices": [
+ {
+ "referencedId": "210e0ea727c735970c576cd0beab0493",
+ "speckle_type": "reference"
+ }
+ ],
+ "__closure": {
+ "210e0ea727c735970c576cd0beab0493": 1,
+ "30ba0a6aba886a2e800b12bb37656ab3": 1
+ },
+ "speckle_type": "Objects.Geometry.Mesh",
+ "applicationId": null,
+ "renderMaterial": {
+ "id": "91b55219af0a40a47f0213b231f149e2",
+ "name": "Fc24",
+ "diffuse": -2960686,
+ "opacity": 1,
+ "emissive": -16777216,
+ "metalness": 0,
+ "roughness": 1,
+ "speckle_type": "Objects.Other.RenderMaterial",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ "textureCoordinates": [],
+ "totalChildrenCount": 0
+ }
+]
\ No newline at end of file
diff --git a/test_data/v3_object.json b/test_data/v3_object.json
new file mode 100644
index 0000000..55b259f
--- /dev/null
+++ b/test_data/v3_object.json
@@ -0,0 +1,696 @@
+[
+ {
+ "id": "46f06fef727d64a0bbcbd7ced51e0cd2",
+ "name": "Walls - W30(Fc24)",
+ "type": "W30(Fc24)",
+ "level": {
+ "name": "1FL",
+ "units": "mm",
+ "elevation": 0
+ },
+ "units": "mm",
+ "family": "Basic Wall",
+ "flipped": false,
+ "category": "Walls",
+ "elements": [],
+ "location": {
+ "id": "9c76b8de34382c9052965ee463f8374b",
+ "end": {
+ "x": 22400.000000000015,
+ "y": 20500,
+ "z": 0,
+ "id": "3455575bfd8939f264d295b61e74156f",
+ "units": "mm",
+ "speckle_type": "Objects.Geometry.Point",
+ "applicationId": null
+ },
+ "bbox": null,
+ "start": {
+ "x": 22400.000000000007,
+ "y": 15199.999999999998,
+ "z": 0,
+ "id": "d0c4fdb2e11cc825e7f05f9dc88a0be1",
+ "units": "mm",
+ "speckle_type": "Objects.Geometry.Point",
+ "applicationId": null
+ },
+ "units": "mm",
+ "domain": {
+ "id": "3b97feaad2dbcc2d894c9cec024a9bf2",
+ "end": 17.388451443569522,
+ "start": -3.552713668866051e-14,
+ "speckle_type": "Objects.Primitive.Interval",
+ "applicationId": null
+ },
+ "length": 5300.000000000002,
+ "speckle_type": "Objects.Geometry.Line",
+ "applicationId": null
+ },
+ "topLevel": {
+ "name": "1FL",
+ "units": "mm",
+ "elevation": 0
+ },
+ "__closure": {
+ "0ad4db1fe261a5b640ad9f315a46a6fc": 100,
+ "0d5518a7a3e63fe345e198ad5d6acc4e": 100,
+ "ec2040af4bd9c8619f9029a43df61a2e": 100
+ },
+ "elementId": "4479852",
+ "worksetId": "0",
+ "properties": {
+ "Parameters": {
+ "Type Parameters": {
+ "Text": {
+ "符号": {
+ "name": "符号",
+ "value": "W30",
+ "internalDefinitionName": "ee1f33e1-5506-4a64-b87b-7b98d30aea52"
+ }
+ },
+ "Other": {
+ "Family Name": {
+ "name": "Family Name",
+ "value": "Basic Wall",
+ "internalDefinitionName": "SYMBOL_FAMILY_NAME_PARAM"
+ },
+ "横筋ピッチ": {
+ "name": "横筋ピッチ",
+ "units": "General",
+ "value": 0,
+ "internalDefinitionName": "cd19c040-0788-4424-8a67-7127427e311f"
+ },
+ "縦筋ピッチ": {
+ "name": "縦筋ピッチ",
+ "units": "General",
+ "value": 0,
+ "internalDefinitionName": "6796d143-ef09-4441-9ecc-3411fe837a65"
+ }
+ },
+ "Rebar Set": {
+ "横筋 主筋径1": {
+ "name": "横筋 主筋径1",
+ "value": "D13",
+ "internalDefinitionName": "横筋 主筋径1"
+ },
+ "横筋 主筋径2": {
+ "name": "横筋 主筋径2",
+ "value": "D16",
+ "internalDefinitionName": "横筋 主筋径2"
+ },
+ "縦筋 主筋径1": {
+ "name": "縦筋 主筋径1",
+ "value": "D13",
+ "internalDefinitionName": "縦筋 主筋径1"
+ },
+ "縦筋 主筋径2": {
+ "name": "縦筋 主筋径2",
+ "value": "D16",
+ "internalDefinitionName": "縦筋 主筋径2"
+ },
+ "横筋 主筋ピッチ": {
+ "name": "横筋 主筋ピッチ",
+ "value": "200",
+ "internalDefinitionName": "横筋 主筋ピッチ"
+ },
+ "縦筋 主筋ピッチ": {
+ "name": "縦筋 主筋ピッチ",
+ "value": "200",
+ "internalDefinitionName": "縦筋 主筋ピッチ"
+ },
+ "開口補強筋 斜筋 本数": {
+ "name": "開口補強筋 斜筋 本数",
+ "value": "―",
+ "internalDefinitionName": "開口補強筋 斜筋 本数"
+ },
+ "開口補強筋 横筋 本数": {
+ "name": "開口補強筋 横筋 本数",
+ "value": "―",
+ "internalDefinitionName": "開口補強筋 横筋 本数"
+ },
+ "開口補強筋 縦筋 本数": {
+ "name": "開口補強筋 縦筋 本数",
+ "value": "―",
+ "internalDefinitionName": "開口補強筋 縦筋 本数"
+ }
+ },
+ "Structure": {
+ "Fc24 (0)": {
+ "units": "mm",
+ "function": "Structure",
+ "material": "Fc24",
+ "thickness": 300
+ }
+ },
+ "Construction": {
+ "Width": {
+ "name": "Width",
+ "units": "Millimeters",
+ "value": 300,
+ "internalDefinitionName": "WALL_ATTR_WIDTH_PARAM"
+ },
+ "Function": {
+ "name": "Function",
+ "value": "Interior",
+ "internalDefinitionName": "FUNCTION_PARAM"
+ },
+ "Wrapping at Ends": {
+ "name": "Wrapping at Ends",
+ "value": "None",
+ "internalDefinitionName": "WRAPPING_AT_ENDS_PARAM"
+ },
+ "Wrapping at Inserts": {
+ "name": "Wrapping at Inserts",
+ "value": "Do not wrap",
+ "internalDefinitionName": "WRAPPING_AT_INSERTS_PARAM"
+ }
+ },
+ "Identity Data": {
+ "Cost": {
+ "name": "Cost",
+ "units": "Currency",
+ "value": 0,
+ "internalDefinitionName": "ALL_MODEL_COST"
+ },
+ "Type Name": {
+ "name": "Type Name",
+ "value": "W30(Fc24)",
+ "internalDefinitionName": "SYMBOL_NAME_PARAM"
+ }
+ },
+ "IFC Parameters": {
+ "Type IfcGUID": {
+ "name": "Type IfcGUID",
+ "value": "0oqavz9$zDZxycDyfZdYh0",
+ "internalDefinitionName": "IFC_TYPE_GUID"
+ },
+ "Export Type to IFC": {
+ "name": "Export Type to IFC",
+ "value": "Default",
+ "internalDefinitionName": "IFC_EXPORT_ELEMENT_TYPE"
+ }
+ },
+ "Analytical Properties": {
+ "Roughness": {
+ "name": "Roughness",
+ "value": 1,
+ "internalDefinitionName": "ANALYTICAL_ROUGHNESS"
+ },
+ "Absorptance": {
+ "name": "Absorptance",
+ "units": "General",
+ "value": 0.1,
+ "internalDefinitionName": "ANALYTICAL_ABSORPTANCE"
+ },
+ "Thermal Mass": {
+ "name": "Thermal Mass",
+ "units": "Kilojoules per square meter Kelvin",
+ "value": 0,
+ "internalDefinitionName": "ANALYTICAL_THERMAL_MASS"
+ },
+ "Thermal Resistance (R)": {
+ "name": "Thermal Resistance (R)",
+ "units": "Square meter kelvins per watt",
+ "value": 0,
+ "internalDefinitionName": "ANALYTICAL_THERMAL_RESISTANCE"
+ },
+ "Heat Transfer Coefficient (U)": {
+ "name": "Heat Transfer Coefficient (U)",
+ "units": "Watts per square meter kelvin",
+ "value": 0,
+ "internalDefinitionName": "ANALYTICAL_HEAT_TRANSFER_COEFFICIENT"
+ }
+ },
+ "Materials and Finishes": {
+ "Structural Material": {
+ "name": "Structural Material",
+ "value": "Fc24",
+ "internalDefinitionName": "STRUCTURAL_MATERIAL_PARAM"
+ }
+ }
+ },
+ "Instance Parameters": {
+ "Other": {
+ "Type": {
+ "name": "Type",
+ "value": "W30(Fc24)",
+ "internalDefinitionName": "ELEM_TYPE_PARAM"
+ },
+ "Family": {
+ "name": "Family",
+ "value": "Basic Wall",
+ "internalDefinitionName": "ELEM_FAMILY_PARAM"
+ },
+ "Type Id": {
+ "name": "Type Id",
+ "value": "Basic Wall W30(Fc24)",
+ "internalDefinitionName": "SYMBOL_ID_PARAM"
+ },
+ "Family and Type": {
+ "name": "Family and Type",
+ "value": "Basic Wall W30(Fc24)",
+ "internalDefinitionName": "ELEM_FAMILY_AND_TYPE_PARAM"
+ }
+ },
+ "Phasing": {
+ "Phase Created": {
+ "name": "Phase Created",
+ "value": "フェーズ1",
+ "internalDefinitionName": "PHASE_CREATED"
+ }
+ },
+ "Dimensions": {
+ "Area": {
+ "name": "Area",
+ "units": "Square meters",
+ "value": 7.630000000000015,
+ "internalDefinitionName": "HOST_AREA_COMPUTED"
+ },
+ "Length": {
+ "name": "Length",
+ "units": "Millimeters",
+ "value": 5300.000000000001,
+ "internalDefinitionName": "CURVE_ELEM_LENGTH"
+ },
+ "Volume": {
+ "name": "Volume",
+ "units": "Cubic meters",
+ "value": 2.2890000000000135,
+ "internalDefinitionName": "HOST_VOLUME_COMPUTED"
+ }
+ },
+ "Structural": {
+ "Structural": {
+ "name": "Structural",
+ "value": "Yes",
+ "internalDefinitionName": "WALL_STRUCTURAL_SIGNIFICANT"
+ },
+ "Structural Usage": {
+ "name": "Structural Usage",
+ "value": "Bearing",
+ "internalDefinitionName": "WALL_STRUCTURAL_USAGE_PARAM"
+ },
+ "Rebar Cover - Other Faces": {
+ "name": "Rebar Cover - Other Faces",
+ "value": "Rebar Cover Settings 内壁(フレーム、柱、および耐力壁)",
+ "internalDefinitionName": "CLEAR_COVER_OTHER"
+ },
+ "Rebar Cover - Exterior Face": {
+ "name": "Rebar Cover - Exterior Face",
+ "value": "Rebar Cover Settings 内壁(フレーム、柱、および耐力壁)",
+ "internalDefinitionName": "CLEAR_COVER_EXTERIOR"
+ },
+ "Rebar Cover - Interior Face": {
+ "name": "Rebar Cover - Interior Face",
+ "value": "Rebar Cover Settings 内壁(フレーム、柱、および耐力壁)",
+ "internalDefinitionName": "CLEAR_COVER_INTERIOR"
+ },
+ "構造スリット 下端": {
+ "name": "構造スリット 下端",
+ "value": "No",
+ "internalDefinitionName": "0560d1bb-007b-45e4-b8c3-87f9c6a3d73c"
+ },
+ "構造スリット 始端": {
+ "name": "構造スリット 始端",
+ "value": "No",
+ "internalDefinitionName": "60795a90-8c91-4e11-90a0-b77b819c2403"
+ },
+ "構造スリット 終端": {
+ "name": "構造スリット 終端",
+ "value": "No",
+ "internalDefinitionName": "e3223f14-6158-4d4f-8697-0de2bcc7f737"
+ }
+ },
+ "Constraints": {
+ "Top Offset": {
+ "name": "Top Offset",
+ "units": "Millimeters",
+ "value": -600,
+ "internalDefinitionName": "WALL_TOP_OFFSET"
+ },
+ "Base Offset": {
+ "name": "Base Offset",
+ "units": "Millimeters",
+ "value": -2000,
+ "internalDefinitionName": "WALL_BASE_OFFSET"
+ },
+ "Location Line": {
+ "name": "Location Line",
+ "value": "Core Centerline",
+ "internalDefinitionName": "WALL_KEY_REF_PARAM"
+ },
+ "Room Bounding": {
+ "name": "Room Bounding",
+ "value": "Yes",
+ "internalDefinitionName": "WALL_ATTR_ROOM_BOUNDING"
+ },
+ "Top Constraint": {
+ "name": "Top Constraint",
+ "value": "1FL",
+ "internalDefinitionName": "WALL_HEIGHT_TYPE"
+ },
+ "Base Constraint": {
+ "name": "Base Constraint",
+ "value": "1FL",
+ "internalDefinitionName": "WALL_BASE_CONSTRAINT"
+ },
+ "Related to Mass": {
+ "name": "Related to Mass",
+ "value": "No",
+ "internalDefinitionName": "RELATED_TO_MASS"
+ },
+ "Top is Attached": {
+ "name": "Top is Attached",
+ "value": "No",
+ "internalDefinitionName": "WALL_TOP_IS_ATTACHED"
+ },
+ "Base is Attached": {
+ "name": "Base is Attached",
+ "value": "No",
+ "internalDefinitionName": "WALL_BOTTOM_IS_ATTACHED"
+ },
+ "Unconnected Height": {
+ "name": "Unconnected Height",
+ "units": "Millimeters",
+ "value": 1400,
+ "internalDefinitionName": "WALL_USER_HEIGHT_PARAM"
+ },
+ "Top Extension Distance": {
+ "name": "Top Extension Distance",
+ "units": "Millimeters",
+ "value": 0,
+ "internalDefinitionName": "WALL_TOP_EXTENSION_DIST_PARAM"
+ },
+ "Base Extension Distance": {
+ "name": "Base Extension Distance",
+ "units": "Millimeters",
+ "value": 0,
+ "internalDefinitionName": "WALL_BOTTOM_EXTENSION_DIST_PARAM"
+ }
+ },
+ "Identity Data": {
+ "Has Association": {
+ "name": "Has Association",
+ "value": "Yes",
+ "internalDefinitionName": "ANALYTICAL_ELEMENT_HAS_ASSOCIATION"
+ },
+ "SPECKLE_Classification": {
+ "name": "SPECKLE_Classification",
+ "value": "Wall",
+ "internalDefinitionName": "SPECKLE_Classification"
+ }
+ },
+ "IFC Parameters": {
+ "IfcGUID": {
+ "name": "IfcGUID",
+ "value": "0oqavz9$zDZxycDyfZdYsW",
+ "internalDefinitionName": "IFC_GUID"
+ },
+ "Export to IFC": {
+ "name": "Export to IFC",
+ "value": "By Type",
+ "internalDefinitionName": "IFC_EXPORT_ELEMENT"
+ }
+ },
+ "Cross-Section Definition": {
+ "Cross-Section": {
+ "name": "Cross-Section",
+ "value": "Vertical",
+ "internalDefinitionName": "WALL_CROSS_SECTION"
+ }
+ }
+ }
+ },
+ "Material Quantities": {
+ "Fc24": {
+ "area": 7630000.000000016,
+ "units": "mm",
+ "volume": 2289000000.0000134,
+ "materialName": "Fc24",
+ "materialClass": "コンクリート",
+ "materialCategory": "コンクリート"
+ }
+ }
+ },
+ "worksetName": "ワークセット1",
+ "displayValue": [
+ {
+ "__closure": null,
+ "referencedId": "ec2040af4bd9c8619f9029a43df61a2e",
+ "speckle_type": "reference"
+ }
+ ],
+ "isStructural": true,
+ "speckle_type": "Objects.Data.DataObject:Objects.Data.RevitObject",
+ "applicationId": "32d24e7d-27ff-4d8f-bf26-37ca63da76cc-00445b6c",
+ "builtInCategory": "OST_Walls",
+ "totalChildrenCount": null
+ },
+ {
+ "id": "0ad4db1fe261a5b640ad9f315a46a6fc",
+ "data": [
+ 3,
+ 5,
+ 0,
+ 1,
+ 3,
+ 5,
+ 1,
+ 4,
+ 3,
+ 4,
+ 2,
+ 3,
+ 3,
+ 2,
+ 4,
+ 1,
+ 3,
+ 11,
+ 12,
+ 9,
+ 3,
+ 9,
+ 10,
+ 11,
+ 3,
+ 12,
+ 13,
+ 9,
+ 3,
+ 13,
+ 6,
+ 8,
+ 3,
+ 7,
+ 8,
+ 6,
+ 3,
+ 13,
+ 8,
+ 9,
+ 3,
+ 15,
+ 16,
+ 18,
+ 3,
+ 14,
+ 15,
+ 19,
+ 3,
+ 17,
+ 18,
+ 16,
+ 3,
+ 19,
+ 20,
+ 14,
+ 3,
+ 18,
+ 19,
+ 15,
+ 3,
+ 21,
+ 22,
+ 23,
+ 3,
+ 23,
+ 24,
+ 21,
+ 3,
+ 26,
+ 27,
+ 29,
+ 3,
+ 25,
+ 26,
+ 30,
+ 3,
+ 28,
+ 29,
+ 27,
+ 3,
+ 30,
+ 31,
+ 25,
+ 3,
+ 29,
+ 30,
+ 26,
+ 3,
+ 32,
+ 33,
+ 34,
+ 3,
+ 34,
+ 35,
+ 32
+ ],
+ "speckle_type": "Speckle.Core.Models.DataChunk",
+ "applicationId": null
+ },
+ {
+ "id": "0d5518a7a3e63fe345e198ad5d6acc4e",
+ "data": [
+ 22550.00031738281,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22550.00031738281,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15350.000262451173,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15350.000262451173,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22550.00031738281,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15350.000262451173,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22550.00031738281,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15350.000262451173,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22550.00031738281,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22550.00031738281,
+ 15049.999969482422,
+ -2000.000015258789
+ ],
+ "speckle_type": "Speckle.Core.Models.DataChunk",
+ "applicationId": null
+ },
+ {
+ "id": "ec2040af4bd9c8619f9029a43df61a2e",
+ "area": 0,
+ "bbox": null,
+ "faces": [
+ {
+ "__closure": null,
+ "referencedId": "0ad4db1fe261a5b640ad9f315a46a6fc",
+ "speckle_type": "reference"
+ }
+ ],
+ "units": "mm",
+ "colors": [],
+ "volume": 0,
+ "vertices": [
+ {
+ "__closure": null,
+ "referencedId": "0d5518a7a3e63fe345e198ad5d6acc4e",
+ "speckle_type": "reference"
+ }
+ ],
+ "__closure": {
+ "0ad4db1fe261a5b640ad9f315a46a6fc": 100,
+ "0d5518a7a3e63fe345e198ad5d6acc4e": 100
+ },
+ "speckle_type": "Objects.Geometry.Mesh",
+ "applicationId": "d2c33253-d0ed-4682-9633-e083daaa87db",
+ "textureCoordinates": []
+ }
+]
\ No newline at end of file
diff --git a/tests/conftest.py b/tests/conftest.py
index 3fbff20..4ba9f26 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,24 +1,132 @@
-import os
-
-from dotenv import load_dotenv
+import pytest
+from specklepy.objects.base import Base
-def pytest_configure(config):
- load_dotenv(dotenv_path=".env")
+@pytest.fixture
+def v2_wall():
+ """Creates a v2-style Speckle wall object."""
+ wall = Base()
+ wall.id = "cdb18060dc48281909e94f0f1d8d3cc0"
+ wall.type = "W30(Fc24)"
+ wall.units = "mm"
+ wall.family = "Basic Wall"
+ wall.height = 1400
+ wall.flipped = False
+ wall.category = "Walls"
+ wall.elementId = "4479852"
+ wall.worksetId = "0"
+ wall.structural = True
+ wall.baseOffset = -2000
+ wall.topOffset = -600
- token_var = "SPECKLE_TOKEN"
- server_var = "SPECKLE_SERVER_URL"
- token = os.getenv(token_var)
- server = os.getenv(server_var)
+ # Create base line geometry
+ wall.baseLine = Base()
+ wall.baseLine.start = Base()
+ wall.baseLine.start.x = 22400.000000000007
+ wall.baseLine.start.y = 15199.999999999998
+ wall.baseLine.start.z = -2000.0000000000002
+ wall.baseLine.end = Base()
+ wall.baseLine.end.x = 22400.000000000015
+ wall.baseLine.end.y = 20500
+ wall.baseLine.end.z = -2000.0000000000002
+ wall.baseLine.units = "mm"
+ wall.baseLine.length = 5300.000000000002
- if not token:
- raise ValueError(f"Cannot run tests without a {token_var} environment variable")
+ # Create parameters structure
+ wall.parameters = Base()
- if not server:
- raise ValueError(
- f"Cannot run tests without a {server_var} environment variable"
- )
+ # Standard parameter
+ wall.parameters["WALL_ATTR_WIDTH_PARAM"] = Base()
+ wall.parameters["WALL_ATTR_WIDTH_PARAM"].name = "Width"
+ wall.parameters["WALL_ATTR_WIDTH_PARAM"].value = 300
+ wall.parameters["WALL_ATTR_WIDTH_PARAM"].units = "mm"
- # Set the token as an attribute on the config object
- config.SPECKLE_TOKEN = token
- config.SPECKLE_SERVER_URL = server
+ # Parameter with GUID key
+ wall.parameters["ee1f33e1-5506-4a64-b87b-7b98d30aea52"] = Base()
+ wall.parameters["ee1f33e1-5506-4a64-b87b-7b98d30aea52"].name = "符号"
+ wall.parameters["ee1f33e1-5506-4a64-b87b-7b98d30aea52"].value = "W30"
+ wall.parameters["ee1f33e1-5506-4a64-b87b-7b98d30aea52"].isShared = True
+ wall.parameters[
+ "ee1f33e1-5506-4a64-b87b-7b98d30aea52"
+ ].internalDefinitionName = "ee1f33e1-5506-4a64-b87b-7b98d30aea52"
+
+ wall.parameters["STRUCTURAL_MATERIAL_PARAM"] = Base()
+ wall.parameters["STRUCTURAL_MATERIAL_PARAM"].name = "Structural Material"
+ wall.parameters["STRUCTURAL_MATERIAL_PARAM"].value = "Fc24"
+
+ # Create basic level reference
+ wall.level = Base()
+ wall.level.name = "1FL"
+ wall.level.elevation = 0
+ wall.level.units = "mm"
+
+ return wall
+
+
+@pytest.fixture
+def v3_wall():
+ """Creates a v3-style Speckle wall object."""
+ wall = Base()
+ wall.id = "46f06fef727d64a0bbcbd7ced51e0cd2"
+ wall.name = "Walls - W30(Fc24)"
+ wall.type = "W30(Fc24)"
+ wall.units = "mm"
+ wall.family = "Basic Wall"
+ wall.flipped = False
+ wall.category = "Walls"
+ wall.elementId = "4479852"
+ wall.worksetId = "0"
+
+ # Create location geometry
+ wall.location = Base()
+ wall.location.start = Base()
+ wall.location.start.x = 22400.000000000007
+ wall.location.start.y = 15199.999999999998
+ wall.location.start.z = 0
+ wall.location.end = Base()
+ wall.location.end.x = 22400.000000000015
+ wall.location.end.y = 20500
+ wall.location.end.z = 0
+ wall.location.units = "mm"
+ wall.location.length = 5300.000000000002
+
+ # Create nested properties structure
+ wall.properties = Base()
+ wall.properties.Parameters = Base()
+
+ # Type Parameters
+ wall.properties.Parameters["Type Parameters"] = Base()
+
+ # Add Text section with GUID parameter
+ wall.properties.Parameters["Type Parameters"].Text = Base()
+ wall.properties.Parameters["Type Parameters"].Text["符号"] = {
+ "name": "符号",
+ "value": "W30",
+ "internalDefinitionName": "ee1f33e1-5506-4a64-b87b-7b98d30aea52",
+ }
+
+ wall.properties.Parameters["Type Parameters"].Structure = Base()
+ wall.properties.Parameters["Type Parameters"].Structure["Fc24 (0)"] = {
+ "units": "mm",
+ "function": "Structure",
+ "material": "Fc24",
+ "thickness": 300,
+ }
+
+ # Instance Parameters
+ wall.properties.Parameters["Instance Parameters"] = Base()
+ wall.properties.Parameters["Instance Parameters"].Structural = Base()
+ wall.properties.Parameters["Instance Parameters"].Structural.Structural = {"name": "Structural", "value": "Yes"}
+
+ # Create basic level references
+ wall.level = Base()
+ wall.level.name = "1FL"
+ wall.level.elevation = 0
+ wall.level.units = "mm"
+
+ wall.topLevel = Base()
+ wall.topLevel.name = "1FL"
+ wall.topLevel.elevation = 0
+ wall.topLevel.units = "mm"
+
+ return wall
diff --git a/tests/localtest.py b/tests/localtest.py
deleted file mode 100644
index e1fbeca..0000000
--- a/tests/localtest.py
+++ /dev/null
@@ -1,32 +0,0 @@
-"""Run integration tests with a speckle server."""
-
-from speckle_automate import (
- AutomationContext,
- AutomationRunData,
- AutomationStatus,
- run_function
-)
-
-from src.inputs import FunctionInputs
-from src.function import automate_function
-
-
-def test_function_run(test_automation_run_data: AutomationRunData, test_automation_token: str):
- """Run an integration test for the automate function."""
- automation_context = AutomationContext.initialize(
- test_automation_run_data, test_automation_token
- )
- default_url: str = (
- "https://docs.google.com/spreadsheets/d/e/2PACX-1vSFmjLfqxPKXJHg-wEs1cp_nJEJJhESGVTLCvWLG_"
- "IgIuRZ4CmMDCSceOYFvuo8IqcmT4sj9qPiLfCx/pub?gid=0&single=true&output=tsv"
- )
-
- automate_sdk = run_function(
- automation_context,
- automate_function,
- FunctionInputs(spreadsheet_url=default_url),
- )
-
- assert automate_sdk.run_status == AutomationStatus.SUCCEEDED
-
-# cli command to run just this test with pytest: pytest tests/local_test_exercise2.py::test_function_run
diff --git a/tests/test_function.py b/tests/test_function.py
index dbc33b1..73ae814 100644
--- a/tests/test_function.py
+++ b/tests/test_function.py
@@ -1,31 +1,41 @@
"""Run integration tests with a speckle server."""
-from pydantic import SecretStr
-
from speckle_automate import (
AutomationContext,
AutomationRunData,
AutomationStatus,
- run_function
+ run_function,
)
+from speckle_automate.fixtures import * # noqa: F401, F403
-from main import FunctionInputs, automate_function
-
-from speckle_automate.fixtures import *
+from src.function import automate_function
+from src.helpers import speckle_print
+from src.inputs import FunctionInputs
def test_function_run(test_automation_run_data: AutomationRunData, test_automation_token: str):
+ """Run an integration test for the automate function.
+
+ Args:
+ test_automation_run_data (AutomationRunData): The automation run data provided by sdk.
+ test_automation_token (str): The automation token.
+
+ """
+ speckle_print(str(test_automation_run_data))
+ speckle_print(str(test_automation_token))
+
"""Run an integration test for the automate function."""
automation_context = AutomationContext.initialize(
test_automation_run_data, test_automation_token
)
+ default_url: str = (
+ "https://drive.google.com/uc?export=download&id=1hiPSw23eOaqd27QD_YsXvZg9PWm7_XBx"
+ )
+
automate_sdk = run_function(
automation_context,
automate_function,
- FunctionInputs(
- forbidden_speckle_type="None",
- whisper_message=SecretStr("testing automatically"),
- ),
+ FunctionInputs(spreadsheet_url=default_url),
)
assert automate_sdk.run_status == AutomationStatus.SUCCEEDED
diff --git a/tests/test_parameters.py b/tests/test_parameters.py
new file mode 100644
index 0000000..15f4f88
--- /dev/null
+++ b/tests/test_parameters.py
@@ -0,0 +1,404 @@
+import os
+from typing import Any
+
+import pytest
+from dotenv import load_dotenv
+from speckle_automate import AutomationContext, AutomationRunData # noqa: F401, F403
+
+# from speckle_automate.fixtures import * # noqa: F401, F403
+from specklepy.api.client import SpeckleClient
+from specklepy.core.api import operations
+from specklepy.objects.base import Base
+from specklepy.transports.server import ServerTransport
+
+from helpers import speckle_print
+from src.rules import PropertyRules
+
+
+def load_test_objects(v2_wall: Any, v3_wall: Any) -> tuple[Base, Base]:
+ """Load test objects from a Speckle server."""
+ client = SpeckleClient(host="https://app.speckle.systems", use_ssl=True)
+
+ load_dotenv(dotenv_path="../.env")
+
+ client.authenticate_with_token(os.getenv("SPECKLE_TOKEN"))
+
+ transport = ServerTransport(client=client, stream_id=os.getenv("SPECKLE_PROJECT_ID"))
+
+ speckle_print(v2_wall)
+ v2_obj = operations.receive("cdb18060dc48281909e94f0f1d8d3cc0", transport)
+ v3_obj = operations.receive("46f06fef727d64a0bbcbd7ced51e0cd2", transport)
+
+ # return v2_wall, v3_wall
+ return v2_obj, v3_obj
+
+
+@pytest.fixture
+def test_objects(v2_wall: Any, v3_wall: Any) -> tuple[Base, Base]:
+ """Pytest fixture to provide test objects."""
+ return load_test_objects(v2_wall, v3_wall)
+
+
+def test_deserialization_structure(test_objects):
+ """Test that objects are properly deserialized with correct structure."""
+ v2_obj, v3_obj = test_objects
+
+ # Check base class type
+ for obj in [v2_obj, v3_obj]:
+ assert isinstance(obj, Base), f"Expected {obj} to be an instance of Base"
+
+ # Check v2 structure
+ assert hasattr(v2_obj, "parameters"), "v2_obj should have 'parameters' attribute"
+ assert v2_obj["parameters"] is not None, "v2_obj['parameters'] should not be None"
+
+ # Check v3 structure
+ assert hasattr(v3_obj, "properties"), "v3_obj should have 'properties' attribute"
+ assert v3_obj["properties"] is not None, "v3_obj['properties'] should not be None"
+ assert "Parameters" in v3_obj["properties"], "'Parameters' key should exist in v3_obj['properties']"
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_result",
+ [
+ ("category", True), # Test parameters that should exist
+ ("WALL_ATTR_WIDTH_PARAM", True), # Test nested parameters
+ ("WALL_ATTR_WIDTH_PARAM.value", True),
+ ("WALL_ATTR_WIDTH_PARAM.id", True),
+ ("WALL_ATTR_WIDTH_PARAM.units", True),
+ ("non_existent_param", False), # Test non-existent parameters
+ ],
+)
+def test_v2_parameter_exists(test_objects, param_name, expected_result):
+ """Test parameter existence checking in v2 objects."""
+ v2_obj, _ = test_objects
+ assert PropertyRules.has_parameter(v2_obj, param_name) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name",
+ [
+ "WALL_ATTR_WIDTH_PARAM.id",
+ "WALL_ATTR_WIDTH_PARAM.value",
+ "WALL_ATTR_WIDTH_PARAM",
+ "WALL_ATTR_WIDTH_PARAM.units",
+ ],
+)
+def test_v2_parameter_value_retrieval(test_objects, param_name):
+ """Test parameter value retrieval in v2 objects."""
+ v2_obj, _ = test_objects
+ assert PropertyRules.get_parameter_value(v2_obj, param_name)
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_result",
+ [
+ ("category", True), # Test parameters that should exist
+ ("Width", True), # Test nested parameters
+ ("non_existent_param", False), # Test non-existent parameters
+ ],
+)
+def test_v3_parameter_exists(test_objects, param_name, expected_result):
+ """Test parameter existence checking in v3 objects."""
+ _, v3_obj = test_objects
+ assert PropertyRules.has_parameter(v3_obj, param_name) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name_1, param_name_2",
+ [
+ (
+ "properties.Parameters.Instance Parameters.Dimensions.Length.value",
+ "Instance Parameters.Dimensions.Length",
+ ),
+ ],
+)
+def test_v3_parameter_search_equivalence(test_objects, param_name_1, param_name_2):
+ """Test parameter existence checking equivalence in v3 objects."""
+ _, v3_obj = test_objects
+ assert PropertyRules.get_parameter_value(v3_obj, param_name_1) == PropertyRules.get_parameter_value(
+ v3_obj, param_name_2
+ )
+
+
+@pytest.mark.parametrize(
+ "obj_version, param_name, expected_value, default_value",
+ [
+ # Test direct parameters
+ ("v2", "category", "Walls", None),
+ ("v3", "category", "Walls", None),
+ # Test nested parameters - using both internal and friendly names
+ ("v2", "WALL_ATTR_WIDTH_PARAM", 300, None),
+ ("v3", "Construction.Width", 300, None),
+ # Test parameters with units
+ ("v2", "CURVE_ELEM_LENGTH", 5300.000000000001, None),
+ ("v3", "Instance Parameters.Dimensions.Length", 5300.000000000001, None),
+ # Test non-existent parameters with a default value
+ ("v2", "parameters.non_existent", "default", "default"),
+ ("v3", "properties.Parameters.non_existent", "default", "default"),
+ ],
+)
+def test_parameter_value_retrieval(test_objects, obj_version, param_name, expected_value, default_value):
+ """Test parameter value retrieval from both v2 and v3 objects."""
+ v2_obj, v3_obj = test_objects
+ obj = v2_obj if obj_version == "v2" else v3_obj
+ result = PropertyRules.get_parameter_value(obj, param_name, default_value=default_value)
+ assert result == expected_value
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_value, expected_result",
+ [
+ ("category", "Walls", True), # Test exact match
+ ("WALL_ATTR_WIDTH_PARAM", 300, True), # Test numeric match
+ ("category", "Windows", False), # Test non-match
+ ],
+)
+def test_v2_parameter_value_matching(test_objects, param_name, expected_value, expected_result):
+ """Test parameter value matching in v2 objects."""
+ v2_obj, _ = test_objects
+ assert PropertyRules.is_parameter_value(v2_obj, param_name, expected_value) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_value, expected_result",
+ [
+ ("category", "Walls", True), # Test exact match
+ ("Width", 300, True), # Test numeric match
+ ("category", "Windows", False), # Test non-match
+ ],
+)
+def test_v3_parameter_value_matching(test_objects, param_name, expected_value, expected_result):
+ """Test parameter value matching in v3 objects."""
+ _, v3_obj = test_objects
+ assert PropertyRules.is_parameter_value(v3_obj, param_name, expected_value) == expected_result
+
+
+@pytest.mark.parametrize(
+ "comparison_func, param_name, value, expected_result",
+ [
+ (PropertyRules.is_parameter_value_greater_than, "WALL_ATTR_WIDTH_PARAM", "200", True), # Test greater than
+ (PropertyRules.is_parameter_value_less_than, "WALL_ATTR_WIDTH_PARAM", "400", True), # Test less than
+ (PropertyRules.is_parameter_value_in_range, "WALL_ATTR_WIDTH_PARAM", "200,400", True), # Test in range
+ ],
+)
+def test_v2_parameter_numeric_comparisons(test_objects, comparison_func, param_name, value, expected_result):
+ """Test numeric parameter comparisons in v2 objects."""
+ v2_obj, _ = test_objects
+ assert comparison_func(v2_obj, param_name, value) == expected_result
+
+
+@pytest.mark.parametrize(
+ "comparison_func, param_name, value, expected_result",
+ [
+ (PropertyRules.is_parameter_value_greater_than, "Width", "200", True), # Test greater than
+ (PropertyRules.is_parameter_value_less_than, "Width", "400", True), # Test less than
+ (PropertyRules.is_parameter_value_in_range, "Width", "200,400", True), # Test in range
+ ],
+)
+def test_v3_parameter_numeric_comparisons(test_objects, comparison_func, param_name, value, expected_result):
+ """Test numeric parameter comparisons in v3 objects."""
+ _, v3_obj = test_objects
+ assert comparison_func(v3_obj, param_name, value) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name, pattern, fuzzy, expected_result",
+ [
+ ("category", "^Walls$", False, True), # Test exact pattern matches
+ ("category", "Walls", True, True), # Test fuzzy matches
+ ("category", "Wall", False, True), # Test partial pattern matches
+ ("category", "^Windows$", False, False), # Test non-matches
+ ],
+)
+def test_v2_parameter_value_like(test_objects, param_name, pattern, fuzzy, expected_result):
+ """Test pattern matching on parameter values in v2 objects."""
+ v2_obj, _ = test_objects
+ assert PropertyRules.is_parameter_value_like(v2_obj, param_name, pattern, fuzzy=fuzzy) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name, pattern, fuzzy, expected_result",
+ [
+ ("category", "^Walls$", False, True), # Test exact pattern matches
+ ("category", "Walls", True, True), # Test fuzzy matches
+ ("category", "Wall", False, True), # Test partial pattern matches
+ ("category", "^Windows$", False, False), # Test non-matches
+ ],
+)
+def test_v3_parameter_value_like(test_objects, param_name, pattern, fuzzy, expected_result):
+ """Test pattern matching on parameter values in v3 objects."""
+ _, v3_obj = test_objects
+ assert PropertyRules.is_parameter_value_like(v3_obj, param_name, pattern, fuzzy=fuzzy) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name, valid_list, expected_result",
+ [
+ ("category", ["Walls", "Windows", "Doors"], True), # Test value in list
+ ("category", "Walls,Windows,Doors", True), # Test comma-separated string list
+ ("category", ["Windows", "Doors"], False), # Test value not in list
+ ],
+)
+def test_v2_parameter_lists(test_objects, param_name, valid_list, expected_result):
+ """Test list-based parameter checks in v2 objects."""
+ v2_obj, _ = test_objects
+ assert PropertyRules.is_parameter_value_in_list(v2_obj, param_name, valid_list) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name, valid_list, expected_result",
+ [
+ ("category", ["Walls", "Windows", "Doors"], True), # Test value in list
+ ("category", "Walls,Windows,Doors", True), # Test comma-separated string list
+ ("category", ["Windows", "Doors"], False), # Test value not in list
+ ],
+)
+def test_v3_parameter_lists(test_objects, param_name, valid_list, expected_result):
+ """Test list-based parameter checks in v3 objects."""
+ _, v3_obj = test_objects
+ assert PropertyRules.is_parameter_value_in_list(v3_obj, param_name, valid_list) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_result",
+ [
+ ("WALL_ATTR_ROOM_BOUNDING.value", True), # Test true values
+ ("wall_top_is_attached", False), # Test false values
+ ],
+)
+def test_v2_boolean_parameters(test_objects, param_name, expected_result):
+ """Test boolean parameter checks in v2 objects."""
+ v2_obj, _ = test_objects
+ if expected_result:
+ assert PropertyRules.is_parameter_value_true(v2_obj, param_name)
+ else:
+ assert PropertyRules.is_parameter_value_false(v2_obj, param_name)
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_result",
+ [
+ ("Room Bounding", True), # Test true values
+ ("top is attached", False), # Test false values
+ ("Top is Attached", False), # Case sensitivity test
+ ],
+)
+def test_v3_boolean_parameters(test_objects, param_name, expected_result):
+ """Test boolean parameter checks in v3 objects."""
+ _, v3_obj = test_objects
+ if expected_result:
+ assert PropertyRules.is_parameter_value_true(v3_obj, param_name)
+ else:
+ assert PropertyRules.is_parameter_value_false(v3_obj, param_name)
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_value, expected_result",
+ [
+ # Test numeric value comparisons
+ ("WALL_ATTR_WIDTH_PARAM", 300, True),
+ ("WALL_ATTR_WIDTH_PARAM.value", 300, True),
+ ("baseLine.length", 5300.000000000002, True),
+ # Test string value comparisons
+ ("STRUCTURAL_MATERIAL_PARAM.value", "Fc24", True),
+ ("ee1f33e1-5506-4a64-b87b-7b98d30aea52.value", "W30", True),
+ # Test non-matches
+ ("WALL_ATTR_WIDTH_PARAM", 301, False),
+ ("nonexistent_param", "any_value", False),
+ ],
+)
+def test_v2_parameter_value_comparisons(v2_wall, param_name, expected_value, expected_result):
+ """Test value comparisons using v2 wall parameters."""
+ assert PropertyRules.is_equal_value(v2_wall, param_name, expected_value) == expected_result
+
+
+@pytest.mark.parametrize(
+ "attribute, value, expected",
+ [
+ # Test numeric value comparisons
+ ("Type Parameters.Structure.Fc24 (0).thickness", 300, True),
+ ("location.length", 5300.000000000002, True),
+ ("location.length", 5300, True),
+ # Test string value comparisons
+ ("Type Parameters.Text.符号.value", "W30", True),
+ ("Instance Parameters.Structural.Structural.value", "Yes", True),
+ # Test non-matches
+ ("Type Parameters.Structure.Fc24 (0).thickness", 301, False),
+ ("nonexistent_param", "any_value", False),
+ ],
+)
+def test_v3_parameter_value_comparisons(v3_wall, attribute, value, expected):
+ """Test value comparisons using v3 wall parameters."""
+ assert PropertyRules.is_equal_value(v3_wall, attribute, value) == expected
+
+
+@pytest.mark.parametrize(
+ "wall, attribute, value, expected",
+ [
+ # V2 wall tests
+ ("v2_wall", "WALL_ATTR_WIDTH_PARAM.value", 300, True),
+ ("v2_wall", "type", "W30(Fc24)", True),
+ ("v2_wall", "WALL_ATTR_WIDTH_PARAM.value", 300.0001, False),
+ # V3 wall tests
+ ("v3_wall", "Type Parameters.Structure.Fc24 (0).thickness", 300, True),
+ ("v3_wall", "type", "W30(Fc24)", True),
+ ("v3_wall", "Type Parameters.Structure.Fc24 (0).thickness", 300.0001, False),
+ ("v3_wall", "location.length", 5300.000000000002, True),
+ ("v3_wall", "location.length", 5300, False),
+ ],
+)
+def test_identical_comparisons(request, wall, attribute, value, expected):
+ """Test identical value comparisons on both wall versions."""
+ wall_instance = request.getfixturevalue(wall)
+ assert PropertyRules.is_identical_value(wall_instance, attribute, value) == expected
+
+
+@pytest.mark.parametrize(
+ "wall, attribute, value",
+ [
+ # V2 wall tests
+ ("v2_wall", "WALL_ATTR_WIDTH_PARAM.value", 301),
+ ("v2_wall", "STRUCTURAL_MATERIAL_PARAM.value", "Fc25"),
+ ("v2_wall", "nonexistent_param", "any_value"),
+ # V3 wall tests
+ ("v3_wall", "Type Parameters.Structure.Fc24 (0).thickness", 301),
+ ("v3_wall", "Type Parameters.Text.符号.value", "W31"),
+ ("v3_wall", "nonexistent_param", "any_value"),
+ ],
+)
+def test_not_equal_comparisons(request, wall, attribute, value):
+ """Test not equal comparisons on both wall versions."""
+ wall_instance = request.getfixturevalue(wall)
+ assert PropertyRules.is_not_equal_value(wall_instance, attribute, value)
+
+
+@pytest.mark.parametrize(
+ "attribute, value, expected_equal, expected_identical",
+ [
+ # Test Yes/No conversion in equals (should convert)
+ ("Instance Parameters.Structural.Structural.value", True, True, False), # Yes vs True
+ ("Instance Parameters.Structural.Structural.value", "Yes", True, True), # Yes vs "Yes"
+ ("Instance Parameters.Structural.Structural.value", "yes", True, False), # Yes vs "yes"
+ ],
+)
+def test_boolean_conversions(v3_wall, attribute, value, expected_equal, expected_identical):
+ """Test conversion of Yes/No strings to boolean values."""
+ assert PropertyRules.is_equal_value(v3_wall, attribute, value) == expected_equal
+ assert PropertyRules.is_identical_value(v3_wall, attribute, value) == expected_identical
+
+
+@pytest.mark.parametrize(
+ "wall, attribute, expected_value",
+ [
+ # V2 wall tests
+ ("v2_wall", "WALL_ATTR_WIDTH_PARAM.value", "300"),
+ ("v2_wall", "baseLine.length", "5300.000000000002"),
+ # V3 wall tests
+ ("v3_wall", "Type Parameters.Structure.Fc24 (0).thickness", "300"),
+ ("v3_wall", "location.length", "5300.000000000002"),
+ ],
+)
+def test_numeric_string_handling(wall, attribute, expected_value, request):
+ """Test handling of numeric strings in both wall versions."""
+ wall_instance = request.getfixturevalue(wall) # Retrieve fixture dynamically
+ assert PropertyRules.is_equal_value(wall_instance, attribute, expected_value)
diff --git a/tests/test_user_entry.py b/tests/test_user_entry.py
new file mode 100644
index 0000000..ca91c3d
--- /dev/null
+++ b/tests/test_user_entry.py
@@ -0,0 +1,33 @@
+import pandas as pd
+import pytest
+
+from src.rule_processor import SeverityLevel, get_severity
+
+
+@pytest.mark.parametrize(
+ "input_severity, expected_enum",
+ [
+ ("INFO", SeverityLevel.INFO),
+ ("info", SeverityLevel.INFO),
+ ("Info", SeverityLevel.INFO),
+ ("WARNING", SeverityLevel.WARNING),
+ ("warning", SeverityLevel.WARNING),
+ ("Warning", SeverityLevel.WARNING),
+ ("ERROR", SeverityLevel.ERROR),
+ ("error", SeverityLevel.ERROR),
+ ("Error", SeverityLevel.ERROR),
+ ("WARN", SeverityLevel.WARNING), # Invalid → Defaults to ERROR
+ ("warn", SeverityLevel.WARNING), # Invalid → Defaults to ERROR
+ ("Critical", SeverityLevel.ERROR), # Invalid → Defaults to ERROR
+ ("Severe", SeverityLevel.ERROR), # Invalid → Defaults to ERROR
+ ("", SeverityLevel.ERROR), # Empty string → Defaults to ERROR
+ (None, SeverityLevel.ERROR), # None → Defaults to ERROR
+ (1.0, SeverityLevel.ERROR), # None → Defaults to ERROR
+ ],
+)
+def test_severity_conversion(input_severity, expected_enum):
+ """Test various user inputs for severity and check expected outputs."""
+ rule_info = pd.Series({"Report Severity": input_severity})
+ severity = get_severity(rule_info)
+
+ assert severity == expected_enum, f"Failed for input: {input_severity}"
diff --git a/uv.lock b/uv.lock
new file mode 100644
index 0000000..4f978b9
--- /dev/null
+++ b/uv.lock
@@ -0,0 +1,977 @@
+version = 1
+requires-python = ">=3.12"
+
+[[package]]
+name = "annotated-types"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
+]
+
+[[package]]
+name = "anyio"
+version = "4.8.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "idna" },
+ { name = "sniffio" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 },
+]
+
+[[package]]
+name = "appdirs"
+version = "1.4.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 },
+]
+
+[[package]]
+name = "attrs"
+version = "23.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e3/fc/f800d51204003fa8ae392c4e8278f256206e7a919b708eef054f5f4b650d/attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", size = 780820 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1", size = 60752 },
+]
+
+[[package]]
+name = "backoff"
+version = "2.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148 },
+]
+
+[[package]]
+name = "black"
+version = "25.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+ { name = "mypy-extensions" },
+ { name = "packaging" },
+ { name = "pathspec" },
+ { name = "platformdirs" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988 },
+ { url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985 },
+ { url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816 },
+ { url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860 },
+ { url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673 },
+ { url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190 },
+ { url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926 },
+ { url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613 },
+ { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646 },
+]
+
+[[package]]
+name = "certifi"
+version = "2025.1.31"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 },
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 },
+ { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 },
+ { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 },
+ { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 },
+ { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 },
+ { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 },
+ { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 },
+ { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 },
+ { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 },
+ { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 },
+ { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 },
+ { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 },
+ { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 },
+ { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 },
+ { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 },
+ { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 },
+ { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 },
+ { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 },
+ { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 },
+ { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 },
+ { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 },
+ { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 },
+ { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 },
+ { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 },
+ { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 },
+ { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 },
+ { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 },
+]
+
+[[package]]
+name = "click"
+version = "8.1.8"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
+]
+
+[[package]]
+name = "deprecated"
+version = "1.2.18"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "wrapt" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 },
+]
+
+[[package]]
+name = "gql"
+version = "3.5.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+ { name = "backoff" },
+ { name = "graphql-core" },
+ { name = "yarl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/3d/85/feda24b33adcc6c8463a62a8e2ca2cc3425dc6d687388ff728ceae231204/gql-3.5.0.tar.gz", hash = "sha256:ccb9c5db543682b28f577069950488218ed65d4ac70bb03b6929aaadaf636de9", size = 179939 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/74/fb/01a200e1c31b79690427c8e983014e4220d2652b4372a46fe4598e1d7a8e/gql-3.5.0-py2.py3-none-any.whl", hash = "sha256:70dda5694a5b194a8441f077aa5fb70cc94e4ec08016117523f013680901ecb7", size = 74001 },
+]
+
+[package.optional-dependencies]
+requests = [
+ { name = "requests" },
+ { name = "requests-toolbelt" },
+]
+websockets = [
+ { name = "websockets" },
+]
+
+[[package]]
+name = "graphql-core"
+version = "3.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c4/16/7574029da84834349b60ed71614d66ca3afe46e9bf9c7b9562102acb7d4f/graphql_core-3.2.6.tar.gz", hash = "sha256:c08eec22f9e40f0bd61d805907e3b3b1b9a320bc606e23dc145eebca07c8fbab", size = 505353 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ae/4f/7297663840621022bc73c22d7d9d80dbc78b4db6297f764b545cd5dd462d/graphql_core-3.2.6-py3-none-any.whl", hash = "sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f", size = 203416 },
+]
+
+[[package]]
+name = "h11"
+version = "0.14.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
+]
+
+[[package]]
+name = "httpcore"
+version = "1.0.7"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "h11" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 },
+]
+
+[[package]]
+name = "httpx"
+version = "0.25.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+ { name = "certifi" },
+ { name = "httpcore" },
+ { name = "idna" },
+ { name = "sniffio" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8c/23/911d93a022979d3ea295f659fbe7edb07b3f4561a477e83b3a6d0e0c914e/httpx-0.25.2.tar.gz", hash = "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8", size = 123889 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a2/65/6940eeb21dcb2953778a6895281c179efd9100463ff08cb6232bb6480da7/httpx-0.25.2-py3-none-any.whl", hash = "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118", size = 74980 },
+]
+
+[[package]]
+name = "idna"
+version = "3.10"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 },
+]
+
+[[package]]
+name = "levenshtein"
+version = "0.26.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "rapidfuzz" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/97/e6/79807d3b59a67dd78bb77072ca6a28d8db0935161fecf935e6c38c5f6825/levenshtein-0.26.1.tar.gz", hash = "sha256:0d19ba22330d50609b2349021ec3cf7d905c6fe21195a2d0d876a146e7ed2575", size = 374307 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4c/53/3685ee7fbe9b8eb4b82d8045255e59dd6943f94e8091697ef3808e7ecf63/levenshtein-0.26.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc741ca406d3704dc331a69c04b061fc952509a069b79cab8287413f434684bd", size = 176447 },
+ { url = "https://files.pythonhosted.org/packages/82/7f/7d6fe9b76bd030200f8f9b162f3de862d597804d292af292ec3ce9ae8bee/levenshtein-0.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:821ace3b4e1c2e02b43cf5dc61aac2ea43bdb39837ac890919c225a2c3f2fea4", size = 157589 },
+ { url = "https://files.pythonhosted.org/packages/bc/d3/44539e952df93c5d88a95a0edff34af38e4f87330a76e8335bfe2c0f31bf/levenshtein-0.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92694c9396f55d4c91087efacf81297bef152893806fc54c289fc0254b45384", size = 153306 },
+ { url = "https://files.pythonhosted.org/packages/ba/fe/21443c0c50824314e2d2ce7e1e9cd11d21b3643f3c14da156b15b4d399c7/levenshtein-0.26.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51ba374de7a1797d04a14a4f0ad3602d2d71fef4206bb20a6baaa6b6a502da58", size = 184409 },
+ { url = "https://files.pythonhosted.org/packages/f0/7b/c95066c64bb18628cf7488e0dd6aec2b7cbda307d93ba9ede68a21af2a7b/levenshtein-0.26.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7aa5c3327dda4ef952769bacec09c09ff5bf426e07fdc94478c37955681885b", size = 193134 },
+ { url = "https://files.pythonhosted.org/packages/36/22/5f9760b135bdefb8cf8d663890756136754db03214f929b73185dfa33f05/levenshtein-0.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e2517e8d3c221de2d1183f400aed64211fcfc77077b291ed9f3bb64f141cdc", size = 162266 },
+ { url = "https://files.pythonhosted.org/packages/11/50/6b1a5f3600caae40db0928f6775d7efc62c13dec2407d3d540bc4afdb72c/levenshtein-0.26.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9092b622765c7649dd1d8af0f43354723dd6f4e570ac079ffd90b41033957438", size = 246339 },
+ { url = "https://files.pythonhosted.org/packages/26/eb/ede282fcb495570898b39a0d2f21bbc9be5587d604c93a518ece80f3e7dc/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc16796c85d7d8b259881d59cc8b5e22e940901928c2ff6924b2c967924e8a0b", size = 1077937 },
+ { url = "https://files.pythonhosted.org/packages/35/41/eebe1c4a75f592d9bdc3c2595418f083bcad747e0aec52a1a9ffaae93f5c/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4370733967f5994ceeed8dc211089bedd45832ee688cecea17bfd35a9eb22b9", size = 1330607 },
+ { url = "https://files.pythonhosted.org/packages/12/8e/4d34b1857adfd69c2a72d84bca1b8538d4cfaaf6fddd8599573f4281a9d1/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3535ecfd88c9b283976b5bc61265855f59bba361881e92ed2b5367b6990c93fe", size = 1197505 },
+ { url = "https://files.pythonhosted.org/packages/c0/7b/6afcda1b0a0622cedaa4f7a5b3507c2384a7358fc051ccf619e5d2453bf2/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:90236e93d98bdfd708883a6767826fafd976dac8af8fc4a0fb423d4fa08e1bf0", size = 1352832 },
+ { url = "https://files.pythonhosted.org/packages/21/5e/0ed4e7b5c820b6bc40e2c391633292c3666400339042a3d306f0dc8fdcb4/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:04b7cabb82edf566b1579b3ed60aac0eec116655af75a3c551fee8754ffce2ea", size = 1135970 },
+ { url = "https://files.pythonhosted.org/packages/c9/91/3ff1abacb58642749dfd130ad855370e01b9c7aeaa73801964361f6e355f/levenshtein-0.26.1-cp312-cp312-win32.whl", hash = "sha256:ae382af8c76f6d2a040c0d9ca978baf461702ceb3f79a0a3f6da8d596a484c5b", size = 87599 },
+ { url = "https://files.pythonhosted.org/packages/7d/f9/727f3ba7843a3fb2a0f3db825358beea2a52bc96258874ee80cb2e5ecabb/levenshtein-0.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:fd091209798cfdce53746f5769987b4108fe941c54fb2e058c016ffc47872918", size = 98809 },
+ { url = "https://files.pythonhosted.org/packages/d4/f4/f87f19222d279dbac429b9bc7ccae271d900fd9c48a581b8bc180ba6cd09/levenshtein-0.26.1-cp312-cp312-win_arm64.whl", hash = "sha256:7e82f2ea44a81ad6b30d92a110e04cd3c8c7c6034b629aca30a3067fa174ae89", size = 88227 },
+ { url = "https://files.pythonhosted.org/packages/7e/d6/b4b522b94d7b387c023d22944590befc0ac6b766ac6d197afd879ddd77fc/levenshtein-0.26.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:790374a9f5d2cbdb30ee780403a62e59bef51453ac020668c1564d1e43438f0e", size = 175836 },
+ { url = "https://files.pythonhosted.org/packages/25/76/06d1e26a8e6d0de68ef4a157dd57f6b342413c03550309e4aa095a453b28/levenshtein-0.26.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7b05c0415c386d00efda83d48db9db68edd02878d6dbc6df01194f12062be1bb", size = 157036 },
+ { url = "https://files.pythonhosted.org/packages/7e/23/21209a9e96b878aede3bea104533866762ba621e36fc344aa080db5feb02/levenshtein-0.26.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3114586032361722ddededf28401ce5baf1cf617f9f49fb86b8766a45a423ff", size = 153326 },
+ { url = "https://files.pythonhosted.org/packages/06/38/9fc68685fffd8863b13864552eba8f3eb6a82a4dc558bf2c6553c2347d6c/levenshtein-0.26.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2532f8a13b68bf09f152d906f118a88da2063da22f44c90e904b142b0a53d534", size = 183693 },
+ { url = "https://files.pythonhosted.org/packages/f6/82/ccd7bdd7d431329da025e649c63b731df44f8cf31b957e269ae1c1dc9a8e/levenshtein-0.26.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:219c30be6aa734bf927188d1208b7d78d202a3eb017b1c5f01ab2034d2d4ccca", size = 190581 },
+ { url = "https://files.pythonhosted.org/packages/6e/c5/57f90b4aea1f89f853872b27a5a5dbce37b89ffeae42c02060b3e82038b2/levenshtein-0.26.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397e245e77f87836308bd56305bba630010cd8298c34c4c44bd94990cdb3b7b1", size = 162446 },
+ { url = "https://files.pythonhosted.org/packages/fc/da/df6acca738921f896ce2d178821be866b43a583f85e2d1de63a4f8f78080/levenshtein-0.26.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeff6ea3576f72e26901544c6c55c72a7b79b9983b6f913cba0e9edbf2f87a97", size = 247123 },
+ { url = "https://files.pythonhosted.org/packages/22/fb/f44a4c0d7784ccd32e4166714fea61e50f62b232162ae16332f45cb55ab2/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a19862e3539a697df722a08793994e334cd12791e8144851e8a1dee95a17ff63", size = 1077437 },
+ { url = "https://files.pythonhosted.org/packages/f0/5e/d9b9e7daa13cc7e2184a3c2422bb847f05d354ce15ba113b20d83e9ab366/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:dc3b5a64f57c3c078d58b1e447f7d68cad7ae1b23abe689215d03fc434f8f176", size = 1330362 },
+ { url = "https://files.pythonhosted.org/packages/bf/67/480d85bb516798014a6849be0225b246f35df4b54499c348c9c9e311f936/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bb6c7347424a91317c5e1b68041677e4c8ed3e7823b5bbaedb95bffb3c3497ea", size = 1198721 },
+ { url = "https://files.pythonhosted.org/packages/9a/7d/889ff7d86903b6545665655627113d263c88c6d596c68fb09a640ee4f0a7/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b817376de4195a207cc0e4ca37754c0e1e1078c2a2d35a6ae502afde87212f9e", size = 1351820 },
+ { url = "https://files.pythonhosted.org/packages/b9/29/cd42273150f08c200ed2d1879486d73502ee35265f162a77952f101d93a0/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b50c3620ff47c9887debbb4c154aaaac3e46be7fc2e5789ee8dbe128bce6a17", size = 1135747 },
+ { url = "https://files.pythonhosted.org/packages/1d/90/cbcfa3dd86023e82036662a19fec2fcb48782d3f9fa322d44dc898d95a5d/levenshtein-0.26.1-cp313-cp313-win32.whl", hash = "sha256:9fb859da90262eb474c190b3ca1e61dee83add022c676520f5c05fdd60df902a", size = 87318 },
+ { url = "https://files.pythonhosted.org/packages/83/73/372edebc79fd09a8b2382cf1244d279ada5b795124f1e1c4fc73d9fbb00f/levenshtein-0.26.1-cp313-cp313-win_amd64.whl", hash = "sha256:8adcc90e3a5bfb0a463581d85e599d950fe3c2938ac6247b29388b64997f6e2d", size = 98418 },
+ { url = "https://files.pythonhosted.org/packages/b2/6d/f0160ea5a7bb7a62b3b3d56e9fc5024b440cb59555a90be2347abf2e7888/levenshtein-0.26.1-cp313-cp313-win_arm64.whl", hash = "sha256:c2599407e029865dc66d210b8804c7768cbdbf60f061d993bb488d5242b0b73e", size = 87792 },
+]
+
+[[package]]
+name = "more-itertools"
+version = "10.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/88/3b/7fa1fe835e2e93fd6d7b52b2f95ae810cf5ba133e1845f726f5a992d62c2/more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b", size = 125009 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/23/62/0fe302c6d1be1c777cab0616e6302478251dfbf9055ad426f5d0def75c89/more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89", size = 63038 },
+]
+
+[[package]]
+name = "multidict"
+version = "6.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713 },
+ { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516 },
+ { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557 },
+ { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170 },
+ { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836 },
+ { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475 },
+ { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049 },
+ { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370 },
+ { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178 },
+ { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567 },
+ { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822 },
+ { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656 },
+ { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 },
+ { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 },
+ { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 },
+ { url = "https://files.pythonhosted.org/packages/22/67/1c7c0f39fe069aa4e5d794f323be24bf4d33d62d2a348acdb7991f8f30db/multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", size = 48771 },
+ { url = "https://files.pythonhosted.org/packages/3c/25/c186ee7b212bdf0df2519eacfb1981a017bda34392c67542c274651daf23/multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", size = 29533 },
+ { url = "https://files.pythonhosted.org/packages/67/5e/04575fd837e0958e324ca035b339cea174554f6f641d3fb2b4f2e7ff44a2/multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", size = 29595 },
+ { url = "https://files.pythonhosted.org/packages/d3/b2/e56388f86663810c07cfe4a3c3d87227f3811eeb2d08450b9e5d19d78876/multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", size = 130094 },
+ { url = "https://files.pythonhosted.org/packages/6c/ee/30ae9b4186a644d284543d55d491fbd4239b015d36b23fea43b4c94f7052/multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", size = 134876 },
+ { url = "https://files.pythonhosted.org/packages/84/c7/70461c13ba8ce3c779503c70ec9d0345ae84de04521c1f45a04d5f48943d/multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", size = 133500 },
+ { url = "https://files.pythonhosted.org/packages/4a/9f/002af221253f10f99959561123fae676148dd730e2daa2cd053846a58507/multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", size = 131099 },
+ { url = "https://files.pythonhosted.org/packages/82/42/d1c7a7301d52af79d88548a97e297f9d99c961ad76bbe6f67442bb77f097/multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", size = 120403 },
+ { url = "https://files.pythonhosted.org/packages/68/f3/471985c2c7ac707547553e8f37cff5158030d36bdec4414cb825fbaa5327/multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", size = 125348 },
+ { url = "https://files.pythonhosted.org/packages/67/2c/e6df05c77e0e433c214ec1d21ddd203d9a4770a1f2866a8ca40a545869a0/multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", size = 119673 },
+ { url = "https://files.pythonhosted.org/packages/c5/cd/bc8608fff06239c9fb333f9db7743a1b2eafe98c2666c9a196e867a3a0a4/multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", size = 129927 },
+ { url = "https://files.pythonhosted.org/packages/44/8e/281b69b7bc84fc963a44dc6e0bbcc7150e517b91df368a27834299a526ac/multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", size = 128711 },
+ { url = "https://files.pythonhosted.org/packages/12/a4/63e7cd38ed29dd9f1881d5119f272c898ca92536cdb53ffe0843197f6c85/multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", size = 125519 },
+ { url = "https://files.pythonhosted.org/packages/38/e0/4f5855037a72cd8a7a2f60a3952d9aa45feedb37ae7831642102604e8a37/multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", size = 26426 },
+ { url = "https://files.pythonhosted.org/packages/7e/a5/17ee3a4db1e310b7405f5d25834460073a8ccd86198ce044dfaf69eac073/multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", size = 28531 },
+ { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 },
+]
+
+[[package]]
+name = "mypy"
+version = "1.15.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mypy-extensions" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981 },
+ { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175 },
+ { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675 },
+ { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020 },
+ { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582 },
+ { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614 },
+ { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592 },
+ { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611 },
+ { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443 },
+ { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541 },
+ { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348 },
+ { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648 },
+ { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 },
+]
+
+[[package]]
+name = "mypy-extensions"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ec/d0/c12ddfd3a02274be06ffc71f3efc6d0e457b0409c4481596881e748cb264/numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f", size = 20233295 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/e6/847d15770ab7a01e807bdfcd4ead5bdae57c0092b7dc83878171b6af97bb/numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467", size = 20912636 },
+ { url = "https://files.pythonhosted.org/packages/d1/af/f83580891577b13bd7e261416120e036d0d8fb508c8a43a73e38928b794b/numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a", size = 14098403 },
+ { url = "https://files.pythonhosted.org/packages/2b/86/d019fb60a9d0f1d4cf04b014fe88a9135090adfadcc31c1fadbb071d7fa7/numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825", size = 5128938 },
+ { url = "https://files.pythonhosted.org/packages/7a/1b/50985edb6f1ec495a1c36452e860476f5b7ecdc3fc59ea89ccad3c4926c5/numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37", size = 6661937 },
+ { url = "https://files.pythonhosted.org/packages/f4/1b/17efd94cad1b9d605c3f8907fb06bcffc4ce4d1d14d46b95316cccccf2b9/numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748", size = 14049518 },
+ { url = "https://files.pythonhosted.org/packages/5b/73/65d2f0b698df1731e851e3295eb29a5ab8aa06f763f7e4188647a809578d/numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0", size = 16099146 },
+ { url = "https://files.pythonhosted.org/packages/d5/69/308f55c0e19d4b5057b5df286c5433822e3c8039ede06d4051d96f1c2c4e/numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278", size = 15246336 },
+ { url = "https://files.pythonhosted.org/packages/f0/d8/d8d333ad0d8518d077a21aeea7b7c826eff766a2b1ce1194dea95ca0bacf/numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba", size = 17863507 },
+ { url = "https://files.pythonhosted.org/packages/82/6e/0b84ad3103ffc16d6673e63b5acbe7901b2af96c2837174c6318c98e27ab/numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283", size = 6276491 },
+ { url = "https://files.pythonhosted.org/packages/fc/84/7f801a42a67b9772a883223a0a1e12069a14626c81a732bd70aac57aebc1/numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb", size = 12616372 },
+ { url = "https://files.pythonhosted.org/packages/e1/fe/df5624001f4f5c3e0b78e9017bfab7fdc18a8d3b3d3161da3d64924dd659/numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc", size = 20899188 },
+ { url = "https://files.pythonhosted.org/packages/a9/80/d349c3b5ed66bd3cb0214be60c27e32b90a506946857b866838adbe84040/numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369", size = 14113972 },
+ { url = "https://files.pythonhosted.org/packages/9d/50/949ec9cbb28c4b751edfa64503f0913cbfa8d795b4a251e7980f13a8a655/numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd", size = 5114294 },
+ { url = "https://files.pythonhosted.org/packages/8d/f3/399c15629d5a0c68ef2aa7621d430b2be22034f01dd7f3c65a9c9666c445/numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be", size = 6648426 },
+ { url = "https://files.pythonhosted.org/packages/2c/03/c72474c13772e30e1bc2e558cdffd9123c7872b731263d5648b5c49dd459/numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84", size = 14045990 },
+ { url = "https://files.pythonhosted.org/packages/83/9c/96a9ab62274ffafb023f8ee08c88d3d31ee74ca58869f859db6845494fa6/numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff", size = 16096614 },
+ { url = "https://files.pythonhosted.org/packages/d5/34/cd0a735534c29bec7093544b3a509febc9b0df77718a9b41ffb0809c9f46/numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0", size = 15242123 },
+ { url = "https://files.pythonhosted.org/packages/5e/6d/541717a554a8f56fa75e91886d9b79ade2e595918690eb5d0d3dbd3accb9/numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de", size = 17859160 },
+ { url = "https://files.pythonhosted.org/packages/b9/a5/fbf1f2b54adab31510728edd06a05c1b30839f37cf8c9747cb85831aaf1b/numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9", size = 6273337 },
+ { url = "https://files.pythonhosted.org/packages/56/e5/01106b9291ef1d680f82bc47d0c5b5e26dfed15b0754928e8f856c82c881/numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369", size = 12609010 },
+ { url = "https://files.pythonhosted.org/packages/9f/30/f23d9876de0f08dceb707c4dcf7f8dd7588266745029debb12a3cdd40be6/numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391", size = 20924451 },
+ { url = "https://files.pythonhosted.org/packages/6a/ec/6ea85b2da9d5dfa1dbb4cb3c76587fc8ddcae580cb1262303ab21c0926c4/numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39", size = 14122390 },
+ { url = "https://files.pythonhosted.org/packages/68/05/bfbdf490414a7dbaf65b10c78bc243f312c4553234b6d91c94eb7c4b53c2/numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317", size = 5156590 },
+ { url = "https://files.pythonhosted.org/packages/f7/ec/fe2e91b2642b9d6544518388a441bcd65c904cea38d9ff998e2e8ebf808e/numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49", size = 6671958 },
+ { url = "https://files.pythonhosted.org/packages/b1/6f/6531a78e182f194d33ee17e59d67d03d0d5a1ce7f6be7343787828d1bd4a/numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2", size = 14019950 },
+ { url = "https://files.pythonhosted.org/packages/e1/fb/13c58591d0b6294a08cc40fcc6b9552d239d773d520858ae27f39997f2ae/numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7", size = 16079759 },
+ { url = "https://files.pythonhosted.org/packages/2c/f2/f2f8edd62abb4b289f65a7f6d1f3650273af00b91b7267a2431be7f1aec6/numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb", size = 15226139 },
+ { url = "https://files.pythonhosted.org/packages/aa/29/14a177f1a90b8ad8a592ca32124ac06af5eff32889874e53a308f850290f/numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648", size = 17856316 },
+ { url = "https://files.pythonhosted.org/packages/95/03/242ae8d7b97f4e0e4ab8dd51231465fb23ed5e802680d629149722e3faf1/numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4", size = 6329134 },
+ { url = "https://files.pythonhosted.org/packages/80/94/cd9e9b04012c015cb6320ab3bf43bc615e248dddfeb163728e800a5d96f0/numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576", size = 12696208 },
+]
+
+[[package]]
+name = "packaging"
+version = "24.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
+]
+
+[[package]]
+name = "pandas"
+version = "2.2.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "python-dateutil" },
+ { name = "pytz" },
+ { name = "tzdata" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 },
+ { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 },
+ { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 },
+ { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 },
+ { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 },
+ { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 },
+ { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 },
+ { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 },
+ { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 },
+ { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 },
+ { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 },
+ { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 },
+ { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 },
+ { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 },
+ { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 },
+ { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 },
+ { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 },
+ { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 },
+ { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 },
+ { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 },
+]
+
+[[package]]
+name = "pathspec"
+version = "0.12.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 },
+]
+
+[[package]]
+name = "platformdirs"
+version = "4.3.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 },
+]
+
+[[package]]
+name = "propcache"
+version = "0.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/20/c8/2a13f78d82211490855b2fb303b6721348d0787fdd9a12ac46d99d3acde1/propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64", size = 41735 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4c/28/1d205fe49be8b1b4df4c50024e62480a442b1a7b818e734308bb0d17e7fb/propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a", size = 79588 },
+ { url = "https://files.pythonhosted.org/packages/21/ee/fc4d893f8d81cd4971affef2a6cb542b36617cd1d8ce56b406112cb80bf7/propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0", size = 45825 },
+ { url = "https://files.pythonhosted.org/packages/4a/de/bbe712f94d088da1d237c35d735f675e494a816fd6f54e9db2f61ef4d03f/propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d", size = 45357 },
+ { url = "https://files.pythonhosted.org/packages/7f/14/7ae06a6cf2a2f1cb382586d5a99efe66b0b3d0c6f9ac2f759e6f7af9d7cf/propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4", size = 241869 },
+ { url = "https://files.pythonhosted.org/packages/cc/59/227a78be960b54a41124e639e2c39e8807ac0c751c735a900e21315f8c2b/propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d", size = 247884 },
+ { url = "https://files.pythonhosted.org/packages/84/58/f62b4ffaedf88dc1b17f04d57d8536601e4e030feb26617228ef930c3279/propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5", size = 248486 },
+ { url = "https://files.pythonhosted.org/packages/1c/07/ebe102777a830bca91bbb93e3479cd34c2ca5d0361b83be9dbd93104865e/propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24", size = 243649 },
+ { url = "https://files.pythonhosted.org/packages/ed/bc/4f7aba7f08f520376c4bb6a20b9a981a581b7f2e385fa0ec9f789bb2d362/propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff", size = 229103 },
+ { url = "https://files.pythonhosted.org/packages/fe/d5/04ac9cd4e51a57a96f78795e03c5a0ddb8f23ec098b86f92de028d7f2a6b/propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f", size = 226607 },
+ { url = "https://files.pythonhosted.org/packages/e3/f0/24060d959ea41d7a7cc7fdbf68b31852331aabda914a0c63bdb0e22e96d6/propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec", size = 221153 },
+ { url = "https://files.pythonhosted.org/packages/77/a7/3ac76045a077b3e4de4859a0753010765e45749bdf53bd02bc4d372da1a0/propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348", size = 222151 },
+ { url = "https://files.pythonhosted.org/packages/e7/af/5e29da6f80cebab3f5a4dcd2a3240e7f56f2c4abf51cbfcc99be34e17f0b/propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6", size = 233812 },
+ { url = "https://files.pythonhosted.org/packages/8c/89/ebe3ad52642cc5509eaa453e9f4b94b374d81bae3265c59d5c2d98efa1b4/propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6", size = 238829 },
+ { url = "https://files.pythonhosted.org/packages/e9/2f/6b32f273fa02e978b7577159eae7471b3cfb88b48563b1c2578b2d7ca0bb/propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518", size = 230704 },
+ { url = "https://files.pythonhosted.org/packages/5c/2e/f40ae6ff5624a5f77edd7b8359b208b5455ea113f68309e2b00a2e1426b6/propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246", size = 40050 },
+ { url = "https://files.pythonhosted.org/packages/3b/77/a92c3ef994e47180862b9d7d11e37624fb1c00a16d61faf55115d970628b/propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1", size = 44117 },
+ { url = "https://files.pythonhosted.org/packages/0f/2a/329e0547cf2def8857157f9477669043e75524cc3e6251cef332b3ff256f/propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc", size = 77002 },
+ { url = "https://files.pythonhosted.org/packages/12/2d/c4df5415e2382f840dc2ecbca0eeb2293024bc28e57a80392f2012b4708c/propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9", size = 44639 },
+ { url = "https://files.pythonhosted.org/packages/d0/5a/21aaa4ea2f326edaa4e240959ac8b8386ea31dedfdaa636a3544d9e7a408/propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439", size = 44049 },
+ { url = "https://files.pythonhosted.org/packages/4e/3e/021b6cd86c0acc90d74784ccbb66808b0bd36067a1bf3e2deb0f3845f618/propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536", size = 224819 },
+ { url = "https://files.pythonhosted.org/packages/3c/57/c2fdeed1b3b8918b1770a133ba5c43ad3d78e18285b0c06364861ef5cc38/propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629", size = 229625 },
+ { url = "https://files.pythonhosted.org/packages/9d/81/70d4ff57bf2877b5780b466471bebf5892f851a7e2ca0ae7ffd728220281/propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b", size = 232934 },
+ { url = "https://files.pythonhosted.org/packages/3c/b9/bb51ea95d73b3fb4100cb95adbd4e1acaf2cbb1fd1083f5468eeb4a099a8/propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052", size = 227361 },
+ { url = "https://files.pythonhosted.org/packages/f1/20/3c6d696cd6fd70b29445960cc803b1851a1131e7a2e4ee261ee48e002bcd/propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce", size = 213904 },
+ { url = "https://files.pythonhosted.org/packages/a1/cb/1593bfc5ac6d40c010fa823f128056d6bc25b667f5393781e37d62f12005/propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d", size = 212632 },
+ { url = "https://files.pythonhosted.org/packages/6d/5c/e95617e222be14a34c709442a0ec179f3207f8a2b900273720501a70ec5e/propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce", size = 207897 },
+ { url = "https://files.pythonhosted.org/packages/8e/3b/56c5ab3dc00f6375fbcdeefdede5adf9bee94f1fab04adc8db118f0f9e25/propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95", size = 208118 },
+ { url = "https://files.pythonhosted.org/packages/86/25/d7ef738323fbc6ebcbce33eb2a19c5e07a89a3df2fded206065bd5e868a9/propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf", size = 217851 },
+ { url = "https://files.pythonhosted.org/packages/b3/77/763e6cef1852cf1ba740590364ec50309b89d1c818e3256d3929eb92fabf/propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f", size = 222630 },
+ { url = "https://files.pythonhosted.org/packages/4f/e9/0f86be33602089c701696fbed8d8c4c07b6ee9605c5b7536fd27ed540c5b/propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30", size = 216269 },
+ { url = "https://files.pythonhosted.org/packages/cc/02/5ac83217d522394b6a2e81a2e888167e7ca629ef6569a3f09852d6dcb01a/propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6", size = 39472 },
+ { url = "https://files.pythonhosted.org/packages/f4/33/d6f5420252a36034bc8a3a01171bc55b4bff5df50d1c63d9caa50693662f/propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1", size = 43363 },
+ { url = "https://files.pythonhosted.org/packages/41/b6/c5319caea262f4821995dca2107483b94a3345d4607ad797c76cb9c36bcc/propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54", size = 11818 },
+]
+
+[[package]]
+name = "pydantic"
+version = "2.10.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-types" },
+ { name = "pydantic-core" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 },
+]
+
+[[package]]
+name = "pydantic-core"
+version = "2.27.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 },
+ { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 },
+ { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 },
+ { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 },
+ { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 },
+ { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 },
+ { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 },
+ { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 },
+ { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 },
+ { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 },
+ { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 },
+ { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 },
+ { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 },
+ { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 },
+ { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 },
+ { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 },
+ { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 },
+ { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 },
+ { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 },
+ { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 },
+ { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 },
+ { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 },
+ { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 },
+ { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 },
+ { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 },
+ { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 },
+ { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 },
+ { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 },
+]
+
+[[package]]
+name = "pydantic-settings"
+version = "2.7.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pydantic" },
+ { name = "python-dotenv" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/73/7b/c58a586cd7d9ac66d2ee4ba60ca2d241fa837c02bca9bea80a9a8c3d22a9/pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93", size = 79920 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b4/46/93416fdae86d40879714f72956ac14df9c7b76f7d41a4d68aa9f71a0028b/pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd", size = 29718 },
+]
+
+[[package]]
+name = "pytest"
+version = "8.3.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 },
+]
+
+[[package]]
+name = "pytest-assertcount"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/84/9f/e6eee30903096887e2fa359163a4ed0969dfd81b301400f5c46fe3e99a41/pytest-assertcount-1.0.0.tar.gz", hash = "sha256:e8271a284e337f89a28789790e68faa18ab8d5e1ca9aad5bd439a672b836a76b", size = 2652 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/61/8d/4415383d305c7d79271e8e349dedc62d7a2a00f997d894b12a18b3ec487a/pytest_assertcount-1.0.0-py3-none-any.whl", hash = "sha256:08a2945248f666787ee1413736fff91875e355aee23bf03900d1438bd4bf81ec", size = 3287 },
+]
+
+[[package]]
+name = "python-dateutil"
+version = "2.9.0.post0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 },
+]
+
+[[package]]
+name = "python-dotenv"
+version = "1.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 },
+]
+
+[[package]]
+name = "python-levenshtein"
+version = "0.26.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "levenshtein" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/31/72/58d77cb80b3c130d94f53a8204ffad9acfddb925b2fb5818ff9af0b3c832/python_levenshtein-0.26.1.tar.gz", hash = "sha256:24ba578e28058ebb4afa2700057e1678d7adf27e43cd1f17700c09a9009d5d3a", size = 12276 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0f/d7/03e0453719ed89724664f781f0255949408118093dbf77a2aa2a1198b38e/python_Levenshtein-0.26.1-py3-none-any.whl", hash = "sha256:8ef5e529dd640fb00f05ee62d998d2ee862f19566b641ace775d5ae16167b2ef", size = 9426 },
+]
+
+[[package]]
+name = "pytz"
+version = "2025.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/5f/57/df1c9157c8d5a05117e455d66fd7cf6dbc46974f832b1058ed4856785d8a/pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e", size = 319617 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57", size = 507930 },
+]
+
+[[package]]
+name = "rapidfuzz"
+version = "3.12.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c9/df/c300ead8c2962f54ad87872e6372a6836f0181a7f20b433c987bd106bfce/rapidfuzz-3.12.1.tar.gz", hash = "sha256:6a98bbca18b4a37adddf2d8201856441c26e9c981d8895491b5bc857b5f780eb", size = 57907552 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1a/20/6049061411df87f2814a2677db0f15e673bb9795bfeff57dc9708121374d/rapidfuzz-3.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f6235b57ae3faa3f85cb3f90c9fee49b21bd671b76e90fc99e8ca2bdf0b5e4a3", size = 1944328 },
+ { url = "https://files.pythonhosted.org/packages/25/73/199383c4c21ae3b4b6ea6951c6896ab38e9dc96942462fa01f9d3fb047da/rapidfuzz-3.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af4585e5812632c357fee5ab781c29f00cd06bea58f8882ff244cc4906ba6c9e", size = 1430203 },
+ { url = "https://files.pythonhosted.org/packages/7b/51/77ebaeec5413c53c3e6d8b800f2b979551adbed7b5efa094d1fad5c5b751/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5942dc4460e5030c5f9e1d4c9383de2f3564a2503fe25e13e89021bcbfea2f44", size = 1403662 },
+ { url = "https://files.pythonhosted.org/packages/54/06/1fadd2704db0a7eecf78de812e2f4fab37c4ae105a5ce4578c9fc66bb0c5/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b31ab59e1a0df5afc21f3109b6cfd77b34040dbf54f1bad3989f885cfae1e60", size = 5555849 },
+ { url = "https://files.pythonhosted.org/packages/19/45/da128c3952bd09cef2935df58db5273fc4eb67f04a69dcbf9e25af9e4432/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97c885a7a480b21164f57a706418c9bbc9a496ec6da087e554424358cadde445", size = 1655273 },
+ { url = "https://files.pythonhosted.org/packages/03/ee/bf2b2a95b5af4e6d36105dd9284dc5335fdcc7f0326186d4ab0b5aa4721e/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d844c0587d969ce36fbf4b7cbf0860380ffeafc9ac5e17a7cbe8abf528d07bb", size = 1678041 },
+ { url = "https://files.pythonhosted.org/packages/7f/4f/36ea4d7f306a23e30ea1a6cabf545d2a794e8ca9603d2ee48384314cde3a/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93c95dce8917bf428064c64024de43ffd34ec5949dd4425780c72bd41f9d969", size = 3137099 },
+ { url = "https://files.pythonhosted.org/packages/70/ef/48195d94b018e7340a60c9a642ab0081bf9dc64fb0bd01dfafd93757d2a2/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:834f6113d538af358f39296604a1953e55f8eeffc20cb4caf82250edbb8bf679", size = 2307388 },
+ { url = "https://files.pythonhosted.org/packages/e5/cd/53d5dbc4791df3e1a8640fc4ad5e328ebb040cc01c10c66f891aa6b83ed5/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a940aa71a7f37d7f0daac186066bf6668d4d3b7e7ef464cb50bc7ba89eae1f51", size = 6906504 },
+ { url = "https://files.pythonhosted.org/packages/1b/99/c27e7db1d49cfd77780cb73978f81092682c2bdbc6de75363df6aaa086d6/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ec9eaf73501c9a7de2c6938cb3050392e2ee0c5ca3921482acf01476b85a7226", size = 2684757 },
+ { url = "https://files.pythonhosted.org/packages/02/8c/2474d6282fdd4aae386a6b16272e544a3f9ea2dcdcf2f3b0b286549bc3d5/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c5ec360694ac14bfaeb6aea95737cf1a6cf805b5fe8ea7fd28814706c7fa838", size = 3229940 },
+ { url = "https://files.pythonhosted.org/packages/ac/27/95d5a8ebe5fcc5462dd0fd265553c8a2ec4a770e079afabcff978442bcb3/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6b5e176524653ac46f1802bdd273a4b44a5f8d0054ed5013a8e8a4b72f254599", size = 4148489 },
+ { url = "https://files.pythonhosted.org/packages/8d/2c/e509bc24b6514de4d6f2c5480201568e1d9a3c7e4692cc969ef899227ba5/rapidfuzz-3.12.1-cp312-cp312-win32.whl", hash = "sha256:6f463c6f1c42ec90e45d12a6379e18eddd5cdf74138804d8215619b6f4d31cea", size = 1834110 },
+ { url = "https://files.pythonhosted.org/packages/cc/ab/900b8d57090b30269258e3ae31752ec9c31042cd58660fcc96d50728487d/rapidfuzz-3.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:b894fa2b30cd6498a29e5c470cb01c6ea898540b7e048a0342775a5000531334", size = 1612461 },
+ { url = "https://files.pythonhosted.org/packages/a0/df/3f51a0a277185b3f28b2941e071aff62908a6b81527efc67a643bcb59fb8/rapidfuzz-3.12.1-cp312-cp312-win_arm64.whl", hash = "sha256:43bb17056c5d1332f517b888c4e57846c4b5f936ed304917eeb5c9ac85d940d4", size = 864251 },
+ { url = "https://files.pythonhosted.org/packages/62/d2/ceebc2446d1f3d3f2cae2597116982e50c2eed9ff2f5a322a51736981405/rapidfuzz-3.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:97f824c15bc6933a31d6e3cbfa90188ba0e5043cf2b6dd342c2b90ee8b3fd47c", size = 1936794 },
+ { url = "https://files.pythonhosted.org/packages/88/38/37f7ea800aa959a4f7a63477fc9ad7f3cd024e46bfadce5d23420af6c7e5/rapidfuzz-3.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a973b3f5cabf931029a3ae4a0f72e3222e53d412ea85fc37ddc49e1774f00fbf", size = 1424155 },
+ { url = "https://files.pythonhosted.org/packages/3f/14/409d0aa84430451488177fcc5cba8babcdf5a45cee772a2a265b9b5f4c7e/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7880e012228722dec1be02b9ef3898ed023388b8a24d6fa8213d7581932510", size = 1398013 },
+ { url = "https://files.pythonhosted.org/packages/4b/2c/601e3ad0bbe61e65f99e72c8cefed9713606cf4b297cc4c3876051db7722/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c78582f50e75e6c2bc38c791ed291cb89cf26a3148c47860c1a04d6e5379c8e", size = 5526157 },
+ { url = "https://files.pythonhosted.org/packages/97/ce/deb7b00ce6e06713fc4df81336402b7fa062f2393c8a47401c228ee906c3/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d7d9e6a04d8344b0198c96394c28874086888d0a2b2f605f30d1b27b9377b7d", size = 1648446 },
+ { url = "https://files.pythonhosted.org/packages/ec/6f/2b8eae1748a022290815999594b438dbc1e072c38c76178ea996920a6253/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5620001fd4d6644a2f56880388179cc8f3767670f0670160fcb97c3b46c828af", size = 1676038 },
+ { url = "https://files.pythonhosted.org/packages/b9/6c/5c831197aca7148ed85c86bbe940e66073fea0fa97f30307bb5850ed8858/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0666ab4c52e500af7ba5cc17389f5d15c0cdad06412c80312088519fdc25686d", size = 3114137 },
+ { url = "https://files.pythonhosted.org/packages/fc/f2/d66ac185eeb0ee3fc0fe208dab1e72feece2c883bc0ab2097570a8159a7b/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:27b4d440fa50b50c515a91a01ee17e8ede719dca06eef4c0cccf1a111a4cfad3", size = 2305754 },
+ { url = "https://files.pythonhosted.org/packages/6c/61/9bf74d7ea9bebc7a1bed707591617bba7901fce414d346a7c5532ef02dbd/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83dccfd5a754f2a0e8555b23dde31f0f7920601bfa807aa76829391ea81e7c67", size = 6901746 },
+ { url = "https://files.pythonhosted.org/packages/81/73/d8dddf73e168f723ef21272e8abb7d34d9244da395eb90ed5a617f870678/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b572b634740e047c53743ed27a1bb3b4f93cf4abbac258cd7af377b2c4a9ba5b", size = 2673947 },
+ { url = "https://files.pythonhosted.org/packages/2e/31/3c473cea7d76af162819a5b84f5e7bdcf53b9e19568fc37cfbdab4f4512a/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7fa7b81fb52902d5f78dac42b3d6c835a6633b01ddf9b202a3ca8443be4b2d6a", size = 3233070 },
+ { url = "https://files.pythonhosted.org/packages/c0/b7/73227dcbf8586f0ca4a77be2720311367288e2db142ae00a1404f42e712d/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1d4fbff980cb6baef4ee675963c081f7b5d6580a105d6a4962b20f1f880e1fb", size = 4146828 },
+ { url = "https://files.pythonhosted.org/packages/3a/c8/fea749c662e268d348a77501995b51ac95cdc3624f3f95ba261f30b000ff/rapidfuzz-3.12.1-cp313-cp313-win32.whl", hash = "sha256:3fe8da12ea77271097b303fa7624cfaf5afd90261002314e3b0047d36f4afd8d", size = 1831797 },
+ { url = "https://files.pythonhosted.org/packages/66/18/11052be5984d9972eb04a52e2931e19e95b2e87731d179f60b79707b7efd/rapidfuzz-3.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:6f7e92fc7d2a7f02e1e01fe4f539324dfab80f27cb70a30dd63a95445566946b", size = 1610169 },
+ { url = "https://files.pythonhosted.org/packages/db/c1/66427c618f000298edbd24e46dd3dd2d3fa441a602701ba6a260d41dd62b/rapidfuzz-3.12.1-cp313-cp313-win_arm64.whl", hash = "sha256:e31be53d7f4905a6a038296d8b773a79da9ee9f0cd19af9490c5c5a22e37d2e5", size = 863036 },
+]
+
+[[package]]
+name = "requests"
+version = "2.32.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
+]
+
+[[package]]
+name = "requests-toolbelt"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "requests" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 },
+]
+
+[[package]]
+name = "ruff"
+version = "0.9.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2a/e1/e265aba384343dd8ddd3083f5e33536cd17e1566c41453a5517b5dd443be/ruff-0.9.6.tar.gz", hash = "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9", size = 3639454 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/76/e3/3d2c022e687e18cf5d93d6bfa2722d46afc64eaa438c7fbbdd603b3597be/ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba", size = 11714128 },
+ { url = "https://files.pythonhosted.org/packages/e1/22/aff073b70f95c052e5c58153cba735748c9e70107a77d03420d7850710a0/ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504", size = 11682539 },
+ { url = "https://files.pythonhosted.org/packages/75/a7/f5b7390afd98a7918582a3d256cd3e78ba0a26165a467c1820084587cbf9/ruff-0.9.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83", size = 11132512 },
+ { url = "https://files.pythonhosted.org/packages/a6/e3/45de13ef65047fea2e33f7e573d848206e15c715e5cd56095589a7733d04/ruff-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc", size = 11929275 },
+ { url = "https://files.pythonhosted.org/packages/7d/f2/23d04cd6c43b2e641ab961ade8d0b5edb212ecebd112506188c91f2a6e6c/ruff-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b", size = 11466502 },
+ { url = "https://files.pythonhosted.org/packages/b5/6f/3a8cf166f2d7f1627dd2201e6cbc4cb81f8b7d58099348f0c1ff7b733792/ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e", size = 12676364 },
+ { url = "https://files.pythonhosted.org/packages/f5/c4/db52e2189983c70114ff2b7e3997e48c8318af44fe83e1ce9517570a50c6/ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666", size = 13335518 },
+ { url = "https://files.pythonhosted.org/packages/66/44/545f8a4d136830f08f4d24324e7db957c5374bf3a3f7a6c0bc7be4623a37/ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5", size = 12823287 },
+ { url = "https://files.pythonhosted.org/packages/c5/26/8208ef9ee7431032c143649a9967c3ae1aae4257d95e6f8519f07309aa66/ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5", size = 14592374 },
+ { url = "https://files.pythonhosted.org/packages/31/70/e917781e55ff39c5b5208bda384fd397ffd76605e68544d71a7e40944945/ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217", size = 12500173 },
+ { url = "https://files.pythonhosted.org/packages/84/f5/e4ddee07660f5a9622a9c2b639afd8f3104988dc4f6ba0b73ffacffa9a8c/ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6", size = 11906555 },
+ { url = "https://files.pythonhosted.org/packages/f1/2b/6ff2fe383667075eef8656b9892e73dd9b119b5e3add51298628b87f6429/ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897", size = 11538958 },
+ { url = "https://files.pythonhosted.org/packages/3c/db/98e59e90de45d1eb46649151c10a062d5707b5b7f76f64eb1e29edf6ebb1/ruff-0.9.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08", size = 12117247 },
+ { url = "https://files.pythonhosted.org/packages/ec/bc/54e38f6d219013a9204a5a2015c09e7a8c36cedcd50a4b01ac69a550b9d9/ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656", size = 12554647 },
+ { url = "https://files.pythonhosted.org/packages/a5/7d/7b461ab0e2404293c0627125bb70ac642c2e8d55bf590f6fce85f508f1b2/ruff-0.9.6-py3-none-win32.whl", hash = "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d", size = 9949214 },
+ { url = "https://files.pythonhosted.org/packages/ee/30/c3cee10f915ed75a5c29c1e57311282d1a15855551a64795c1b2bbe5cf37/ruff-0.9.6-py3-none-win_amd64.whl", hash = "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa", size = 10999914 },
+ { url = "https://files.pythonhosted.org/packages/e8/a8/d71f44b93e3aa86ae232af1f2126ca7b95c0f515ec135462b3e1f351441c/ruff-0.9.6-py3-none-win_arm64.whl", hash = "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a", size = 10177499 },
+]
+
+[[package]]
+name = "six"
+version = "1.17.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 },
+]
+
+[[package]]
+name = "sniffio"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
+]
+
+[[package]]
+name = "speckle-automate-checker"
+version = "0.1.0"
+source = { virtual = "." }
+dependencies = [
+ { name = "more-itertools" },
+ { name = "pandas" },
+ { name = "pydantic" },
+ { name = "pytest-assertcount" },
+ { name = "python-dotenv" },
+ { name = "python-levenshtein" },
+ { name = "specklepy" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "black" },
+ { name = "mypy" },
+ { name = "pydantic-settings" },
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "more-itertools", specifier = ">=10.6.0" },
+ { name = "pandas", specifier = ">=2.2.3" },
+ { name = "pydantic", specifier = "==2.10.6" },
+ { name = "pytest-assertcount", specifier = ">=1.0.0" },
+ { name = "python-dotenv", specifier = ">=1.0.1" },
+ { name = "python-levenshtein", specifier = ">=0.26.1" },
+ { name = "specklepy", specifier = ">=2.21.2" },
+]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "black", specifier = ">=25.1.0" },
+ { name = "mypy", specifier = ">=1.15.0" },
+ { name = "pydantic-settings", specifier = ">=2.7.1" },
+ { name = "pytest", specifier = ">=8.3.4" },
+ { name = "ruff", specifier = ">=0.9.6" },
+]
+
+[[package]]
+name = "specklepy"
+version = "2.21.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "appdirs" },
+ { name = "attrs" },
+ { name = "deprecated" },
+ { name = "gql", extra = ["requests", "websockets"] },
+ { name = "httpx" },
+ { name = "pydantic" },
+ { name = "stringcase" },
+ { name = "ujson" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/18/79/58269be683ca06194a464deaac3655989b094c6a0df0f8dccb24eeb47031/specklepy-2.21.2.tar.gz", hash = "sha256:ba44bb9167ced32e52ba7e5717d0b1d0ece1aa23ca02243ce75f0eaba08e8107", size = 93326 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/13/89/78eb05af38fc455c695c2ab882db2cca0ef518313c49f73b6536d0cad9e7/specklepy-2.21.2-py3-none-any.whl", hash = "sha256:bb34bb0de56f8731f88ac9a1ada4cddfbf2d71e52d4e9cce07bab95c1dac2b2d", size = 136495 },
+]
+
+[[package]]
+name = "stringcase"
+version = "1.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/1f/1241aa3d66e8dc1612427b17885f5fcd9c9ee3079fc0d28e9a3aeeb36fa3/stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008", size = 2958 }
+
+[[package]]
+name = "typing-extensions"
+version = "4.12.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 },
+]
+
+[[package]]
+name = "tzdata"
+version = "2025.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/43/0f/fa4723f22942480be4ca9527bbde8d43f6c3f2fe8412f00e7f5f6746bc8b/tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694", size = 194950 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639", size = 346762 },
+]
+
+[[package]]
+name = "ujson"
+version = "5.10.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f0/00/3110fd566786bfa542adb7932d62035e0c0ef662a8ff6544b6643b3d6fd7/ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1", size = 7154885 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e8/a6/fd3f8bbd80842267e2d06c3583279555e8354c5986c952385199d57a5b6c/ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5", size = 55642 },
+ { url = "https://files.pythonhosted.org/packages/a8/47/dd03fd2b5ae727e16d5d18919b383959c6d269c7b948a380fdd879518640/ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e", size = 51807 },
+ { url = "https://files.pythonhosted.org/packages/25/23/079a4cc6fd7e2655a473ed9e776ddbb7144e27f04e8fc484a0fb45fe6f71/ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043", size = 51972 },
+ { url = "https://files.pythonhosted.org/packages/04/81/668707e5f2177791869b624be4c06fb2473bf97ee33296b18d1cf3092af7/ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1", size = 53686 },
+ { url = "https://files.pythonhosted.org/packages/bd/50/056d518a386d80aaf4505ccf3cee1c40d312a46901ed494d5711dd939bc3/ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3", size = 58591 },
+ { url = "https://files.pythonhosted.org/packages/fc/d6/aeaf3e2d6fb1f4cfb6bf25f454d60490ed8146ddc0600fae44bfe7eb5a72/ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21", size = 997853 },
+ { url = "https://files.pythonhosted.org/packages/f8/d5/1f2a5d2699f447f7d990334ca96e90065ea7f99b142ce96e85f26d7e78e2/ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2", size = 1140689 },
+ { url = "https://files.pythonhosted.org/packages/f2/2c/6990f4ccb41ed93744aaaa3786394bca0875503f97690622f3cafc0adfde/ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e", size = 1043576 },
+ { url = "https://files.pythonhosted.org/packages/14/f5/a2368463dbb09fbdbf6a696062d0c0f62e4ae6fa65f38f829611da2e8fdd/ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e", size = 38764 },
+ { url = "https://files.pythonhosted.org/packages/59/2d/691f741ffd72b6c84438a93749ac57bf1a3f217ac4b0ea4fd0e96119e118/ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc", size = 42211 },
+ { url = "https://files.pythonhosted.org/packages/0d/69/b3e3f924bb0e8820bb46671979770c5be6a7d51c77a66324cdb09f1acddb/ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287", size = 55646 },
+ { url = "https://files.pythonhosted.org/packages/32/8a/9b748eb543c6cabc54ebeaa1f28035b1bd09c0800235b08e85990734c41e/ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e", size = 51806 },
+ { url = "https://files.pythonhosted.org/packages/39/50/4b53ea234413b710a18b305f465b328e306ba9592e13a791a6a6b378869b/ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557", size = 51975 },
+ { url = "https://files.pythonhosted.org/packages/b4/9d/8061934f960cdb6dd55f0b3ceeff207fcc48c64f58b43403777ad5623d9e/ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988", size = 53693 },
+ { url = "https://files.pythonhosted.org/packages/f5/be/7bfa84b28519ddbb67efc8410765ca7da55e6b93aba84d97764cd5794dbc/ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816", size = 58594 },
+ { url = "https://files.pythonhosted.org/packages/48/eb/85d465abafb2c69d9699cfa5520e6e96561db787d36c677370e066c7e2e7/ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20", size = 997853 },
+ { url = "https://files.pythonhosted.org/packages/9f/76/2a63409fc05d34dd7d929357b7a45e3a2c96f22b4225cd74becd2ba6c4cb/ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0", size = 1140694 },
+ { url = "https://files.pythonhosted.org/packages/45/ed/582c4daba0f3e1688d923b5cb914ada1f9defa702df38a1916c899f7c4d1/ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f", size = 1043580 },
+ { url = "https://files.pythonhosted.org/packages/d7/0c/9837fece153051e19c7bade9f88f9b409e026b9525927824cdf16293b43b/ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165", size = 38766 },
+ { url = "https://files.pythonhosted.org/packages/d7/72/6cb6728e2738c05bbe9bd522d6fc79f86b9a28402f38663e85a28fddd4a0/ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539", size = 42212 },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 },
+]
+
+[[package]]
+name = "websockets"
+version = "11.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/3b/2ed38e52eed4cf277f9df5f0463a99199a04d9e29c9e227cfafa57bd3993/websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016", size = 104235 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/47/96/9d5749106ff57629b54360664ae7eb9afd8302fad1680ead385383e33746/websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6", size = 118056 },
+]
+
+[[package]]
+name = "wrapt"
+version = "1.17.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799 },
+ { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821 },
+ { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919 },
+ { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721 },
+ { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899 },
+ { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222 },
+ { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707 },
+ { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685 },
+ { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567 },
+ { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672 },
+ { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865 },
+ { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 },
+ { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 },
+ { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 },
+ { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 },
+ { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 },
+ { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 },
+ { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 },
+ { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 },
+ { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 },
+ { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 },
+ { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 },
+ { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 },
+ { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 },
+ { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 },
+ { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 },
+ { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 },
+ { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 },
+ { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 },
+ { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 },
+ { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 },
+ { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 },
+ { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 },
+ { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 },
+]
+
+[[package]]
+name = "yarl"
+version = "1.18.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "idna" },
+ { name = "multidict" },
+ { name = "propcache" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b7/9d/4b94a8e6d2b51b599516a5cb88e5bc99b4d8d4583e468057eaa29d5f0918/yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", size = 181062 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/33/85/bd2e2729752ff4c77338e0102914897512e92496375e079ce0150a6dc306/yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50", size = 142644 },
+ { url = "https://files.pythonhosted.org/packages/ff/74/1178322cc0f10288d7eefa6e4a85d8d2e28187ccab13d5b844e8b5d7c88d/yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576", size = 94962 },
+ { url = "https://files.pythonhosted.org/packages/be/75/79c6acc0261e2c2ae8a1c41cf12265e91628c8c58ae91f5ff59e29c0787f/yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640", size = 92795 },
+ { url = "https://files.pythonhosted.org/packages/6b/32/927b2d67a412c31199e83fefdce6e645247b4fb164aa1ecb35a0f9eb2058/yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2", size = 332368 },
+ { url = "https://files.pythonhosted.org/packages/19/e5/859fca07169d6eceeaa4fde1997c91d8abde4e9a7c018e371640c2da2b71/yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75", size = 342314 },
+ { url = "https://files.pythonhosted.org/packages/08/75/76b63ccd91c9e03ab213ef27ae6add2e3400e77e5cdddf8ed2dbc36e3f21/yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512", size = 341987 },
+ { url = "https://files.pythonhosted.org/packages/1a/e1/a097d5755d3ea8479a42856f51d97eeff7a3a7160593332d98f2709b3580/yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba", size = 336914 },
+ { url = "https://files.pythonhosted.org/packages/0b/42/e1b4d0e396b7987feceebe565286c27bc085bf07d61a59508cdaf2d45e63/yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb", size = 325765 },
+ { url = "https://files.pythonhosted.org/packages/7e/18/03a5834ccc9177f97ca1bbb245b93c13e58e8225276f01eedc4cc98ab820/yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272", size = 344444 },
+ { url = "https://files.pythonhosted.org/packages/c8/03/a713633bdde0640b0472aa197b5b86e90fbc4c5bc05b727b714cd8a40e6d/yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6", size = 340760 },
+ { url = "https://files.pythonhosted.org/packages/eb/99/f6567e3f3bbad8fd101886ea0276c68ecb86a2b58be0f64077396cd4b95e/yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e", size = 346484 },
+ { url = "https://files.pythonhosted.org/packages/8e/a9/84717c896b2fc6cb15bd4eecd64e34a2f0a9fd6669e69170c73a8b46795a/yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb", size = 359864 },
+ { url = "https://files.pythonhosted.org/packages/1e/2e/d0f5f1bef7ee93ed17e739ec8dbcb47794af891f7d165fa6014517b48169/yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393", size = 364537 },
+ { url = "https://files.pythonhosted.org/packages/97/8a/568d07c5d4964da5b02621a517532adb8ec5ba181ad1687191fffeda0ab6/yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285", size = 357861 },
+ { url = "https://files.pythonhosted.org/packages/7d/e3/924c3f64b6b3077889df9a1ece1ed8947e7b61b0a933f2ec93041990a677/yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2", size = 84097 },
+ { url = "https://files.pythonhosted.org/packages/34/45/0e055320daaabfc169b21ff6174567b2c910c45617b0d79c68d7ab349b02/yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477", size = 90399 },
+ { url = "https://files.pythonhosted.org/packages/30/c7/c790513d5328a8390be8f47be5d52e141f78b66c6c48f48d241ca6bd5265/yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", size = 140789 },
+ { url = "https://files.pythonhosted.org/packages/30/aa/a2f84e93554a578463e2edaaf2300faa61c8701f0898725842c704ba5444/yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", size = 94144 },
+ { url = "https://files.pythonhosted.org/packages/c6/fc/d68d8f83714b221a85ce7866832cba36d7c04a68fa6a960b908c2c84f325/yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", size = 91974 },
+ { url = "https://files.pythonhosted.org/packages/56/4e/d2563d8323a7e9a414b5b25341b3942af5902a2263d36d20fb17c40411e2/yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", size = 333587 },
+ { url = "https://files.pythonhosted.org/packages/25/c9/cfec0bc0cac8d054be223e9f2c7909d3e8442a856af9dbce7e3442a8ec8d/yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", size = 344386 },
+ { url = "https://files.pythonhosted.org/packages/ab/5d/4c532190113b25f1364d25f4c319322e86232d69175b91f27e3ebc2caf9a/yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", size = 345421 },
+ { url = "https://files.pythonhosted.org/packages/23/d1/6cdd1632da013aa6ba18cee4d750d953104a5e7aac44e249d9410a972bf5/yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", size = 339384 },
+ { url = "https://files.pythonhosted.org/packages/9a/c4/6b3c39bec352e441bd30f432cda6ba51681ab19bb8abe023f0d19777aad1/yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", size = 326689 },
+ { url = "https://files.pythonhosted.org/packages/23/30/07fb088f2eefdc0aa4fc1af4e3ca4eb1a3aadd1ce7d866d74c0f124e6a85/yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", size = 345453 },
+ { url = "https://files.pythonhosted.org/packages/63/09/d54befb48f9cd8eec43797f624ec37783a0266855f4930a91e3d5c7717f8/yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", size = 341872 },
+ { url = "https://files.pythonhosted.org/packages/91/26/fd0ef9bf29dd906a84b59f0cd1281e65b0c3e08c6aa94b57f7d11f593518/yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", size = 347497 },
+ { url = "https://files.pythonhosted.org/packages/d9/b5/14ac7a256d0511b2ac168d50d4b7d744aea1c1aa20c79f620d1059aab8b2/yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", size = 359981 },
+ { url = "https://files.pythonhosted.org/packages/ca/b3/d493221ad5cbd18bc07e642894030437e405e1413c4236dd5db6e46bcec9/yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", size = 366229 },
+ { url = "https://files.pythonhosted.org/packages/04/56/6a3e2a5d9152c56c346df9b8fb8edd2c8888b1e03f96324d457e5cf06d34/yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", size = 360383 },
+ { url = "https://files.pythonhosted.org/packages/fd/b7/4b3c7c7913a278d445cc6284e59b2e62fa25e72758f888b7a7a39eb8423f/yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", size = 310152 },
+ { url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", size = 315723 },
+ { url = "https://files.pythonhosted.org/packages/f5/4b/a06e0ec3d155924f77835ed2d167ebd3b211a7b0853da1cf8d8414d784ef/yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", size = 45109 },
+]