├── tests ├── __init__.py ├── data │ ├── __init__.py │ ├── caller.py │ ├── example.py │ ├── defi.py │ ├── nft.py │ ├── storage.py │ └── tether.py ├── test_performance.py ├── test_utils.py ├── test_decode_function.py ├── test_decode_error.py └── test_decode_constructor.py ├── web3_input_decoder ├── py.typed ├── utils │ ├── hex.py │ ├── __init__.py │ └── parse.py ├── exceptions.py ├── types.py ├── __init__.py └── decoder.py ├── .ruff.toml ├── .github ├── dependabot.yml └── workflows │ ├── cd.yml │ └── ci.yml ├── LICENSE ├── pyproject.toml ├── .gitignore ├── README.md └── poetry.lock /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/data/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web3_input_decoder/py.typed: -------------------------------------------------------------------------------- 1 | # Marker file for PEP 561. 2 | -------------------------------------------------------------------------------- /.ruff.toml: -------------------------------------------------------------------------------- 1 | line-length = 88 2 | 3 | [lint] 4 | ignore = ["E501", "W605", "E203"] 5 | 6 | [lint.mccabe] 7 | max-complexity = 12 8 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: pip 4 | directory: "/" 5 | schedule: 6 | interval: monthly 7 | open-pull-requests-limit: 3 8 | -------------------------------------------------------------------------------- /web3_input_decoder/utils/hex.py: -------------------------------------------------------------------------------- 1 | from typing import Union 2 | 3 | 4 | def hex_to_bytes(data: Union[str, bytes]) -> bytes: 5 | if isinstance(data, str): 6 | if data.startswith("0x"): 7 | data = data[2:] 8 | data = bytes.fromhex(data) 9 | return data 10 | -------------------------------------------------------------------------------- /web3_input_decoder/utils/__init__.py: -------------------------------------------------------------------------------- 1 | from .hex import hex_to_bytes 2 | from .parse import ( 3 | decode_input, 4 | detect_constructor_arguments, 5 | get_constructor_type, 6 | get_selector_to_function_type, 7 | get_types_names, 8 | ) 9 | 10 | __all__ = ( 11 | "hex_to_bytes", 12 | "decode_input", 13 | "detect_constructor_arguments", 14 | "get_constructor_type", 15 | "get_selector_to_function_type", 16 | "get_types_names", 17 | ) 18 | -------------------------------------------------------------------------------- /web3_input_decoder/exceptions.py: -------------------------------------------------------------------------------- 1 | __all__ = ( 2 | "InputDataError", 3 | "METHOD_NOT_FOUND", 4 | "CONSTRUCTOR_NOT_FOUND", 5 | "INVALID_INPUT", 6 | "UNABLE_TO_DETECT_CONSTRUCTOR_ARGUMENTS", 7 | ) 8 | 9 | 10 | class InputDataError(ValueError): 11 | pass 12 | 13 | 14 | METHOD_NOT_FOUND = InputDataError("Specified method is not found in ABI") 15 | CONSTRUCTOR_NOT_FOUND = InputDataError("Constructor is not found in ABI") 16 | INVALID_INPUT = InputDataError("Invalid input") 17 | UNABLE_TO_DETECT_CONSTRUCTOR_ARGUMENTS = InputDataError( 18 | "Unable to detect arguments including array. Please provide the bytecode." 19 | ) 20 | -------------------------------------------------------------------------------- /tests/data/caller.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from web3_input_decoder.types import Abi 4 | 5 | # Made with Remix IDE 6 | 7 | """ 8 | // SPDX-License-Identifier: GPL-3.0 9 | 10 | pragma solidity >=0.7.0 <0.9.0; 11 | 12 | contract Caller { 13 | address addr; 14 | 15 | constructor(address _addr) { 16 | addr = _addr; 17 | } 18 | } 19 | """ 20 | 21 | CALLER_ABI: Abi = [ 22 | { 23 | "inputs": [{"internalType": "address", "name": "_addr", "type": "address"}], 24 | "stateMutability": "nonpayable", 25 | "type": "constructor", 26 | } 27 | ] 28 | 29 | 30 | CALLER_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE = ( 31 | "0x0000000000000000000000000000000000000000000000000000000000000002" 32 | ) 33 | 34 | CALLER_CONSTRUCTOR_CALL_ARGUMENT = [ 35 | ("address", "_addr", "0x0000000000000000000000000000000000000002") 36 | ] 37 | -------------------------------------------------------------------------------- /.github/workflows/cd.yml: -------------------------------------------------------------------------------- 1 | name: CD 2 | 3 | on: 4 | release: 5 | types: [published] 6 | jobs: 7 | publish: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v4 11 | 12 | - run: pipx install poetry 13 | 14 | - uses: actions/setup-python@v5 15 | with: 16 | python-version: "3.13" 17 | cache: "poetry" 18 | 19 | - run: poetry install 20 | 21 | - name: Upload to pypi 22 | run: | 23 | poetry build 24 | poetry config repositories.testpypi https://test.pypi.org/legacy/ 25 | poetry config pypi-token.testpypi "$TEST_PYPI_TOKEN" 26 | poetry config pypi-token.pypi "$PYPI_TOKEN" 27 | poetry publish --dry-run 28 | poetry publish --repository testpypi 29 | poetry publish 30 | env: 31 | PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} 32 | TEST_PYPI_TOKEN: ${{ secrets.TEST_PYPI_TOKEN }} 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021-2025 Weiliang Li 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [master] 6 | 7 | pull_request: 8 | branches: [master] 9 | 10 | jobs: 11 | build: 12 | runs-on: ${{ matrix.os }} 13 | strategy: 14 | matrix: 15 | os: [ubuntu-latest, macos-latest, windows-latest] 16 | python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] 17 | steps: 18 | - uses: actions/checkout@v4 19 | 20 | - run: pipx install poetry 21 | 22 | - uses: actions/setup-python@v5 23 | with: 24 | python-version: ${{ matrix.python-version }} 25 | cache: "poetry" 26 | 27 | - run: brew install automake 28 | if: matrix.os == 'macos-latest' 29 | 30 | - run: poetry install --with test 31 | 32 | - name: Lint 33 | run: poetry run ruff check --fix && poetry run ruff format && poetry run ty check 34 | 35 | - name: Run test 36 | run: poetry run pytest -s tests --cov-report xml 37 | 38 | - name: Upload to codecov 39 | uses: codecov/codecov-action@v5 40 | if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.13' 41 | with: 42 | token: ${{ secrets.CODECOV_TOKEN }} 43 | 44 | - run: poetry build 45 | -------------------------------------------------------------------------------- /tests/test_performance.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from pyinstrument import Profiler 3 | 4 | from web3_input_decoder import InputDecoder 5 | 6 | from .data.defi import ROUTER_ABI, ROUTER_TOKENS_SWAP_CALL_INPUT 7 | from .data.tether import TETHER_ABI 8 | 9 | 10 | @pytest.mark.parametrize( 11 | "count", 12 | [10, 100, 1000, 10000], 13 | ) 14 | def test_profiling_tether_transfer_decode(count: int): 15 | tx = ( 16 | "0xa9059cbb000000000000000000000000f050227be1a7ce587aa83d5013f900dbc3b" 17 | "e0611000000000000000000000000000000000000000000000000000000000ecdd350" 18 | ) 19 | __check(TETHER_ABI, tx, "transfer", count) 20 | 21 | 22 | @pytest.mark.parametrize( 23 | "count", 24 | [10, 100, 1000, 10000], 25 | ) 26 | def test_profiling_router_swap(count: int): 27 | __check( 28 | ROUTER_ABI, 29 | ROUTER_TOKENS_SWAP_CALL_INPUT, 30 | "swapExactTokensForTokens", 31 | count, 32 | ) 33 | 34 | 35 | def __check(abi, tx: str, func_name: str, count: int): 36 | p = Profiler() 37 | with p: 38 | decoder = InputDecoder(abi) 39 | for _ in range(count): 40 | func_call = decoder.decode_function(tx) 41 | assert func_call.name == func_name 42 | p.print() 43 | -------------------------------------------------------------------------------- /tests/test_utils.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from web3_input_decoder.utils import ( 4 | detect_constructor_arguments, 5 | get_constructor_type, 6 | get_selector_to_function_type, 7 | hex_to_bytes, 8 | ) 9 | 10 | from .data.tether import ( 11 | TETHER_ABI, 12 | TETHER_CONSTRUCTOR_CALL_INPUT, 13 | TETHER_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE, 14 | ) 15 | 16 | 17 | @pytest.mark.parametrize( 18 | "abi,input_with_bytecode,input", 19 | [ 20 | ( 21 | TETHER_ABI, 22 | TETHER_CONSTRUCTOR_CALL_INPUT, 23 | TETHER_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE, 24 | ), 25 | ( 26 | TETHER_ABI, 27 | TETHER_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE, 28 | TETHER_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE, 29 | ), 30 | ], 31 | ids=["with-bytecode", "without-bytecode"], 32 | ) 33 | def test_detect_arguments(abi, input_with_bytecode, input): 34 | type_def = get_constructor_type(abi) 35 | assert type_def is not None 36 | assert detect_constructor_arguments( 37 | type_def, hex_to_bytes(input_with_bytecode) 38 | ) == hex_to_bytes(input) 39 | 40 | 41 | def test_selector_to_func_type(): 42 | assert get_selector_to_function_type(TETHER_ABI) != {} 43 | -------------------------------------------------------------------------------- /web3_input_decoder/types.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | import sys 4 | from typing import Literal, Union 5 | 6 | if sys.version_info >= (3, 11): 7 | from typing import NotRequired, TypedDict 8 | else: 9 | from typing_extensions import NotRequired, TypedDict 10 | 11 | 12 | class Input(TypedDict): 13 | name: str 14 | type: str 15 | components: NotRequired[list[Input]] # only for "tuple" and "tuple[]" 16 | internalType: NotRequired[str] 17 | 18 | 19 | class Output(TypedDict): 20 | name: str 21 | type: str 22 | components: NotRequired[list[Output]] # only for "tuple" and "tuple[]" 23 | internalType: NotRequired[str] 24 | 25 | 26 | class ConstructorType(TypedDict): 27 | name: NotRequired[str] 28 | type: Literal["constructor"] 29 | inputs: list[Input] 30 | constant: NotRequired[bool] 31 | payable: NotRequired[bool] 32 | stateMutability: NotRequired[Literal["pure", "view", "nonpayable", "payable"]] 33 | 34 | 35 | class FunctionType(TypedDict): 36 | name: str 37 | type: Literal["function"] 38 | inputs: list[Input] 39 | constant: NotRequired[bool] 40 | payable: NotRequired[bool] 41 | stateMutability: NotRequired[Literal["pure", "view", "nonpayable", "payable"]] 42 | outputs: NotRequired[list[Output]] 43 | 44 | 45 | TypeDef = Union[ConstructorType, FunctionType] # for backward compatibility 46 | Abi = list[TypeDef] 47 | -------------------------------------------------------------------------------- /tests/test_decode_function.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from web3_input_decoder import decode_function 4 | 5 | from .data.defi import ( 6 | ROUTER_ABI, 7 | ROUTER_SWAP_CALL_ARGUMENT, 8 | ROUTER_SWAP_CALL_INPUT, 9 | ROUTER_TOKENS_SWAP_CALL_ARGUMENT, 10 | ROUTER_TOKENS_SWAP_CALL_INPUT, 11 | ) 12 | from .data.nft import ( 13 | SEAPORT_ABI, 14 | SEAPORT_FULFILL_ORDER_CALL_ARGUMENT, 15 | SEAPORT_FULFILL_ORDER_CALL_INPUT, 16 | ) 17 | from .data.storage import ( 18 | STORAGE_ABI, 19 | STORAGE_FUNCTION_CALL_ARGUMENT, 20 | STORAGE_FUNCTION_CALL_INPUT, 21 | ) 22 | from .data.tether import ( 23 | TETHER_ABI, 24 | TETHER_TRANSFER_CALL_ARGUMENT, 25 | TETHER_TRANSFER_CALL_INPUT, 26 | ) 27 | 28 | 29 | @pytest.mark.parametrize( 30 | "abi,input,expected", 31 | [ 32 | (STORAGE_ABI, STORAGE_FUNCTION_CALL_INPUT, STORAGE_FUNCTION_CALL_ARGUMENT), 33 | (TETHER_ABI, TETHER_TRANSFER_CALL_INPUT, TETHER_TRANSFER_CALL_ARGUMENT), 34 | (ROUTER_ABI, ROUTER_SWAP_CALL_INPUT, ROUTER_SWAP_CALL_ARGUMENT), 35 | (ROUTER_ABI, ROUTER_TOKENS_SWAP_CALL_INPUT, ROUTER_TOKENS_SWAP_CALL_ARGUMENT), 36 | ( 37 | SEAPORT_ABI, 38 | SEAPORT_FULFILL_ORDER_CALL_INPUT, 39 | SEAPORT_FULFILL_ORDER_CALL_ARGUMENT, 40 | ), 41 | ], 42 | ids=[ 43 | "storage", 44 | "tether", 45 | "router-swap", 46 | "router-tokens-swap", 47 | "seaport-fulfill-order", 48 | ], 49 | ) 50 | def test_decode_function(abi, input, expected): 51 | assert decode_function(abi, input) == expected 52 | -------------------------------------------------------------------------------- /web3_input_decoder/__init__.py: -------------------------------------------------------------------------------- 1 | from typing import Any, Optional, Union 2 | 3 | from .decoder import InputDecoder 4 | 5 | __all__ = ( 6 | "decode_constructor", 7 | "decode_function", 8 | "InputDecoder", 9 | ) 10 | 11 | 12 | def decode_constructor( 13 | abi: list[dict], 14 | tx_input: Union[str, bytes], 15 | bytecode: Optional[Union[str, bytes]] = None, 16 | ) -> list[tuple[str, str, Any]]: 17 | """Decode constructor transaction input 18 | 19 | Parameters 20 | ---------- 21 | abi: list[dict] 22 | Contract ABI 23 | tx_input: Union[str, bytes] 24 | Transaction input to decode, with or without deployed contract bytecode 25 | bytecode: Union[str, bytes], optional 26 | Optional deployed contract bytecode. If this is set, `tx_input` should include bytecode 27 | 28 | Returns 29 | ------- 30 | list[tuple[str, str, Any]] 31 | Decoded type-name-value tuples 32 | """ 33 | decoder = InputDecoder(abi) # type:ignore[arg-type] 34 | return decoder.decode_constructor(tx_input, bytecode).arguments 35 | 36 | 37 | def decode_function( 38 | abi: list[dict], tx_input: Union[str, bytes] 39 | ) -> list[tuple[str, str, Any]]: 40 | """Decode function transaction input 41 | 42 | Parameters 43 | ---------- 44 | abi: list[dict] 45 | Contract ABI 46 | tx_input: Union[str, bytes] 47 | Transaction input to decode 48 | 49 | Returns 50 | ------- 51 | list[tuple[str, str, Any]] 52 | Decoded type-name-value tuples 53 | """ 54 | decoder = InputDecoder(abi) # type:ignore[arg-type] 55 | return decoder.decode_function(tx_input).arguments 56 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "web3-input-decoder" 3 | version = "0.1.15" 4 | # doc 5 | authors = ["Weiliang Li "] 6 | description = "A simple offline web3 transaction input decoder for functions and constructors" 7 | license = "MIT" 8 | maintainers = ["Weiliang Li "] 9 | readme = "README.md" 10 | repository = "https://github.com/kigawas/web3-input-decoder" 11 | # tags 12 | classifiers = [ 13 | "Development Status :: 4 - Beta", 14 | "Intended Audience :: Developers", 15 | "Natural Language :: English", 16 | "Programming Language :: Python :: Implementation :: CPython", 17 | "Operating System :: OS Independent", 18 | ] 19 | keywords = [ 20 | "ethereum", 21 | "web3", 22 | ] 23 | # package data: PEP-561 24 | include = ["web3_input_decoder/py.typed"] 25 | 26 | [tool.poetry.dependencies] 27 | python = "^3.9" 28 | typing-extensions = {version = ">=4.5.0", python = "<3.11"} 29 | 30 | # 3rd party 31 | eth-abi = "^5.0.1" 32 | eth-utils = ">=2.0.0" 33 | pycryptodome = ">=3.18.0" 34 | 35 | [tool.poetry.group.dev.dependencies] 36 | ipython = {version = "^9.5.0", python = "^3.11"} 37 | ruff = "^0.13.0" 38 | ty = "^0.0.1a20" 39 | 40 | # stubs 41 | eth-typing = "^5.2.1" 42 | 43 | [tool.poetry.group.test.dependencies] 44 | pyinstrument = "^5.1.1" 45 | pytest = "^8.4.1" 46 | pytest-cov = "^7.0.0" 47 | 48 | [build-system] 49 | build-backend = "poetry.core.masonry.api" 50 | requires = ["poetry-core>=1.0.0"] 51 | 52 | [tool.pytest.ini_options] 53 | addopts = "--cov=web3_input_decoder" 54 | 55 | [tool.coverage.report] 56 | exclude_lines = [ 57 | "pragma: no cover", 58 | "@abstract", 59 | "raise NotImplementedError", 60 | "if __name__ == .__main__.", 61 | 'from typing_extensions import NotRequired, TypedDict', 62 | ] 63 | -------------------------------------------------------------------------------- /tests/test_decode_error.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from web3_input_decoder import decode_constructor, decode_function 4 | from web3_input_decoder.exceptions import InputDataError 5 | 6 | from .data.defi import ROUTER_V2_ABI, ROUTER_V2_TOKENS_SWAP_CALL_ERROR_INPUT 7 | from .data.example import EXAMPLE_ABI, EXAMPLE_CONSTRUCTOR_CALL_INPUT 8 | from .data.storage import STORAGE_ABI, STORAGE_CONSTRUCTOR_CALL_INPUT 9 | from .data.tether import TETHER_ABI 10 | 11 | INVALID_ABI = [{"inputs": [], "type": "function", "name": "test"}] 12 | INVALID_CALL_INPUT = "0x00" 13 | 14 | UNABLE_TO_DETECT = "Unable to detect arguments including array" 15 | CONSTRUCTOR_NOT_FOUND = "Constructor is not found in ABI" 16 | METHOD_NOT_FOUND = "Specified method is not found in ABI" 17 | INVALID_INPUT = "Invalid input" 18 | 19 | 20 | @pytest.mark.parametrize( 21 | "abi,input,match", 22 | [ 23 | (INVALID_ABI, INVALID_CALL_INPUT, CONSTRUCTOR_NOT_FOUND), 24 | (EXAMPLE_ABI, EXAMPLE_CONSTRUCTOR_CALL_INPUT, UNABLE_TO_DETECT), 25 | (STORAGE_ABI, STORAGE_CONSTRUCTOR_CALL_INPUT, UNABLE_TO_DETECT), 26 | ], 27 | ids=["invalid", "example", "storage"], 28 | ) 29 | def test_decode_constructor_error(abi, input, match): 30 | with pytest.raises(InputDataError, match=match): 31 | decode_constructor(abi, input) 32 | 33 | 34 | @pytest.mark.parametrize( 35 | "abi,input,match", 36 | [ 37 | (TETHER_ABI, INVALID_CALL_INPUT, METHOD_NOT_FOUND), 38 | (INVALID_ABI, INVALID_CALL_INPUT, METHOD_NOT_FOUND), 39 | (ROUTER_V2_ABI, ROUTER_V2_TOKENS_SWAP_CALL_ERROR_INPUT, INVALID_INPUT), 40 | ], 41 | ids=["tether", "invalid", "router-v2-tokens-swap"], 42 | ) 43 | def test_decode_function_error(abi, input, match): 44 | with pytest.raises(InputDataError, match=match): 45 | decode_function(abi, input) 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | junit.xml 47 | *.cover 48 | .hypothesis/ 49 | .pytest_cache/ 50 | 51 | # Translations 52 | *.mo 53 | *.pot 54 | 55 | # Django stuff: 56 | *.log 57 | local_settings.py 58 | db.sqlite3 59 | 60 | # Flask stuff: 61 | instance/ 62 | .webassets-cache 63 | 64 | # Scrapy stuff: 65 | .scrapy 66 | 67 | # Sphinx documentation 68 | docs/_build/ 69 | 70 | # PyBuilder 71 | target/ 72 | 73 | # Jupyter Notebook 74 | .ipynb_checkpoints 75 | 76 | # pyenv 77 | .python-version 78 | 79 | # celery beat schedule file 80 | celerybeat-schedule 81 | 82 | # SageMath parsed files 83 | *.sage.py 84 | 85 | # Environments 86 | .env 87 | .venv 88 | env/ 89 | venv/ 90 | ENV/ 91 | env.bak/ 92 | venv.bak/ 93 | 94 | # Spyder project settings 95 | .spyderproject 96 | .spyproject 97 | 98 | # Rope project settings 99 | .ropeproject 100 | 101 | # mkdocs documentation 102 | /site 103 | 104 | # dev 105 | .mypy_cache/ 106 | .ruff_cache/ 107 | 108 | .vscode/ 109 | .DS_Store 110 | -------------------------------------------------------------------------------- /tests/test_decode_constructor.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from web3_input_decoder import decode_constructor 4 | 5 | from .data.caller import ( 6 | CALLER_ABI, 7 | CALLER_CONSTRUCTOR_CALL_ARGUMENT, 8 | CALLER_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE, 9 | ) 10 | from .data.example import ( 11 | EXAMPLE_ABI, 12 | EXAMPLE_BYTECODE, 13 | EXAMPLE_CONSTRUCTOR_CALL_ARGUMENT, 14 | EXAMPLE_CONSTRUCTOR_CALL_INPUT, 15 | EXAMPLE_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE, 16 | ) 17 | from .data.storage import ( 18 | STORAGE_ABI, 19 | STORAGE_BYTECODE, 20 | STORAGE_CONSTRUCTOR_CALL_ARGUMENT, 21 | STORAGE_CONSTRUCTOR_CALL_INPUT, 22 | ) 23 | from .data.tether import ( 24 | TETHER_ABI, 25 | TETHER_BYTECODE, 26 | TETHER_CONSTRUCTOR_CALL_ARGUMENT, 27 | TETHER_CONSTRUCTOR_CALL_INPUT, 28 | TETHER_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE, 29 | ) 30 | 31 | 32 | @pytest.mark.parametrize( 33 | "abi,input,expected", 34 | [ 35 | ( 36 | TETHER_ABI, 37 | TETHER_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE, 38 | TETHER_CONSTRUCTOR_CALL_ARGUMENT, 39 | ), 40 | ( 41 | CALLER_ABI, 42 | CALLER_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE, 43 | CALLER_CONSTRUCTOR_CALL_ARGUMENT, 44 | ), 45 | ( 46 | EXAMPLE_ABI, 47 | EXAMPLE_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE, 48 | EXAMPLE_CONSTRUCTOR_CALL_ARGUMENT, 49 | ), 50 | ], 51 | ids=["tether", "caller", "example"], 52 | ) 53 | def test_decode_constructor_without_bytecode(abi, input, expected): 54 | assert decode_constructor(abi, input) == expected 55 | 56 | 57 | @pytest.mark.parametrize( 58 | "abi,input,bytecode,expected", 59 | [ 60 | ( 61 | TETHER_ABI, 62 | TETHER_CONSTRUCTOR_CALL_INPUT, 63 | TETHER_BYTECODE, 64 | TETHER_CONSTRUCTOR_CALL_ARGUMENT, 65 | ), 66 | ( 67 | EXAMPLE_ABI, 68 | EXAMPLE_CONSTRUCTOR_CALL_INPUT, 69 | EXAMPLE_BYTECODE, 70 | EXAMPLE_CONSTRUCTOR_CALL_ARGUMENT, 71 | ), 72 | ( 73 | STORAGE_ABI, 74 | STORAGE_CONSTRUCTOR_CALL_INPUT, 75 | STORAGE_BYTECODE, 76 | STORAGE_CONSTRUCTOR_CALL_ARGUMENT, 77 | ), 78 | ], 79 | ids=["tether", "example", "storage"], 80 | ) 81 | def test_decode_constructor_with_bytecode(abi, input, bytecode, expected): 82 | assert decode_constructor(abi, input, bytecode) == expected 83 | -------------------------------------------------------------------------------- /web3_input_decoder/decoder.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass 2 | from typing import Any, Optional, Union 3 | 4 | from eth_abi.exceptions import DecodingError 5 | 6 | from .exceptions import ( 7 | CONSTRUCTOR_NOT_FOUND, 8 | INVALID_INPUT, 9 | METHOD_NOT_FOUND, 10 | InputDataError, 11 | ) 12 | from .types import Abi, Input 13 | from .utils import ( 14 | decode_input, 15 | detect_constructor_arguments, 16 | get_constructor_type, 17 | get_selector_to_function_type, 18 | hex_to_bytes, 19 | ) 20 | 21 | __all__ = ( 22 | "ContractCall", 23 | "InputDecoder", 24 | ) 25 | 26 | 27 | @dataclass(frozen=True) 28 | class ContractCall: 29 | name: str 30 | arguments: list[tuple[str, str, Any]] 31 | 32 | @classmethod 33 | def decode(cls, func_name: str, inputs: list[Input], func_args: bytes): 34 | try: 35 | types, names, values = decode_input(inputs, func_args) 36 | return cls(func_name, list(zip(types, names, values))) 37 | except (DecodingError, OverflowError): 38 | raise INVALID_INPUT 39 | 40 | 41 | class InputDecoder: 42 | __slots__ = ["_constructor_type", "_selector_to_func_type"] 43 | 44 | def __init__(self, abi: Abi): 45 | self._constructor_type = get_constructor_type(abi) 46 | self._selector_to_func_type = get_selector_to_function_type(abi) 47 | 48 | def decode_function(self, tx_input: Union[str, bytes]): 49 | tx_input = hex_to_bytes(tx_input) 50 | selector, func_args = tx_input[:4], tx_input[4:] 51 | type_def = self._selector_to_func_type.get(selector, None) 52 | if not type_def: 53 | raise METHOD_NOT_FOUND 54 | 55 | return ContractCall.decode(type_def["name"], type_def["inputs"], func_args) 56 | 57 | def decode_constructor( 58 | self, 59 | tx_input: Union[str, bytes], 60 | bytecode: Optional[Union[str, bytes]] = None, 61 | ): 62 | tx_input = hex_to_bytes(tx_input) 63 | if not self._constructor_type: 64 | raise CONSTRUCTOR_NOT_FOUND 65 | 66 | func_name = "constructor" 67 | inputs = self._constructor_type["inputs"] 68 | 69 | if bytecode is not None: 70 | # bytecode is provided => assuming tx input has bytecode 71 | func_args = tx_input[len(hex_to_bytes(bytecode)) :] 72 | else: 73 | try: 74 | # if tx_input has no bytecode, it may just succeed 75 | return ContractCall.decode(func_name, inputs, tx_input) 76 | except (DecodingError, InputDataError): 77 | # tx input has bytecode and bytecode is not provided => detect 78 | pass 79 | 80 | func_args = detect_constructor_arguments(self._constructor_type, tx_input) 81 | 82 | return ContractCall.decode(func_name, inputs, func_args) 83 | -------------------------------------------------------------------------------- /web3_input_decoder/utils/parse.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from typing import Any, Optional 4 | 5 | from eth_abi.abi import decode, encode 6 | from eth_utils.abi import function_abi_to_4byte_selector 7 | 8 | from ..exceptions import UNABLE_TO_DETECT_CONSTRUCTOR_ARGUMENTS 9 | from ..types import Abi, ConstructorType, FunctionType, Input 10 | 11 | 12 | def get_constructor_type(abi: Abi) -> Optional[ConstructorType]: 13 | for type_def in abi: 14 | if type_def["type"] == "constructor": 15 | return type_def 16 | return None 17 | 18 | 19 | def get_selector_to_function_type(abi: Abi) -> dict[bytes, FunctionType]: 20 | type_defs = {} 21 | for type_def in abi: 22 | if type_def["type"] == "function": 23 | selector = function_abi_to_4byte_selector(type_def) # type:ignore[arg-type] 24 | type_defs[selector] = type_def 25 | return type_defs 26 | 27 | 28 | def detect_constructor_arguments(type_def: ConstructorType, data_with_bytecode: bytes): 29 | inputs = type_def["inputs"] # TODO: remove this from 0.2.0 30 | has_array, default_args = get_default_arguments(inputs) 31 | if has_array: 32 | raise UNABLE_TO_DETECT_CONSTRUCTOR_ARGUMENTS 33 | return data_with_bytecode[-len(default_args) :] 34 | 35 | 36 | def get_default_arguments(inputs: list[Input]): 37 | types, _ = get_types_names(inputs) 38 | default_values: list[Any] = [] 39 | has_array = False 40 | for t in types: 41 | if t.endswith("[]"): 42 | default_values.append([]) 43 | has_array = True 44 | elif "int" in t: 45 | default_values.append(0) 46 | elif "string" == t: 47 | default_values.append("0") 48 | elif "bool" == t: 49 | default_values.append(False) 50 | elif "address" == t: 51 | default_values.append("0x0000000000000000000000000000000000000000") 52 | else: 53 | raise NotImplementedError(f"Type {t} is not implemented yet") 54 | 55 | return has_array, encode(types, default_values) 56 | 57 | 58 | def decode_input(inputs: list[Input], func_args: bytes): 59 | types, names = get_types_names(inputs) 60 | values = decode(types, func_args) 61 | return types, names, values 62 | 63 | 64 | def get_types_names(inputs: list[Input]) -> tuple[list[str], list[str]]: 65 | types = [] 66 | for t in inputs: 67 | if t["type"] == "tuple": 68 | types.append(__expand_tuple_types(t)) 69 | elif t["type"] == "tuple[]": 70 | types.append(f"{__expand_tuple_types(t)}[]") 71 | else: 72 | types.append(t["type"]) 73 | 74 | names = [t["name"] for t in inputs] 75 | return types, names 76 | 77 | 78 | def __expand_tuple_types(input: Input) -> str: 79 | if "components" not in input: 80 | # impossible, should have failed earlier in eth-utils 81 | raise NotImplementedError 82 | types = [] 83 | for component in input["components"]: 84 | if "components" not in component: 85 | types.append(component["type"]) 86 | elif component["type"] == "tuple[]": 87 | types.append(f"{__expand_tuple_types(component)}[]") 88 | else: 89 | types.append(__expand_tuple_types(component)) 90 | types_str = ",".join(types) 91 | return f"({types_str})" 92 | -------------------------------------------------------------------------------- /tests/data/example.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from web3_input_decoder.types import Abi 4 | 5 | # Made with Remix IDE 6 | """ 7 | // SPDX-License-Identifier: GPL-3.0 8 | 9 | pragma solidity >=0.7.0 <0.9.0; 10 | 11 | contract Storage { 12 | enum Enum {A, B, C, D} 13 | 14 | uint256 number; 15 | bool enable; 16 | string s; 17 | address[] addrs; 18 | Enum e; 19 | address addr; 20 | 21 | 22 | constructor(uint256 num, bool _enable, string memory _s, address[] memory _addrs, Enum _e, address _addr) { 23 | number = num; 24 | enable = _enable; 25 | s = _s; 26 | addrs = _addrs; 27 | e = _e; 28 | addr = _addr; 29 | } 30 | } 31 | """ 32 | 33 | EXAMPLE_ABI: Abi = [ 34 | { 35 | "inputs": [ 36 | {"internalType": "uint256", "name": "num", "type": "uint256"}, 37 | {"internalType": "bool", "name": "_enable", "type": "bool"}, 38 | {"internalType": "string", "name": "_s", "type": "string"}, 39 | {"internalType": "address[]", "name": "_addrs", "type": "address[]"}, 40 | {"internalType": "enum Storage.Enum", "name": "_e", "type": "uint8"}, 41 | {"internalType": "address", "name": "_addr", "type": "address"}, 42 | ], 43 | "stateMutability": "nonpayable", 44 | "type": "constructor", 45 | } 46 | ] 47 | EXAMPLE_BYTECODE = "0x608060405234801561001057600080fd5b50604051610353380380610353833981810160405260c081101561003357600080fd5b8151602083015160408085018051915193959294830192918464010000000082111561005e57600080fd5b90830190602082018581111561007357600080fd5b825164010000000081118282018810171561008d57600080fd5b82525081516020918201929091019080838360005b838110156100ba5781810151838201526020016100a2565b50505050905090810190601f1680156100e75780820380516001836020036101000a031916815260200191505b506040526020018051604051939291908464010000000082111561010a57600080fd5b90830190602082018581111561011f57600080fd5b825186602082028301116401000000008211171561013c57600080fd5b82525081516020918201928201910280838360005b83811015610169578181015183820152602001610151565b50505050919091016040908152602083810151939091015160008a90556001805460ff19168a1515179055875193955093506101ac926002925090870190610210565b5082516101c090600390602086019061029c565b506004805483919060ff191660018360038111156101da57fe5b0217905550600480546001600160a01b0390921661010002610100600160a81b0319909216919091179055506103069350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282610246576000855561028c565b82601f1061025f57805160ff191683800117855561028c565b8280016001018555821561028c579182015b8281111561028c578251825591602001919060010190610271565b506102989291506102f1565b5090565b82805482825590600052602060002090810192821561028c579160200282015b8281111561028c57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906102bc565b5b8082111561029857600081556001016102f2565b603f806103146000396000f3fe6080604052600080fdfea2646970667358221220a75435b85057a239995042116d1f84a8c1d97199bcc159a3927fccf5b9bb703364736f6c63430007060033" 48 | EXAMPLE_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE = "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036161610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" 49 | EXAMPLE_CONSTRUCTOR_CALL_INPUT = ( 50 | EXAMPLE_BYTECODE + EXAMPLE_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE[2:] 51 | ) 52 | EXAMPLE_CONSTRUCTOR_CALL_ARGUMENT = [ 53 | ("uint256", "num", 0), 54 | ("bool", "_enable", False), 55 | ("string", "_s", "aaa"), 56 | ( 57 | "address[]", 58 | "_addrs", 59 | ( 60 | "0x0000000000000000000000000000000000000000", 61 | "0x0000000000000000000000000000000000000001", 62 | ), 63 | ), 64 | ("uint8", "_e", 0), 65 | ("address", "_addr", "0x0000000000000000000000000000000000000002"), 66 | ] 67 | -------------------------------------------------------------------------------- /tests/data/defi.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from web3_input_decoder.types import Abi 4 | 5 | ROUTER_ABI: Abi = [ 6 | { 7 | "name": "swapExactAVAXForTokens", 8 | "type": "function", 9 | "inputs": [ 10 | {"name": "amountOutMin", "type": "uint256"}, 11 | {"name": "path", "type": "address[]"}, 12 | {"name": "to", "type": "address"}, 13 | {"name": "deadline", "type": "uint256"}, 14 | ], 15 | "outputs": [{"name": "amounts", "type": "uint256[]"}], 16 | "stateMutability": "payable", 17 | }, 18 | { 19 | "inputs": [ 20 | {"internalType": "uint256", "name": "amountIn", "type": "uint256"}, 21 | {"internalType": "uint256", "name": "amountOutMin", "type": "uint256"}, 22 | { 23 | "components": [ 24 | {"internalType": "address", "name": "from", "type": "address"}, 25 | {"internalType": "address", "name": "to", "type": "address"}, 26 | {"internalType": "bool", "name": "stable", "type": "bool"}, 27 | ], 28 | "internalType": "struct BaseV1Router01.route[]", 29 | "name": "routes", 30 | "type": "tuple[]", 31 | }, 32 | {"internalType": "address", "name": "to", "type": "address"}, 33 | {"internalType": "uint256", "name": "deadline", "type": "uint256"}, 34 | ], 35 | "name": "swapExactTokensForTokens", 36 | "outputs": [ 37 | {"internalType": "uint256[]", "name": "amounts", "type": "uint256[]"} 38 | ], 39 | "stateMutability": "nonpayable", 40 | "type": "function", 41 | }, 42 | ] 43 | 44 | # tx: 0x921d1b904d042b6d0f2444ffab361894495642466d9c3fe997feed0dac84ed82 45 | ROUTER_SWAP_CALL_INPUT = "0xa2a1623d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000006ef4158bf7304b966929945248927fb400ece8b500000000000000000000000000000000000000000000000000000000622bc5e10000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c70000000000000000000000003df307e8e9a897da488211682430776cdf0f17cc" 46 | ROUTER_SWAP_CALL_ARGUMENT = [ 47 | ("uint256", "amountOutMin", 0), 48 | ( 49 | "address[]", 50 | "path", 51 | ( 52 | "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7", 53 | "0x3df307e8e9a897da488211682430776cdf0f17cc", 54 | ), 55 | ), 56 | ("address", "to", "0x6ef4158bf7304b966929945248927fb400ece8b5"), 57 | ("uint256", "deadline", 1647035873), 58 | ] 59 | 60 | ROUTER_TOKENS_SWAP_CALL_INPUT = "0xf41766d80000000000000000000000000000000000000000000000000000000002dc6c000000000000000000000000000000000000000000000000001bbc2e22c5c1c2cb00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000007c77b132a0cd0ad1c694ab8645affa26c2787d6600000000000000000000000000000000000000000000000000000000636aaa2f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ea32a96608495e54156ae48931a7c20f0dcc1a21000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead00000000000000000000000000000000000000000000000000000000000000000000" 61 | ROUTER_TOKENS_SWAP_CALL_ARGUMENT = [ 62 | ("uint256", "amountIn", 48000000), 63 | ("uint256", "amountOutMin", 1998523061527233227), 64 | ( 65 | "(address,address,bool)[]", 66 | "routes", 67 | ( 68 | ( 69 | "0xea32a96608495e54156ae48931a7c20f0dcc1a21", 70 | "0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000", 71 | False, 72 | ), 73 | ), 74 | ), 75 | ("address", "to", "0x7c77b132a0cd0ad1c694ab8645affa26c2787d66"), 76 | ("uint256", "deadline", 1667934767), 77 | ] 78 | 79 | ROUTER_V2_ABI = [ 80 | { 81 | "inputs": [ 82 | {"internalType": "uint256", "name": "amountIn", "type": "uint256"}, 83 | {"internalType": "uint256", "name": "amountOutMin", "type": "uint256"}, 84 | {"internalType": "address[]", "name": "path", "type": "address[]"}, 85 | {"internalType": "address", "name": "to", "type": "address"}, 86 | {"internalType": "uint256", "name": "deadline", "type": "uint256"}, 87 | ], 88 | "name": "swapExactTokensForTokens", 89 | "outputs": [ 90 | {"internalType": "uint256[]", "name": "amounts", "type": "uint256[]"} 91 | ], 92 | "stateMutability": "nonpayable", 93 | "type": "function", 94 | } 95 | ] 96 | ROUTER_V2_TOKENS_SWAP_CALL_ERROR_INPUT = "0x38ed1739000200000000000007e3e9b4130e0a0000000000000000031c4b60a9d6004e6bbf3a9d39ef65058149a3fcd9e7b74f1d3a9907d000000000001db6bd61ebf584aa5501e4bd310ce3a2fa9b6b93734a9f62f11e39ccc6ad09c400000000000007e705ff73b7e00000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c" 97 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # web3-input-decoder 2 | 3 | [![Codacy Badge](https://app.codacy.com/project/badge/Grade/6f10d5104ef4464797ee94b17c7b9371)](https://www.codacy.com/gh/kigawas/web3-input-decoder/dashboard) 4 | [![CI](https://img.shields.io/github/actions/workflow/status/kigawas/web3-input-decoder/ci.yml)](https://github.com/kigawas/web3-input-decoder/actions) 5 | [![Codecov](https://img.shields.io/codecov/c/github/kigawas/web3-input-decoder.svg)](https://codecov.io/gh/kigawas/web3-input-decoder) 6 | [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/web3-input-decoder.svg)](https://pypi.org/project/web3-input-decoder/) 7 | [![PyPI](https://img.shields.io/pypi/v/web3-input-decoder.svg)](https://pypi.org/project/web3-input-decoder/) 8 | [![License](https://img.shields.io/github/license/kigawas/web3-input-decoder.svg)](https://github.com/kigawas/web3-input-decoder) 9 | 10 | A simple offline web3 transaction input decoder for functions and constructors. 11 | 12 | ## Install 13 | 14 | ```bash 15 | pip install web3-input-decoder 16 | ``` 17 | 18 | ## Quick start 19 | 20 | Let's take a [USDT transfer transaction](https://etherscan.io/tx/0x0331fdfa070ee26b1fc7b01b246ef5e58593cbe9f4a02f7f09bf4a2aa640cf35) and the [USDT contract creator transaction](https://etherscan.io/address/0xdac17f958d2ee523a2206206994597c13d831ec7#code) as an example: 21 | 22 | ```python 23 | >>> import json 24 | >>> import urllib.request 25 | >>> from web3_input_decoder import decode_constructor, decode_function 26 | >>> f = urllib.request.urlopen("https://api.etherscan.io/api?module=contract&action=getabi&address=0xdac17f958d2ee523a2206206994597c13d831ec7") 27 | >>> TETHER_ABI = json.loads(json.load(f)["result"]) 28 | >>> decode_function( 29 | TETHER_ABI, "0xa9059cbb000000000000000000000000f050227be1a7ce587aa83d5013f900dbc3be0611000000000000000000000000000000000000000000000000000000000ecdd350", 30 | ) 31 | [('address', '_to', '0xf050227be1a7ce587aa83d5013f900dbc3be0611'), 32 | ('uint256', '_value', 248370000)] 33 | >>> decode_constructor( 34 | TETHER_ABI, "000000000000000000000000000000000000000000000000000000174876e800000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a546574686572205553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000" 35 | ) 36 | [('uint256', '_initialSupply', 100000000000), 37 | ('string', '_name', 'Tether USD'), 38 | ('string', '_symbol', 'USDT'), 39 | ('uint256', '_decimals', 6)] 40 | ``` 41 | 42 | You can also play with it [here](https://replit.com/@kigawas/Web3-input-decoder-quick-start). 43 | 44 | ### Performance enhancement 45 | 46 | If you have lots of inputs in the same contract to decode, consider using [`InputDecoder`](web3_input_decoder/decoder.py#L41). 47 | 48 | ```python 49 | >>> from web3_input_decoder import InputDecoder 50 | >>> decoder = InputDecoder(TETHER_ABI) 51 | >>> for _ in range(10000): 52 | >>> decoder.decode_function( 53 | ( 54 | "0xa9059cbb000000000000000000000000f050227be1a7ce587aa83d5013f900dbc3b" 55 | "e0611000000000000000000000000000000000000000000000000000000000ecdd350" 56 | ), 57 | ) 58 | ``` 59 | 60 | ## API 61 | 62 | - [`decode_constructor`](web3_input_decoder/__init__.py#L12) 63 | 64 | ```python 65 | def decode_constructor( 66 | abi: list[dict], 67 | tx_input: Union[str, bytes], 68 | bytecode: Optional[Union[str, bytes]] = None, 69 | ) -> list[tuple[str, str, Any]] 70 | ``` 71 | 72 | **Parameters**: 73 | 74 | - `abi`: Contract ABI 75 | - `tx_input`: Transaction input to decode, with or without deployed contract bytecode 76 | - `bytecode`: Optional deployed contract bytecode. If this is set, `tx_input` should include bytecode 77 | 78 | **Returns**: 79 | 80 | - `list[tuple[str, str, Any]]`: Decoded type-name-value tuples 81 | 82 | - [`decode_function`](web3_input_decoder/__init__.py#L37) 83 | 84 | ```python 85 | def decode_function( 86 | abi: list[dict], tx_input: Union[str, bytes] 87 | ) -> list[tuple[str, str, Any]] 88 | ``` 89 | 90 | **Parameters**: 91 | 92 | - `abi`: Contract ABI 93 | - `tx_input`: Transaction input to decode 94 | 95 | **Returns**: 96 | 97 | - `list[tuple[str, str, Any]]`: Decoded type-name-value tuples 98 | 99 | ## Rationale 100 | 101 | Existing solutions are not satisfying to me, e.g.: 102 | 103 | 1. [web3py](https://web3py.readthedocs.io/en/latest/web3.contract.html#web3.contract.Contract.decode_function_input) can only decode function calls and it's necessary to be online to set up a provider first. 104 | 2. [ethereum-input-decoder](https://github.com/tintinweb/ethereum-input-decoder) is not maintained and it contains several glitches. 105 | -------------------------------------------------------------------------------- /tests/data/nft.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from web3_input_decoder.types import Abi 4 | 5 | # Contract: 0x00000000006c3852cbef3e08e8df289169ede581 6 | SEAPORT_ABI: Abi = [ 7 | { 8 | "inputs": [ 9 | { 10 | "components": [ 11 | { 12 | "internalType": "address", 13 | "name": "considerationToken", 14 | "type": "address", 15 | }, 16 | { 17 | "internalType": "uint256", 18 | "name": "considerationIdentifier", 19 | "type": "uint256", 20 | }, 21 | { 22 | "internalType": "uint256", 23 | "name": "considerationAmount", 24 | "type": "uint256", 25 | }, 26 | { 27 | "internalType": "address payable", 28 | "name": "offerer", 29 | "type": "address", 30 | }, 31 | {"internalType": "address", "name": "zone", "type": "address"}, 32 | { 33 | "internalType": "address", 34 | "name": "offerToken", 35 | "type": "address", 36 | }, 37 | { 38 | "internalType": "uint256", 39 | "name": "offerIdentifier", 40 | "type": "uint256", 41 | }, 42 | { 43 | "internalType": "uint256", 44 | "name": "offerAmount", 45 | "type": "uint256", 46 | }, 47 | { 48 | "internalType": "enum BasicOrderType", 49 | "name": "basicOrderType", 50 | "type": "uint8", 51 | }, 52 | {"internalType": "uint256", "name": "startTime", "type": "uint256"}, 53 | {"internalType": "uint256", "name": "endTime", "type": "uint256"}, 54 | {"internalType": "bytes32", "name": "zoneHash", "type": "bytes32"}, 55 | {"internalType": "uint256", "name": "salt", "type": "uint256"}, 56 | { 57 | "internalType": "bytes32", 58 | "name": "offererConduitKey", 59 | "type": "bytes32", 60 | }, 61 | { 62 | "internalType": "bytes32", 63 | "name": "fulfillerConduitKey", 64 | "type": "bytes32", 65 | }, 66 | { 67 | "internalType": "uint256", 68 | "name": "totalOriginalAdditionalRecipients", 69 | "type": "uint256", 70 | }, 71 | { 72 | "components": [ 73 | { 74 | "internalType": "uint256", 75 | "name": "amount", 76 | "type": "uint256", 77 | }, 78 | { 79 | "internalType": "address payable", 80 | "name": "recipient", 81 | "type": "address", 82 | }, 83 | ], 84 | "internalType": "struct AdditionalRecipient[]", 85 | "name": "additionalRecipients", 86 | "type": "tuple[]", 87 | }, 88 | {"internalType": "bytes", "name": "signature", "type": "bytes"}, 89 | ], 90 | "internalType": "struct BasicOrderParameters", 91 | "name": "parameters", 92 | "type": "tuple", 93 | } 94 | ], 95 | "name": "fulfillBasicOrder", 96 | "outputs": [{"internalType": "bool", "name": "fulfilled", "type": "bool"}], 97 | "stateMutability": "payable", 98 | "type": "function", 99 | }, 100 | ] 101 | 102 | # TX: 0xa139231454fd021dd227a94fff6a1b6260890bb95e5f5bf8517af36e228575e6 103 | SEAPORT_FULFILL_ORDER_CALL_INPUT = ( 104 | "0xfb0f3ee1000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000" 105 | "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" 106 | "00000000000000000000000000000000000000000003b53d9d99ecb800000000000000000000000000001850dd8fb9323b01c34" 107 | "0d0eb1da1ec16cc8ee1a2000000000000000000000000004c00500000ad104d7dbd00e3ae0a5c00560c00000000000000000000" 108 | "000000bc4ca0eda7647a8ab7c2061c2e118a18a936f13d000000000000000000000000000000000000000000000000000000000" 109 | "0000561000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000" 110 | "00000000000000000000000000000002000000000000000000000000000000000000000000000000000000006346e1d20000000" 111 | "0000000000000000000000000000000000000000000000000636fadcd0000000000000000000000000000000000000000000000" 112 | "000000000000000000360c6ebe00000000000000000000000000000000000000000589c7ee474bc5850000007b02230091a7ed0" 113 | "1230072f7006a004d60a8d4e71d599b8104250f00000000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f" 114 | "0000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000" 115 | "0000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002e00000000000" 116 | "0000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000001" 117 | "8fae27693b400000000000000000000000000000000a26b00c1f0df003000390027140000faa719000000000000000000000000" 118 | "00000000000000000000000018fae27693b40000000000000000000000000000a858ddc0445d8131dac4d1de01f834ffcba52ef" 119 | "10000000000000000000000000000000000000000000000000000000000000041046bd0fda5b934a96ef4700da1b64e03e7451e" 120 | "6a6ee45a5004b93823ff3baae34b9f1c4f667781b5fedd27dc67339d4fd3e4ae2a873b315090e6312853732f9a1c00000000000" 121 | "000000000000000000000000000000000000000000000000000360c6ebe" 122 | ) 123 | SEAPORT_FULFILL_ORDER_CALL_ARGUMENT = [ 124 | ( 125 | "(address,uint256,uint256,address,address,address,uint256,uint256,uint8,uint256,uint256,bytes32,uint256,bytes32,bytes32,uint256,(uint256,address)[],bytes)", 126 | "parameters", 127 | ( 128 | "0x0000000000000000000000000000000000000000", 129 | 0, 130 | 68400000000000000000, 131 | "0x1850dd8fb9323b01c340d0eb1da1ec16cc8ee1a2", 132 | "0x004c00500000ad104d7dbd00e3ae0a5c00560c00", 133 | "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d", 134 | 1377, 135 | 1, 136 | 2, 137 | 1665589714, 138 | 1668263373, 139 | b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 140 | 24446860302761739304752683030156737591518664810215442929800781758303463785861, 141 | b"\x00\x00\x00{\x02#\x00\x91\xa7\xed\x01#\x00r\xf7\x00j\x00M`\xa8\xd4\xe7\x1dY\x9b\x81\x04%\x0f\x00\x00", 142 | b"\x00\x00\x00{\x02#\x00\x91\xa7\xed\x01#\x00r\xf7\x00j\x00M`\xa8\xd4\xe7\x1dY\x9b\x81\x04%\x0f\x00\x00", 143 | 2, 144 | ( 145 | (1800000000000000000, "0x0000a26b00c1f0df003000390027140000faa719"), 146 | (1800000000000000000, "0xa858ddc0445d8131dac4d1de01f834ffcba52ef1"), 147 | ), 148 | bytes.fromhex( 149 | "046bd0fda5b934a96ef4700da1b64e03e7451e6a6ee45a5004b93823ff3baae34b9f1c4f667781b5fedd27dc67339d4fd3e4ae2a873b315090e6312853732f9a1c" 150 | ), 151 | ), 152 | ) 153 | ] 154 | -------------------------------------------------------------------------------- /tests/data/storage.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from web3_input_decoder.types import Abi 4 | 5 | # Made with Remix IDE 6 | 7 | """ 8 | pragma solidity >=0.7.0 <0.9.0; 9 | 10 | contract Storage { 11 | 12 | uint256[] numbers; 13 | struct S {uint a; uint b;} 14 | struct T {uint a; S s;} 15 | 16 | constructor (uint256[] memory _nums) { 17 | numbers = _nums; 18 | } 19 | 20 | function retrieve() public view returns (uint256[] memory){ 21 | return numbers; 22 | } 23 | 24 | function parseT(T memory t) public pure returns (uint, uint, uint) { 25 | return (t.a, t.s.a, t.s.b); 26 | } 27 | } 28 | """ 29 | 30 | STORAGE_ABI: Abi = [ 31 | { 32 | "inputs": [{"internalType": "uint256[]", "name": "_nums", "type": "uint256[]"}], 33 | "stateMutability": "nonpayable", 34 | "type": "constructor", 35 | }, 36 | { 37 | "inputs": [], 38 | "name": "retrieve", 39 | "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], 40 | "stateMutability": "view", 41 | "type": "function", 42 | }, 43 | { 44 | "inputs": [ 45 | { 46 | "components": [ 47 | {"internalType": "uint256", "name": "a", "type": "uint256"}, 48 | { 49 | "components": [ 50 | {"internalType": "uint256", "name": "a", "type": "uint256"}, 51 | {"internalType": "uint256", "name": "b", "type": "uint256"}, 52 | ], 53 | "internalType": "struct Storage.S", 54 | "name": "s", 55 | "type": "tuple", 56 | }, 57 | ], 58 | "internalType": "struct Storage.T", 59 | "name": "t", 60 | "type": "tuple", 61 | } 62 | ], 63 | "name": "parseT", 64 | "outputs": [ 65 | {"internalType": "uint256", "name": "", "type": "uint256"}, 66 | {"internalType": "uint256", "name": "", "type": "uint256"}, 67 | {"internalType": "uint256", "name": "", "type": "uint256"}, 68 | ], 69 | "stateMutability": "pure", 70 | "type": "function", 71 | }, 72 | ] 73 | STORAGE_BYTECODE = "0x608060405234801561000f575f80fd5b5060405161067f38038061067f83398181016040528101906100319190610247565b805f908051906020019061004692919061004d565b505061028e565b828054828255905f5260205f20908101928215610087579160200282015b8281111561008657825182559160200191906001019061006b565b5b5090506100949190610098565b5090565b5b808211156100af575f815f905550600101610099565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61010e826100c8565b810181811067ffffffffffffffff8211171561012d5761012c6100d8565b5b80604052505050565b5f61013f6100b3565b905061014b8282610105565b919050565b5f67ffffffffffffffff82111561016a576101696100d8565b5b602082029050602081019050919050565b5f80fd5b5f819050919050565b6101918161017f565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f6101c46101bf84610150565b610136565b905080838252602082019050602084028301858111156101e7576101e661017b565b5b835b8181101561021057806101fc888261019e565b8452602084019350506020810190506101e9565b5050509392505050565b5f82601f83011261022e5761022d6100c4565b5b815161023e8482602086016101b2565b91505092915050565b5f6020828403121561025c5761025b6100bc565b5b5f82015167ffffffffffffffff811115610279576102786100c0565b5b6102858482850161021a565b91505092915050565b6103e48061029b5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c80630aca78a8146100385780632e64cec11461006a575b5f80fd5b610052600480360381019061004d9190610268565b610088565b604051610061939291906102a2565b60405180910390f35b6100726100ad565b60405161007f919061038e565b60405180910390f35b5f805f835f015184602001515f01518560200151602001519250925092509193909250565b60605f8054806020026020016040519081016040528092919081815260200182805480156100f857602002820191905f5260205f20905b8154815260200190600101908083116100e4575b5050505050905090565b5f604051905090565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61015982610113565b810181811067ffffffffffffffff8211171561017857610177610123565b5b80604052505050565b5f61018a610102565b90506101968282610150565b919050565b5f819050919050565b6101ad8161019b565b81146101b7575f80fd5b50565b5f813590506101c8816101a4565b92915050565b5f604082840312156101e3576101e261010f565b5b6101ed6040610181565b90505f6101fc848285016101ba565b5f83015250602061020f848285016101ba565b60208301525092915050565b5f606082840312156102305761022f61010f565b5b61023a6040610181565b90505f610249848285016101ba565b5f83015250602061025c848285016101ce565b60208301525092915050565b5f6060828403121561027d5761027c61010b565b5b5f61028a8482850161021b565b91505092915050565b61029c8161019b565b82525050565b5f6060820190506102b55f830186610293565b6102c26020830185610293565b6102cf6040830184610293565b949350505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6103098161019b565b82525050565b5f61031a8383610300565b60208301905092915050565b5f602082019050919050565b5f61033c826102d7565b61034681856102e1565b9350610351836102f1565b805f5b83811015610381578151610368888261030f565b975061037383610326565b925050600181019050610354565b5085935050505092915050565b5f6020820190508181035f8301526103a68184610332565b90509291505056fea2646970667358221220d40a0e14d7f370dda379502e5cde13639a3ed587e0ab469b95bff1612929212764736f6c634300081a0033" 74 | STORAGE_CONSTRUCTOR_CALL_INPUT = "0x608060405234801561000f575f80fd5b5060405161067f38038061067f83398181016040528101906100319190610247565b805f908051906020019061004692919061004d565b505061028e565b828054828255905f5260205f20908101928215610087579160200282015b8281111561008657825182559160200191906001019061006b565b5b5090506100949190610098565b5090565b5b808211156100af575f815f905550600101610099565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61010e826100c8565b810181811067ffffffffffffffff8211171561012d5761012c6100d8565b5b80604052505050565b5f61013f6100b3565b905061014b8282610105565b919050565b5f67ffffffffffffffff82111561016a576101696100d8565b5b602082029050602081019050919050565b5f80fd5b5f819050919050565b6101918161017f565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f6101c46101bf84610150565b610136565b905080838252602082019050602084028301858111156101e7576101e661017b565b5b835b8181101561021057806101fc888261019e565b8452602084019350506020810190506101e9565b5050509392505050565b5f82601f83011261022e5761022d6100c4565b5b815161023e8482602086016101b2565b91505092915050565b5f6020828403121561025c5761025b6100bc565b5b5f82015167ffffffffffffffff811115610279576102786100c0565b5b6102858482850161021a565b91505092915050565b6103e48061029b5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c80630aca78a8146100385780632e64cec11461006a575b5f80fd5b610052600480360381019061004d9190610268565b610088565b604051610061939291906102a2565b60405180910390f35b6100726100ad565b60405161007f919061038e565b60405180910390f35b5f805f835f015184602001515f01518560200151602001519250925092509193909250565b60605f8054806020026020016040519081016040528092919081815260200182805480156100f857602002820191905f5260205f20905b8154815260200190600101908083116100e4575b5050505050905090565b5f604051905090565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61015982610113565b810181811067ffffffffffffffff8211171561017857610177610123565b5b80604052505050565b5f61018a610102565b90506101968282610150565b919050565b5f819050919050565b6101ad8161019b565b81146101b7575f80fd5b50565b5f813590506101c8816101a4565b92915050565b5f604082840312156101e3576101e261010f565b5b6101ed6040610181565b90505f6101fc848285016101ba565b5f83015250602061020f848285016101ba565b60208301525092915050565b5f606082840312156102305761022f61010f565b5b61023a6040610181565b90505f610249848285016101ba565b5f83015250602061025c848285016101ce565b60208301525092915050565b5f6060828403121561027d5761027c61010b565b5b5f61028a8482850161021b565b91505092915050565b61029c8161019b565b82525050565b5f6060820190506102b55f830186610293565b6102c26020830185610293565b6102cf6040830184610293565b949350505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6103098161019b565b82525050565b5f61031a8383610300565b60208301905092915050565b5f602082019050919050565b5f61033c826102d7565b61034681856102e1565b9350610351836102f1565b805f5b83811015610381578151610368888261030f565b975061037383610326565b925050600181019050610354565b5085935050505092915050565b5f6020820190508181035f8301526103a68184610332565b90509291505056fea2646970667358221220d40a0e14d7f370dda379502e5cde13639a3ed587e0ab469b95bff1612929212764736f6c634300081a003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003" 75 | STORAGE_CONSTRUCTOR_CALL_ARGUMENT = [("uint256[]", "_nums", (1, 2, 3))] 76 | STORAGE_FUNCTION_CALL_INPUT = "0x0aca78a8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003" 77 | STORAGE_FUNCTION_CALL_ARGUMENT = [("(uint256,(uint256,uint256))", "t", (1, (2, 3)))] 78 | -------------------------------------------------------------------------------- /tests/data/tether.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from web3_input_decoder.types import Abi 4 | 5 | TETHER_ABI: Abi = [ 6 | { 7 | "constant": True, 8 | "inputs": [], 9 | "name": "name", 10 | "outputs": [{"name": "", "type": "string"}], 11 | "payable": False, 12 | "stateMutability": "view", 13 | "type": "function", 14 | }, 15 | { 16 | "constant": False, 17 | "inputs": [{"name": "_upgradedAddress", "type": "address"}], 18 | "name": "deprecate", 19 | "outputs": [], 20 | "payable": False, 21 | "stateMutability": "nonpayable", 22 | "type": "function", 23 | }, 24 | { 25 | "constant": False, 26 | "inputs": [ 27 | {"name": "_spender", "type": "address"}, 28 | {"name": "_value", "type": "uint256"}, 29 | ], 30 | "name": "approve", 31 | "outputs": [], 32 | "payable": False, 33 | "stateMutability": "nonpayable", 34 | "type": "function", 35 | }, 36 | { 37 | "constant": True, 38 | "inputs": [], 39 | "name": "deprecated", 40 | "outputs": [{"name": "", "type": "bool"}], 41 | "payable": False, 42 | "stateMutability": "view", 43 | "type": "function", 44 | }, 45 | { 46 | "constant": False, 47 | "inputs": [{"name": "_evilUser", "type": "address"}], 48 | "name": "addBlackList", 49 | "outputs": [], 50 | "payable": False, 51 | "stateMutability": "nonpayable", 52 | "type": "function", 53 | }, 54 | { 55 | "constant": True, 56 | "inputs": [], 57 | "name": "totalSupply", 58 | "outputs": [{"name": "", "type": "uint256"}], 59 | "payable": False, 60 | "stateMutability": "view", 61 | "type": "function", 62 | }, 63 | { 64 | "constant": False, 65 | "inputs": [ 66 | {"name": "_from", "type": "address"}, 67 | {"name": "_to", "type": "address"}, 68 | {"name": "_value", "type": "uint256"}, 69 | ], 70 | "name": "transferFrom", 71 | "outputs": [], 72 | "payable": False, 73 | "stateMutability": "nonpayable", 74 | "type": "function", 75 | }, 76 | { 77 | "constant": True, 78 | "inputs": [], 79 | "name": "upgradedAddress", 80 | "outputs": [{"name": "", "type": "address"}], 81 | "payable": False, 82 | "stateMutability": "view", 83 | "type": "function", 84 | }, 85 | { 86 | "constant": True, 87 | "inputs": [{"name": "", "type": "address"}], 88 | "name": "balances", 89 | "outputs": [{"name": "", "type": "uint256"}], 90 | "payable": False, 91 | "stateMutability": "view", 92 | "type": "function", 93 | }, 94 | { 95 | "constant": True, 96 | "inputs": [], 97 | "name": "decimals", 98 | "outputs": [{"name": "", "type": "uint256"}], 99 | "payable": False, 100 | "stateMutability": "view", 101 | "type": "function", 102 | }, 103 | { 104 | "constant": True, 105 | "inputs": [], 106 | "name": "maximumFee", 107 | "outputs": [{"name": "", "type": "uint256"}], 108 | "payable": False, 109 | "stateMutability": "view", 110 | "type": "function", 111 | }, 112 | { 113 | "constant": True, 114 | "inputs": [], 115 | "name": "_totalSupply", 116 | "outputs": [{"name": "", "type": "uint256"}], 117 | "payable": False, 118 | "stateMutability": "view", 119 | "type": "function", 120 | }, 121 | { 122 | "constant": False, 123 | "inputs": [], 124 | "name": "unpause", 125 | "outputs": [], 126 | "payable": False, 127 | "stateMutability": "nonpayable", 128 | "type": "function", 129 | }, 130 | { 131 | "constant": True, 132 | "inputs": [{"name": "_maker", "type": "address"}], 133 | "name": "getBlackListStatus", 134 | "outputs": [{"name": "", "type": "bool"}], 135 | "payable": False, 136 | "stateMutability": "view", 137 | "type": "function", 138 | }, 139 | { 140 | "constant": True, 141 | "inputs": [{"name": "", "type": "address"}, {"name": "", "type": "address"}], 142 | "name": "allowed", 143 | "outputs": [{"name": "", "type": "uint256"}], 144 | "payable": False, 145 | "stateMutability": "view", 146 | "type": "function", 147 | }, 148 | { 149 | "constant": True, 150 | "inputs": [], 151 | "name": "paused", 152 | "outputs": [{"name": "", "type": "bool"}], 153 | "payable": False, 154 | "stateMutability": "view", 155 | "type": "function", 156 | }, 157 | { 158 | "constant": True, 159 | "inputs": [{"name": "who", "type": "address"}], 160 | "name": "balanceOf", 161 | "outputs": [{"name": "", "type": "uint256"}], 162 | "payable": False, 163 | "stateMutability": "view", 164 | "type": "function", 165 | }, 166 | { 167 | "constant": False, 168 | "inputs": [], 169 | "name": "pause", 170 | "outputs": [], 171 | "payable": False, 172 | "stateMutability": "nonpayable", 173 | "type": "function", 174 | }, 175 | { 176 | "constant": True, 177 | "inputs": [], 178 | "name": "getOwner", 179 | "outputs": [{"name": "", "type": "address"}], 180 | "payable": False, 181 | "stateMutability": "view", 182 | "type": "function", 183 | }, 184 | { 185 | "constant": True, 186 | "inputs": [], 187 | "name": "owner", 188 | "outputs": [{"name": "", "type": "address"}], 189 | "payable": False, 190 | "stateMutability": "view", 191 | "type": "function", 192 | }, 193 | { 194 | "constant": True, 195 | "inputs": [], 196 | "name": "symbol", 197 | "outputs": [{"name": "", "type": "string"}], 198 | "payable": False, 199 | "stateMutability": "view", 200 | "type": "function", 201 | }, 202 | { 203 | "constant": False, 204 | "inputs": [ 205 | {"name": "_to", "type": "address"}, 206 | {"name": "_value", "type": "uint256"}, 207 | ], 208 | "name": "transfer", 209 | "outputs": [], 210 | "payable": False, 211 | "stateMutability": "nonpayable", 212 | "type": "function", 213 | }, 214 | { 215 | "constant": False, 216 | "inputs": [ 217 | {"name": "newBasisPoints", "type": "uint256"}, 218 | {"name": "newMaxFee", "type": "uint256"}, 219 | ], 220 | "name": "setParams", 221 | "outputs": [], 222 | "payable": False, 223 | "stateMutability": "nonpayable", 224 | "type": "function", 225 | }, 226 | { 227 | "constant": False, 228 | "inputs": [{"name": "amount", "type": "uint256"}], 229 | "name": "issue", 230 | "outputs": [], 231 | "payable": False, 232 | "stateMutability": "nonpayable", 233 | "type": "function", 234 | }, 235 | { 236 | "constant": False, 237 | "inputs": [{"name": "amount", "type": "uint256"}], 238 | "name": "redeem", 239 | "outputs": [], 240 | "payable": False, 241 | "stateMutability": "nonpayable", 242 | "type": "function", 243 | }, 244 | { 245 | "constant": True, 246 | "inputs": [ 247 | {"name": "_owner", "type": "address"}, 248 | {"name": "_spender", "type": "address"}, 249 | ], 250 | "name": "allowance", 251 | "outputs": [{"name": "remaining", "type": "uint256"}], 252 | "payable": False, 253 | "stateMutability": "view", 254 | "type": "function", 255 | }, 256 | { 257 | "constant": True, 258 | "inputs": [], 259 | "name": "basisPointsRate", 260 | "outputs": [{"name": "", "type": "uint256"}], 261 | "payable": False, 262 | "stateMutability": "view", 263 | "type": "function", 264 | }, 265 | { 266 | "constant": True, 267 | "inputs": [{"name": "", "type": "address"}], 268 | "name": "isBlackListed", 269 | "outputs": [{"name": "", "type": "bool"}], 270 | "payable": False, 271 | "stateMutability": "view", 272 | "type": "function", 273 | }, 274 | { 275 | "constant": False, 276 | "inputs": [{"name": "_clearedUser", "type": "address"}], 277 | "name": "removeBlackList", 278 | "outputs": [], 279 | "payable": False, 280 | "stateMutability": "nonpayable", 281 | "type": "function", 282 | }, 283 | { 284 | "constant": True, 285 | "inputs": [], 286 | "name": "MAX_UINT", 287 | "outputs": [{"name": "", "type": "uint256"}], 288 | "payable": False, 289 | "stateMutability": "view", 290 | "type": "function", 291 | }, 292 | { 293 | "constant": False, 294 | "inputs": [{"name": "newOwner", "type": "address"}], 295 | "name": "transferOwnership", 296 | "outputs": [], 297 | "payable": False, 298 | "stateMutability": "nonpayable", 299 | "type": "function", 300 | }, 301 | { 302 | "constant": False, 303 | "inputs": [{"name": "_blackListedUser", "type": "address"}], 304 | "name": "destroyBlackFunds", 305 | "outputs": [], 306 | "payable": False, 307 | "stateMutability": "nonpayable", 308 | "type": "function", 309 | }, 310 | { 311 | "inputs": [ 312 | {"name": "_initialSupply", "type": "uint256"}, 313 | {"name": "_name", "type": "string"}, 314 | {"name": "_symbol", "type": "string"}, 315 | {"name": "_decimals", "type": "uint256"}, 316 | ], 317 | "payable": False, 318 | "stateMutability": "nonpayable", 319 | "type": "constructor", 320 | }, 321 | ] 322 | 323 | 324 | TETHER_CONSTRUCTOR_CALL_ARGUMENT = [ 325 | ("uint256", "_initialSupply", 100000000000), 326 | ("string", "_name", "Tether USD"), 327 | ("string", "_symbol", "USDT"), 328 | ("uint256", "_decimals", 6), 329 | ] 330 | 331 | TETHER_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE = "0x000000000000000000000000000000000000000000000000000000174876e800000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a546574686572205553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000" 332 | 333 | TETHER_BYTECODE = "0x606060405260008060146101000a81548160ff0219169083151502179055506000600355600060045534156200003457600080fd5b60405162002d7c38038062002d7c83398101604052808051906020019091908051820191906020018051820191906020018051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836001819055508260079080519060200190620000cf9291906200017a565b508160089080519060200190620000e89291906200017a565b508060098190555083600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600a60146101000a81548160ff0219169083151502179055505050505062000229565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001bd57805160ff1916838001178555620001ee565b82800160010185558215620001ee579182015b82811115620001ed578251825591602001919060010190620001d0565b5b509050620001fd919062000201565b5090565b6200022691905b808211156200022257600081600090555060010162000208565b5090565b90565b612b4380620002396000396000f300606060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461019b5780630753c30c14610229578063095ea7b3146102625780630e136b19146102a45780630ecb93c0146102d157806318160ddd1461030a57806323b872dd1461033357806326976e3f1461039457806327e235e3146103e9578063313ce56714610436578063353907141461045f5780633eaaf86b146104885780633f4ba83a146104b157806359bf1abe146104c65780635c658165146105175780635c975abb1461058357806370a08231146105b05780638456cb59146105fd578063893d20e8146106125780638da5cb5b1461066757806395d89b41146106bc578063a9059cbb1461074a578063c0324c771461078c578063cc872b66146107b8578063db006a75146107db578063dd62ed3e146107fe578063dd644f721461086a578063e47d606014610893578063e4997dc5146108e4578063e5b5019a1461091d578063f2fde38b14610946578063f3bdc2281461097f575b600080fd5b34156101a657600080fd5b6101ae6109b8565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101ee5780820151818401526020810190506101d3565b50505050905090810190601f16801561021b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561023457600080fd5b610260600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a56565b005b341561026d57600080fd5b6102a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b73565b005b34156102af57600080fd5b6102b7610cc1565b604051808215151515815260200191505060405180910390f35b34156102dc57600080fd5b610308600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610cd4565b005b341561031557600080fd5b61031d610ded565b6040518082815260200191505060405180910390f35b341561033e57600080fd5b610392600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ebd565b005b341561039f57600080fd5b6103a761109d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f457600080fd5b610420600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506110c3565b6040518082815260200191505060405180910390f35b341561044157600080fd5b6104496110db565b6040518082815260200191505060405180910390f35b341561046a57600080fd5b6104726110e1565b6040518082815260200191505060405180910390f35b341561049357600080fd5b61049b6110e7565b6040518082815260200191505060405180910390f35b34156104bc57600080fd5b6104c46110ed565b005b34156104d157600080fd5b6104fd600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506111ab565b604051808215151515815260200191505060405180910390f35b341561052257600080fd5b61056d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611201565b6040518082815260200191505060405180910390f35b341561058e57600080fd5b610596611226565b604051808215151515815260200191505060405180910390f35b34156105bb57600080fd5b6105e7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611239565b6040518082815260200191505060405180910390f35b341561060857600080fd5b610610611348565b005b341561061d57600080fd5b610625611408565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561067257600080fd5b61067a611431565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106c757600080fd5b6106cf611456565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561070f5780820151818401526020810190506106f4565b50505050905090810190601f16801561073c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561075557600080fd5b61078a600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506114f4565b005b341561079757600080fd5b6107b6600480803590602001909190803590602001909190505061169e565b005b34156107c357600080fd5b6107d96004808035906020019091905050611783565b005b34156107e657600080fd5b6107fc600480803590602001909190505061197a565b005b341561080957600080fd5b610854600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b0d565b6040518082815260200191505060405180910390f35b341561087557600080fd5b61087d611c52565b6040518082815260200191505060405180910390f35b341561089e57600080fd5b6108ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c58565b604051808215151515815260200191505060405180910390f35b34156108ef57600080fd5b61091b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c78565b005b341561092857600080fd5b610930611d91565b6040518082815260200191505060405180910390f35b341561095157600080fd5b61097d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611db5565b005b341561098a57600080fd5b6109b6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611e8a565b005b60078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a4e5780601f10610a2357610100808354040283529160200191610a4e565b820191906000526020600020905b815481529060010190602001808311610a3157829003601f168201915b505050505081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ab157600080fd5b6001600a60146101000a81548160ff02191690831515021790555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcc358699805e9a8b7f77b522628c7cb9abd07d9efb86b6fb616af1609036a99e81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b604060048101600036905010151515610b8b57600080fd5b600a60149054906101000a900460ff1615610cb157600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aee92d333385856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610c9857600080fd5b6102c65a03f11515610ca957600080fd5b505050610cbc565b610cbb838361200e565b5b505050565b600a60149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610d2f57600080fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f42e160154868087d6bfdc0ca23d96a1c1cfa32f1b72ba9ba27b69b98a0d819dc81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b6000600a60149054906101000a900460ff1615610eb457600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e9257600080fd5b6102c65a03f11515610ea357600080fd5b505050604051805190509050610eba565b60015490505b90565b600060149054906101000a900460ff16151515610ed957600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515610f3257600080fd5b600a60149054906101000a900460ff161561108c57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638b477adb338585856040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050600060405180830381600087803b151561107357600080fd5b6102c65a03f1151561108457600080fd5b505050611098565b6110978383836121ab565b5b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915090505481565b60095481565b60045481565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561114857600080fd5b600060149054906101000a900460ff16151561116357600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6005602052816000526040600020602052806000526040600020600091509150505481565b600060149054906101000a900460ff1681565b6000600a60149054906101000a900460ff161561133757600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561131557600080fd5b6102c65a03f1151561132657600080fd5b505050604051805190509050611343565b61134082612652565b90505b919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a357600080fd5b600060149054906101000a900460ff161515156113bf57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114ec5780601f106114c1576101008083540402835291602001916114ec565b820191906000526020600020905b8154815290600101906020018083116114cf57829003601f168201915b505050505081565b600060149054906101000a900460ff1615151561151057600080fd5b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561156957600080fd5b600a60149054906101000a900460ff161561168f57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636e18980a3384846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b151561167657600080fd5b6102c65a03f1151561168757600080fd5b50505061169a565b611699828261269b565b5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156116f957600080fd5b60148210151561170857600080fd5b60328110151561171757600080fd5b81600381905550611736600954600a0a82612a0390919063ffffffff16565b6004819055507fb044a1e409eac5c48e5af22d4af52670dd1a99059537a78b31b48c6500a6354e600354600454604051808381526020018281526020019250505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117de57600080fd5b60015481600154011115156117f257600080fd5b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011115156118c257600080fd5b80600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550806001600082825401925050819055507fcb8241adb0c3fdb35b70c24ce35c5eb0c17af7431c99f827d44a445ca624176a816040518082815260200191505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119d557600080fd5b80600154101515156119e657600080fd5b80600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611a5557600080fd5b8060016000828254039250508190555080600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055507f702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a44816040518082815260200191505060405180910390a150565b6000600a60149054906101000a900460ff1615611c3f57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515611c1d57600080fd5b6102c65a03f11515611c2e57600080fd5b505050604051805190509050611c4c565b611c498383612a3e565b90505b92915050565b60035481565b60066020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cd357600080fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd7e9ec6e6ecd65492dce6bf513cd6867560d49544421d0783ddf06e76c24470c81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e1057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515611e8757806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ee757600080fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611f3f57600080fd5b611f4882611239565b90506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806001600082825403925050819055507f61e6e66b0d6339b2980aecc6ccc0039736791f0ccde9ed512e789a7fbdd698c68282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b60406004810160003690501015151561202657600080fd5b600082141580156120b457506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b1515156120c057600080fd5b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a3505050565b60008060006060600481016000369050101515156121c857600080fd5b600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054935061227061271061226260035488612a0390919063ffffffff16565b612ac590919063ffffffff16565b92506004548311156122825760045492505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84101561233e576122bd8585612ae090919063ffffffff16565b600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6123518386612ae090919063ffffffff16565b91506123a585600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ae090919063ffffffff16565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061243a82600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af990919063ffffffff16565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008311156125e4576124f983600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af990919063ffffffff16565b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050505050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000806040600481016000369050101515156126b657600080fd5b6126df6127106126d160035487612a0390919063ffffffff16565b612ac590919063ffffffff16565b92506004548311156126f15760045492505b6127048385612ae090919063ffffffff16565b915061275884600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ae090919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506127ed82600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af990919063ffffffff16565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000831115612997576128ac83600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af990919063ffffffff16565b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050565b6000806000841415612a185760009150612a37565b8284029050828482811515612a2957fe5b04141515612a3357fe5b8091505b5092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000808284811515612ad357fe5b0490508091505092915050565b6000828211151515612aee57fe5b818303905092915050565b6000808284019050838110151515612b0d57fe5b80915050929150505600a165627a7a72305820645ee12d73db47fd78ba77fa1f824c3c8f9184061b3b10386beb4dc9236abb280029000000000000000000000000000000" 334 | 335 | TETHER_CONSTRUCTOR_CALL_INPUT = ( 336 | TETHER_BYTECODE + TETHER_CONSTRUCTOR_CALL_INPUT_WITHOUT_BYTECODE[2:] 337 | ) 338 | 339 | TETHER_TRANSFER_CALL_INPUT = ( 340 | "0xa9059cbb000000000000000000000000f050227be1a7ce587aa83d5013f900dbc3b" 341 | "e0611000000000000000000000000000000000000000000000000000000000ecdd350" 342 | ) 343 | TETHER_TRANSFER_CALL_ARGUMENT = [ 344 | ("address", "_to", "0xf050227be1a7ce587aa83d5013f900dbc3be0611"), 345 | ("uint256", "_value", 248370000), 346 | ] 347 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "annotated-types" 5 | version = "0.7.0" 6 | description = "Reusable constraint types to use with typing.Annotated" 7 | optional = false 8 | python-versions = ">=3.8" 9 | groups = ["main"] 10 | files = [ 11 | {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, 12 | {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, 13 | ] 14 | 15 | [[package]] 16 | name = "asttokens" 17 | version = "3.0.0" 18 | description = "Annotate AST trees with source code positions" 19 | optional = false 20 | python-versions = ">=3.8" 21 | groups = ["dev"] 22 | markers = "python_version >= \"3.11\"" 23 | files = [ 24 | {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, 25 | {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, 26 | ] 27 | 28 | [package.extras] 29 | astroid = ["astroid (>=2,<4)"] 30 | test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] 31 | 32 | [[package]] 33 | name = "colorama" 34 | version = "0.4.6" 35 | description = "Cross-platform colored terminal text." 36 | optional = false 37 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 38 | groups = ["dev", "test"] 39 | files = [ 40 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 41 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 42 | ] 43 | markers = {dev = "python_version >= \"3.11\" and sys_platform == \"win32\"", test = "sys_platform == \"win32\""} 44 | 45 | [[package]] 46 | name = "coverage" 47 | version = "7.10.6" 48 | description = "Code coverage measurement for Python" 49 | optional = false 50 | python-versions = ">=3.9" 51 | groups = ["test"] 52 | files = [ 53 | {file = "coverage-7.10.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:70e7bfbd57126b5554aa482691145f798d7df77489a177a6bef80de78860a356"}, 54 | {file = "coverage-7.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e41be6f0f19da64af13403e52f2dec38bbc2937af54df8ecef10850ff8d35301"}, 55 | {file = "coverage-7.10.6-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c61fc91ab80b23f5fddbee342d19662f3d3328173229caded831aa0bd7595460"}, 56 | {file = "coverage-7.10.6-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10356fdd33a7cc06e8051413140bbdc6f972137508a3572e3f59f805cd2832fd"}, 57 | {file = "coverage-7.10.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80b1695cf7c5ebe7b44bf2521221b9bb8cdf69b1f24231149a7e3eb1ae5fa2fb"}, 58 | {file = "coverage-7.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2e4c33e6378b9d52d3454bd08847a8651f4ed23ddbb4a0520227bd346382bbc6"}, 59 | {file = "coverage-7.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c8a3ec16e34ef980a46f60dc6ad86ec60f763c3f2fa0db6d261e6e754f72e945"}, 60 | {file = "coverage-7.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7d79dabc0a56f5af990cc6da9ad1e40766e82773c075f09cc571e2076fef882e"}, 61 | {file = "coverage-7.10.6-cp310-cp310-win32.whl", hash = "sha256:86b9b59f2b16e981906e9d6383eb6446d5b46c278460ae2c36487667717eccf1"}, 62 | {file = "coverage-7.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:e132b9152749bd33534e5bd8565c7576f135f157b4029b975e15ee184325f528"}, 63 | {file = "coverage-7.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c706db3cabb7ceef779de68270150665e710b46d56372455cd741184f3868d8f"}, 64 | {file = "coverage-7.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e0c38dc289e0508ef68ec95834cb5d2e96fdbe792eaccaa1bccac3966bbadcc"}, 65 | {file = "coverage-7.10.6-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:752a3005a1ded28f2f3a6e8787e24f28d6abe176ca64677bcd8d53d6fe2ec08a"}, 66 | {file = "coverage-7.10.6-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:689920ecfd60f992cafca4f5477d55720466ad2c7fa29bb56ac8d44a1ac2b47a"}, 67 | {file = "coverage-7.10.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec98435796d2624d6905820a42f82149ee9fc4f2d45c2c5bc5a44481cc50db62"}, 68 | {file = "coverage-7.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b37201ce4a458c7a758ecc4efa92fa8ed783c66e0fa3c42ae19fc454a0792153"}, 69 | {file = "coverage-7.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2904271c80898663c810a6b067920a61dd8d38341244a3605bd31ab55250dad5"}, 70 | {file = "coverage-7.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5aea98383463d6e1fa4e95416d8de66f2d0cb588774ee20ae1b28df826bcb619"}, 71 | {file = "coverage-7.10.6-cp311-cp311-win32.whl", hash = "sha256:e3fb1fa01d3598002777dd259c0c2e6d9d5e10e7222976fc8e03992f972a2cba"}, 72 | {file = "coverage-7.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:f35ed9d945bece26553d5b4c8630453169672bea0050a564456eb88bdffd927e"}, 73 | {file = "coverage-7.10.6-cp311-cp311-win_arm64.whl", hash = "sha256:99e1a305c7765631d74b98bf7dbf54eeea931f975e80f115437d23848ee8c27c"}, 74 | {file = "coverage-7.10.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5b2dd6059938063a2c9fee1af729d4f2af28fd1a545e9b7652861f0d752ebcea"}, 75 | {file = "coverage-7.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:388d80e56191bf846c485c14ae2bc8898aa3124d9d35903fef7d907780477634"}, 76 | {file = "coverage-7.10.6-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:90cb5b1a4670662719591aa92d0095bb41714970c0b065b02a2610172dbf0af6"}, 77 | {file = "coverage-7.10.6-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:961834e2f2b863a0e14260a9a273aff07ff7818ab6e66d2addf5628590c628f9"}, 78 | {file = "coverage-7.10.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf9a19f5012dab774628491659646335b1928cfc931bf8d97b0d5918dd58033c"}, 79 | {file = "coverage-7.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99c4283e2a0e147b9c9cc6bc9c96124de9419d6044837e9799763a0e29a7321a"}, 80 | {file = "coverage-7.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:282b1b20f45df57cc508c1e033403f02283adfb67d4c9c35a90281d81e5c52c5"}, 81 | {file = "coverage-7.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cdbe264f11afd69841bd8c0d83ca10b5b32853263ee62e6ac6a0ab63895f972"}, 82 | {file = "coverage-7.10.6-cp312-cp312-win32.whl", hash = "sha256:a517feaf3a0a3eca1ee985d8373135cfdedfbba3882a5eab4362bda7c7cf518d"}, 83 | {file = "coverage-7.10.6-cp312-cp312-win_amd64.whl", hash = "sha256:856986eadf41f52b214176d894a7de05331117f6035a28ac0016c0f63d887629"}, 84 | {file = "coverage-7.10.6-cp312-cp312-win_arm64.whl", hash = "sha256:acf36b8268785aad739443fa2780c16260ee3fa09d12b3a70f772ef100939d80"}, 85 | {file = "coverage-7.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ffea0575345e9ee0144dfe5701aa17f3ba546f8c3bb48db62ae101afb740e7d6"}, 86 | {file = "coverage-7.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:95d91d7317cde40a1c249d6b7382750b7e6d86fad9d8eaf4fa3f8f44cf171e80"}, 87 | {file = "coverage-7.10.6-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e23dd5408fe71a356b41baa82892772a4cefcf758f2ca3383d2aa39e1b7a003"}, 88 | {file = "coverage-7.10.6-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0f3f56e4cb573755e96a16501a98bf211f100463d70275759e73f3cbc00d4f27"}, 89 | {file = "coverage-7.10.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db4a1d897bbbe7339946ffa2fe60c10cc81c43fab8b062d3fcb84188688174a4"}, 90 | {file = "coverage-7.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d8fd7879082953c156d5b13c74aa6cca37f6a6f4747b39538504c3f9c63d043d"}, 91 | {file = "coverage-7.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:28395ca3f71cd103b8c116333fa9db867f3a3e1ad6a084aa3725ae002b6583bc"}, 92 | {file = "coverage-7.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:61c950fc33d29c91b9e18540e1aed7d9f6787cc870a3e4032493bbbe641d12fc"}, 93 | {file = "coverage-7.10.6-cp313-cp313-win32.whl", hash = "sha256:160c00a5e6b6bdf4e5984b0ef21fc860bc94416c41b7df4d63f536d17c38902e"}, 94 | {file = "coverage-7.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:628055297f3e2aa181464c3808402887643405573eb3d9de060d81531fa79d32"}, 95 | {file = "coverage-7.10.6-cp313-cp313-win_arm64.whl", hash = "sha256:df4ec1f8540b0bcbe26ca7dd0f541847cc8a108b35596f9f91f59f0c060bfdd2"}, 96 | {file = "coverage-7.10.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c9a8b7a34a4de3ed987f636f71881cd3b8339f61118b1aa311fbda12741bff0b"}, 97 | {file = "coverage-7.10.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dd5af36092430c2b075cee966719898f2ae87b636cefb85a653f1d0ba5d5393"}, 98 | {file = "coverage-7.10.6-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b0353b0f0850d49ada66fdd7d0c7cdb0f86b900bb9e367024fd14a60cecc1e27"}, 99 | {file = "coverage-7.10.6-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d6b9ae13d5d3e8aeca9ca94198aa7b3ebbc5acfada557d724f2a1f03d2c0b0df"}, 100 | {file = "coverage-7.10.6-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:675824a363cc05781b1527b39dc2587b8984965834a748177ee3c37b64ffeafb"}, 101 | {file = "coverage-7.10.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:692d70ea725f471a547c305f0d0fc6a73480c62fb0da726370c088ab21aed282"}, 102 | {file = "coverage-7.10.6-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:851430a9a361c7a8484a36126d1d0ff8d529d97385eacc8dfdc9bfc8c2d2cbe4"}, 103 | {file = "coverage-7.10.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d9369a23186d189b2fc95cc08b8160ba242057e887d766864f7adf3c46b2df21"}, 104 | {file = "coverage-7.10.6-cp313-cp313t-win32.whl", hash = "sha256:92be86fcb125e9bda0da7806afd29a3fd33fdf58fba5d60318399adf40bf37d0"}, 105 | {file = "coverage-7.10.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6b3039e2ca459a70c79523d39347d83b73f2f06af5624905eba7ec34d64d80b5"}, 106 | {file = "coverage-7.10.6-cp313-cp313t-win_arm64.whl", hash = "sha256:3fb99d0786fe17b228eab663d16bee2288e8724d26a199c29325aac4b0319b9b"}, 107 | {file = "coverage-7.10.6-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6008a021907be8c4c02f37cdc3ffb258493bdebfeaf9a839f9e71dfdc47b018e"}, 108 | {file = "coverage-7.10.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5e75e37f23eb144e78940b40395b42f2321951206a4f50e23cfd6e8a198d3ceb"}, 109 | {file = "coverage-7.10.6-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0f7cb359a448e043c576f0da00aa8bfd796a01b06aa610ca453d4dde09cc1034"}, 110 | {file = "coverage-7.10.6-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c68018e4fc4e14b5668f1353b41ccf4bc83ba355f0e1b3836861c6f042d89ac1"}, 111 | {file = "coverage-7.10.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd4b2b0707fc55afa160cd5fc33b27ccbf75ca11d81f4ec9863d5793fc6df56a"}, 112 | {file = "coverage-7.10.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cec13817a651f8804a86e4f79d815b3b28472c910e099e4d5a0e8a3b6a1d4cb"}, 113 | {file = "coverage-7.10.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f2a6a8e06bbda06f78739f40bfb56c45d14eb8249d0f0ea6d4b3d48e1f7c695d"}, 114 | {file = "coverage-7.10.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:081b98395ced0d9bcf60ada7661a0b75f36b78b9d7e39ea0790bb4ed8da14747"}, 115 | {file = "coverage-7.10.6-cp314-cp314-win32.whl", hash = "sha256:6937347c5d7d069ee776b2bf4e1212f912a9f1f141a429c475e6089462fcecc5"}, 116 | {file = "coverage-7.10.6-cp314-cp314-win_amd64.whl", hash = "sha256:adec1d980fa07e60b6ef865f9e5410ba760e4e1d26f60f7e5772c73b9a5b0713"}, 117 | {file = "coverage-7.10.6-cp314-cp314-win_arm64.whl", hash = "sha256:a80f7aef9535442bdcf562e5a0d5a5538ce8abe6bb209cfbf170c462ac2c2a32"}, 118 | {file = "coverage-7.10.6-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0de434f4fbbe5af4fa7989521c655c8c779afb61c53ab561b64dcee6149e4c65"}, 119 | {file = "coverage-7.10.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6e31b8155150c57e5ac43ccd289d079eb3f825187d7c66e755a055d2c85794c6"}, 120 | {file = "coverage-7.10.6-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:98cede73eb83c31e2118ae8d379c12e3e42736903a8afcca92a7218e1f2903b0"}, 121 | {file = "coverage-7.10.6-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f863c08f4ff6b64fa8045b1e3da480f5374779ef187f07b82e0538c68cb4ff8e"}, 122 | {file = "coverage-7.10.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b38261034fda87be356f2c3f42221fdb4171c3ce7658066ae449241485390d5"}, 123 | {file = "coverage-7.10.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e93b1476b79eae849dc3872faeb0bf7948fd9ea34869590bc16a2a00b9c82a7"}, 124 | {file = "coverage-7.10.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ff8a991f70f4c0cf53088abf1e3886edcc87d53004c7bb94e78650b4d3dac3b5"}, 125 | {file = "coverage-7.10.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ac765b026c9f33044419cbba1da913cfb82cca1b60598ac1c7a5ed6aac4621a0"}, 126 | {file = "coverage-7.10.6-cp314-cp314t-win32.whl", hash = "sha256:441c357d55f4936875636ef2cfb3bee36e466dcf50df9afbd398ce79dba1ebb7"}, 127 | {file = "coverage-7.10.6-cp314-cp314t-win_amd64.whl", hash = "sha256:073711de3181b2e204e4870ac83a7c4853115b42e9cd4d145f2231e12d670930"}, 128 | {file = "coverage-7.10.6-cp314-cp314t-win_arm64.whl", hash = "sha256:137921f2bac5559334ba66122b753db6dc5d1cf01eb7b64eb412bb0d064ef35b"}, 129 | {file = "coverage-7.10.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90558c35af64971d65fbd935c32010f9a2f52776103a259f1dee865fe8259352"}, 130 | {file = "coverage-7.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8953746d371e5695405806c46d705a3cd170b9cc2b9f93953ad838f6c1e58612"}, 131 | {file = "coverage-7.10.6-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c83f6afb480eae0313114297d29d7c295670a41c11b274e6bca0c64540c1ce7b"}, 132 | {file = "coverage-7.10.6-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7eb68d356ba0cc158ca535ce1381dbf2037fa8cb5b1ae5ddfc302e7317d04144"}, 133 | {file = "coverage-7.10.6-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5b15a87265e96307482746d86995f4bff282f14b027db75469c446da6127433b"}, 134 | {file = "coverage-7.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fc53ba868875bfbb66ee447d64d6413c2db91fddcfca57025a0e7ab5b07d5862"}, 135 | {file = "coverage-7.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:efeda443000aa23f276f4df973cb82beca682fd800bb119d19e80504ffe53ec2"}, 136 | {file = "coverage-7.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9702b59d582ff1e184945d8b501ffdd08d2cee38d93a2206aa5f1365ce0b8d78"}, 137 | {file = "coverage-7.10.6-cp39-cp39-win32.whl", hash = "sha256:2195f8e16ba1a44651ca684db2ea2b2d4b5345da12f07d9c22a395202a05b23c"}, 138 | {file = "coverage-7.10.6-cp39-cp39-win_amd64.whl", hash = "sha256:f32ff80e7ef6a5b5b606ea69a36e97b219cd9dc799bcf2963018a4d8f788cfbf"}, 139 | {file = "coverage-7.10.6-py3-none-any.whl", hash = "sha256:92c4ecf6bf11b2e85fd4d8204814dc26e6a19f0c9d938c207c5cb0eadfcabbe3"}, 140 | {file = "coverage-7.10.6.tar.gz", hash = "sha256:f644a3ae5933a552a29dbb9aa2f90c677a875f80ebea028e5a52a4f429044b90"}, 141 | ] 142 | 143 | [package.dependencies] 144 | tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} 145 | 146 | [package.extras] 147 | toml = ["tomli ; python_full_version <= \"3.11.0a6\""] 148 | 149 | [[package]] 150 | name = "cytoolz" 151 | version = "1.0.1" 152 | description = "Cython implementation of Toolz: High performance functional utilities" 153 | optional = false 154 | python-versions = ">=3.8" 155 | groups = ["main"] 156 | markers = "implementation_name == \"cpython\"" 157 | files = [ 158 | {file = "cytoolz-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cec9af61f71fc3853eb5dca3d42eb07d1f48a4599fa502cbe92adde85f74b042"}, 159 | {file = "cytoolz-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:140bbd649dbda01e91add7642149a5987a7c3ccc251f2263de894b89f50b6608"}, 160 | {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e90124bdc42ff58b88cdea1d24a6bc5f776414a314cc4d94f25c88badb3a16d1"}, 161 | {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e74801b751e28f7c5cc3ad264c123954a051f546f2fdfe089f5aa7a12ccfa6da"}, 162 | {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:582dad4545ddfb5127494ef23f3fa4855f1673a35d50c66f7638e9fb49805089"}, 163 | {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7bd0618e16efe03bd12f19c2a26a27e6e6b75d7105adb7be1cd2a53fa755d8"}, 164 | {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d74cca6acf1c4af58b2e4a89cc565ed61c5e201de2e434748c93e5a0f5c541a5"}, 165 | {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:823a3763828d8d457f542b2a45d75d6b4ced5e470b5c7cf2ed66a02f508ed442"}, 166 | {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:51633a14e6844c61db1d68c1ffd077cf949f5c99c60ed5f1e265b9e2966f1b52"}, 167 | {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f3ec9b01c45348f1d0d712507d54c2bfd69c62fbd7c9ef555c9d8298693c2432"}, 168 | {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1855022b712a9c7a5bce354517ab4727a38095f81e2d23d3eabaf1daeb6a3b3c"}, 169 | {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9930f7288c4866a1dc1cc87174f0c6ff4cad1671eb1f6306808aa6c445857d78"}, 170 | {file = "cytoolz-1.0.1-cp310-cp310-win32.whl", hash = "sha256:a9baad795d72fadc3445ccd0f122abfdbdf94269157e6d6d4835636dad318804"}, 171 | {file = "cytoolz-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:ad95b386a84e18e1f6136f6d343d2509d4c3aae9f5a536f3dc96808fcc56a8cf"}, 172 | {file = "cytoolz-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d958d4f04d9d7018e5c1850790d9d8e68b31c9a2deebca74b903706fdddd2b6"}, 173 | {file = "cytoolz-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0f445b8b731fc0ecb1865b8e68a070084eb95d735d04f5b6c851db2daf3048ab"}, 174 | {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f546a96460a7e28eb2ec439f4664fa646c9b3e51c6ebad9a59d3922bbe65e30"}, 175 | {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0317681dd065532d21836f860b0563b199ee716f55d0c1f10de3ce7100c78a3b"}, 176 | {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c0ef52febd5a7821a3fd8d10f21d460d1a3d2992f724ba9c91fbd7a96745d41"}, 177 | {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebaf419acf2de73b643cf96108702b8aef8e825cf4f63209ceb078d5fbbbfd"}, 178 | {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f7f04eeb4088947585c92d6185a618b25ad4a0f8f66ea30c8db83cf94a425e3"}, 179 | {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f61928803bb501c17914b82d457c6f50fe838b173fb40d39c38d5961185bd6c7"}, 180 | {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d2960cb4fa01ccb985ad1280db41f90dc97a80b397af970a15d5a5de403c8c61"}, 181 | {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b2b407cc3e9defa8df5eb46644f6f136586f70ba49eba96f43de67b9a0984fd3"}, 182 | {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8245f929144d4d3bd7b972c9593300195c6cea246b81b4c46053c48b3f044580"}, 183 | {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e37385db03af65763933befe89fa70faf25301effc3b0485fec1c15d4ce4f052"}, 184 | {file = "cytoolz-1.0.1-cp311-cp311-win32.whl", hash = "sha256:50f9c530f83e3e574fc95c264c3350adde8145f4f8fc8099f65f00cc595e5ead"}, 185 | {file = "cytoolz-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:b7f6b617454b4326af7bd3c7c49b0fc80767f134eb9fd6449917a058d17a0e3c"}, 186 | {file = "cytoolz-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fcb8f7d0d65db1269022e7e0428471edee8c937bc288ebdcb72f13eaa67c2fe4"}, 187 | {file = "cytoolz-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:207d4e4b445e087e65556196ff472ff134370d9a275d591724142e255f384662"}, 188 | {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21cdf6bac6fd843f3b20280a66fd8df20dea4c58eb7214a2cd8957ec176f0bb3"}, 189 | {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a55ec098036c0dea9f3bdc021f8acd9d105a945227d0811589f0573f21c9ce1"}, 190 | {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a13ab79ff4ce202e03ab646a2134696988b554b6dc4b71451e948403db1331d8"}, 191 | {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2d944799026e1ff08a83241f1027a2d9276c41f7a74224cd98b7df6e03957d"}, 192 | {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88ba85834cd523b91fdf10325e1e6d71c798de36ea9bdc187ca7bd146420de6f"}, 193 | {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a750b1af7e8bf6727f588940b690d69e25dc47cce5ce467925a76561317eaf7"}, 194 | {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44a71870f7eae31d263d08b87da7c2bf1176f78892ed8bdade2c2850478cb126"}, 195 | {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8231b9abbd8e368e036f4cc2e16902c9482d4cf9e02a6147ed0e9a3cd4a9ab0"}, 196 | {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:aa87599ccc755de5a096a4d6c34984de6cd9dc928a0c5eaa7607457317aeaf9b"}, 197 | {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67cd16537df51baabde3baa770ab7b8d16839c4d21219d5b96ac59fb012ebd2d"}, 198 | {file = "cytoolz-1.0.1-cp312-cp312-win32.whl", hash = "sha256:fb988c333f05ee30ad4693fe4da55d95ec0bb05775d2b60191236493ea2e01f9"}, 199 | {file = "cytoolz-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b"}, 200 | {file = "cytoolz-1.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6944bb93b287032a4c5ca6879b69bcd07df46f3079cf8393958cf0b0454f50c0"}, 201 | {file = "cytoolz-1.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e027260fd2fc5cb041277158ac294fc13dca640714527219f702fb459a59823a"}, 202 | {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88662c0e07250d26f5af9bc95911e6137e124a5c1ec2ce4a5d74de96718ab242"}, 203 | {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309dffa78b0961b4c0cf55674b828fbbc793cf2d816277a5c8293c0c16155296"}, 204 | {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:edb34246e6eb40343c5860fc51b24937698e4fa1ee415917a73ad772a9a1746b"}, 205 | {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54da7a8e4348a18d45d4d5bc84af6c716d7f131113a4f1cc45569d37edff1b"}, 206 | {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:241c679c3b1913c0f7259cf1d9639bed5084c86d0051641d537a0980548aa266"}, 207 | {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5bfc860251a8f280ac79696fc3343cfc3a7c30b94199e0240b6c9e5b6b01a2a5"}, 208 | {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c8edd1547014050c1bdad3ff85d25c82bd1c2a3c96830c6181521eb78b9a42b3"}, 209 | {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b349bf6162e8de215403d7f35f8a9b4b1853dc2a48e6e1a609a5b1a16868b296"}, 210 | {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1b18b35256219b6c3dd0fa037741b85d0bea39c552eab0775816e85a52834140"}, 211 | {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:738b2350f340ff8af883eb301054eb724997f795d20d90daec7911c389d61581"}, 212 | {file = "cytoolz-1.0.1-cp313-cp313-win32.whl", hash = "sha256:9cbd9c103df54fcca42be55ef40e7baea624ac30ee0b8bf1149f21146d1078d9"}, 213 | {file = "cytoolz-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297"}, 214 | {file = "cytoolz-1.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f3a509e4ac8e711703c368476b9bbce921fcef6ebb87fa3501525f7000e44185"}, 215 | {file = "cytoolz-1.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a7eecab6373e933dfbf4fdc0601d8fd7614f8de76793912a103b5fccf98170cd"}, 216 | {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e55ed62087f6e3e30917b5f55350c3b6be6470b849c6566018419cd159d2cebc"}, 217 | {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43de33d99a4ccc07234cecd81f385456b55b0ea9c39c9eebf42f024c313728a5"}, 218 | {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:139bed875828e1727018aa0982aa140e055cbafccb7fd89faf45cbb4f2a21514"}, 219 | {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22c12671194b518aa8ce2f4422bd5064f25ab57f410ba0b78705d0a219f4a97a"}, 220 | {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79888f2f7dc25709cd5d37b032a8833741e6a3692c8823be181d542b5999128e"}, 221 | {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:51628b4eb41fa25bd428f8f7b5b74fbb05f3ae65fbd265019a0dd1ded4fdf12a"}, 222 | {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:1db9eb7179285403d2fb56ba1ff6ec35a44921b5e2fa5ca19d69f3f9f0285ea5"}, 223 | {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:08ab7efae08e55812340bfd1b3f09f63848fe291675e2105eab1aa5327d3a16e"}, 224 | {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e5fdc5264f884e7c0a1711a81dff112708a64b9c8561654ee578bfdccec6be09"}, 225 | {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:90d6a2e6ab891043ee655ec99d5e77455a9bee9e1131bdfcfb745edde81200dd"}, 226 | {file = "cytoolz-1.0.1-cp38-cp38-win32.whl", hash = "sha256:08946e083faa5147751b34fbf78ab931f149ef758af5c1092932b459e18dcf5c"}, 227 | {file = "cytoolz-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:a91b4e10a9c03796c0dc93e47ebe25bb41ecc6fafc3cf5197c603cf767a3d44d"}, 228 | {file = "cytoolz-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:980c323e626ba298b77ae62871b2de7c50b9d7219e2ddf706f52dd34b8be7349"}, 229 | {file = "cytoolz-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:45f6fa1b512bc2a0f2de5123db932df06c7f69d12874fe06d67772b2828e2c8b"}, 230 | {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93f42d9100c415155ad1f71b0de362541afd4ac95e3153467c4c79972521b6b"}, 231 | {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a76d20dec9c090cdf4746255bbf06a762e8cc29b5c9c1d138c380bbdb3122ade"}, 232 | {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:239039585487c69aa50c5b78f6a422016297e9dea39755761202fb9f0530fe87"}, 233 | {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28307640ca2ab57b9fbf0a834b9bf563958cd9e038378c3a559f45f13c3c541"}, 234 | {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:454880477bb901cee3a60f6324ec48c95d45acc7fecbaa9d49a5af737ded0595"}, 235 | {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:902115d1b1f360fd81e44def30ac309b8641661150fcbdde18ead446982ada6a"}, 236 | {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e68e6b38473a3a79cee431baa22be31cac39f7df1bf23eaa737eaff42e213883"}, 237 | {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:32fba3f63fcb76095b0a22f4bdcc22bc62a2bd2d28d58bf02fd21754c155a3ec"}, 238 | {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0724ba4cf41eb40b6cf75250820ab069e44bdf4183ff78857aaf4f0061551075"}, 239 | {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c42420e0686f887040d5230420ed44f0e960ccbfa29a0d65a3acd9ca52459209"}, 240 | {file = "cytoolz-1.0.1-cp39-cp39-win32.whl", hash = "sha256:4ba8b16358ea56b1fe8e637ec421e36580866f2e787910bac1cf0a6997424a34"}, 241 | {file = "cytoolz-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:92d27f84bf44586853d9562bfa3610ecec000149d030f793b4cb614fd9da1813"}, 242 | {file = "cytoolz-1.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:83d19d55738ad9c60763b94f3f6d3c6e4de979aeb8d76841c1401081e0e58d96"}, 243 | {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f112a71fad6ea824578e6393765ce5c054603afe1471a5c753ff6c67fd872d10"}, 244 | {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a515df8f8aa6e1eaaf397761a6e4aff2eef73b5f920aedf271416d5471ae5ee"}, 245 | {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92c398e7b7023460bea2edffe5fcd0a76029580f06c3f6938ac3d198b47156f3"}, 246 | {file = "cytoolz-1.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3237e56211e03b13df47435b2369f5df281e02b04ad80a948ebd199b7bc10a47"}, 247 | {file = "cytoolz-1.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba0d1da50aab1909b165f615ba1125c8b01fcc30d606c42a61c42ea0269b5e2c"}, 248 | {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25b6e8dec29aa5a390092d193abd673e027d2c0b50774ae816a31454286c45c7"}, 249 | {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36cd6989ebb2f18fe9af8f13e3c61064b9f741a40d83dc5afeb0322338ad25f2"}, 250 | {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47394f8ab7fca3201f40de61fdeea20a2baffb101485ae14901ea89c3f6c95d"}, 251 | {file = "cytoolz-1.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d00ac423542af944302e034e618fb055a0c4e87ba704cd6a79eacfa6ac83a3c9"}, 252 | {file = "cytoolz-1.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a5ca923d1fa632f7a4fb33c0766c6fba7f87141a055c305c3e47e256fb99c413"}, 253 | {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:058bf996bcae9aad3acaeeb937d42e0c77c081081e67e24e9578a6a353cb7fb2"}, 254 | {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69e2a1f41a3dad94a17aef4a5cc003323359b9f0a9d63d4cc867cb5690a2551d"}, 255 | {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67daeeeadb012ec2b59d63cb29c4f2a2023b0c4957c3342d354b8bb44b209e9a"}, 256 | {file = "cytoolz-1.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:54d3d36bbf0d4344d1afa22c58725d1668e30ff9de3a8f56b03db1a6da0acb11"}, 257 | {file = "cytoolz-1.0.1.tar.gz", hash = "sha256:89cc3161b89e1bb3ed7636f74ed2e55984fd35516904fc878cae216e42b2c7d6"}, 258 | ] 259 | 260 | [package.dependencies] 261 | toolz = ">=0.8.0" 262 | 263 | [package.extras] 264 | cython = ["cython"] 265 | 266 | [[package]] 267 | name = "decorator" 268 | version = "5.2.1" 269 | description = "Decorators for Humans" 270 | optional = false 271 | python-versions = ">=3.8" 272 | groups = ["dev"] 273 | markers = "python_version >= \"3.11\"" 274 | files = [ 275 | {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, 276 | {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, 277 | ] 278 | 279 | [[package]] 280 | name = "eth-abi" 281 | version = "5.2.0" 282 | description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" 283 | optional = false 284 | python-versions = "<4,>=3.8" 285 | groups = ["main"] 286 | files = [ 287 | {file = "eth_abi-5.2.0-py3-none-any.whl", hash = "sha256:17abe47560ad753f18054f5b3089fcb588f3e3a092136a416b6c1502cb7e8877"}, 288 | {file = "eth_abi-5.2.0.tar.gz", hash = "sha256:178703fa98c07d8eecd5ae569e7e8d159e493ebb6eeb534a8fe973fbc4e40ef0"}, 289 | ] 290 | 291 | [package.dependencies] 292 | eth-typing = ">=3.0.0" 293 | eth-utils = ">=2.0.0" 294 | parsimonious = ">=0.10.0,<0.11.0" 295 | 296 | [package.extras] 297 | dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-hash[pycryptodome]", "hypothesis (>=6.22.0,<6.108.7)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] 298 | docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] 299 | test = ["eth-hash[pycryptodome]", "hypothesis (>=6.22.0,<6.108.7)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=2.4.0)"] 300 | tools = ["hypothesis (>=6.22.0,<6.108.7)"] 301 | 302 | [[package]] 303 | name = "eth-hash" 304 | version = "0.7.1" 305 | description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" 306 | optional = false 307 | python-versions = "<4,>=3.8" 308 | groups = ["main"] 309 | files = [ 310 | {file = "eth_hash-0.7.1-py3-none-any.whl", hash = "sha256:0fb1add2adf99ef28883fd6228eb447ef519ea72933535ad1a0b28c6f65f868a"}, 311 | {file = "eth_hash-0.7.1.tar.gz", hash = "sha256:d2411a403a0b0a62e8247b4117932d900ffb4c8c64b15f92620547ca5ce46be5"}, 312 | ] 313 | 314 | [package.extras] 315 | dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] 316 | docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] 317 | pycryptodome = ["pycryptodome (>=3.6.6,<4)"] 318 | pysha3 = ["pysha3 (>=1.0.0,<2.0.0) ; python_version < \"3.9\"", "safe-pysha3 (>=1.0.0) ; python_version >= \"3.9\""] 319 | test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] 320 | 321 | [[package]] 322 | name = "eth-typing" 323 | version = "5.2.1" 324 | description = "eth-typing: Common type annotations for ethereum python packages" 325 | optional = false 326 | python-versions = "<4,>=3.8" 327 | groups = ["main", "dev"] 328 | files = [ 329 | {file = "eth_typing-5.2.1-py3-none-any.whl", hash = "sha256:b0c2812ff978267563b80e9d701f487dd926f1d376d674f3b535cfe28b665d3d"}, 330 | {file = "eth_typing-5.2.1.tar.gz", hash = "sha256:7557300dbf02a93c70fa44af352b5c4a58f94e997a0fd6797fb7d1c29d9538ee"}, 331 | ] 332 | 333 | [package.dependencies] 334 | typing_extensions = ">=4.5.0" 335 | 336 | [package.extras] 337 | dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] 338 | docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] 339 | test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] 340 | 341 | [[package]] 342 | name = "eth-utils" 343 | version = "5.3.1" 344 | description = "eth-utils: Common utility functions for python code that interacts with Ethereum" 345 | optional = false 346 | python-versions = "<4,>=3.8" 347 | groups = ["main"] 348 | files = [ 349 | {file = "eth_utils-5.3.1-py3-none-any.whl", hash = "sha256:1f5476d8f29588d25b8ae4987e1ffdfae6d4c09026e476c4aad13b32dda3ead0"}, 350 | {file = "eth_utils-5.3.1.tar.gz", hash = "sha256:c94e2d2abd024a9a42023b4ddc1c645814ff3d6a737b33d5cfd890ebf159c2d1"}, 351 | ] 352 | 353 | [package.dependencies] 354 | cytoolz = {version = ">=0.10.1", markers = "implementation_name == \"cpython\""} 355 | eth-hash = ">=0.3.1" 356 | eth-typing = ">=5.0.0" 357 | pydantic = ">=2.0.0,<3" 358 | toolz = {version = ">0.8.2", markers = "implementation_name == \"pypy\""} 359 | 360 | [package.extras] 361 | dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-hash[pycryptodome]", "hypothesis (>=4.43.0)", "ipython", "mypy (==1.10.0)", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] 362 | docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] 363 | test = ["hypothesis (>=4.43.0)", "mypy (==1.10.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] 364 | 365 | [[package]] 366 | name = "exceptiongroup" 367 | version = "1.3.0" 368 | description = "Backport of PEP 654 (exception groups)" 369 | optional = false 370 | python-versions = ">=3.7" 371 | groups = ["test"] 372 | markers = "python_version < \"3.11\"" 373 | files = [ 374 | {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, 375 | {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, 376 | ] 377 | 378 | [package.dependencies] 379 | typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} 380 | 381 | [package.extras] 382 | test = ["pytest (>=6)"] 383 | 384 | [[package]] 385 | name = "executing" 386 | version = "2.2.1" 387 | description = "Get the currently executing AST node of a frame, and other information" 388 | optional = false 389 | python-versions = ">=3.8" 390 | groups = ["dev"] 391 | markers = "python_version >= \"3.11\"" 392 | files = [ 393 | {file = "executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017"}, 394 | {file = "executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4"}, 395 | ] 396 | 397 | [package.extras] 398 | tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] 399 | 400 | [[package]] 401 | name = "iniconfig" 402 | version = "2.1.0" 403 | description = "brain-dead simple config-ini parsing" 404 | optional = false 405 | python-versions = ">=3.8" 406 | groups = ["test"] 407 | files = [ 408 | {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, 409 | {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, 410 | ] 411 | 412 | [[package]] 413 | name = "ipython" 414 | version = "9.5.0" 415 | description = "IPython: Productive Interactive Computing" 416 | optional = false 417 | python-versions = ">=3.11" 418 | groups = ["dev"] 419 | markers = "python_version >= \"3.11\"" 420 | files = [ 421 | {file = "ipython-9.5.0-py3-none-any.whl", hash = "sha256:88369ffa1d5817d609120daa523a6da06d02518e582347c29f8451732a9c5e72"}, 422 | {file = "ipython-9.5.0.tar.gz", hash = "sha256:129c44b941fe6d9b82d36fc7a7c18127ddb1d6f02f78f867f402e2e3adde3113"}, 423 | ] 424 | 425 | [package.dependencies] 426 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 427 | decorator = "*" 428 | ipython-pygments-lexers = "*" 429 | jedi = ">=0.16" 430 | matplotlib-inline = "*" 431 | pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} 432 | prompt_toolkit = ">=3.0.41,<3.1.0" 433 | pygments = ">=2.4.0" 434 | stack_data = "*" 435 | traitlets = ">=5.13.0" 436 | typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} 437 | 438 | [package.extras] 439 | all = ["ipython[doc,matplotlib,test,test-extra]"] 440 | black = ["black"] 441 | doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinx_toml (==0.0.4)", "typing_extensions"] 442 | matplotlib = ["matplotlib"] 443 | test = ["packaging", "pytest", "pytest-asyncio", "testpath"] 444 | test-extra = ["curio", "ipykernel", "ipython[test]", "jupyter_ai", "matplotlib (!=3.2.0)", "nbclient", "nbformat", "numpy (>=1.23)", "pandas", "trio"] 445 | 446 | [[package]] 447 | name = "ipython-pygments-lexers" 448 | version = "1.1.1" 449 | description = "Defines a variety of Pygments lexers for highlighting IPython code." 450 | optional = false 451 | python-versions = ">=3.8" 452 | groups = ["dev"] 453 | markers = "python_version >= \"3.11\"" 454 | files = [ 455 | {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"}, 456 | {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"}, 457 | ] 458 | 459 | [package.dependencies] 460 | pygments = "*" 461 | 462 | [[package]] 463 | name = "jedi" 464 | version = "0.19.2" 465 | description = "An autocompletion tool for Python that can be used for text editors." 466 | optional = false 467 | python-versions = ">=3.6" 468 | groups = ["dev"] 469 | markers = "python_version >= \"3.11\"" 470 | files = [ 471 | {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, 472 | {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, 473 | ] 474 | 475 | [package.dependencies] 476 | parso = ">=0.8.4,<0.9.0" 477 | 478 | [package.extras] 479 | docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] 480 | qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] 481 | testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] 482 | 483 | [[package]] 484 | name = "matplotlib-inline" 485 | version = "0.1.7" 486 | description = "Inline Matplotlib backend for Jupyter" 487 | optional = false 488 | python-versions = ">=3.8" 489 | groups = ["dev"] 490 | markers = "python_version >= \"3.11\"" 491 | files = [ 492 | {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, 493 | {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, 494 | ] 495 | 496 | [package.dependencies] 497 | traitlets = "*" 498 | 499 | [[package]] 500 | name = "packaging" 501 | version = "25.0" 502 | description = "Core utilities for Python packages" 503 | optional = false 504 | python-versions = ">=3.8" 505 | groups = ["test"] 506 | files = [ 507 | {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, 508 | {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, 509 | ] 510 | 511 | [[package]] 512 | name = "parsimonious" 513 | version = "0.10.0" 514 | description = "(Soon to be) the fastest pure-Python PEG parser I could muster" 515 | optional = false 516 | python-versions = "*" 517 | groups = ["main"] 518 | files = [ 519 | {file = "parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f"}, 520 | {file = "parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c"}, 521 | ] 522 | 523 | [package.dependencies] 524 | regex = ">=2022.3.15" 525 | 526 | [[package]] 527 | name = "parso" 528 | version = "0.8.5" 529 | description = "A Python Parser" 530 | optional = false 531 | python-versions = ">=3.6" 532 | groups = ["dev"] 533 | markers = "python_version >= \"3.11\"" 534 | files = [ 535 | {file = "parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887"}, 536 | {file = "parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a"}, 537 | ] 538 | 539 | [package.extras] 540 | qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] 541 | testing = ["docopt", "pytest"] 542 | 543 | [[package]] 544 | name = "pexpect" 545 | version = "4.9.0" 546 | description = "Pexpect allows easy control of interactive console applications." 547 | optional = false 548 | python-versions = "*" 549 | groups = ["dev"] 550 | markers = "python_version >= \"3.11\" and sys_platform != \"win32\" and sys_platform != \"emscripten\"" 551 | files = [ 552 | {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, 553 | {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, 554 | ] 555 | 556 | [package.dependencies] 557 | ptyprocess = ">=0.5" 558 | 559 | [[package]] 560 | name = "pluggy" 561 | version = "1.6.0" 562 | description = "plugin and hook calling mechanisms for python" 563 | optional = false 564 | python-versions = ">=3.9" 565 | groups = ["test"] 566 | files = [ 567 | {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, 568 | {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, 569 | ] 570 | 571 | [package.extras] 572 | dev = ["pre-commit", "tox"] 573 | testing = ["coverage", "pytest", "pytest-benchmark"] 574 | 575 | [[package]] 576 | name = "prompt-toolkit" 577 | version = "3.0.52" 578 | description = "Library for building powerful interactive command lines in Python" 579 | optional = false 580 | python-versions = ">=3.8" 581 | groups = ["dev"] 582 | markers = "python_version >= \"3.11\"" 583 | files = [ 584 | {file = "prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"}, 585 | {file = "prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855"}, 586 | ] 587 | 588 | [package.dependencies] 589 | wcwidth = "*" 590 | 591 | [[package]] 592 | name = "ptyprocess" 593 | version = "0.7.0" 594 | description = "Run a subprocess in a pseudo terminal" 595 | optional = false 596 | python-versions = "*" 597 | groups = ["dev"] 598 | markers = "python_version >= \"3.11\" and sys_platform != \"win32\" and sys_platform != \"emscripten\"" 599 | files = [ 600 | {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, 601 | {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, 602 | ] 603 | 604 | [[package]] 605 | name = "pure-eval" 606 | version = "0.2.3" 607 | description = "Safely evaluate AST nodes without side effects" 608 | optional = false 609 | python-versions = "*" 610 | groups = ["dev"] 611 | markers = "python_version >= \"3.11\"" 612 | files = [ 613 | {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, 614 | {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, 615 | ] 616 | 617 | [package.extras] 618 | tests = ["pytest"] 619 | 620 | [[package]] 621 | name = "pycryptodome" 622 | version = "3.23.0" 623 | description = "Cryptographic library for Python" 624 | optional = false 625 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 626 | groups = ["main"] 627 | files = [ 628 | {file = "pycryptodome-3.23.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a176b79c49af27d7f6c12e4b178b0824626f40a7b9fed08f712291b6d54bf566"}, 629 | {file = "pycryptodome-3.23.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:573a0b3017e06f2cffd27d92ef22e46aa3be87a2d317a5abf7cc0e84e321bd75"}, 630 | {file = "pycryptodome-3.23.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:63dad881b99ca653302b2c7191998dd677226222a3f2ea79999aa51ce695f720"}, 631 | {file = "pycryptodome-3.23.0-cp27-cp27m-win32.whl", hash = "sha256:b34e8e11d97889df57166eda1e1ddd7676da5fcd4d71a0062a760e75060514b4"}, 632 | {file = "pycryptodome-3.23.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:7ac1080a8da569bde76c0a104589c4f414b8ba296c0b3738cf39a466a9fb1818"}, 633 | {file = "pycryptodome-3.23.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6fe8258e2039eceb74dfec66b3672552b6b7d2c235b2dfecc05d16b8921649a8"}, 634 | {file = "pycryptodome-3.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:0011f7f00cdb74879142011f95133274741778abba114ceca229adbf8e62c3e4"}, 635 | {file = "pycryptodome-3.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:90460fc9e088ce095f9ee8356722d4f10f86e5be06e2354230a9880b9c549aae"}, 636 | {file = "pycryptodome-3.23.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4764e64b269fc83b00f682c47443c2e6e85b18273712b98aa43bcb77f8570477"}, 637 | {file = "pycryptodome-3.23.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb8f24adb74984aa0e5d07a2368ad95276cf38051fe2dc6605cbcf482e04f2a7"}, 638 | {file = "pycryptodome-3.23.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d97618c9c6684a97ef7637ba43bdf6663a2e2e77efe0f863cce97a76af396446"}, 639 | {file = "pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a53a4fe5cb075075d515797d6ce2f56772ea7e6a1e5e4b96cf78a14bac3d265"}, 640 | {file = "pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:763d1d74f56f031788e5d307029caef067febf890cd1f8bf61183ae142f1a77b"}, 641 | {file = "pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:954af0e2bd7cea83ce72243b14e4fb518b18f0c1649b576d114973e2073b273d"}, 642 | {file = "pycryptodome-3.23.0-cp313-cp313t-win32.whl", hash = "sha256:257bb3572c63ad8ba40b89f6fc9d63a2a628e9f9708d31ee26560925ebe0210a"}, 643 | {file = "pycryptodome-3.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6501790c5b62a29fcb227bd6b62012181d886a767ce9ed03b303d1f22eb5c625"}, 644 | {file = "pycryptodome-3.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9a77627a330ab23ca43b48b130e202582e91cc69619947840ea4d2d1be21eb39"}, 645 | {file = "pycryptodome-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27"}, 646 | {file = "pycryptodome-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843"}, 647 | {file = "pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490"}, 648 | {file = "pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575"}, 649 | {file = "pycryptodome-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0698f65e5b570426fc31b8162ed4603b0c2841cbb9088e2b01641e3065915b"}, 650 | {file = "pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:53ecbafc2b55353edcebd64bf5da94a2a2cdf5090a6915bcca6eca6cc452585a"}, 651 | {file = "pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f"}, 652 | {file = "pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa"}, 653 | {file = "pycryptodome-3.23.0-cp37-abi3-win32.whl", hash = "sha256:507dbead45474b62b2bbe318eb1c4c8ee641077532067fec9c1aa82c31f84886"}, 654 | {file = "pycryptodome-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2"}, 655 | {file = "pycryptodome-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c"}, 656 | {file = "pycryptodome-3.23.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:350ebc1eba1da729b35ab7627a833a1a355ee4e852d8ba0447fafe7b14504d56"}, 657 | {file = "pycryptodome-3.23.0-pp27-pypy_73-win32.whl", hash = "sha256:93837e379a3e5fd2bb00302a47aee9fdf7940d83595be3915752c74033d17ca7"}, 658 | {file = "pycryptodome-3.23.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddb95b49df036ddd264a0ad246d1be5b672000f12d6961ea2c267083a5e19379"}, 659 | {file = "pycryptodome-3.23.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e95564beb8782abfd9e431c974e14563a794a4944c29d6d3b7b5ea042110b4"}, 660 | {file = "pycryptodome-3.23.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14e15c081e912c4b0d75632acd8382dfce45b258667aa3c67caf7a4d4c13f630"}, 661 | {file = "pycryptodome-3.23.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7fc76bf273353dc7e5207d172b83f569540fc9a28d63171061c42e361d22353"}, 662 | {file = "pycryptodome-3.23.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:45c69ad715ca1a94f778215a11e66b7ff989d792a4d63b68dc586a1da1392ff5"}, 663 | {file = "pycryptodome-3.23.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:865d83c906b0fc6a59b510deceee656b6bc1c4fa0d82176e2b77e97a420a996a"}, 664 | {file = "pycryptodome-3.23.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89d4d56153efc4d81defe8b65fd0821ef8b2d5ddf8ed19df31ba2f00872b8002"}, 665 | {file = "pycryptodome-3.23.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3f2d0aaf8080bda0587d58fc9fe4766e012441e2eed4269a77de6aea981c8be"}, 666 | {file = "pycryptodome-3.23.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64093fc334c1eccfd3933c134c4457c34eaca235eeae49d69449dc4728079339"}, 667 | {file = "pycryptodome-3.23.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ce64e84a962b63a47a592690bdc16a7eaf709d2c2697ababf24a0def566899a6"}, 668 | {file = "pycryptodome-3.23.0.tar.gz", hash = "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef"}, 669 | ] 670 | 671 | [[package]] 672 | name = "pydantic" 673 | version = "2.11.7" 674 | description = "Data validation using Python type hints" 675 | optional = false 676 | python-versions = ">=3.9" 677 | groups = ["main"] 678 | files = [ 679 | {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, 680 | {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, 681 | ] 682 | 683 | [package.dependencies] 684 | annotated-types = ">=0.6.0" 685 | pydantic-core = "2.33.2" 686 | typing-extensions = ">=4.12.2" 687 | typing-inspection = ">=0.4.0" 688 | 689 | [package.extras] 690 | email = ["email-validator (>=2.0.0)"] 691 | timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] 692 | 693 | [[package]] 694 | name = "pydantic-core" 695 | version = "2.33.2" 696 | description = "Core functionality for Pydantic validation and serialization" 697 | optional = false 698 | python-versions = ">=3.9" 699 | groups = ["main"] 700 | files = [ 701 | {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, 702 | {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, 703 | {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, 704 | {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, 705 | {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, 706 | {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, 707 | {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, 708 | {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, 709 | {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, 710 | {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, 711 | {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, 712 | {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, 713 | {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, 714 | {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, 715 | {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, 716 | {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, 717 | {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, 718 | {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, 719 | {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, 720 | {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, 721 | {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, 722 | {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, 723 | {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, 724 | {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, 725 | {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, 726 | {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, 727 | {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, 728 | {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, 729 | {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, 730 | {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, 731 | {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, 732 | {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, 733 | {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, 734 | {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, 735 | {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, 736 | {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, 737 | {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, 738 | {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, 739 | {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, 740 | {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, 741 | {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, 742 | {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, 743 | {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, 744 | {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, 745 | {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, 746 | {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, 747 | {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, 748 | {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, 749 | {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, 750 | {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, 751 | {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, 752 | {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, 753 | {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, 754 | {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, 755 | {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, 756 | {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, 757 | {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, 758 | {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, 759 | {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, 760 | {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, 761 | {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, 762 | {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, 763 | {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, 764 | {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, 765 | {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, 766 | {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, 767 | {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, 768 | {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, 769 | {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, 770 | {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, 771 | {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, 772 | {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, 773 | {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, 774 | {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, 775 | {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, 776 | {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, 777 | {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, 778 | {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, 779 | {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, 780 | {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, 781 | {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, 782 | {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, 783 | {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, 784 | {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, 785 | {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, 786 | {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, 787 | {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, 788 | {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, 789 | {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, 790 | {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, 791 | {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, 792 | {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, 793 | {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, 794 | {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, 795 | {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, 796 | {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, 797 | {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, 798 | {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, 799 | {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, 800 | ] 801 | 802 | [package.dependencies] 803 | typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" 804 | 805 | [[package]] 806 | name = "pygments" 807 | version = "2.19.2" 808 | description = "Pygments is a syntax highlighting package written in Python." 809 | optional = false 810 | python-versions = ">=3.8" 811 | groups = ["dev", "test"] 812 | files = [ 813 | {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, 814 | {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, 815 | ] 816 | markers = {dev = "python_version >= \"3.11\""} 817 | 818 | [package.extras] 819 | windows-terminal = ["colorama (>=0.4.6)"] 820 | 821 | [[package]] 822 | name = "pyinstrument" 823 | version = "5.1.1" 824 | description = "Call stack profiler for Python. Shows you why your code is slow!" 825 | optional = false 826 | python-versions = ">=3.8" 827 | groups = ["test"] 828 | files = [ 829 | {file = "pyinstrument-5.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f4912edf01912792d2f44dfc43d3f041acc7ea634d0300b3394711963a431d1b"}, 830 | {file = "pyinstrument-5.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:217ee5decbc7312b16092307a1bfbe1c04b175bb91ad9622388cd266f54fb260"}, 831 | {file = "pyinstrument-5.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2fcad0f4211226e445cdbca1ee308567d3d7507cb18355463de64bea2dbe0b80"}, 832 | {file = "pyinstrument-5.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:129dcdd57f0720ffb0c181517eddf5db6bfb2cdd1338c6fd5f4082d62c657ba0"}, 833 | {file = "pyinstrument-5.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1efb57a5b708f76b5fed08ecb9dc380a1949f4cb82794d14c3c40113c2f4a2d"}, 834 | {file = "pyinstrument-5.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d1e89dcf9a88d328cc7eb7c67c43c8a4ad38c8162eda87d93166a998fc8580d"}, 835 | {file = "pyinstrument-5.1.1-cp310-cp310-win32.whl", hash = "sha256:954bc886e11ddcf5789a8a953bec65e663f48d93cc634a8c77585f3e8762bcbb"}, 836 | {file = "pyinstrument-5.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:9b2f1d54c72661feeefd5ca81b6f487baf52add1d688ae349be599a258168bfc"}, 837 | {file = "pyinstrument-5.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5272cff6eea21163b2105f6a80c907315e0f567720621e6d5672dc01bf71ee48"}, 838 | {file = "pyinstrument-5.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d4e7dc5a4aee37a44ff2e63db3127f2044dd95edcae240cb95915adbf223d4be"}, 839 | {file = "pyinstrument-5.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:602d55121df1d88aeb6d8ebc801597fdcb9718f78d602ae81458d65c56f25d24"}, 840 | {file = "pyinstrument-5.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63b5a788ff955e0597bc95463e64d5fa3747017524fdc02a0f5d12d5117cf2b9"}, 841 | {file = "pyinstrument-5.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7f66038ec55a12e5510689240cdc745f8e98c90b93363f745106976e5cfb7397"}, 842 | {file = "pyinstrument-5.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:110a08b6e7fa9542eb37c337e79467913d364a03bc2062f85566ba96bc82f54e"}, 843 | {file = "pyinstrument-5.1.1-cp311-cp311-win32.whl", hash = "sha256:a223d5e9226ccede5bf2fbd4d13ce0aeb5120501b633ba85290ed94df37d3623"}, 844 | {file = "pyinstrument-5.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:16ce582a7b56287d338a8b59688458341aab5c6abda970ba50b2f7b3fd69f89d"}, 845 | {file = "pyinstrument-5.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bcd6a03bdf180d73bc8dc7371e09dda089a48057095584e5f2818df1c820525b"}, 846 | {file = "pyinstrument-5.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ffa0948c1e268356dcf930c128624f34037ce92ee865fa4c056dee067aee4c5"}, 847 | {file = "pyinstrument-5.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c95adf98a920f2039eb0065966f980452a7af794bab387e9bfe8af3c681affa0"}, 848 | {file = "pyinstrument-5.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bcb46ca8596b375c27850d4d06a1ce94ed78074774d35cbed3ccd28b663c5ba6"}, 849 | {file = "pyinstrument-5.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3fc16597d26b24a46bf3455686300c0b8a3eb565ebc82396f402c031dccc0145"}, 850 | {file = "pyinstrument-5.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5aa135b4bd9667ddcb25fa582f4db77c5117ef207cb10ae901a8e4c5d5cde0e0"}, 851 | {file = "pyinstrument-5.1.1-cp312-cp312-win32.whl", hash = "sha256:d15e37f8074b3043fca7aa985cb2079d2c221ccb0d27f059451ede800c801645"}, 852 | {file = "pyinstrument-5.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c27d5cef0e809f213e5a94143c397d948650f5142c91dcce3611f584779183e"}, 853 | {file = "pyinstrument-5.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:45af421c60c943a7f1619afabeba4951d4cc16b4206490d7d5b7ef5a4e2dfd42"}, 854 | {file = "pyinstrument-5.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2603db3d745a65de66c96929ab9b0fcce050511eb24e32856ea2458785b8917f"}, 855 | {file = "pyinstrument-5.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2fe32492100efaa1b0a488c237fe420fdaf141646733a31a97f96c4e1fa6bbf8"}, 856 | {file = "pyinstrument-5.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:999b5373f8b1e846357923063ae5c9275ad8a85ed4e0a42960a349288d1f5007"}, 857 | {file = "pyinstrument-5.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:58a2f69052178ec624e4df0cf546eda48b3a381572ac1cb3272b4c163888af9d"}, 858 | {file = "pyinstrument-5.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4d9bbc00d2e258edbefeb39b61ad4636099b08acd1effdd40d76883a13e7bf5a"}, 859 | {file = "pyinstrument-5.1.1-cp313-cp313-win32.whl", hash = "sha256:cf2d8933e2aeaa02d4cb6279d83ef11ee882fb243fff96e3378153a730aadd6e"}, 860 | {file = "pyinstrument-5.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:2402683a92617066b13a6d48f904396dcd15938016875b392534df027660eed4"}, 861 | {file = "pyinstrument-5.1.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:688acba1c00cad73e43254e610f8e384a53ced3b0dbb5268fb44636e2b99663e"}, 862 | {file = "pyinstrument-5.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:116f5ad8cec4d6f5626305d7c1a104f5845a084bfb4b192d231eb8c41ea81f9a"}, 863 | {file = "pyinstrument-5.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d139d12a637001d3884344330054ce8335b2c8165dc3dd239726e1b358576bd"}, 864 | {file = "pyinstrument-5.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc5b87b1e27bec94457fed8d03c755a3c09edb4f35d975dbdffd77d863173254"}, 865 | {file = "pyinstrument-5.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15f4a2ed9562efab34b555e1208955cf9681b2272489d7a59cd0e289344ada2e"}, 866 | {file = "pyinstrument-5.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1cb0c79bfa2b2b5734213429c9d7f455e5af664cfde785c69a5780f6c532c1fd"}, 867 | {file = "pyinstrument-5.1.1-cp314-cp314-win32.whl", hash = "sha256:3b9f1216ae4848a8983dc405e1a42e46e75bd8ae96aaba328d4358b8fc80a7a0"}, 868 | {file = "pyinstrument-5.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:26971d4a17e0d5d4f6737e71c9de7a7ce5c83ab7daf078c6bf330be41d65273b"}, 869 | {file = "pyinstrument-5.1.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:62362843884d654401ec4c25fed35f4b4ded077d96b3396f1e791c31e4203d3e"}, 870 | {file = "pyinstrument-5.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f2d640230b71c6d9ac8f27a9c5cd07fc8a6acad9196d1e48d9c33658b176fb80"}, 871 | {file = "pyinstrument-5.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f54f7292c63461c75ddf193f5e733803e463ccbc54f2fb7c9591337ddea7d10"}, 872 | {file = "pyinstrument-5.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c156eb442f9f22960ae16bd195051863d5e8a68b877926e88bbaf8bbdc1456d1"}, 873 | {file = "pyinstrument-5.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:caadaf67ad5926c46af784316024793c909b9e9ee550475855fd32171c4bd033"}, 874 | {file = "pyinstrument-5.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:88ef2e8f483a5e1501d79a7ebdab592a597467810ed24d8db09ab6f568e938d3"}, 875 | {file = "pyinstrument-5.1.1-cp314-cp314t-win32.whl", hash = "sha256:265bc4389f82e6521777bfab426a62a15c4940955e86f75db79a44e7349f9757"}, 876 | {file = "pyinstrument-5.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:fa254f269a72a007b5d02c18cd4b67081e0efabbd33e18acdbd5e3be905afa06"}, 877 | {file = "pyinstrument-5.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:439ab74bfa8cb6e27f7e8bf6783528cd01167d35a076206e2e61076a48d8c270"}, 878 | {file = "pyinstrument-5.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:458d89bb9d8ef9b15a0b781047a55ac4f59eecc6b592b21aafde1caa2f04f070"}, 879 | {file = "pyinstrument-5.1.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3aa6ea18708cab6ad43121a9a90196f53ff80614b456345daf407c7c260c535"}, 880 | {file = "pyinstrument-5.1.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0c53800eec349f5727429488eea7788e00f9443fda49b1173b254b7bc202544"}, 881 | {file = "pyinstrument-5.1.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e32e1964cb3c0d28e0d07e996adc857d281eebf636aff1256e914ac768c7729f"}, 882 | {file = "pyinstrument-5.1.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2152461091134c2c98c911688149234cc4321ab7afcde5f46bd1d65559d3b34d"}, 883 | {file = "pyinstrument-5.1.1-cp38-cp38-win32.whl", hash = "sha256:a3877eb1738f90cb81e7fd8ff95d527367c97012dbc8f6b2102429ef6450f66e"}, 884 | {file = "pyinstrument-5.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:70eff7dd8b320bfbfe83ba3a213fe509052907f3858cd556960eecb35c734e82"}, 885 | {file = "pyinstrument-5.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:88985f97a7656f1de4ee44abbc2d058720b493e465f1d159784caadc7e68dde4"}, 886 | {file = "pyinstrument-5.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8725a94eb7a990c4e1937bf5f6f025e8e8d159e7e723f879f9e4e92678e0ea2"}, 887 | {file = "pyinstrument-5.1.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:18e0a6597eab69590312aa3f162f38e9bd1308a8d770d54d8dc510a51d2218d7"}, 888 | {file = "pyinstrument-5.1.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4adffa45d4338a7651ffc2eb9714fc5c8542caf8e7e4497f49695fb721bfb2e0"}, 889 | {file = "pyinstrument-5.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f415f58f70734815b5e17606ce8474a6a0c27660266868d98824ec49a0f90377"}, 890 | {file = "pyinstrument-5.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:abfdcf2a1fa2fee2e3f84039ed5fd9914fe0b020a6211e959ae69f7a2c6daac7"}, 891 | {file = "pyinstrument-5.1.1-cp39-cp39-win32.whl", hash = "sha256:a8ebaf1d74b89f4216cde10968cbfeccd7038a6c8c62e36a80443159acadc6e0"}, 892 | {file = "pyinstrument-5.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:420d3361e258e1d981b83aa1167201c35027895375a3377071d4efa8a95a7e66"}, 893 | {file = "pyinstrument-5.1.1.tar.gz", hash = "sha256:bc401cda990b3c1cfe8e0e0473cbd605df3c63b73478a89ac4ab108f2184baa8"}, 894 | ] 895 | 896 | [package.extras] 897 | bin = ["click", "nox"] 898 | docs = ["furo (==2024.7.18)", "myst-parser (==3.0.1)", "sphinx (==7.4.7)", "sphinx-autobuild (==2024.4.16)", "sphinxcontrib-programoutput (==0.17)"] 899 | examples = ["django", "litestar", "numpy"] 900 | test = ["cffi (>=1.17.0)", "flaky", "greenlet (>=3)", "ipython", "pytest", "pytest-asyncio (==0.23.8)", "trio"] 901 | types = ["typing_extensions"] 902 | 903 | [[package]] 904 | name = "pytest" 905 | version = "8.4.2" 906 | description = "pytest: simple powerful testing with Python" 907 | optional = false 908 | python-versions = ">=3.9" 909 | groups = ["test"] 910 | files = [ 911 | {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, 912 | {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, 913 | ] 914 | 915 | [package.dependencies] 916 | colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} 917 | exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} 918 | iniconfig = ">=1" 919 | packaging = ">=20" 920 | pluggy = ">=1.5,<2" 921 | pygments = ">=2.7.2" 922 | tomli = {version = ">=1", markers = "python_version < \"3.11\""} 923 | 924 | [package.extras] 925 | dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] 926 | 927 | [[package]] 928 | name = "pytest-cov" 929 | version = "7.0.0" 930 | description = "Pytest plugin for measuring coverage." 931 | optional = false 932 | python-versions = ">=3.9" 933 | groups = ["test"] 934 | files = [ 935 | {file = "pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861"}, 936 | {file = "pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1"}, 937 | ] 938 | 939 | [package.dependencies] 940 | coverage = {version = ">=7.10.6", extras = ["toml"]} 941 | pluggy = ">=1.2" 942 | pytest = ">=7" 943 | 944 | [package.extras] 945 | testing = ["process-tests", "pytest-xdist", "virtualenv"] 946 | 947 | [[package]] 948 | name = "regex" 949 | version = "2025.9.1" 950 | description = "Alternative regular expression module, to replace re." 951 | optional = false 952 | python-versions = ">=3.9" 953 | groups = ["main"] 954 | files = [ 955 | {file = "regex-2025.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5aa2a6a73bf218515484b36a0d20c6ad9dc63f6339ff6224147b0e2c095ee55"}, 956 | {file = "regex-2025.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c2ff5c01d5e47ad5fc9d31bcd61e78c2fa0068ed00cab86b7320214446da766"}, 957 | {file = "regex-2025.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d49dc84e796b666181de8a9973284cad6616335f01b52bf099643253094920fc"}, 958 | {file = "regex-2025.9.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9914fe1040874f83c15fcea86d94ea54091b0666eab330aaab69e30d106aabe"}, 959 | {file = "regex-2025.9.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e71bceb3947362ec5eabd2ca0870bb78eae4edfc60c6c21495133c01b6cd2df4"}, 960 | {file = "regex-2025.9.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:67a74456f410fe5e869239ee7a5423510fe5121549af133809d9591a8075893f"}, 961 | {file = "regex-2025.9.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c3b96ed0223b32dbdc53a83149b6de7ca3acd5acd9c8e64b42a166228abe29c"}, 962 | {file = "regex-2025.9.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:113d5aa950f428faf46fd77d452df62ebb4cc6531cb619f6cc30a369d326bfbd"}, 963 | {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fcdeb38de4f7f3d69d798f4f371189061446792a84e7c92b50054c87aae9c07c"}, 964 | {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4bcdff370509164b67a6c8ec23c9fb40797b72a014766fdc159bb809bd74f7d8"}, 965 | {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:7383efdf6e8e8c61d85e00cfb2e2e18da1a621b8bfb4b0f1c2747db57b942b8f"}, 966 | {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1ec2bd3bdf0f73f7e9f48dca550ba7d973692d5e5e9a90ac42cc5f16c4432d8b"}, 967 | {file = "regex-2025.9.1-cp310-cp310-win32.whl", hash = "sha256:9627e887116c4e9c0986d5c3b4f52bcfe3df09850b704f62ec3cbf177a0ae374"}, 968 | {file = "regex-2025.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:94533e32dc0065eca43912ee6649c90ea0681d59f56d43c45b5bcda9a740b3dd"}, 969 | {file = "regex-2025.9.1-cp310-cp310-win_arm64.whl", hash = "sha256:a874a61bb580d48642ffd338570ee24ab13fa023779190513fcacad104a6e251"}, 970 | {file = "regex-2025.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e5bcf112b09bfd3646e4db6bf2e598534a17d502b0c01ea6550ba4eca780c5e6"}, 971 | {file = "regex-2025.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:67a0295a3c31d675a9ee0238d20238ff10a9a2fdb7a1323c798fc7029578b15c"}, 972 | {file = "regex-2025.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea8267fbadc7d4bd7c1301a50e85c2ff0de293ff9452a1a9f8d82c6cafe38179"}, 973 | {file = "regex-2025.9.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6aeff21de7214d15e928fb5ce757f9495214367ba62875100d4c18d293750cc1"}, 974 | {file = "regex-2025.9.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d89f1bbbbbc0885e1c230f7770d5e98f4f00b0ee85688c871d10df8b184a6323"}, 975 | {file = "regex-2025.9.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca3affe8ddea498ba9d294ab05f5f2d3b5ad5d515bc0d4a9016dd592a03afe52"}, 976 | {file = "regex-2025.9.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91892a7a9f0a980e4c2c85dd19bc14de2b219a3a8867c4b5664b9f972dcc0c78"}, 977 | {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e1cb40406f4ae862710615f9f636c1e030fd6e6abe0e0f65f6a695a2721440c6"}, 978 | {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:94f6cff6f7e2149c7e6499a6ecd4695379eeda8ccbccb9726e8149f2fe382e92"}, 979 | {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6c0226fb322b82709e78c49cc33484206647f8a39954d7e9de1567f5399becd0"}, 980 | {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a12f59c7c380b4fcf7516e9cbb126f95b7a9518902bcf4a852423ff1dcd03e6a"}, 981 | {file = "regex-2025.9.1-cp311-cp311-win32.whl", hash = "sha256:49865e78d147a7a4f143064488da5d549be6bfc3f2579e5044cac61f5c92edd4"}, 982 | {file = "regex-2025.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:d34b901f6f2f02ef60f4ad3855d3a02378c65b094efc4b80388a3aeb700a5de7"}, 983 | {file = "regex-2025.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:47d7c2dab7e0b95b95fd580087b6ae196039d62306a592fa4e162e49004b6299"}, 984 | {file = "regex-2025.9.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:84a25164bd8dcfa9f11c53f561ae9766e506e580b70279d05a7946510bdd6f6a"}, 985 | {file = "regex-2025.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:645e88a73861c64c1af558dd12294fb4e67b5c1eae0096a60d7d8a2143a611c7"}, 986 | {file = "regex-2025.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10a450cba5cd5409526ee1d4449f42aad38dd83ac6948cbd6d7f71ca7018f7db"}, 987 | {file = "regex-2025.9.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9dc5991592933a4192c166eeb67b29d9234f9c86344481173d1bc52f73a7104"}, 988 | {file = "regex-2025.9.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a32291add816961aab472f4fad344c92871a2ee33c6c219b6598e98c1f0108f2"}, 989 | {file = "regex-2025.9.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:588c161a68a383478e27442a678e3b197b13c5ba51dbba40c1ccb8c4c7bee9e9"}, 990 | {file = "regex-2025.9.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47829ffaf652f30d579534da9085fe30c171fa2a6744a93d52ef7195dc38218b"}, 991 | {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e978e5a35b293ea43f140c92a3269b6ab13fe0a2bf8a881f7ac740f5a6ade85"}, 992 | {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4cf09903e72411f4bf3ac1eddd624ecfd423f14b2e4bf1c8b547b72f248b7bf7"}, 993 | {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d016b0f77be63e49613c9e26aaf4a242f196cd3d7a4f15898f5f0ab55c9b24d2"}, 994 | {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:656563e620de6908cd1c9d4f7b9e0777e3341ca7db9d4383bcaa44709c90281e"}, 995 | {file = "regex-2025.9.1-cp312-cp312-win32.whl", hash = "sha256:df33f4ef07b68f7ab637b1dbd70accbf42ef0021c201660656601e8a9835de45"}, 996 | {file = "regex-2025.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:5aba22dfbc60cda7c0853516104724dc904caa2db55f2c3e6e984eb858d3edf3"}, 997 | {file = "regex-2025.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:ec1efb4c25e1849c2685fa95da44bfde1b28c62d356f9c8d861d4dad89ed56e9"}, 998 | {file = "regex-2025.9.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bc6834727d1b98d710a63e6c823edf6ffbf5792eba35d3fa119531349d4142ef"}, 999 | {file = "regex-2025.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c3dc05b6d579875719bccc5f3037b4dc80433d64e94681a0061845bd8863c025"}, 1000 | {file = "regex-2025.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22213527df4c985ec4a729b055a8306272d41d2f45908d7bacb79be0fa7a75ad"}, 1001 | {file = "regex-2025.9.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e3f6e3c5a5a1adc3f7ea1b5aec89abfc2f4fbfba55dafb4343cd1d084f715b2"}, 1002 | {file = "regex-2025.9.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcb89c02a0d6c2bec9b0bb2d8c78782699afe8434493bfa6b4021cc51503f249"}, 1003 | {file = "regex-2025.9.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0e2f95413eb0c651cd1516a670036315b91b71767af83bc8525350d4375ccba"}, 1004 | {file = "regex-2025.9.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a41dc039e1c97d3c2ed3e26523f748e58c4de3ea7a31f95e1cf9ff973fff5a"}, 1005 | {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f0b4258b161094f66857a26ee938d3fe7b8a5063861e44571215c44fbf0e5df"}, 1006 | {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bf70e18ac390e6977ea7e56f921768002cb0fa359c4199606c7219854ae332e0"}, 1007 | {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b84036511e1d2bb0a4ff1aec26951caa2dea8772b223c9e8a19ed8885b32dbac"}, 1008 | {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c2e05dcdfe224047f2a59e70408274c325d019aad96227ab959403ba7d58d2d7"}, 1009 | {file = "regex-2025.9.1-cp313-cp313-win32.whl", hash = "sha256:3b9a62107a7441b81ca98261808fed30ae36ba06c8b7ee435308806bd53c1ed8"}, 1010 | {file = "regex-2025.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:b38afecc10c177eb34cfae68d669d5161880849ba70c05cbfbe409f08cc939d7"}, 1011 | {file = "regex-2025.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:ec329890ad5e7ed9fc292858554d28d58d56bf62cf964faf0aa57964b21155a0"}, 1012 | {file = "regex-2025.9.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:72fb7a016467d364546f22b5ae86c45680a4e0de6b2a6f67441d22172ff641f1"}, 1013 | {file = "regex-2025.9.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c9527fa74eba53f98ad86be2ba003b3ebe97e94b6eb2b916b31b5f055622ef03"}, 1014 | {file = "regex-2025.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c905d925d194c83a63f92422af7544ec188301451b292c8b487f0543726107ca"}, 1015 | {file = "regex-2025.9.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74df7c74a63adcad314426b1f4ea6054a5ab25d05b0244f0c07ff9ce640fa597"}, 1016 | {file = "regex-2025.9.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4f6e935e98ea48c7a2e8be44494de337b57a204470e7f9c9c42f912c414cd6f5"}, 1017 | {file = "regex-2025.9.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4a62d033cd9ebefc7c5e466731a508dfabee827d80b13f455de68a50d3c2543d"}, 1018 | {file = "regex-2025.9.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef971ebf2b93bdc88d8337238be4dfb851cc97ed6808eb04870ef67589415171"}, 1019 | {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d936a1db208bdca0eca1f2bb2c1ba1d8370b226785c1e6db76e32a228ffd0ad5"}, 1020 | {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:7e786d9e4469698fc63815b8de08a89165a0aa851720eb99f5e0ea9d51dd2b6a"}, 1021 | {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6b81d7dbc5466ad2c57ce3a0ddb717858fe1a29535c8866f8514d785fdb9fc5b"}, 1022 | {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cd4890e184a6feb0ef195338a6ce68906a8903a0f2eb7e0ab727dbc0a3156273"}, 1023 | {file = "regex-2025.9.1-cp314-cp314-win32.whl", hash = "sha256:34679a86230e46164c9e0396b56cab13c0505972343880b9e705083cc5b8ec86"}, 1024 | {file = "regex-2025.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:a1196e530a6bfa5f4bde029ac5b0295a6ecfaaffbfffede4bbaf4061d9455b70"}, 1025 | {file = "regex-2025.9.1-cp314-cp314-win_arm64.whl", hash = "sha256:f46d525934871ea772930e997d577d48c6983e50f206ff7b66d4ac5f8941e993"}, 1026 | {file = "regex-2025.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a13d20007dce3c4b00af5d84f6c191ed1c0f70928c6d9b6cd7b8d2f125df7f46"}, 1027 | {file = "regex-2025.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d6b046b0a01cb713fd53ef36cb59db4b0062b343db28e83b52ac6aa01ee5b368"}, 1028 | {file = "regex-2025.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0fa9a7477288717f42dbd02ff5d13057549e9a8cdb81f224c313154cc10bab52"}, 1029 | {file = "regex-2025.9.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2b3ad150c6bc01a8cd5030040675060e2adbe6cbc50aadc4da42c6d32ec266e"}, 1030 | {file = "regex-2025.9.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aa88d5a82dfe80deaf04e8c39c8b0ad166d5d527097eb9431cb932c44bf88715"}, 1031 | {file = "regex-2025.9.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6f1dae2cf6c2dbc6fd2526653692c144721b3cf3f769d2a3c3aa44d0f38b9a58"}, 1032 | {file = "regex-2025.9.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ff62a3022914fc19adaa76b65e03cf62bc67ea16326cbbeb170d280710a7d719"}, 1033 | {file = "regex-2025.9.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a34ef82216189d823bc82f614d1031cb0b919abef27cecfd7b07d1e9a8bdeeb4"}, 1034 | {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d40e6b49daae9ebbd7fa4e600697372cba85b826592408600068e83a3c47211"}, 1035 | {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:0aeb0fe80331059c152a002142699a89bf3e44352aee28261315df0c9874759b"}, 1036 | {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a90014d29cb3098403d82a879105d1418edbbdf948540297435ea6e377023ea7"}, 1037 | {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6ff623271e0b0cc5a95b802666bbd70f17ddd641582d65b10fb260cc0c003529"}, 1038 | {file = "regex-2025.9.1-cp39-cp39-win32.whl", hash = "sha256:d161bfdeabe236290adfd8c7588da7f835d67e9e7bf2945f1e9e120622839ba6"}, 1039 | {file = "regex-2025.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:43ebc77a7dfe36661192afd8d7df5e8be81ec32d2ad0c65b536f66ebfec3dece"}, 1040 | {file = "regex-2025.9.1-cp39-cp39-win_arm64.whl", hash = "sha256:5d74b557cf5554001a869cda60b9a619be307df4d10155894aeaad3ee67c9899"}, 1041 | {file = "regex-2025.9.1.tar.gz", hash = "sha256:88ac07b38d20b54d79e704e38aa3bd2c0f8027432164226bdee201a1c0c9c9ff"}, 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "ruff" 1046 | version = "0.13.0" 1047 | description = "An extremely fast Python linter and code formatter, written in Rust." 1048 | optional = false 1049 | python-versions = ">=3.7" 1050 | groups = ["dev"] 1051 | files = [ 1052 | {file = "ruff-0.13.0-py3-none-linux_armv6l.whl", hash = "sha256:137f3d65d58ee828ae136a12d1dc33d992773d8f7644bc6b82714570f31b2004"}, 1053 | {file = "ruff-0.13.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:21ae48151b66e71fd111b7d79f9ad358814ed58c339631450c66a4be33cc28b9"}, 1054 | {file = "ruff-0.13.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:64de45f4ca5441209e41742d527944635a05a6e7c05798904f39c85bafa819e3"}, 1055 | {file = "ruff-0.13.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b2c653ae9b9d46e0ef62fc6fbf5b979bda20a0b1d2b22f8f7eb0cde9f4963b8"}, 1056 | {file = "ruff-0.13.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4cec632534332062bc9eb5884a267b689085a1afea9801bf94e3ba7498a2d207"}, 1057 | {file = "ruff-0.13.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dcd628101d9f7d122e120ac7c17e0a0f468b19bc925501dbe03c1cb7f5415b24"}, 1058 | {file = "ruff-0.13.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afe37db8e1466acb173bb2a39ca92df00570e0fd7c94c72d87b51b21bb63efea"}, 1059 | {file = "ruff-0.13.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f96a8d90bb258d7d3358b372905fe7333aaacf6c39e2408b9f8ba181f4b6ef2"}, 1060 | {file = "ruff-0.13.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b5e3d883e4f924c5298e3f2ee0f3085819c14f68d1e5b6715597681433f153"}, 1061 | {file = "ruff-0.13.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03447f3d18479df3d24917a92d768a89f873a7181a064858ea90a804a7538991"}, 1062 | {file = "ruff-0.13.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:fbc6b1934eb1c0033da427c805e27d164bb713f8e273a024a7e86176d7f462cf"}, 1063 | {file = "ruff-0.13.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a8ab6a3e03665d39d4a25ee199d207a488724f022db0e1fe4002968abdb8001b"}, 1064 | {file = "ruff-0.13.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d2a5c62f8ccc6dd2fe259917482de7275cecc86141ee10432727c4816235bc41"}, 1065 | {file = "ruff-0.13.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b7b85ca27aeeb1ab421bc787009831cffe6048faae08ad80867edab9f2760945"}, 1066 | {file = "ruff-0.13.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:79ea0c44a3032af768cabfd9616e44c24303af49d633b43e3a5096e009ebe823"}, 1067 | {file = "ruff-0.13.0-py3-none-win32.whl", hash = "sha256:4e473e8f0e6a04e4113f2e1de12a5039579892329ecc49958424e5568ef4f768"}, 1068 | {file = "ruff-0.13.0-py3-none-win_amd64.whl", hash = "sha256:48e5c25c7a3713eea9ce755995767f4dcd1b0b9599b638b12946e892123d1efb"}, 1069 | {file = "ruff-0.13.0-py3-none-win_arm64.whl", hash = "sha256:ab80525317b1e1d38614addec8ac954f1b3e662de9d59114ecbf771d00cf613e"}, 1070 | {file = "ruff-0.13.0.tar.gz", hash = "sha256:5b4b1ee7eb35afae128ab94459b13b2baaed282b1fb0f472a73c82c996c8ae60"}, 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "stack-data" 1075 | version = "0.6.3" 1076 | description = "Extract data from python stack frames and tracebacks for informative displays" 1077 | optional = false 1078 | python-versions = "*" 1079 | groups = ["dev"] 1080 | markers = "python_version >= \"3.11\"" 1081 | files = [ 1082 | {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, 1083 | {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, 1084 | ] 1085 | 1086 | [package.dependencies] 1087 | asttokens = ">=2.1.0" 1088 | executing = ">=1.2.0" 1089 | pure-eval = "*" 1090 | 1091 | [package.extras] 1092 | tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] 1093 | 1094 | [[package]] 1095 | name = "tomli" 1096 | version = "2.2.1" 1097 | description = "A lil' TOML parser" 1098 | optional = false 1099 | python-versions = ">=3.8" 1100 | groups = ["test"] 1101 | markers = "python_full_version <= \"3.11.0a6\"" 1102 | files = [ 1103 | {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, 1104 | {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, 1105 | {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, 1106 | {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, 1107 | {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, 1108 | {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, 1109 | {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, 1110 | {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, 1111 | {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, 1112 | {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, 1113 | {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, 1114 | {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, 1115 | {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, 1116 | {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, 1117 | {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, 1118 | {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, 1119 | {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, 1120 | {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, 1121 | {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, 1122 | {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, 1123 | {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, 1124 | {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, 1125 | {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, 1126 | {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, 1127 | {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, 1128 | {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, 1129 | {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, 1130 | {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, 1131 | {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, 1132 | {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, 1133 | {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, 1134 | {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, 1135 | ] 1136 | 1137 | [[package]] 1138 | name = "toolz" 1139 | version = "1.0.0" 1140 | description = "List processing tools and functional utilities" 1141 | optional = false 1142 | python-versions = ">=3.8" 1143 | groups = ["main"] 1144 | markers = "implementation_name == \"pypy\" or implementation_name == \"cpython\"" 1145 | files = [ 1146 | {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, 1147 | {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, 1148 | ] 1149 | 1150 | [[package]] 1151 | name = "traitlets" 1152 | version = "5.14.3" 1153 | description = "Traitlets Python configuration system" 1154 | optional = false 1155 | python-versions = ">=3.8" 1156 | groups = ["dev"] 1157 | markers = "python_version >= \"3.11\"" 1158 | files = [ 1159 | {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, 1160 | {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, 1161 | ] 1162 | 1163 | [package.extras] 1164 | docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] 1165 | test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] 1166 | 1167 | [[package]] 1168 | name = "ty" 1169 | version = "0.0.1a20" 1170 | description = "An extremely fast Python type checker, written in Rust." 1171 | optional = false 1172 | python-versions = ">=3.8" 1173 | groups = ["dev"] 1174 | files = [ 1175 | {file = "ty-0.0.1a20-py3-none-linux_armv6l.whl", hash = "sha256:f73a7aca1f0d38af4d6999b375eb00553f3bfcba102ae976756cc142e14f3450"}, 1176 | {file = "ty-0.0.1a20-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cad12c857ea4b97bf61e02f6796e13061ccca5e41f054cbd657862d80aa43bae"}, 1177 | {file = "ty-0.0.1a20-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f153b65c7fcb6b8b59547ddb6353761b3e8d8bb6f0edd15e3e3ac14405949f7a"}, 1178 | {file = "ty-0.0.1a20-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c4336987a6a781d4392a9fd7b3a39edb7e4f3dd4f860e03f46c932b52aefa2"}, 1179 | {file = "ty-0.0.1a20-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3ff75cd4c744d09914e8c9db8d99e02f82c9379ad56b0a3fc4c5c9c923cfa84e"}, 1180 | {file = "ty-0.0.1a20-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e26437772be7f7808868701f2bf9e14e706a6ec4c7d02dbd377ff94d7ba60c11"}, 1181 | {file = "ty-0.0.1a20-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:83a7ee12465841619b5eb3ca962ffc7d576bb1c1ac812638681aee241acbfbbe"}, 1182 | {file = "ty-0.0.1a20-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:726d0738be4459ac7ffae312ba96c5f486d6cbc082723f322555d7cba9397871"}, 1183 | {file = "ty-0.0.1a20-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b481f26513f38543df514189fb16744690bcba8d23afee95a01927d93b46e36"}, 1184 | {file = "ty-0.0.1a20-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7abbe3c02218c12228b1d7c5f98c57240029cc3bcb15b6997b707c19be3908c1"}, 1185 | {file = "ty-0.0.1a20-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fff51c75ee3f7cc6d7722f2f15789ef8ffe6fd2af70e7269ac785763c906688e"}, 1186 | {file = "ty-0.0.1a20-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b4124ab75e0e6f09fe7bc9df4a77ee43c5e0ef7e61b0c149d7c089d971437cbd"}, 1187 | {file = "ty-0.0.1a20-py3-none-musllinux_1_2_i686.whl", hash = "sha256:8a138fa4f74e6ed34e9fd14652d132409700c7ff57682c2fed656109ebfba42f"}, 1188 | {file = "ty-0.0.1a20-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8eff8871d6b88d150e2a67beba2c57048f20c090c219f38ed02eebaada04c124"}, 1189 | {file = "ty-0.0.1a20-py3-none-win32.whl", hash = "sha256:3c2ace3a22fab4bd79f84c74e3dab26e798bfba7006bea4008d6321c1bd6efc6"}, 1190 | {file = "ty-0.0.1a20-py3-none-win_amd64.whl", hash = "sha256:f41e77ff118da3385915e13c3f366b3a2f823461de54abd2e0ca72b170ba0f19"}, 1191 | {file = "ty-0.0.1a20-py3-none-win_arm64.whl", hash = "sha256:d8ac1c5a14cda5fad1a8b53959d9a5d979fe16ce1cc2785ea8676fed143ac85f"}, 1192 | {file = "ty-0.0.1a20.tar.gz", hash = "sha256:933b65a152f277aa0e23ba9027e5df2c2cc09e18293e87f2a918658634db5f15"}, 1193 | ] 1194 | 1195 | [[package]] 1196 | name = "typing-extensions" 1197 | version = "4.15.0" 1198 | description = "Backported and Experimental Type Hints for Python 3.9+" 1199 | optional = false 1200 | python-versions = ">=3.9" 1201 | groups = ["main", "dev", "test"] 1202 | files = [ 1203 | {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, 1204 | {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, 1205 | ] 1206 | markers = {test = "python_version < \"3.11\""} 1207 | 1208 | [[package]] 1209 | name = "typing-inspection" 1210 | version = "0.4.1" 1211 | description = "Runtime typing introspection tools" 1212 | optional = false 1213 | python-versions = ">=3.9" 1214 | groups = ["main"] 1215 | files = [ 1216 | {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, 1217 | {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, 1218 | ] 1219 | 1220 | [package.dependencies] 1221 | typing-extensions = ">=4.12.0" 1222 | 1223 | [[package]] 1224 | name = "wcwidth" 1225 | version = "0.2.13" 1226 | description = "Measures the displayed width of unicode strings in a terminal" 1227 | optional = false 1228 | python-versions = "*" 1229 | groups = ["dev"] 1230 | markers = "python_version >= \"3.11\"" 1231 | files = [ 1232 | {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, 1233 | {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, 1234 | ] 1235 | 1236 | [metadata] 1237 | lock-version = "2.1" 1238 | python-versions = "^3.9" 1239 | content-hash = "383ff0a0952b08668074df2cecca5c578eb71a57a22538fb9e783314f08399ea" 1240 | --------------------------------------------------------------------------------