From 2f452231cad7404e55b374cc7b408577f36b4377 Mon Sep 17 00:00:00 2001 From: janvonrickenbach Date: Tue, 20 Feb 2024 17:25:05 +0100 Subject: [PATCH] Bring release branch 0.4 up to date (#429) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add compatibility info for server version 7.1 (#315) * Add compatibility info for new release * Remove obsolete comment * Bump pylint from 2.17.4 to 2.17.5 (#318) Bumps [pylint](https://github.com/pylint-dev/pylint) from 2.17.4 to 2.17.5. - [Release notes](https://github.com/pylint-dev/pylint/releases) - [Commits](https://github.com/pylint-dev/pylint/compare/v2.17.4...v2.17.5) --- updated-dependencies: - dependency-name: pylint dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ansys-sphinx-theme from 0.9.9 to 0.10.0 (#319) Bumps [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) from 0.9.9 to 0.10.0. - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.9.9...v0.10.0) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Show interactive PyVista plots in docs (#320) * Add PyVista dynamic image scraper * Remove theme option, split plots into separate cells where needed * Re-lock dependencies * Remove 'library-namespace' argument from 'build-wheelhouse' action (#321) The 'library-namespace' argument is no longer needed since version 4.1 of the 'build-wheelhouse' action. * Bump ansys-sphinx-theme from 0.10.0 to 0.10.2 (#325) Bumps [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) from 0.10.0 to 0.10.2. - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.10.0...v0.10.2) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Downgrade debugpy because 1.6.8 was yanked. (#326) * Bump mypy from 1.4.1 to 1.5.0 (#327) Bumps [mypy](https://github.com/python/mypy) from 1.4.1 to 1.5.0. - [Commits](https://github.com/python/mypy/compare/v1.4.1...v1.5.0) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ansys-sphinx-theme from 0.10.2 to 0.10.3 (#328) Bumps [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) from 0.10.2 to 0.10.3. - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.10.2...v0.10.3) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump mypy from 1.5.0 to 1.5.1 (#330) Bumps [mypy](https://github.com/python/mypy) from 1.5.0 to 1.5.1. - [Commits](https://github.com/python/mypy/compare/v1.5.0...v1.5.1) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ansys-sphinx-theme from 0.10.3 to 0.10.4 (#331) Bumps [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) from 0.10.3 to 0.10.4. - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.10.3...v0.10.4) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ansys-sphinx-theme from 0.10.4 to 0.10.5 (#332) Bumps [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) from 0.10.4 to 0.10.5. - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.10.4...v0.10.5) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump pyvista from 0.36.1 to 0.42.0 (#336) Bumps [pyvista](https://github.com/pyvista/pyvista) from 0.36.1 to 0.42.0. - [Release notes](https://github.com/pyvista/pyvista/releases) - [Commits](https://github.com/pyvista/pyvista/compare/v0.36.1...v0.42.0) --- updated-dependencies: - dependency-name: pyvista dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump pytest from 7.4.0 to 7.4.1 (#333) Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.0 to 7.4.1. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.4.0...7.4.1) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump pre-commit from 3.3.3 to 3.4.0 (#335) Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 3.3.3 to 3.4.0. - [Release notes](https://github.com/pre-commit/pre-commit/releases) - [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md) - [Commits](https://github.com/pre-commit/pre-commit/compare/v3.3.3...v3.4.0) --- updated-dependencies: - dependency-name: pre-commit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump actions/checkout from 3 to 4 (#338) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ansys-sphinx-theme from 0.10.5 to 0.10.6 (#337) Bumps [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) from 0.10.5 to 0.10.6. - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.10.5...v0.10.6) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump pyvista from 0.36.1 to 0.42.1 (#339) Bumps [pyvista](https://github.com/pyvista/pyvista) from 0.36.1 to 0.42.1. - [Release notes](https://github.com/pyvista/pyvista/releases) - [Commits](https://github.com/pyvista/pyvista/compare/v0.36.1...v0.42.1) --- updated-dependencies: - dependency-name: pyvista dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ansys-sphinx-theme from 0.10.6 to 0.11.0 (#341) Bumps [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) from 0.10.6 to 0.11.0. - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.10.6...v0.11.0) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ansys-sphinx-theme from 0.11.0 to 0.11.1 (#343) Bumps [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) from 0.11.0 to 0.11.1. - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.11.0...v0.11.1) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump pytest from 7.4.1 to 7.4.2 (#340) Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.1 to 7.4.2. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.4.1...7.4.2) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump docker/login-action from 2 to 3 (#345) Bumps [docker/login-action](https://github.com/docker/login-action) from 2 to 3. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * CompositeFiles: convert rst always into a list. (#347) * convert rst always into a list. Users were manually setting the rst as a pure path. * improve descriptions * implement suggestions from the code review and add unit test * Fix broken link, and port changes from 0.3.1 back to develop (#350) * Move minimum_requirements.txt to separate directory (#352) Dependabot struggles to get the correct lockfile to update when both 'poetry.lock' and 'minimum_requirements.txt' are located in the same directory and creates weird PR descriptions. See e.g. https://github.com/ansys/pydpf-composites/pull/351, where the actual base version is '0.42.1', but the PR mentions '0.36.1' which is the version from 'minimum_requirements.txt'. As a simple workaround, we move the 'minimum_requirements.txt' to a separate directory. * Use grouped updates for python dependencies (#334) * Bump the dependencies group with 4 updates (#354) Bumps the dependencies group with 4 updates: [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme), [matplotlib](https://github.com/matplotlib/matplotlib), [pyvista](https://github.com/pyvista/pyvista) and [pylint](https://github.com/pylint-dev/pylint). Updates `ansys-sphinx-theme` from 0.11.1 to 0.11.2 - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.11.1...v0.11.2) Updates `matplotlib` from 3.7.2 to 3.7.3 - [Release notes](https://github.com/matplotlib/matplotlib/releases) - [Commits](https://github.com/matplotlib/matplotlib/compare/v3.7.2...v3.7.3) Updates `pyvista` from 0.42.1 to 0.42.2 - [Release notes](https://github.com/pyvista/pyvista/releases) - [Commits](https://github.com/pyvista/pyvista/compare/v0.42.1...v0.42.2) Updates `pylint` from 2.17.5 to 2.17.6 - [Release notes](https://github.com/pylint-dev/pylint/releases) - [Commits](https://github.com/pylint-dev/pylint/compare/v2.17.5...v2.17.6) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: matplotlib dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: pyvista dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: pylint dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Feat/exposure of material names (#353) * add `material_names` as property to the CompositeModel which returns a dict[dpf mat id, material name]. * add unit test * apply pre-commit patch * Update documentation --------- Co-authored-by: Kathy Pippert <84872299+PipKat@users.noreply.github.com> * Sort composite definition labels before comparing in test. (#361) Sort composite definition labels before comparing in test. Their order is irrelevant since all lookups happen with the label. * Bump the dependencies group with 5 updates (#364) Bumps the dependencies group with 5 updates: | Package | From | To | | --- | --- | --- | | [packaging](https://github.com/pypa/packaging) | `23.1` | `23.2` | | [numpydoc](https://github.com/numpy/numpydoc) | `1.5.0` | `1.6.0` | | [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) | `0.11.2` | `0.12.2` | | [pyvista](https://github.com/pyvista/pyvista) | `0.42.2` | `0.42.3` | | [pylint](https://github.com/pylint-dev/pylint) | `2.17.6` | `2.17.7` | Updates `packaging` from 23.1 to 23.2 - [Release notes](https://github.com/pypa/packaging/releases) - [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pypa/packaging/compare/23.1...23.2) Updates `numpydoc` from 1.5.0 to 1.6.0 - [Release notes](https://github.com/numpy/numpydoc/releases) - [Changelog](https://github.com/numpy/numpydoc/blob/main/doc/release_notes.rst) - [Commits](https://github.com/numpy/numpydoc/compare/v1.5.0...v1.6.0) Updates `ansys-sphinx-theme` from 0.11.2 to 0.12.2 - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.11.2...v0.12.2) Updates `pyvista` from 0.42.2 to 0.42.3 - [Release notes](https://github.com/pyvista/pyvista/releases) - [Commits](https://github.com/pyvista/pyvista/compare/v0.42.2...v0.42.3) Updates `pylint` from 2.17.6 to 2.17.7 - [Release notes](https://github.com/pylint-dev/pylint/releases) - [Commits](https://github.com/pylint-dev/pylint/compare/v2.17.6...v2.17.7) --- updated-dependencies: - dependency-name: packaging dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: numpydoc dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: pyvista dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: pylint dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update supported python versions (#360) - Add support for Python 3.12 - Drop support for Python 3.8 - Run `pyupgrade` with `--py39-plus` - Restrict upper Python version to `<3.13`, to allow solving for numpy `1.26` * Bump the dependencies group with 2 updates (#365) Bumps the dependencies group with 2 updates: [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) and [mypy](https://github.com/python/mypy). Updates `ansys-sphinx-theme` from 0.12.2 to 0.12.3 - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.12.2...v0.12.3) Updates `mypy` from 1.5.1 to 1.6.0 - [Commits](https://github.com/python/mypy/compare/v1.5.1...v1.6.0) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: mypy dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Document composite:minmax_per_element_operator (#366) * Add note that the critical layer indices are 1-based. * Add note when using get_selected_indices * Bump the dependencies group with 2 updates (#367) Bumps the dependencies group with 2 updates: [numpy](https://github.com/numpy/numpy) and [pre-commit](https://github.com/pre-commit/pre-commit). Updates `numpy` from 1.26.0 to 1.26.1 - [Release notes](https://github.com/numpy/numpy/releases) - [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst) - [Commits](https://github.com/numpy/numpy/compare/v1.26.0...v1.26.1) Updates `pre-commit` from 3.4.0 to 3.5.0 - [Release notes](https://github.com/pre-commit/pre-commit/releases) - [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md) - [Commits](https://github.com/pre-commit/pre-commit/compare/v3.4.0...v3.5.0) --- updated-dependencies: - dependency-name: numpy dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: pre-commit dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump the dependencies group with 2 updates (#370) Bumps the dependencies group with 2 updates: [pypandoc](https://github.com/JessicaTegner/pypandoc) and [mypy](https://github.com/python/mypy). Updates `pypandoc` from 1.11 to 1.12 - [Release notes](https://github.com/JessicaTegner/pypandoc/releases) - [Changelog](https://github.com/JessicaTegner/pypandoc/blob/master/release.md) - [Commits](https://github.com/JessicaTegner/pypandoc/compare/v1.11...v1.12) Updates `mypy` from 1.6.0 to 1.6.1 - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/v1.6.0...v1.6.1) --- updated-dependencies: - dependency-name: pypandoc dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: mypy dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump pytest from 7.4.2 to 7.4.3 (#373) Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.2 to 7.4.3. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.4.2...7.4.3) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update minimum DPF core requirement to 0.8.0 (#374) Update the minimum requirement for `ansys-dpf-core` to `0.8.0` in `minimum_requirements.txt`, to match the `pyproject.toml` definition `>=0.8,<1`. * Add support for plots on reference surfaces (#384) * Add support for plots on reference surfaces * Fix layer index that starts at zero for older versions * Add more backward compatibility tests * Only test material name for versions >=7.1 * Support section data from RST (#388) * Import section data directly from the RST (MAPDL solution) * Postprocessing of layered shell and solid elements of MAPDL models which are not preprocessed with ACP. * Additional examples and documentation for the new workflow --------- Co-authored-by: Kathy Pippert <84872299+PipKat@users.noreply.github.com> Co-authored-by: janvonrickenbach * Bump the dependencies group with 6 updates (#390) * Bump the dependencies group with 6 updates Bumps the dependencies group with 6 updates: | Package | From | To | | --- | --- | --- | | [numpy](https://github.com/numpy/numpy) | `1.26.1` | `1.26.2` | | [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) | `0.12.3` | `0.12.5` | | [mypy](https://github.com/python/mypy) | `1.6.1` | `1.7.1` | | [ansys-dpf-core](https://github.com/ansys/pydpf-core) | `0.9.0` | `0.10.0` | | [matplotlib](https://github.com/matplotlib/matplotlib) | `3.8.0` | `3.8.2` | | [scipy](https://github.com/scipy/scipy) | `1.11.3` | `1.11.4` | Updates `numpy` from 1.26.1 to 1.26.2 - [Release notes](https://github.com/numpy/numpy/releases) - [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst) - [Commits](https://github.com/numpy/numpy/compare/v1.26.1...v1.26.2) Updates `ansys-sphinx-theme` from 0.12.3 to 0.12.5 - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.12.3...v0.12.5) Updates `mypy` from 1.6.1 to 1.7.1 - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/v1.6.1...v1.7.1) Updates `ansys-dpf-core` from 0.9.0 to 0.10.0 - [Release notes](https://github.com/ansys/pydpf-core/releases) - [Commits](https://github.com/ansys/pydpf-core/compare/v0.9.0...v0.10.0) Updates `matplotlib` from 3.8.0 to 3.8.2 - [Release notes](https://github.com/matplotlib/matplotlib/releases) - [Commits](https://github.com/matplotlib/matplotlib/compare/v3.8.0...v3.8.2) Updates `scipy` from 1.11.3 to 1.11.4 - [Release notes](https://github.com/scipy/scipy/releases) - [Commits](https://github.com/scipy/scipy/compare/v1.11.3...v1.11.4) --- updated-dependencies: - dependency-name: numpy dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: mypy dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: ansys-dpf-core dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: matplotlib dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: scipy dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] * Fix type hints for paths * Explicitly uninstall ansys-dpf-core in test-minimal --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Dominik Gresch * Bump actions/labeler from 4 to 5 (#393) * Bump actions/labeler from 4 to 5 Bumps [actions/labeler](https://github.com/actions/labeler) from 4 to 5. - [Release notes](https://github.com/actions/labeler/releases) - [Commits](https://github.com/actions/labeler/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/labeler dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Update .github/workflows/label.yml * Update labeler config --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Dominik Gresch Co-authored-by: Dominik Gresch * Bump actions/setup-python from 4 to 5 (#394) Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump the dependencies group with 1 update (#395) Bumps the dependencies group with 1 update: [pyvista](https://github.com/pyvista/pyvista). - [Release notes](https://github.com/pyvista/pyvista/releases) - [Commits](https://github.com/pyvista/pyvista/compare/v0.42.3...v0.43.0) --- updated-dependencies: - dependency-name: pyvista dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump the dependencies group with 1 update (#397) Bumps the dependencies group with 1 update: [pre-commit](https://github.com/pre-commit/pre-commit). - [Release notes](https://github.com/pre-commit/pre-commit/releases) - [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md) - [Commits](https://github.com/pre-commit/pre-commit/compare/v3.5.0...v3.6.0) --- updated-dependencies: - dependency-name: pre-commit dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump the dependencies group with 1 update (#398) Bumps the dependencies group with 1 update: [pyvista](https://github.com/pyvista/pyvista). - [Release notes](https://github.com/pyvista/pyvista/releases) - [Commits](https://github.com/pyvista/pyvista/compare/v0.43.0...v0.43.1) --- updated-dependencies: - dependency-name: pyvista dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ansys/actions from 4 to 5 (#401) Bumps [ansys/actions](https://github.com/ansys/actions) from 4 to 5. - [Release notes](https://github.com/ansys/actions/releases) - [Commits](https://github.com/ansys/actions/compare/v4...v5) --- updated-dependencies: - dependency-name: ansys/actions dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump actions/upload-artifact from 3 to 4 (#399) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump the dependencies group with 2 updates (#402) Bumps the dependencies group with 2 updates: [mypy](https://github.com/python/mypy) and [ansys-dpf-core](https://github.com/ansys/pydpf-core). Updates `mypy` from 1.7.1 to 1.8.0 - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/v1.7.1...v1.8.0) Updates `ansys-dpf-core` from 0.10.0 to 0.10.1 - [Release notes](https://github.com/ansys/pydpf-core/releases) - [Commits](https://github.com/ansys/pydpf-core/compare/v0.10.0...v0.10.1) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: ansys-dpf-core dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump the dependencies group with 1 update (#403) Bumps the dependencies group with 1 update: [pytest](https://github.com/pytest-dev/pytest). Updates `pytest` from 7.4.3 to 7.4.4 - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.4.3...7.4.4) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump the dependencies group with 1 update (#404) Bumps the dependencies group with 1 update: [numpy](https://github.com/numpy/numpy). Updates `numpy` from 1.26.2 to 1.26.3 - [Release notes](https://github.com/numpy/numpy/releases) - [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst) - [Commits](https://github.com/numpy/numpy/compare/v1.26.2...v1.26.3) --- updated-dependencies: - dependency-name: numpy dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump the dependencies group with 1 update (#407) Bumps the dependencies group with 1 update: [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme). Updates `ansys-sphinx-theme` from 0.12.5 to 0.13.0 - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.12.5...v0.13.0) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Remove obsolet premium context (#408) Remove obsolete premium context, since premium is anyway the default. * Add convenience function to get ply-wise data (#396) * Add function to extract ply wise data * Add test for extract ply wise data * Update filtering example * Upload files to unique folder on server to avoid conflicts (#409) * Upload files to unique folder on server to avoid conflicts * Use correct path when uploading example files * New fatigue example (#405) * Add fatigue example * Bump the dependencies group with 2 updates (#411) Bumps the dependencies group with 2 updates: [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) and [pyvista](https://github.com/pyvista/pyvista). Updates `ansys-sphinx-theme` from 0.13.0 to 0.13.1 - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.13.0...v0.13.1) Updates `pyvista` from 0.43.1 to 0.43.2 - [Release notes](https://github.com/pyvista/pyvista/releases) - [Commits](https://github.com/pyvista/pyvista/compare/v0.43.1...v0.43.2) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: pyvista dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add license headers via pre-commit hook (#410) * Add and run pre-commit hook to add license headers * Manually change top-level LICENSE year * cicd: update add-license-header hook (#414) * Bump the dependencies group with 2 updates (#415) Bumps the dependencies group with 2 updates: [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme) and [scipy](https://github.com/scipy/scipy). Updates `ansys-sphinx-theme` from 0.13.1 to 0.13.2 - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.13.1...v0.13.2) Updates `scipy` from 1.11.4 to 1.12.0 - [Release notes](https://github.com/scipy/scipy/releases) - [Commits](https://github.com/scipy/scipy/compare/v1.11.4...v1.12.0) --- updated-dependencies: - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: scipy dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump codecov/codecov-action from 3 to 4 (#416) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3 to 4. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v3...v4) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump peter-evans/create-or-update-comment from 3 to 4 (#413) Bumps [peter-evans/create-or-update-comment](https://github.com/peter-evans/create-or-update-comment) from 3 to 4. - [Release notes](https://github.com/peter-evans/create-or-update-comment/releases) - [Commits](https://github.com/peter-evans/create-or-update-comment/compare/v3...v4) --- updated-dependencies: - dependency-name: peter-evans/create-or-update-comment dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump the dependencies group with 2 updates (#417) Bumps the dependencies group with 2 updates: [numpy](https://github.com/numpy/numpy) and [ansys-sphinx-theme](https://github.com/ansys/ansys-sphinx-theme). Updates `numpy` from 1.26.3 to 1.26.4 - [Release notes](https://github.com/numpy/numpy/releases) - [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst) - [Commits](https://github.com/numpy/numpy/compare/v1.26.3...v1.26.4) Updates `ansys-sphinx-theme` from 0.13.2 to 0.13.3 - [Release notes](https://github.com/ansys/ansys-sphinx-theme/releases) - [Commits](https://github.com/ansys/ansys-sphinx-theme/compare/v0.13.2...v0.13.3) --- updated-dependencies: - dependency-name: numpy dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: ansys-sphinx-theme dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump the dependencies group with 1 update (#418) Bumps the dependencies group with 1 update: [pyvista](https://github.com/pyvista/pyvista). Updates `pyvista` from 0.43.2 to 0.43.3 - [Release notes](https://github.com/pyvista/pyvista/releases) - [Commits](https://github.com/pyvista/pyvista/compare/v0.43.2...v0.43.3) --- updated-dependencies: - dependency-name: pyvista dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Convert numpy slice to list to fix test (#425) Convert numpy slice to list * Fix vale warnings (#423) Vale had a breaking change / bug where warnings now cause a non-zero exit code. To get PR (e.g. dependabot) working again, we need to fix the warnings. * Feat/add release checklist (#427) * Add release checklist and add missing version to compatibility * Add tests for the newly tagged version. * Bump version to 0.4.0 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Dominik Gresch Co-authored-by: René Roos <105842014+roosre@users.noreply.github.com> Co-authored-by: Kathy Pippert <84872299+PipKat@users.noreply.github.com> Co-authored-by: Dominik Gresch Co-authored-by: Roberto Pastor Muela <37798125+RobPasMue@users.noreply.github.com> --- .../minimum_requirements.txt | 2 +- .github/dependabot.yml | 4 + .github/labeler.yml | 11 +- .github/workflows/ci_cd.yml | 54 +- .github/workflows/label.yml | 7 +- .github/workflows/package_cleanup.yml | 2 +- .pre-commit-config.yaml | 8 +- LICENSE | 2 +- README.rst | 26 +- doc/.vale.ini | 4 +- doc/source/api/index.rst | 1 + doc/source/api/layup_info.rst | 1 + doc/source/api/ply_wise_data.rst | 12 + doc/source/conf.py | 7 +- doc/source/index.rst | 39 +- doc/source/intro.rst | 8 +- doc/styles/Vocab/ANSYS/accept.txt | 7 +- examples/001_failure_operator_example.py | 22 + examples/002_sampling_point_example.py | 22 + examples/003_short_fiber_example.py | 24 + .../004_get_material_properties_example.py | 22 + examples/005_get_layup_properties_example.py | 22 + examples/006_filter_composite_data_example.py | 149 +- .../007_interlaminar_normal_stress_example.py | 22 + examples/008_assembly_example.py | 43 +- .../009_short_fiber_orientation_tensor.py | 28 + examples/010_harmonic_example.py | 24 + examples/011_rst_workflow.py | 136 + examples/012_fatigue_example.py | 178 + ... => 099_dpf_composite_failure_workflow.py} | 24 +- poetry.lock | 4414 ++++++++--------- pyproject.toml | 13 +- release_checklist.rst | 8 + src/ansys/dpf/composites/__init__.py | 24 + .../composites/_composite_model_factory.py | 22 + .../dpf/composites/_composite_model_impl.py | 226 +- .../_composite_model_impl_2023r2.py | 62 +- src/ansys/dpf/composites/_indexer.py | 141 +- .../dpf/composites/_sampling_point_helpers.py | 36 +- src/ansys/dpf/composites/_typing_helper.py | 24 +- src/ansys/dpf/composites/composite_model.py | 52 +- src/ansys/dpf/composites/composite_scope.py | 25 +- src/ansys/dpf/composites/constants.py | 43 +- src/ansys/dpf/composites/data_sources.py | 90 +- .../dpf/composites/example_helper/__init__.py | 65 +- .../composites/failure_criteria/__init__.py | 22 + .../_combined_failure_criterion.py | 31 +- .../failure_criteria/_core_failure.py | 22 + .../composites/failure_criteria/_cuntze.py | 22 + .../failure_criteria/_face_sheet_wrinkling.py | 22 + .../_failure_criterion_base.py | 27 +- .../failure_criteria/_failure_mode_enum.py | 22 + .../composites/failure_criteria/_hashin.py | 22 + .../composites/failure_criteria/_hoffman.py | 22 + .../dpf/composites/failure_criteria/_larc.py | 22 + .../failure_criteria/_max_strain.py | 22 + .../failure_criteria/_max_stress.py | 22 + .../dpf/composites/failure_criteria/_puck.py | 22 + .../_quadratic_failure_criterion.py | 22 + .../failure_criteria/_shear_crimping.py | 22 + .../composites/failure_criteria/_tsai_hill.py | 22 + .../composites/failure_criteria/_tsai_wu.py | 22 + .../composites/failure_criteria/_von_mises.py | 22 + .../dpf/composites/layup_info/__init__.py | 26 + .../layup_info/_add_layup_info_to_mesh.py | 61 +- src/ansys/dpf/composites/layup_info/_enums.py | 22 + .../dpf/composites/layup_info/_layup_info.py | 115 +- .../layup_info/_reference_surface.py | 58 + .../layup_info/material_operators.py | 22 + .../layup_info/material_properties.py | 31 +- src/ansys/dpf/composites/ply_wise_data.py | 116 + src/ansys/dpf/composites/result_definition.py | 35 +- src/ansys/dpf/composites/sampling_point.py | 41 +- .../dpf/composites/sampling_point_2023r2.py | 29 +- .../dpf/composites/sampling_point_types.py | 27 +- src/ansys/dpf/composites/select_indices.py | 32 +- .../dpf/composites/server_helpers/__init__.py | 24 + .../_connect_to_or_start_server.py | 34 +- .../composites/server_helpers/_load_plugin.py | 22 + .../server_helpers/_upload_files_to_server.py | 56 +- .../composites/server_helpers/_versions.py | 36 +- src/ansys/dpf/composites/unit_system.py | 27 +- tests/__init__.py | 21 + tests/basic_workflow_test.py | 34 +- tests/composite_model_scoping_test.py | 89 +- tests/composite_model_test.py | 172 +- tests/conftest.py | 39 +- .../mixed_model.wbpz | Bin 0 -> 356396 bytes .../model_with_beams_shells_solids.acph5 | Bin 0 -> 166396 bytes .../model_with_beams_shells_solids.engd | 1841 +++++++ .../model_with_beams_shells_solids.h5 | Bin 0 -> 48264 bytes .../model_with_beams_shells_solids.rst | Bin 0 -> 458752 bytes .../data/shell_mixed_acp_rst_model/ReadMe.txt | 3 + .../linear_shell_with_MAPDL_sections.cdb | 379 ++ .../linear_shell_with_MAPDL_sections.h5 | Bin 0 -> 47272 bytes .../linear_shell_with_MAPDL_sections.rst | Bin 0 -> 327680 bytes .../shell_mixed_acp_rst_model/material.engd | 1577 ++++++ .../multiple_time_steps/MatML.xml | 1320 +++++ .../Setup/ACPCompositeDefinitions.h5 | Bin 0 -> 46176 bytes .../multiple_time_steps/file.rst | Bin 0 -> 393216 bytes ...ment_info_output_all_element_types_test.py | 31 +- tests/element_info_test.py | 145 + .../combined_failure_criterion_test.py | 22 + tests/failure_criteria/core_failure_test.py | 22 + tests/failure_criteria/cuntze_test.py | 22 + .../face_sheet_wrinkling_test.py | 22 + tests/failure_criteria/hashin_test.py | 22 + tests/failure_criteria/hoffman_test.py | 22 + tests/failure_criteria/larc_test.py | 22 + .../max_strain_criterion_test.py | 22 + .../max_stress_criterion_test.py | 22 + tests/failure_criteria/puck_test.py | 22 + tests/failure_criteria/shear_crimping_test.py | 22 + tests/failure_criteria/tsai_hill_test.py | 22 + tests/failure_criteria/tsai_wu_test.py | 22 + tests/failure_criteria/von_mises_test.py | 22 + tests/filter_layered_data_test.py | 39 +- tests/getting_started_test.py | 22 + tests/helper.py | 26 +- tests/layup_properties_test.py | 22 + tests/material_properties_test.py | 26 +- tests/performance_test.py | 22 + tests/ply_wise_data_test.py | 166 + tests/result_definition_test.py | 26 +- tests/rst_only_workflow_test.py | 141 + tests/sampling_point_test.py | 22 + tests/test_data_sources.py | 26 + tests/test_metadata.py | 22 + tests/utils.py | 22 + tox.ini | 18 +- 130 files changed, 11155 insertions(+), 2784 deletions(-) rename minimum_requirements.txt => .ci/minimum_requirements.txt (80%) create mode 100644 doc/source/api/ply_wise_data.rst create mode 100644 examples/011_rst_workflow.py create mode 100644 examples/012_fatigue_example.py rename examples/{011_dpf_composite_failure_workflow.py => 099_dpf_composite_failure_workflow.py} (85%) create mode 100644 release_checklist.rst create mode 100644 src/ansys/dpf/composites/layup_info/_reference_surface.py create mode 100644 src/ansys/dpf/composites/ply_wise_data.py create mode 100644 tests/data/model_with_beams_shells_solids/mixed_model.wbpz create mode 100644 tests/data/model_with_beams_shells_solids/model_with_beams_shells_solids.acph5 create mode 100644 tests/data/model_with_beams_shells_solids/model_with_beams_shells_solids.engd create mode 100644 tests/data/model_with_beams_shells_solids/model_with_beams_shells_solids.h5 create mode 100644 tests/data/model_with_beams_shells_solids/model_with_beams_shells_solids.rst create mode 100644 tests/data/shell_mixed_acp_rst_model/ReadMe.txt create mode 100644 tests/data/shell_mixed_acp_rst_model/linear_shell_with_MAPDL_sections.cdb create mode 100644 tests/data/shell_mixed_acp_rst_model/linear_shell_with_MAPDL_sections.h5 create mode 100644 tests/data/shell_mixed_acp_rst_model/linear_shell_with_MAPDL_sections.rst create mode 100644 tests/data/shell_mixed_acp_rst_model/material.engd create mode 100644 tests/data/workflow_example/multiple_time_steps/MatML.xml create mode 100644 tests/data/workflow_example/multiple_time_steps/Setup/ACPCompositeDefinitions.h5 create mode 100644 tests/data/workflow_example/multiple_time_steps/file.rst create mode 100644 tests/element_info_test.py create mode 100644 tests/ply_wise_data_test.py create mode 100644 tests/rst_only_workflow_test.py diff --git a/minimum_requirements.txt b/.ci/minimum_requirements.txt similarity index 80% rename from minimum_requirements.txt rename to .ci/minimum_requirements.txt index feb659833..991a1eee5 100644 --- a/minimum_requirements.txt +++ b/.ci/minimum_requirements.txt @@ -1,5 +1,5 @@ # Contains minimum requirements that we support numpy == 1.22.0 matplotlib == 3.5.0 -ansys-dpf-core == 0.7.3 +ansys-dpf-core == 0.8.0 pyvista == 0.36.1 diff --git a/.github/dependabot.yml b/.github/dependabot.yml index df4569d0d..641968780 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,6 +5,10 @@ updates: schedule: interval: "daily" versioning-strategy: "lockfile-only" + groups: + dependencies: + patterns: + - "*" # Update all packages together - package-ecosystem: "github-actions" directory: "/" schedule: diff --git a/.github/labeler.yml b/.github/labeler.yml index f5d904279..0d978041e 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,8 +1,9 @@ documentation: -- doc/source/**/* +- changed-files: + - any-glob-to-any-file: ["doc/source/**/*"] maintenance: -- .github/**/* -- .flake8 -- pyproject.toml +- changed-files: + - any-glob-to-any-file: [".github/**/*", ".flake8", "pyproject.toml"] dependencies: -- requirements/* +- changed-files: + - any-glob-to-any-file: ["poetry.lock"] diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 72877eb43..220b18dc3 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -28,9 +28,9 @@ jobs: name: "Code style" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ env.MAIN_PYTHON_VERSION }} - name: Install dependencies @@ -45,7 +45,7 @@ jobs: name: "Documentation style" runs-on: ubuntu-latest steps: - - uses: ansys/actions/doc-style@v4 + - uses: ansys/actions/doc-style@v5 with: token: ${{ secrets.GITHUB_TOKEN }} @@ -58,11 +58,11 @@ jobs: # docker images on the windows agents. See the issue # https://github.com/actions/runner-images/issues/1143 os: [ubuntu-latest] - python-version: ['3.8', '3.9', '3.10', '3.11'] + python-version: ['3.9', '3.10', '3.11', '3.12'] fail-fast: false steps: - name: "Login in Github Container registry" - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} @@ -73,13 +73,16 @@ jobs: # if other containers must be tested. run: | docker pull ghcr.io/ansys/pydpf-composites:${{ env.CONTAINER_TAG }} + docker pull ghcr.io/ansys/pydpf-composites:2024r2_pre0 + docker pull ghcr.io/ansys/pydpf-composites:2024r1_pre0 + docker pull ghcr.io/ansys/pydpf-composites:2024r1 docker pull ghcr.io/ansys/pydpf-composites:2023r2_pre1 - name: "Checkout the project" - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: "Set up Python ${{ matrix.python-version }}" - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} @@ -96,7 +99,7 @@ jobs: LICENSE_SERVER: ${{ secrets.LICENSE_SERVER }} - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} files: coverage.xml @@ -105,7 +108,7 @@ jobs: # pipeline secrets. # - name: "Upload server output" # if: always() - # uses: actions/upload-artifact@v3 + # uses: actions/upload-artifact@v4 # with: # name: server_output # path: tests/logs/*_log_*.txt @@ -117,7 +120,7 @@ jobs: steps: - name: "Login in Github Container registry" - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} @@ -125,11 +128,11 @@ jobs: - name: "Pull and start DPF container" run: | docker pull ghcr.io/ansys/pydpf-composites:${{ env.CONTAINER_TAG }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: - python-version: 3.8 + python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip tox tox-gh-actions @@ -151,7 +154,7 @@ jobs: sudo apt-get install pandoc xvfb - name: "Login in Github Container registry" - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} @@ -163,10 +166,10 @@ jobs: docker run -d --restart always -p 50052:50052 -e ANSYSLMD_LICENSE_FILE=1055@${{ secrets.LICENSE_SERVER }} -e ANSYS_DPF_ACCEPT_LA=Y ghcr.io/ansys/pydpf-composites:${{ env.CONTAINER_TAG }} - name: "Checkout the project" - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: "Set up Python ${{ env.MAIN_PYTHON_VERSION }}" - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ env.MAIN_PYTHON_VERSION }} @@ -180,7 +183,7 @@ jobs: tox -e doc-linux - name: "Upload HTML Documentation" - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: documentation-html path: .tox/doc_out/html @@ -195,7 +198,7 @@ jobs: tox -e doc-linux-pdf - name: "Upload PDF Documentation" - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: documentation-pdf path: .tox/doc_out/latex/ansys-dpf-composites.pdf @@ -207,7 +210,7 @@ jobs: needs: [doc-style, doc-build, code-style, tests, tests_minimal_version] steps: - name: "Build library source and wheel artifacts" - uses: ansys/actions/build-library@v4 + uses: ansys/actions/build-library@v5 with: library-name: ${{ env.PACKAGE_NAME }} @@ -218,13 +221,12 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest] - python-version: ['3.8', '3.9', '3.10', '3.11'] + python-version: ['3.9', '3.10', '3.11', '3.12'] steps: - name: "Build a wheelhouse of the Python library" - uses: ansys/actions/build-wheelhouse@v4 + uses: ansys/actions/build-wheelhouse@v5 with: library-name: "ansys-dpf-composites" - library-namespace: "ansys.dpf.composites" operating-system: ${{ matrix.os }} python-version: ${{ matrix.python-version }} @@ -234,7 +236,7 @@ jobs: runs-on: ubuntu-latest needs: [build-library, build-wheelhouse] steps: - - uses: ansys/actions/doc-deploy-dev@v4 + - uses: ansys/actions/doc-deploy-dev@v5 with: cname: ${{ env.DOCUMENTATION_CNAME }} token: ${{ secrets.GITHUB_TOKEN }} @@ -248,14 +250,14 @@ jobs: steps: - name: "Release to the public PyPI repository" - uses: ansys/actions/release-pypi-public@v4 + uses: ansys/actions/release-pypi-public@v5 with: library-name: ${{ env.PACKAGE_NAME }} twine-username: "__token__" twine-token: ${{ secrets.PYPI_TOKEN }} - name: "Release to GitHub" - uses: ansys/actions/release-github@v4 + uses: ansys/actions/release-github@v5 with: library-name: ${{ env.PACKAGE_NAME }} @@ -265,7 +267,7 @@ jobs: needs: [release] if: github.event_name == 'push' && contains(github.ref, 'refs/tags/v') steps: - - uses: ansys/actions/doc-deploy-stable@v4 + - uses: ansys/actions/doc-deploy-stable@v5 with: cname: ${{ env.DOCUMENTATION_CNAME }} token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 756737d65..3dc805d99 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -16,7 +16,7 @@ jobs: name: Syncer runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: micnncim/action-label-syncer@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -32,10 +32,9 @@ jobs: # Label based on modified files - name: Label based on changed files - uses: actions/labeler@v4 + uses: actions/labeler@v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - sync-labels: '' # Label based on branch name - uses: actions-ecosystem/action-add-labels@v1 @@ -70,7 +69,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Suggest to add labels - uses: peter-evans/create-or-update-comment@v3 + uses: peter-evans/create-or-update-comment@v4 # Execute only when no labels have been applied to the pull request if: toJSON(github.event.pull_request.labels.*.name) == '{}' with: diff --git a/.github/workflows/package_cleanup.yml b/.github/workflows/package_cleanup.yml index d32fe582f..6c21f7bcf 100644 --- a/.github/workflows/package_cleanup.yml +++ b/.github/workflows/package_cleanup.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: "Delete untagged package versions" - uses: ansys/actions/hk-package-clean-untagged@v4 + uses: ansys/actions/hk-package-clean-untagged@v5 with: package-name: 'pydpf-composites' allow-last-days: '14' diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6ff642ebe..3b12be6a2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: rev: v3.7.0 hooks: - id: pyupgrade - args: [--py38-plus] + args: [--py39-plus] - repo: https://github.com/PyCQA/flake8 rev: 6.0.0 @@ -42,6 +42,12 @@ repos: additional_dependencies: ['tomli'] # needed to parse pyproject.toml exclude: '^poetry\.lock$' +- repo: https://github.com/ansys/pre-commit-hooks + rev: v0.2.8 + hooks: + - id: add-license-headers + args: ["--start_year", "2023"] + - repo: local hooks: - id: poetry-pyproject-consistency diff --git a/LICENSE b/LICENSE index 69af3d3e4..d281a4056 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 ANSYS, Inc. All rights reserved. +Copyright (c) 2023 - 2024 ANSYS, Inc. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.rst b/README.rst index 8301e4596..bb8c3fe86 100644 --- a/README.rst +++ b/README.rst @@ -8,7 +8,7 @@ PyDPF Composites :target: https://docs.pyansys.com/ :alt: PyAnsys -.. |python| image:: https://img.shields.io/badge/Python-%3E%3D3.8-blue +.. |python| image:: https://img.shields.io/badge/Python-%3E%3D3.9-blue :target: https://pypi.org/project/ansys-dpf-composites/ :alt: Python @@ -33,13 +33,14 @@ PyDPF Composites :alt: Black -PyDPF Composites is a Python wrapper for Ansys DPF composites. It implements -classes on top of DPF Composites operators and data accessors for short -fiber and layered composites (layered shell and solid elements). This module -can be used to postprocess fiber reinforced plastics and layered composites and -to implement custom failure criteria and computation. For information demonstrating -the behavior and usage of PyDPF Composites, see `Examples`_ in the DPF Composite -documentation. +PyDPF Composites enables the post-processing of composite structures based on +`Ansys DPF`_ and the DPF Composites plugin. So it is a Python wrapper which +implements classes on top of DPF Composites operators and data accessors for +short fiber and layered composites (layered shell and solid elements). This +module can be used to postprocess fiber reinforced plastics and layered +composites, and to implement custom failure criteria and computation. For +information demonstrating the behavior and usage of PyDPF Composites, +see `Examples`_ in the DPF Composite documentation. .. START_MARKER_FOR_SPHINX_DOCS @@ -102,7 +103,7 @@ server is started. #. Run tests with a Docker container: - Follow the steps in `Getting The DPF Server Docker Image`_ to get + Follow the steps in `Getting the DPF server Docker image`_ to get and run the DPF docker image. Run the tests with the following command .. code:: bash @@ -129,7 +130,7 @@ server is started. Build documentation =================== -Follow the description in `Getting The DPF Server Docker Image`_ image to get +Follow the description in `Getting the DPF server Docker image`_ image to get and run the dpf docker image. On Windows, build the documentation with: @@ -194,5 +195,6 @@ released versions. .. _pytest: https://docs.pytest.org/en/stable/ .. _Sphinx: https://www.sphinx-doc.org/en/master/ .. _tox: https://tox.wiki/ -.. _Examples: https://composites.dpf.docs.pyansys.com/dev/examples/index.html -.. _Getting The DPF Server Docker Image: https://composites.dpf.docs.pyansys.com/version/stable/intro.html#getting-the-dpf-server-docker-image +.. _Examples: https://composites.dpf.docs.pyansys.com/version/stable/examples/index.html +.. _Getting the DPF server Docker image: https://composites.dpf.docs.pyansys.com/version/stable/intro.html#getting-the-dpf-server-docker-image +.. _Ansys DPF: https://dpf.docs.pyansys.com/version/stable/ diff --git a/doc/.vale.ini b/doc/.vale.ini index b10919f63..20177c586 100644 --- a/doc/.vale.ini +++ b/doc/.vale.ini @@ -28,4 +28,6 @@ Vocab = ANSYS BasedOnStyles = Vale, Google # Removing Google-specific rule - Not applicable under some circumstances -Google.Colons = NO \ No newline at end of file +Google.Colons = NO + +TokenIgnores = ((:py)?:(func|class|meth|attr|py):`(?:.|\n)*?`)|(<.*>)|(.. code::.*\n| .*) diff --git a/doc/source/api/index.rst b/doc/source/api/index.rst index 151e3ef1e..3b50fe054 100644 --- a/doc/source/api/index.rst +++ b/doc/source/api/index.rst @@ -16,6 +16,7 @@ For in-depth documentation on the different failure criteria, refer to the ACP h data_sources failure_criteria layup_info + ply_wise_data result_definition sampling_point server_helpers diff --git a/doc/source/api/layup_info.rst b/doc/source/api/layup_info.rst index 722d671b0..f51ca18bb 100644 --- a/doc/source/api/layup_info.rst +++ b/doc/source/api/layup_info.rst @@ -18,6 +18,7 @@ General features to access information on the composite lay-up. LayerProperty LayupPropertiesProvider LayupProperty + LayupModelContextType Material properties diff --git a/doc/source/api/ply_wise_data.rst b/doc/source/api/ply_wise_data.rst new file mode 100644 index 000000000..8d1ae64d4 --- /dev/null +++ b/doc/source/api/ply_wise_data.rst @@ -0,0 +1,12 @@ +Ply wise data +------------- + +.. module:: ansys.dpf.composites.ply_wise_data + +.. autosummary:: + :toctree: _autosummary + + SpotReductionStrategy + get_ply_wise_data + + diff --git a/doc/source/conf.py b/doc/source/conf.py index fc03d3c92..603669a6e 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -3,7 +3,9 @@ import os from ansys_sphinx_theme import ansys_favicon, get_version_match, pyansys_logo_black +import numpy as np import pyvista +from pyvista.plotting.utilities.sphinx_gallery import DynamicScraper from sphinx_gallery.sorting import FileNameSortKey from ansys.dpf.composites import __version__ @@ -17,6 +19,8 @@ # necessary when building the sphinx gallery pyvista.BUILDING_GALLERY = True +pyvista.global_theme.window_size = np.array([1024, 768]) * 2 + # Project information project = "ansys-dpf-composites" copyright = f"(c) {datetime.now().year} ANSYS, Inc. All rights reserved" @@ -61,6 +65,7 @@ "sphinx_copybutton", "sphinx_gallery.gen_gallery", "sphinx_design", + "pyvista.ext.viewer_directive", ] # Intersphinx mapping @@ -133,7 +138,7 @@ "backreferences_dir": None, # Modules for which function level galleries are created. In "doc_module": "ansys-pydpf-composites", - "image_scrapers": ("pyvista", "matplotlib"), + "image_scrapers": (DynamicScraper(), "matplotlib"), "ignore_pattern": r"__init__\.py", "thumbnail_size": (350, 350), } diff --git a/doc/source/index.rst b/doc/source/index.rst index d499f9862..c753a1ce6 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -11,10 +11,11 @@ PyDPF Composites ---------------- -PyDPF Composites is a Python wrapper for Ansys DPF composites. It implements +PyDPF Composites enables the post-processing of composite structures based on +`Ansys DPF`_ and the DPF Composites plugin. It implements classes on top of DPF Composites operators and data accessors for short fiber and layered composites (layered shell and solid elements). This module -can be used to postprocess fiber reinforced plastics and layered composites and +can be used to postprocess fiber reinforced plastics and layered composites, and to implement custom failure criteria and computation. .. grid:: 1 1 2 2 @@ -45,11 +46,17 @@ to implement custom failure criteria and computation. Provides developer installation and usage information. +The minimum set of inputs to run a postprocessing for composites is the result files of an +MAPDL solution and a material file (MATML) which was generated by Engineering Data. +Lay-up files from ACP are optional and only required for some advanced operations. Refer to +:ref:`Limitations`. + Key features '''''''''''' Here are some key features of PyDPF Composites: +* Postprocessing of layered shell and solid elements. MAPDL models as well as models preprocessed with ACP are supported. * Failure criteria evaluation as shown in :ref:`Composite failure analysis `. * A :class:`.SamplingPoint` class for extracting and visualizing a result over the entire thickness of a laminate as shown in :ref:`Sampling point `. @@ -62,14 +69,34 @@ Here are some key features of PyDPF Composites: * Postprocessing of homogeneous elements. +.. _limitations: + Limitations ''''''''''' -- Layered elements (section data) that have not been preprocessed with ACP are not supported. - For information on converting legacy models, see `Import of Legacy Mechanical APDL Composite Models`_ - in the Ansys Help. - Only the Mechanical APDL solver is supported. +- The following operators and features are only supported if the model was + preprocessed with ACP and if the corresponding lay-up definition file is passed to the :class:`.CompositeModel` class. + + - The evaluation of the failure criteria for sandwich + (:class:`FaceSheetWrinklingCriterion <.failure_criteria.FaceSheetWrinklingCriterion>`, + :class:`ShearCrimpingCriterion <.failure_criteria.ShearCrimpingCriterion>`) + for solid elements. Layered shell elements are always supported. + + - The computation of interlaminar normal stresses (s3) for layered shell elements. + Without ACP layup definitions, s3 is always zero. This also affects 3D failure criteria which use s3, + such as Puck 3D. This limitation does not affect (layered) solid elements. + + - The support of variable materials and material fields. Without ACP, only the + temperature is considered for the evaluation of variable material properties. + + - Global plies, and scoping by plies. Layer-wise post-processing is always supported. + + - Plotting results on the reference surface of a laminate. +Note: MAPDL models that have not been preprocessed with ACP can be converted. For more +information, see `Import of Legacy Mechanical APDL Composite Models`_ in the Ansys Help. .. _Ansys Workbench: https://download.ansys.com/Current%20Release -.. _Import of Legacy Mechanical APDL Composite Models: https://ansyshelp.ansys.com/account/secured?returnurl=/Views/Secured/corp/v231/en/acp_ug/acp_import_legacy_APDL_comp.html +.. _Import of Legacy Mechanical APDL Composite Models: https://ansyshelp.ansys.com/account/secured?returnurl=/Views/Secured/corp/v232/en/acp_ug/acp_import_legacy_APDL_comp.html .. _Compatibility: https://dpf.docs.pyansys.com/version/stable/getting_started/compatibility.html +.. _Ansys DPF: https://dpf.docs.pyansys.com/version/stable/ diff --git a/doc/source/intro.rst b/doc/source/intro.rst index 686bef56e..417a4f072 100644 --- a/doc/source/intro.rst +++ b/doc/source/intro.rst @@ -112,10 +112,12 @@ By default the DPF server is started from the latest Ansys installer. To choose * - Server version - ansys.dpf.composites Python module version - * - 8.0 (Ansys 2024 R1 pre0) + * - 8.0 (Ansys 2024 R2 pre0) - 0.3.0 and later * - 7.0 (Ansys 2024 R1) - 0.3.0 and later + * - 7.0 (Ansys 2024 R1 pre0) + - 0.3.0 and later * - 6.2 (Ansys 2023 R2) - 0.2.0 and 0.3 * - 6.1 (Ansys 2023 R2 pre1) @@ -128,8 +130,8 @@ By default the DPF server is started from the latest Ansys installer. To choose .. _Get DPF Docker image: -Getting the DPF Server Docker Image +Getting the DPF server Docker image """"""""""""""""""""""""""""""""""" Follow the steps described in the DPF documentation in the section `Run DPF Server in A Docker Container `_. Make sure you also download the composites plugin (e.g ``ansys_dpf_composites_lin_v2024.1.pre0.zip``). -After following the steps above, you should have a running DPF docker container that listens to port 50052. +After following the preceding steps, you should have a running DPF Docker container that listens to port 50052. diff --git a/doc/styles/Vocab/ANSYS/accept.txt b/doc/styles/Vocab/ANSYS/accept.txt index 70a82f65a..f6a316779 100644 --- a/doc/styles/Vocab/ANSYS/accept.txt +++ b/doc/styles/Vocab/ANSYS/accept.txt @@ -6,4 +6,9 @@ accessor interlaminar postprocess Postprocessing - +postprocessing +ply-wise +API +Docker +DPF +dpf diff --git a/examples/001_failure_operator_example.py b/examples/001_failure_operator_example.py index dfc9560f2..b035b6da6 100644 --- a/examples/001_failure_operator_example.py +++ b/examples/001_failure_operator_example.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """ .. _failure_operator_example: diff --git a/examples/002_sampling_point_example.py b/examples/002_sampling_point_example.py index 259e86d6f..dc83ba3b6 100644 --- a/examples/002_sampling_point_example.py +++ b/examples/002_sampling_point_example.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """ .. _sampling_point_example: diff --git a/examples/003_short_fiber_example.py b/examples/003_short_fiber_example.py index 260176964..b26ff933b 100644 --- a/examples/003_short_fiber_example.py +++ b/examples/003_short_fiber_example.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """ .. _short_fiber_example: @@ -72,6 +94,8 @@ a11 = field_variables[0] a11.plot() +# %% + a22 = field_variables[1] a22.plot() diff --git a/examples/004_get_material_properties_example.py b/examples/004_get_material_properties_example.py index 2f67f996d..5cb10fa77 100644 --- a/examples/004_get_material_properties_example.py +++ b/examples/004_get_material_properties_example.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """ .. _material_properties: diff --git a/examples/005_get_layup_properties_example.py b/examples/005_get_layup_properties_example.py index 87a41e8f0..306179756 100644 --- a/examples/005_get_layup_properties_example.py +++ b/examples/005_get_layup_properties_example.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """ .. _layup_properties_plot: diff --git a/examples/006_filter_composite_data_example.py b/examples/006_filter_composite_data_example.py index 32bef8815..26aee5fb2 100644 --- a/examples/006_filter_composite_data_example.py +++ b/examples/006_filter_composite_data_example.py @@ -1,12 +1,40 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """ .. _filter_composite_data: Filter result data by different criteria ---------------------------------------- -This example show how data filtering can be used for custom postprocessing of +This example shows how data filtering can be used for custom postprocessing of layered composites. You can filter strains and stresses by material, layer, or -analysis ply. The example filters data by layer, spot, and node, as well as material +analysis ply. Filtering by analysis ply is implemented on the server side and +exposed with the :func:`.get_ply_wise_data` function. In this case, the data is +filtered (and reduced) on the server side and only the resulting field is returned +to the client. This is the recommended way to filter data if possible. +For more complex filtering, the data is transferred to the client side and filtered +using numpy functionality. +The examples show filtering data by layer, spot, and node, as well as material or analysis ply ID. To learn more about how layered result data is organized, see :ref:`select_indices`. """ @@ -24,17 +52,14 @@ from ansys.dpf.composites.composite_model import CompositeModel from ansys.dpf.composites.constants import Spot, Sym3x3TensorComponent from ansys.dpf.composites.example_helper import get_continuous_fiber_example_files -from ansys.dpf.composites.layup_info import ( - AnalysisPlyInfoProvider, - get_all_analysis_ply_names, - get_dpf_material_id_by_analyis_ply_map, -) +from ansys.dpf.composites.layup_info import AnalysisPlyInfoProvider, get_all_analysis_ply_names +from ansys.dpf.composites.ply_wise_data import SpotReductionStrategy, get_ply_wise_data from ansys.dpf.composites.select_indices import ( get_selected_indices, get_selected_indices_by_analysis_ply, get_selected_indices_by_dpf_material_ids, ) -from ansys.dpf.composites.server_helpers import connect_to_or_start_server +from ansys.dpf.composites.server_helpers import connect_to_or_start_server, version_equal_or_later # %% # Start a DPF server and copy the example files into the current working directory. @@ -55,6 +80,44 @@ stress_operator.inputs.bool_rotate_to_global(False) stress_field = stress_operator.get_output(pin=0, output_type=dpf.types.fields_container)[0] +# %% +# Filter data by analysis ply +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# %% +# List all available analysis plies. +all_ply_names = get_all_analysis_ply_names(composite_model.get_mesh()) +all_ply_names + +# %% +# The easiest way to filter data by analysis ply is to use the :func:`.get_ply_wise_data` function. +# This function supports different reduction strategies such as computing the average, +# maximum, or minimum over the spot locations. +# It also supports selecting a specific spot (TOP, MID, BOT) directly. +# This example selects the maximum value over all spots for each node and then requests +# the elemental location, which implies averaging over all nodes in an element. +# Using the :func:`.get_ply_wise_data` function has the advantage that all the averaging +# and filtering is done on the server side. +if version_equal_or_later(server, "8.0"): + elemental_max = get_ply_wise_data( + field=stress_field, + ply_name="P1L1__ud_patch ns1", + mesh=composite_model.get_mesh(), + component=Sym3x3TensorComponent.TENSOR11, + spot_reduction_strategy=SpotReductionStrategy.MAX, + requested_location=dpf.locations.elemental, + ) + + composite_model.get_mesh().plot(elemental_max) + + +# %% +# Generic client-side filtering +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# This example shows how to filter data by layer, spot, and node using the generic filtering on +# the client side. +# This code plots stress values in the material direction for the first node and top spot. + # %% # Get element information for all elements and show the first one as an example. element_ids = stress_field.scoping.ids @@ -62,9 +125,7 @@ element_infos[0] # %% -# Plot result data -# ~~~~~~~~~~~~~~~~ -# For the top layer, plot stress values in the material direction for the first node and top spot. +# Get filtered data component = Sym3x3TensorComponent.TENSOR11 result_field = dpf.field.Field(location=dpf.locations.elemental, nature=dpf.natures.scalar) with result_field.as_local_field() as local_result_field: @@ -82,23 +143,45 @@ composite_model.get_mesh().plot(result_field) + # %% -# List analysis plies -# ~~~~~~~~~~~~~~~~~~~ -# List all available analysis plies. -all_ply_names = get_all_analysis_ply_names(composite_model.get_mesh()) -all_ply_names +# Filter by material +# ~~~~~~~~~~~~~~~~~~~~~ +# Loop over all elements and get the maximum stress in the material direction +# for all plies that have a specific UD material. + +ud_material_id = composite_model.material_names["Epoxy Carbon UD (230 GPa) Prepreg"] +component = Sym3x3TensorComponent.TENSOR11 + +material_result_field = dpf.field.Field(location=dpf.locations.elemental, nature=dpf.natures.scalar) +with material_result_field.as_local_field() as local_result_field: + element_ids = stress_field.scoping.ids + + for element_id in element_ids: + element_info = composite_model.get_element_info(element_id) + assert element_info is not None + if ud_material_id in element_info.dpf_material_ids: + stress_data = stress_field.get_entity_data_by_id(element_id) + selected_indices = get_selected_indices_by_dpf_material_ids( + element_info, [ud_material_id] + ) + + value = np.max(stress_data[selected_indices][:, component]) + local_result_field.append([value], element_id) + +composite_model.get_mesh().plot(material_result_field) # %% -# Plot results -# ~~~~~~~~~~~~ -# Loop all elements that contain a given ply and plot the maximum stress value +# Filter by analysis ply on the client side +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Loop over all elements that contain a given ply and plot the maximum stress value # in the material direction in this ply. component = Sym3x3TensorComponent.TENSOR11 analysis_ply_info_provider = AnalysisPlyInfoProvider( mesh=composite_model.get_mesh(), name="P1L1__ud_patch ns1" ) + ply_result_field = dpf.field.Field(location=dpf.locations.elemental, nature=dpf.natures.scalar) with ply_result_field.as_local_field() as local_result_field: element_ids = analysis_ply_info_provider.property_field.scoping.ids @@ -116,31 +199,3 @@ composite_model.get_mesh().plot(ply_result_field) - -# %% -# Loop all elements and get the maximum stress in the material direction -# for all plies that have a material with DPF material ID. -# Note: It is not possible to get a DPF material ID for a -# given material name. It is only possible to get a DPF material -# ID from an analysis ply. -material_map = get_dpf_material_id_by_analyis_ply_map( - composite_model.get_mesh(), data_source_or_streams_provider=composite_model.data_sources.rst -) -ud_material_id = material_map["P1L1__ud_patch ns1"] -component = Sym3x3TensorComponent.TENSOR11 - -material_result_field = dpf.field.Field(location=dpf.locations.elemental, nature=dpf.natures.scalar) -with material_result_field.as_local_field() as local_result_field: - element_ids = analysis_ply_info_provider.property_field.scoping.ids - - for element_id in element_ids: - stress_data = stress_field.get_entity_data_by_id(element_id) - element_info = composite_model.get_element_info(element_id) - assert element_info is not None - - selected_indices = get_selected_indices_by_dpf_material_ids(element_info, [ud_material_id]) - - value = np.max(stress_data[selected_indices][:, component]) - local_result_field.append([value], element_id) - -composite_model.get_mesh().plot(material_result_field) diff --git a/examples/007_interlaminar_normal_stress_example.py b/examples/007_interlaminar_normal_stress_example.py index 9325782bf..b155c5f8b 100644 --- a/examples/007_interlaminar_normal_stress_example.py +++ b/examples/007_interlaminar_normal_stress_example.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """ .. _interlaminar_normal_stress_example: diff --git a/examples/008_assembly_example.py b/examples/008_assembly_example.py index 3f67eaf44..78028c182 100644 --- a/examples/008_assembly_example.py +++ b/examples/008_assembly_example.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """ .. _assembly_example: @@ -22,7 +44,11 @@ from ansys.dpf.composites.constants import FailureOutput from ansys.dpf.composites.example_helper import get_continuous_fiber_example_files from ansys.dpf.composites.failure_criteria import CombinedFailureCriterion, MaxStressCriterion -from ansys.dpf.composites.server_helpers import connect_to_or_start_server, version_older_than +from ansys.dpf.composites.server_helpers import ( + connect_to_or_start_server, + version_equal_or_later, + version_older_than, +) # %% # Start a DPF server and copy the example files into the current working directory. @@ -47,17 +73,28 @@ # %% # Plot IRF # ~~~~~~~~ -# Plot the maximum IRF per element. +# Plot the maximum IRF per (solid) element. output_all_elements = composite_model.evaluate_failure_criteria(combined_criterion=combined_fc) irf_field = output_all_elements.get_field({"failure_label": FailureOutput.FAILURE_VALUE}) irf_field.plot() +# %% +# Plot IRF on the reference surface +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Plot the maximum IRF on the reference surface +if version_equal_or_later(server, "8.0"): + irf_field = output_all_elements.get_field( + {"failure_label": FailureOutput.FAILURE_VALUE_REF_SURFACE} + ) + irf_field.plot() + + # %% # Get element information # ~~~~~~~~~~~~~~~~~~~~~~~ # In the assembly, two composite definitions exist: one with a "shell" label # and one with a "solid" label. For DPF Server versions earlier than 7.0, -# the layup properties must be queried with the correct composite definition label. The code +# the lay-up properties must be queried with the correct composite definition label. The code # following gets element information for all layered elements. # For DPF Server versions 7.0 and later, element information can be retrieved directly. diff --git a/examples/009_short_fiber_orientation_tensor.py b/examples/009_short_fiber_orientation_tensor.py index a963c2cb7..fe36899b0 100644 --- a/examples/009_short_fiber_orientation_tensor.py +++ b/examples/009_short_fiber_orientation_tensor.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """ .. _short_fiber_orientation_tensor: @@ -85,6 +107,8 @@ a11 = field_variable_dict[A11_NAME] a11.plot() +# %% + a22 = field_variable_dict[A22_NAME] a22.plot() @@ -134,5 +158,9 @@ aXZ = fiber_orientation_tensor_fc.select_component(5)[0] mesh.plot(aXX, title="Axx", text="Axx plot") + +# %% mesh.plot(aYY, title="Ayy", text="Ayy plot") + +# %% mesh.plot(aXZ, title="Axz", text="Axz plot") diff --git a/examples/010_harmonic_example.py b/examples/010_harmonic_example.py index 6d1b6c3b7..43f351756 100644 --- a/examples/010_harmonic_example.py +++ b/examples/010_harmonic_example.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """ .. _harmonic_example: @@ -131,6 +153,8 @@ failure_evaluator.inputs.strains_container(strain_at_phase) failure_evaluator.inputs.mesh(composite_model.get_mesh()) + # Note: the min/max layer indices are 1-based starting with + # Workbench 2024 R1 (DPF server 7.1) minmax_per_element = dpf.Operator("composite::minmax_per_element_operator") minmax_per_element.inputs.fields_container(failure_evaluator) minmax_per_element.inputs.mesh(composite_model.get_mesh()) diff --git a/examples/011_rst_workflow.py b/examples/011_rst_workflow.py new file mode 100644 index 000000000..77b65df4f --- /dev/null +++ b/examples/011_rst_workflow.py @@ -0,0 +1,136 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +""" +.. _rst_workflow_example: + +Failure analysis of an MAPDL (RST) model +---------------------------------------- + +This example shows the postprocessing of an MAPDL (RST) model with layered elements that was not +preprocessed by ACP. The difference between the RST-only and ACP-based workflow is that +the section data are loaded from the RST file instead of the ACP layup file. +This happens automatically if the parameter `composite` of the +:class:`.ContinuousFiberCompositesFiles` class is not set. + +The engineering data file (XML or ENGD) with the material properties is needed anyway. +Otherwise, the material properties cannot be mapped. +At the end of this example, two workflows are shown on how to create +the engineering data file based on a MAPDL model and how to set the +material UUIDs in MAPDL. + +.. important:: + The material UUIDs in the engineering data file must be identical + to the UUIDs in Mechanical APDL (RST file). + +The postprocessing of MAPDL models is supported in 2024 R2 (DPF Server version 8.0) +and later. A few advanced features are not supported with the RST only workflow. +For more information, see :ref:`limitations`. +""" +# %% +# Set up analysis +# ~~~~~~~~~~~~~~~ +# Setting up the analysis consists of loading Ansys libraries, connecting to the +# DPF server, and retrieving the example files. +# +# Load Ansys libraries. + +from ansys.dpf.composites.composite_model import CompositeModel +from ansys.dpf.composites.constants import FailureOutput +from ansys.dpf.composites.example_helper import get_continuous_fiber_example_files +from ansys.dpf.composites.failure_criteria import ( + CombinedFailureCriterion, + CoreFailureCriterion, + FaceSheetWrinklingCriterion, + MaxStrainCriterion, + MaxStressCriterion, + VonMisesCriterion, +) +from ansys.dpf.composites.server_helpers import connect_to_or_start_server + +# %% +# Start a DPF server and copy the example files into the current working directory. +server = connect_to_or_start_server() + +# %% +# Get input files (RST and material.engd but skip the ACP layup file). +composite_files_on_server = get_continuous_fiber_example_files(server, "shell", True) +print(composite_files_on_server) + +# %% +# Configure combined failure criterion +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Configure the combined failure criterion. + +combined_fc = CombinedFailureCriterion( + name="failure of all materials", + failure_criteria=[ + MaxStrainCriterion(), + MaxStressCriterion(), + CoreFailureCriterion(), + VonMisesCriterion(vme=True, vms=False), + FaceSheetWrinklingCriterion(), + ], +) + +# %% +# Set up model and evaluate failures +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Set up the composite model. + +composite_model = CompositeModel(composite_files_on_server, server) + +# %% +# Evaluate failures for the entire model +output_all_elements = composite_model.evaluate_failure_criteria( + combined_criterion=combined_fc, +) +irf_field = output_all_elements.get_field({"failure_label": FailureOutput.FAILURE_VALUE}) +irf_field.plot() + +# %% +# Create and plot a sampling point +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +sampling_point = composite_model.get_sampling_point(combined_criterion=combined_fc, element_id=2) +sampling_plot = sampling_point.get_result_plots(core_scale_factor=0.1) +sampling_plot.figure.show() + + +# %% +# Create Engineering Data file and set material UUIDs in MAPDL +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Here are two workflows for setting up the engineering data file +# and the material UUIDs in MAPDL. The material UUIDs must be set +# in MAPDL before the model is solved. +# +# With WB and Engineering Data: +# - Create an External Model system in WB and load the solver input file +# - Link the External Model with an Engineering Data system and update it +# - Save the project and copy the generated engineering data file (EngineeringData.xml) +# - For each material, look for the ``DataTransferID``, go to MAPDL and set the material +# UUIDs with the ``MP,UVID,,`` command +# +# With ACP Standalone (for constant material properties only): +# - Start ACP, go to *File - Import Model* and load the solver input file (CDB) +# - Go to the Materials folder and export the engineering data file (Ansys Workbench XML) +# - For each material, look for the ``DataTransferID``, go to MAPDL and set the material +# UUID with the ``MP,UVID,,`` command. diff --git a/examples/012_fatigue_example.py b/examples/012_fatigue_example.py new file mode 100644 index 000000000..42a988e6a --- /dev/null +++ b/examples/012_fatigue_example.py @@ -0,0 +1,178 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +""" +.. _fatigue_plate_example: + +Evaluate fatigue for a composite plate +-------------------------------------- + +This example shows how to evaluate fatigue for a flat plate. +It shows how you can use PyPDF Composites to select specific layers and define a custom +combination method. For this example, the custom combination method is stress in fibre +direction. + +A random load time series is created. Taking into account that the load is assumed +proportional, rainflow counting is applied to the load time series. +Load ranges are then applied on the stress combination method, and damage is evaluated +by using a dummy S-N curve. + +Be aware that the fatpack package is not developed by Ansys, so it is the responsibility +of the user to verify that it works as expected. For more information, see the +`fatpack package `_, + +""" + + +# %% +# Set up analysis +# ~~~~~~~~~~~~~~~ +# Setting up the analysis consists of loading the required modules, connecting to the +# DPF server, and retrieving the example files. +# +# Load Ansys libraries and numpy, matplotlib and fatpack +import ansys.dpf.core as dpf +import fatpack +import matplotlib.pyplot as plt +import numpy as np + +from ansys.dpf.composites.composite_model import CompositeModel +from ansys.dpf.composites.constants import Sym3x3TensorComponent +from ansys.dpf.composites.example_helper import get_continuous_fiber_example_files +from ansys.dpf.composites.layup_info import AnalysisPlyInfoProvider +from ansys.dpf.composites.select_indices import get_selected_indices_by_analysis_ply +from ansys.dpf.composites.server_helpers import connect_to_or_start_server + +# %% +# Start a DPF server and copy the example files into the current working directory. +server = connect_to_or_start_server() +composite_files_on_server = get_continuous_fiber_example_files(server, "fatigue") + +# %% +# Create a composite model +composite_model = CompositeModel(composite_files_on_server, server) + +# %% +# Read stresses and define a specific layer and a component of stress tensor +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# + +# %% +# Read stresses +stress_operator = composite_model.core_model.results.stress() +stress_operator.inputs.bool_rotate_to_global(False) +stress_fc = stress_operator.get_output(pin=0, output_type=dpf.types.fields_container) +stress_field = stress_fc.get_field_by_time_id(1) + +# %% +# Select layer P1L1__ModelingPly.2 +analysis_ply_info_provider = AnalysisPlyInfoProvider( + mesh=composite_model.get_mesh(), name="P1L1__ModelingPly.2" +) + +# %% +# Select Sigma11 as the combination method +component = Sym3x3TensorComponent.TENSOR11 + + +# %% +# Load time series and apply rainflow counting +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# A random time series is created. Load is assumed proportional, so rainflow counting +# can be directly done on the load time series to get the load ranges. +# No mean stress correction is applied. +# +number_of_times = 100 +load_factor_time_series = np.random.normal(-1, 2.5, size=number_of_times) +x = np.linspace(1, number_of_times, number_of_times) +plt.xlabel("Load Index") +plt.ylabel("Load Factor") +plt.plot(x, load_factor_time_series, color="red") + + +# %% +# Fatpack package is used for doing the rainflow counting +load_range_factors = fatpack.find_rainflow_ranges(load_factor_time_series) + + +# %% +# S-N curve +# ~~~~~~~~~ +# A dummy S-N curve is created. Note that this curve is not based on any +# experimental data. Sc is chosen to be twice the orthotropic stress limit in the fiber direction. +# and Nc is set to 1. +# +Sc = 2 * 1979 +Nc = 1 +s_n_curve = fatpack.LinearEnduranceCurve(Sc) +# Value for UD materials +s_n_curve.m = 14 +s_n_curve.Nc = Nc + +N = np.logspace(0, 9, 1000) +S = s_n_curve.get_stress(N) +line = plt.loglog(N, S) +plt.grid(which="both") +plt.title("Dummy Linear S-N curve") +plt.xlabel("Cycles to failure") +plt.ylabel("Stress range (MPa)") + + +# %% +# Damage evaluation +# ~~~~~~~~~~~~~~~~~ +# Stress S11 at time 1 and layer P1L1__ModelingPly.2 are read +# for each load range. Its damage is evaluated using the dummy S-N curve. +# + +damage_result_field = dpf.field.Field(location=dpf.locations.elemental, nature=dpf.natures.scalar) + +with damage_result_field.as_local_field() as local_result_field: + element_ids = analysis_ply_info_provider.property_field.scoping.ids + + for element_id in element_ids: + stress_data = stress_field.get_entity_data_by_id(element_id) + element_info = composite_model.get_element_info(element_id) + assert element_info is not None + selected_indices = get_selected_indices_by_analysis_ply( + analysis_ply_info_provider, element_info + ) + # Load Range scaled by S11 + s_11 = max(stress_data[selected_indices][:, component]) + stress_ranges = load_range_factors * s_11 + fatigue_damage = s_n_curve.find_miner_sum(stress_ranges) + local_result_field.append([fatigue_damage], element_id) + + +# %% +# Plot damage +composite_model.get_mesh().plot(damage_result_field, text="Fatigue Damage") + + +# %% +# Identify the element with the maximum damage +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +maximum_element_scoping = damage_result_field.max().scoping +max_element_id = maximum_element_scoping[0] +print(f"The element with highest damage is {max_element_id}.") +print(f"The highest damage value is {damage_result_field.max().data[0]}.") diff --git a/examples/011_dpf_composite_failure_workflow.py b/examples/099_dpf_composite_failure_workflow.py similarity index 85% rename from examples/011_dpf_composite_failure_workflow.py rename to examples/099_dpf_composite_failure_workflow.py index 233904a70..678ef3f08 100644 --- a/examples/011_dpf_composite_failure_workflow.py +++ b/examples/099_dpf_composite_failure_workflow.py @@ -1,5 +1,27 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """ -.. _basic_example: +.. _basic_example_composite_failure_workflow: DPF composite failure workflow ------------------------------ diff --git a/poetry.lock b/poetry.lock index b4bfbc9c7..c844135f3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "accessible-pygments" @@ -16,111 +16,99 @@ pygments = ">=1.5" [[package]] name = "aiohttp" -version = "3.8.4" +version = "3.9.1" description = "Async http client/server framework (asyncio)" optional = true -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, - {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, - {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, - {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, - {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, - {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, - {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, - {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, - {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, - {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, - {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, - {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"}, + {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"}, + {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"}, + {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"}, + {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"}, + {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"}, + {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8"}, + {file = "aiohttp-3.9.1-cp38-cp38-win32.whl", hash = "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4"}, + {file = "aiohttp-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c"}, + {file = "aiohttp-3.9.1-cp39-cp39-win32.whl", hash = "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7"}, + {file = "aiohttp-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf"}, + {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"}, ] [package.dependencies] aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] +speedups = ["Brotli", "aiodns", "brotlicffi"] [[package]] name = "aiosignal" @@ -149,137 +137,92 @@ files = [ [[package]] name = "ansys-dpf-core" -version = "0.8.1" +version = "0.10.1" description = "Data Processing Framework - Python Core" optional = false -python-versions = ">=3.7, <4" +python-versions = "<4,>=3.9" files = [ - {file = "ansys-dpf-core-0.8.1.tar.gz", hash = "sha256:7e7d8a8459b7ee141bf09a2dc14551deb96dfe45427b73783da2c44987385593"}, - {file = "ansys_dpf_core-0.8.1-py3-none-any.whl", hash = "sha256:74c93a1232c799786c4fb2d078b1204ff78496549751da2d7d791046995a38f8"}, + {file = "ansys_dpf_core-0.10.1-py3-none-any.whl", hash = "sha256:ddfe9393e3b5a3e0bd403161886fba94507c83e3f3e81168e9ab876f80496ff6"}, + {file = "ansys_dpf_core-0.10.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:f70c5ad45dbc1a181775fdc513690336dbcf5bf0040914b3c8722f1894673268"}, + {file = "ansys_dpf_core-0.10.1-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:c1fac8564a60182935ffce646a4acb02bae9937a00a9754e5924ebd4b03af65b"}, + {file = "ansys_dpf_core-0.10.1-py3-none-win_amd64.whl", hash = "sha256:3d26c29b58c742cfb52f6ce04b6e97d058a4fc1592a2c1a2a9d150bdc84f8631"}, ] [package.dependencies] -ansys-dpf-gate = ">=0.3" +google-api-python-client = "*" +grpcio = "*" importlib-metadata = ">=4.0" numpy = "*" packaging = "*" +protobuf = "*" psutil = "*" setuptools = "*" tqdm = "*" [package.extras] -plotting = ["matplotlib (>=3.2)", "pyvista (>=0.32.0)"] - -[[package]] -name = "ansys-dpf-gate" -version = "0.3.1" -description = "DPF Python helpers to call DPF C and gRPC APIs" -optional = false -python-versions = ">=3.7.*" -files = [ - {file = "ansys_dpf_gate-0.3.1-py3-none-any.whl", hash = "sha256:44b19cb766a19ce2dfadeed86e6148dfa5eb1050f8e0fe9ff28f265db56d4a22"}, -] - -[package.dependencies] -ansys-dpf-gatebin = {version = "*", markers = "platform_system != \"Darwin\""} -"ansys.grpc.dpf" = ">=0.2.3" -numpy = "*" - -[[package]] -name = "ansys-dpf-gatebin" -version = "0.3.1" -description = "DPF binaries dependencies for ansys-dpf-gate" -optional = false -python-versions = ">=3.7.*" -files = [ - {file = "ansys_dpf_gatebin-0.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:c48c000465a9f9fe71976feb1376d2524562d06e710ff475e9deb0c8f466db11"}, - {file = "ansys_dpf_gatebin-0.3.1-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:8f45ae6e8ae48ff0f262a4850c32eb7c6fca0e37ed185cecb64d133f9f1ef5cd"}, - {file = "ansys_dpf_gatebin-0.3.1-py3-none-win_amd64.whl", hash = "sha256:087e5499e44e1385366b05e32c7e3f8d1b1e93b044b5dd5d955cbf2a991f78bc"}, -] - -[[package]] -name = "ansys-grpc-dpf" -version = "0.7.1" -description = "Package for ansys-grpc-dpf python gRPC client" -optional = false -python-versions = ">=3.7.*" -files = [ - {file = "ansys_grpc_dpf-0.7.1-py3-none-any.whl", hash = "sha256:bf71388d50c05ee3c24d08f2baf1b10689fccec948276ad5740c9d80aba89c58"}, -] - -[package.dependencies] -google-api-python-client = "*" -grpcio = "*" +plotting = ["imageio (<2.28.1)", "imageio-ffmpeg", "matplotlib (>=3.2)", "pyvista (>=0.32.0)"] [[package]] name = "ansys-sphinx-theme" -version = "0.9.9" +version = "0.13.3" description = "A theme devised by ANSYS, Inc. for Sphinx documentation." optional = true -python-versions = ">=3.7" +python-versions = ">=3.9,<4" files = [ - {file = "ansys-sphinx-theme-0.9.9.tar.gz", hash = "sha256:1813e8d3d8d665512440911db91359dc850af6f359857aff6b80cb80a09b2f0c"}, - {file = "ansys_sphinx_theme-0.9.9-py3-none-any.whl", hash = "sha256:dd2f0344cc0aeda361a95ec4750eb29cb8c782eeb7701f0c34ea64d14660b315"}, + {file = "ansys_sphinx_theme-0.13.3-py3-none-any.whl", hash = "sha256:c87f006a891d286ae7fa2b975ad42cb236c98e3e7aab28ffb1956335be254ea3"}, + {file = "ansys_sphinx_theme-0.13.3.tar.gz", hash = "sha256:6dbe4002c5f45ad3189d9e59f8e41d3773700ba334c19383073e7912c1e3e278"}, ] [package.dependencies] +importlib-metadata = ">=4.0" Jinja2 = ">=3.1.2" -pydata-sphinx-theme = "0.13.3" +pydata-sphinx-theme = ">=0.14,<0.15" Sphinx = ">=4.2.0" [package.extras] -doc = ["Sphinx (==6.1.3)", "bs4 (==0.0.1)", "html5lib (==1.1)", "numpydoc (==1.5.0)", "requests (==2.28.2)", "sphinx-copybutton (==0.5.2)", "sphinx-design (==0.4.1)", "sphinx-jinja (==2.0.2)", "sphinx-notfound-page (==0.8.3)"] +doc = ["Sphinx (==7.2.6)", "numpydoc (==1.6.0)", "requests (==2.31.0)", "sphinx-copybutton (==0.5.2)", "sphinx-design (==0.5.0)", "sphinx-jinja (==2.0.2)", "sphinx-notfound-page (==1.0.0)"] [[package]] name = "anyio" -version = "3.7.0" +version = "4.2.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0"}, - {file = "anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce"}, + {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, + {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, ] [package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=6.1.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] - -[[package]] -name = "appnope" -version = "0.1.3" -description = "Disable App Nap on macOS >= 10.9" -optional = true -python-versions = "*" -files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] name = "argon2-cffi" -version = "21.3.0" -description = "The secure Argon2 password hashing algorithm." +version = "23.1.0" +description = "Argon2 for Python" optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, - {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, ] [package.dependencies] argon2-cffi-bindings = "*" [package.extras] -dev = ["cogapp", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pytest", "sphinx", "sphinx-notfound-page", "tomli"] -docs = ["furo", "sphinx", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] [[package]] name = "argon2-cffi-bindings" @@ -320,27 +263,32 @@ tests = ["pytest"] [[package]] name = "arrow" -version = "1.2.3" +version = "1.3.0" description = "Better dates & times for Python" optional = true -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, - {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, ] [package.dependencies] python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] [[package]] name = "astroid" -version = "2.15.5" +version = "2.15.8" description = "An abstract syntax tree for Python with inference support." optional = true python-versions = ">=3.7.2" files = [ - {file = "astroid-2.15.5-py3-none-any.whl", hash = "sha256:078e5212f9885fa85fbb0cf0101978a336190aadea6e13305409d099f71b2324"}, - {file = "astroid-2.15.5.tar.gz", hash = "sha256:1039262575027b441137ab4a62a793a9b43defb42c32d5670f38686207cd780f"}, + {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, + {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, ] [package.dependencies] @@ -353,74 +301,65 @@ wrapt = [ [[package]] name = "asttokens" -version = "2.2.1" +version = "2.4.1" description = "Annotate AST trees with source code positions" optional = true python-versions = "*" files = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] [package.dependencies] -six = "*" +six = ">=1.12.0" [package.extras] -test = ["astroid", "pytest"] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" optional = true python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "babel" -version = "2.12.1" +version = "2.14.0" description = "Internationalization utilities" optional = true python-versions = ">=3.7" files = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] -[package.dependencies] -pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} - -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -optional = true -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "beautifulsoup4" @@ -442,13 +381,13 @@ lxml = ["lxml"] [[package]] name = "bleach" -version = "6.0.0" +version = "6.1.0" description = "An easy safelist-based HTML-sanitizing tool." optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, - {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, ] [package.dependencies] @@ -456,29 +395,7 @@ six = ">=1.9.0" webencodings = "*" [package.extras] -css = ["tinycss2 (>=1.1.0,<1.2)"] - -[[package]] -name = "bokeh" -version = "3.1.1" -description = "Interactive plots and applications in the browser from Python" -optional = true -python-versions = ">=3.8" -files = [ - {file = "bokeh-3.1.1-py3-none-any.whl", hash = "sha256:a542a076ce326f81bf6d226355458572d39fe8fc9b547eab9728a2f1d71e4bdb"}, - {file = "bokeh-3.1.1.tar.gz", hash = "sha256:ba0fc6bae4352d307541293256dee930a42d0acf92e760c72dc0e7397c3a28e9"}, -] - -[package.dependencies] -contourpy = ">=1" -Jinja2 = ">=2.9" -numpy = ">=1.16" -packaging = ">=16.8" -pandas = ">=1.2" -pillow = ">=7.1.0" -PyYAML = ">=3.10" -tornado = ">=5.1" -xyzservices = ">=2021.09.1" +css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "build" @@ -505,97 +422,85 @@ virtualenv = ["virtualenv (>=20.0.35)"] [[package]] name = "cachetools" -version = "5.3.1" +version = "5.3.2" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, - {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, + {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, + {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, ] [[package]] name = "certifi" -version = "2023.5.7" +version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, ] [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." optional = true -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -603,97 +508,112 @@ pycparser = "*" [[package]] name = "cfgv" -version = "3.3.1" +version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = true -python-versions = ">=3.6.1" +python-versions = ">=3.8" files = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, ] [[package]] name = "charset-normalizer" -version = "3.1.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] @@ -709,148 +629,143 @@ files = [ [[package]] name = "comm" -version = "0.1.3" +version = "0.2.1" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = true -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, - {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, + {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, + {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, ] [package.dependencies] -traitlets = ">=5.3" +traitlets = ">=4" [package.extras] -lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] test = ["pytest"] -typing = ["mypy (>=0.990)"] [[package]] name = "contourpy" -version = "1.1.0" +version = "1.2.0" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = ">=3.8" -files = [ - {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, - {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, - {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, - {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, - {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, - {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, - {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, - {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, - {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, - {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, - {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, - {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, - {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, - {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, - {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, - {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, - {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, + {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, + {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, + {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, + {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, + {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, + {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, + {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, + {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, + {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, ] [package.dependencies] -numpy = ">=1.16" +numpy = ">=1.20,<2.0" [package.extras] bokeh = ["bokeh", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "wurlitzer"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.2.7" +version = "7.4.0" description = "Code coverage measurement for Python" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, - {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, - {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, - {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, - {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, - {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, - {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, - {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, - {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, - {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, - {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, - {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, - {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, - {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, - {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, - {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, - {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, - {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, + {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"}, + {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"}, + {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"}, + {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"}, + {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"}, + {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"}, + {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"}, + {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"}, + {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"}, + {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"}, + {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"}, + {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"}, + {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"}, + {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"}, + {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"}, + {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"}, + {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"}, + {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"}, + {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"}, + {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"}, + {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"}, + {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"}, ] [package.dependencies] @@ -861,30 +776,34 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "41.0.1" +version = "41.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = true python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"}, - {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3"}, - {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db"}, - {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31"}, - {file = "cryptography-41.0.1-cp37-abi3-win32.whl", hash = "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5"}, - {file = "cryptography-41.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5"}, - {file = "cryptography-41.0.1.tar.gz", hash = "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"}, + {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"}, + {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"}, + {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"}, ] [package.dependencies] @@ -902,41 +821,18 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "cycler" -version = "0.11.0" +version = "0.12.1" description = "Composable style cycles" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, ] -[[package]] -name = "debugpy" -version = "1.6.7" -description = "An implementation of the Debug Adapter Protocol for Python" -optional = true -python-versions = ">=3.7" -files = [ - {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, - {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, - {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, - {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, - {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, - {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, - {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, - {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, - {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, - {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, - {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, - {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, - {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, - {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, - {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, - {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, - {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, - {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, -] +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "decorator" @@ -962,13 +858,13 @@ files = [ [[package]] name = "dill" -version = "0.3.6" -description = "serialize all of python" +version = "0.3.7" +description = "serialize all of Python" optional = true python-versions = ">=3.7" files = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, ] [package.extras] @@ -976,13 +872,13 @@ graph = ["objgraph (>=1.7.2)"] [[package]] name = "distlib" -version = "0.3.6" +version = "0.3.8" description = "Distribution utilities" optional = true python-versions = "*" files = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, ] [[package]] @@ -998,13 +894,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.1.2" +version = "1.2.0" description = "Backport of PEP 654 (exception groups)" optional = true python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, - {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, ] [package.extras] @@ -1012,94 +908,117 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "1.2.0" +version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" optional = true -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] [package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "fastjsonschema" -version = "2.17.1" +version = "2.19.1" description = "Fastest Python implementation of JSON schema" optional = true python-versions = "*" files = [ - {file = "fastjsonschema-2.17.1-py3-none-any.whl", hash = "sha256:4b90b252628ca695280924d863fe37234eebadc29c5360d322571233dc9746e0"}, - {file = "fastjsonschema-2.17.1.tar.gz", hash = "sha256:f4eeb8a77cef54861dbf7424ac8ce71306f12cbb086c45131bcba2c6a4f726e3"}, + {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, + {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, ] [package.extras] devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] +[[package]] +name = "fatpack" +version = "0.7.7" +description = "Fatigue analysis in python" +optional = true +python-versions = "*" +files = [ + {file = "fatpack-0.7.7-py3-none-any.whl", hash = "sha256:cc8542cdef861833ad286da34dc0cb8309c398d3fba63ca0d120052c760d2611"}, + {file = "fatpack-0.7.7.tar.gz", hash = "sha256:afb0804844f98672e839764bae490e20a30eadcae693ec86731258001ac7f5e9"}, +] + +[package.dependencies] +numpy = "*" + [[package]] name = "filelock" -version = "3.12.2" +version = "3.13.1" description = "A platform independent file lock." optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, - {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] [[package]] name = "fonttools" -version = "4.40.0" +version = "4.47.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.40.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b802dcbf9bcff74672f292b2466f6589ab8736ce4dcf36f48eb994c2847c4b30"}, - {file = "fonttools-4.40.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f6e3fa3da923063c286320e728ba2270e49c73386e3a711aa680f4b0747d692"}, - {file = "fonttools-4.40.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdf60f8a5c6bcce7d024a33f7e4bc7921f5b74e8ea13bccd204f2c8b86f3470"}, - {file = "fonttools-4.40.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91784e21a1a085fac07c6a407564f4a77feb471b5954c9ee55a4f9165151f6c1"}, - {file = "fonttools-4.40.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:05171f3c546f64d78569f10adc0de72561882352cac39ec7439af12304d8d8c0"}, - {file = "fonttools-4.40.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7449e5e306f3a930a8944c85d0cbc8429cba13503372a1a40f23124d6fb09b58"}, - {file = "fonttools-4.40.0-cp310-cp310-win32.whl", hash = "sha256:bae8c13abbc2511e9a855d2142c0ab01178dd66b1a665798f357da0d06253e0d"}, - {file = "fonttools-4.40.0-cp310-cp310-win_amd64.whl", hash = "sha256:425b74a608427499b0e45e433c34ddc350820b6f25b7c8761963a08145157a66"}, - {file = "fonttools-4.40.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:00ab569b2a3e591e00425023ade87e8fef90380c1dde61be7691cb524ca5f743"}, - {file = "fonttools-4.40.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:18ea64ac43e94c9e0c23d7a9475f1026be0e25b10dda8f236fc956188761df97"}, - {file = "fonttools-4.40.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:022c4a16b412293e7f1ce21b8bab7a6f9d12c4ffdf171fdc67122baddb973069"}, - {file = "fonttools-4.40.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530c5d35109f3e0cea2535742d6a3bc99c0786cf0cbd7bb2dc9212387f0d908c"}, - {file = "fonttools-4.40.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5e00334c66f4e83535384cb5339526d01d02d77f142c23b2f97bd6a4f585497a"}, - {file = "fonttools-4.40.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb52c10fda31159c22c7ed85074e05f8b97da8773ea461706c273e31bcbea836"}, - {file = "fonttools-4.40.0-cp311-cp311-win32.whl", hash = "sha256:6a8d71b9a5c884c72741868e845c0e563c5d83dcaf10bb0ceeec3b4b2eb14c67"}, - {file = "fonttools-4.40.0-cp311-cp311-win_amd64.whl", hash = "sha256:15abb3d055c1b2dff9ce376b6c3db10777cb74b37b52b78f61657634fd348a0d"}, - {file = "fonttools-4.40.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14037c31138fbd21847ad5e5441dfdde003e0a8f3feb5812a1a21fd1c255ffbd"}, - {file = "fonttools-4.40.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:94c915f6716589f78bc00fbc14c5b8de65cfd11ee335d32504f1ef234524cb24"}, - {file = "fonttools-4.40.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37467cee0f32cada2ec08bc16c9c31f9b53ea54b2f5604bf25a1246b5f50593a"}, - {file = "fonttools-4.40.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56d4d85f5374b45b08d2f928517d1e313ea71b4847240398decd0ab3ebbca885"}, - {file = "fonttools-4.40.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8c4305b171b61040b1ee75d18f9baafe58bd3b798d1670078efe2c92436bfb63"}, - {file = "fonttools-4.40.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a954b90d1473c85a22ecf305761d9fd89da93bbd31dae86e7dea436ad2cb5dc9"}, - {file = "fonttools-4.40.0-cp38-cp38-win32.whl", hash = "sha256:1bc4c5b147be8dbc5df9cc8ac5e93ee914ad030fe2a201cc8f02f499db71011d"}, - {file = "fonttools-4.40.0-cp38-cp38-win_amd64.whl", hash = "sha256:8a917828dbfdb1cbe50cf40eeae6fbf9c41aef9e535649ed8f4982b2ef65c091"}, - {file = "fonttools-4.40.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:882983279bf39afe4e945109772c2ffad2be2c90983d6559af8b75c19845a80a"}, - {file = "fonttools-4.40.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c55f1b4109dbc3aeb496677b3e636d55ef46dc078c2a5e3f3db4e90f1c6d2907"}, - {file = "fonttools-4.40.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec468c022d09f1817c691cf884feb1030ef6f1e93e3ea6831b0d8144c06480d1"}, - {file = "fonttools-4.40.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5adf4ba114f028fc3f5317a221fd8b0f4ef7a2e5524a2b1e0fd891b093791a"}, - {file = "fonttools-4.40.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aa83b3f151bc63970f39b2b42a06097c5a22fd7ed9f7ba008e618de4503d3895"}, - {file = "fonttools-4.40.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97d95b8301b62bdece1af943b88bcb3680fd385f88346a4a899ee145913b414a"}, - {file = "fonttools-4.40.0-cp39-cp39-win32.whl", hash = "sha256:1a003608400dd1cca3e089e8c94973c6b51a4fb1ef00ff6d7641617b9242e637"}, - {file = "fonttools-4.40.0-cp39-cp39-win_amd64.whl", hash = "sha256:7961575221e3da0841c75da53833272c520000d76f7f71274dbf43370f8a1065"}, - {file = "fonttools-4.40.0-py3-none-any.whl", hash = "sha256:200729d12461e2038700d31f0d49ad5a7b55855dec7525074979a06b46f88505"}, - {file = "fonttools-4.40.0.tar.gz", hash = "sha256:337b6e83d7ee73c40ea62407f2ce03b07c3459e213b6f332b94a69923b9e1cb9"}, + {file = "fonttools-4.47.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2d2404107626f97a221dc1a65b05396d2bb2ce38e435f64f26ed2369f68675d9"}, + {file = "fonttools-4.47.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c01f409be619a9a0f5590389e37ccb58b47264939f0e8d58bfa1f3ba07d22671"}, + {file = "fonttools-4.47.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d986b66ff722ef675b7ee22fbe5947a41f60a61a4da15579d5e276d897fbc7fa"}, + {file = "fonttools-4.47.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8acf6dd0434b211b3bd30d572d9e019831aae17a54016629fa8224783b22df8"}, + {file = "fonttools-4.47.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:495369c660e0c27233e3c572269cbe520f7f4978be675f990f4005937337d391"}, + {file = "fonttools-4.47.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c59227d7ba5b232281c26ae04fac2c73a79ad0e236bca5c44aae904a18f14faf"}, + {file = "fonttools-4.47.0-cp310-cp310-win32.whl", hash = "sha256:59a6c8b71a245800e923cb684a2dc0eac19c56493e2f896218fcf2571ed28984"}, + {file = "fonttools-4.47.0-cp310-cp310-win_amd64.whl", hash = "sha256:52c82df66201f3a90db438d9d7b337c7c98139de598d0728fb99dab9fd0495ca"}, + {file = "fonttools-4.47.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:854421e328d47d70aa5abceacbe8eef231961b162c71cbe7ff3f47e235e2e5c5"}, + {file = "fonttools-4.47.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:511482df31cfea9f697930f61520f6541185fa5eeba2fa760fe72e8eee5af88b"}, + {file = "fonttools-4.47.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0e2c88c8c985b7b9a7efcd06511fb0a1fe3ddd9a6cd2895ef1dbf9059719d7"}, + {file = "fonttools-4.47.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7a0a8848726956e9d9fb18c977a279013daadf0cbb6725d2015a6dd57527992"}, + {file = "fonttools-4.47.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e869da810ae35afb3019baa0d0306cdbab4760a54909c89ad8904fa629991812"}, + {file = "fonttools-4.47.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dd23848f877c3754f53a4903fb7a593ed100924f9b4bff7d5a4e2e8a7001ae11"}, + {file = "fonttools-4.47.0-cp311-cp311-win32.whl", hash = "sha256:bf1810635c00f7c45d93085611c995fc130009cec5abdc35b327156aa191f982"}, + {file = "fonttools-4.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:61df4dee5d38ab65b26da8efd62d859a1eef7a34dcbc331299a28e24d04c59a7"}, + {file = "fonttools-4.47.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e3f4d61f3a8195eac784f1d0c16c0a3105382c1b9a74d99ac4ba421da39a8826"}, + {file = "fonttools-4.47.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:174995f7b057e799355b393e97f4f93ef1f2197cbfa945e988d49b2a09ecbce8"}, + {file = "fonttools-4.47.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea592e6a09b71cb7a7661dd93ac0b877a6228e2d677ebacbad0a4d118494c86d"}, + {file = "fonttools-4.47.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40bdbe90b33897d9cc4a39f8e415b0fcdeae4c40a99374b8a4982f127ff5c767"}, + {file = "fonttools-4.47.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:843509ae9b93db5aaf1a6302085e30bddc1111d31e11d724584818f5b698f500"}, + {file = "fonttools-4.47.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9acfa1cdc479e0dde528b61423855913d949a7f7fe09e276228298fef4589540"}, + {file = "fonttools-4.47.0-cp312-cp312-win32.whl", hash = "sha256:66c92ec7f95fd9732550ebedefcd190a8d81beaa97e89d523a0d17198a8bda4d"}, + {file = "fonttools-4.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:e8fa20748de55d0021f83754b371432dca0439e02847962fc4c42a0e444c2d78"}, + {file = "fonttools-4.47.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c75e19971209fbbce891ebfd1b10c37320a5a28e8d438861c21d35305aedb81c"}, + {file = "fonttools-4.47.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e79f1a3970d25f692bbb8c8c2637e621a66c0d60c109ab48d4a160f50856deff"}, + {file = "fonttools-4.47.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:562681188c62c024fe2c611b32e08b8de2afa00c0c4e72bed47c47c318e16d5c"}, + {file = "fonttools-4.47.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a77a60315c33393b2bd29d538d1ef026060a63d3a49a9233b779261bad9c3f71"}, + {file = "fonttools-4.47.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4fabb8cc9422efae1a925160083fdcbab8fdc96a8483441eb7457235df625bd"}, + {file = "fonttools-4.47.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2a78dba8c2a1e9d53a0fb5382979f024200dc86adc46a56cbb668a2249862fda"}, + {file = "fonttools-4.47.0-cp38-cp38-win32.whl", hash = "sha256:e6b968543fde4119231c12c2a953dcf83349590ca631ba8216a8edf9cd4d36a9"}, + {file = "fonttools-4.47.0-cp38-cp38-win_amd64.whl", hash = "sha256:4a9a51745c0439516d947480d4d884fa18bd1458e05b829e482b9269afa655bc"}, + {file = "fonttools-4.47.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:62d8ddb058b8e87018e5dc26f3258e2c30daad4c87262dfeb0e2617dd84750e6"}, + {file = "fonttools-4.47.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5dde0eab40faaa5476133123f6a622a1cc3ac9b7af45d65690870620323308b4"}, + {file = "fonttools-4.47.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4da089f6dfdb822293bde576916492cd708c37c2501c3651adde39804630538"}, + {file = "fonttools-4.47.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:253bb46bab970e8aae254cebf2ae3db98a4ef6bd034707aa68a239027d2b198d"}, + {file = "fonttools-4.47.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1193fb090061efa2f9e2d8d743ae9850c77b66746a3b32792324cdce65784154"}, + {file = "fonttools-4.47.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:084511482dd265bce6dca24c509894062f0117e4e6869384d853f46c0e6d43be"}, + {file = "fonttools-4.47.0-cp39-cp39-win32.whl", hash = "sha256:97620c4af36e4c849e52661492e31dc36916df12571cb900d16960ab8e92a980"}, + {file = "fonttools-4.47.0-cp39-cp39-win_amd64.whl", hash = "sha256:e77bdf52185bdaf63d39f3e1ac3212e6cfa3ab07d509b94557a8902ce9c13c82"}, + {file = "fonttools-4.47.0-py3-none-any.whl", hash = "sha256:d6477ba902dd2d7adda7f0fd3bfaeb92885d45993c9e1928c9f28fc3961415f7"}, + {file = "fonttools-4.47.0.tar.gz", hash = "sha256:ec13a10715eef0e031858c1c23bfaee6cba02b97558e4a7bfa089dba4a8c2ebf"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] +interpolatable = ["munkres", "pycairo", "scipy"] lxml = ["lxml (>=4.0,<5)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] @@ -1107,7 +1026,7 @@ repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.0.0)"] +unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] @@ -1123,96 +1042,99 @@ files = [ [[package]] name = "frozenlist" -version = "1.3.3" +version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] [[package]] name = "google-api-core" -version = "2.11.1" +version = "2.15.0" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-core-2.11.1.tar.gz", hash = "sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a"}, - {file = "google_api_core-2.11.1-py3-none-any.whl", hash = "sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a"}, + {file = "google-api-core-2.15.0.tar.gz", hash = "sha256:abc978a72658f14a2df1e5e12532effe40f94f868f6e23d95133bd6abcca35ca"}, + {file = "google_api_core-2.15.0-py3-none-any.whl", hash = "sha256:2aa56d2be495551e66bbff7f729b790546f87d5c90e74781aa77233bcb395a8a"}, ] [package.dependencies] @@ -1228,13 +1150,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.91.0" +version = "2.111.0" description = "Google API Client Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.91.0.tar.gz", hash = "sha256:d9385ad6e7f95eecd40f7c81e3abfe4b6ad3a84f2c16bcdb66fb7b8dd814ed56"}, - {file = "google_api_python_client-2.91.0-py2.py3-none-any.whl", hash = "sha256:6959d21d4b20c0f65c69662ca7b6a8a02fc08f3e7f72d70b28ae3e6e3a5f9ab2"}, + {file = "google-api-python-client-2.111.0.tar.gz", hash = "sha256:3a45a53c031478d1c82c7162dd25c9a965247bca6bd438af0838a9d9b8219405"}, + {file = "google_api_python_client-2.111.0-py2.py3-none-any.whl", hash = "sha256:b605adee2d09a843b97a59925757802904679e44e5599708cedb8939900dfbc7"}, ] [package.dependencies] @@ -1246,53 +1168,51 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.17.3" +version = "2.26.1" description = "Google Authentication Library" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.7" files = [ - {file = "google-auth-2.17.3.tar.gz", hash = "sha256:ce311e2bc58b130fddf316df57c9b3943c2a7b4f6ec31de9663a9333e4064efc"}, - {file = "google_auth-2.17.3-py2.py3-none-any.whl", hash = "sha256:f586b274d3eb7bd932ea424b1c702a30e0393a2e2bc4ca3eae8263ffd8be229f"}, + {file = "google-auth-2.26.1.tar.gz", hash = "sha256:54385acca5c0fbdda510cd8585ba6f3fcb06eeecf8a6ecca39d3ee148b092590"}, + {file = "google_auth-2.26.1-py2.py3-none-any.whl", hash = "sha256:2c8b55e3e564f298122a02ab7b97458ccfcc5617840beb5d0ac757ada92c9780"}, ] [package.dependencies] cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} -six = ">=1.9.0" +rsa = ">=3.1.4,<5" [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0dev)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-auth-httplib2" -version = "0.1.0" +version = "0.2.0" description = "Google Authentication Library: httplib2 transport" optional = false python-versions = "*" files = [ - {file = "google-auth-httplib2-0.1.0.tar.gz", hash = "sha256:a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac"}, - {file = "google_auth_httplib2-0.1.0-py2.py3-none-any.whl", hash = "sha256:31e49c36c6b5643b57e82617cb3e021e3e1d2df9da63af67252c02fa9c1f4a10"}, + {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"}, + {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"}, ] [package.dependencies] google-auth = "*" -httplib2 = ">=0.15.0" -six = "*" +httplib2 = ">=0.19.0" [[package]] name = "googleapis-common-protos" -version = "1.59.1" +version = "1.62.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.59.1.tar.gz", hash = "sha256:b35d530fe825fb4227857bc47ad84c33c809ac96f312e13182bdeaa2abe1178a"}, - {file = "googleapis_common_protos-1.59.1-py2.py3-none-any.whl", hash = "sha256:0cbedb6fb68f1c07e18eb4c48256320777707e7d0c55063ae56c15db3224a61e"}, + {file = "googleapis-common-protos-1.62.0.tar.gz", hash = "sha256:83f0ece9f94e5672cced82f592d2a5edf527a96ed1794f0bab36d5735c996277"}, + {file = "googleapis_common_protos-1.62.0-py2.py3-none-any.whl", hash = "sha256:4750113612205514f9f6aa4cb00d523a94f3e8c06c5ad2fee466387dc4875f07"}, ] [package.dependencies] @@ -1303,60 +1223,69 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpcio" -version = "1.56.0" +version = "1.60.0" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.56.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:fb34ace11419f1ae321c36ccaa18d81cd3f20728cd191250be42949d6845bb2d"}, - {file = "grpcio-1.56.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:008767c0aed4899e657b50f2e0beacbabccab51359eba547f860e7c55f2be6ba"}, - {file = "grpcio-1.56.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:17f47aeb9be0da5337f9ff33ebb8795899021e6c0741ee68bd69774a7804ca86"}, - {file = "grpcio-1.56.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43c50d810cc26349b093bf2cfe86756ab3e9aba3e7e681d360930c1268e1399a"}, - {file = "grpcio-1.56.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187b8f71bad7d41eea15e0c9812aaa2b87adfb343895fffb704fb040ca731863"}, - {file = "grpcio-1.56.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:881575f240eb5db72ddca4dc5602898c29bc082e0d94599bf20588fb7d1ee6a0"}, - {file = "grpcio-1.56.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c243b158dd7585021d16c50498c4b2ec0a64a6119967440c5ff2d8c89e72330e"}, - {file = "grpcio-1.56.0-cp310-cp310-win32.whl", hash = "sha256:8b3b2c7b5feef90bc9a5fa1c7f97637e55ec3e76460c6d16c3013952ee479cd9"}, - {file = "grpcio-1.56.0-cp310-cp310-win_amd64.whl", hash = "sha256:03a80451530fd3b8b155e0c4480434f6be669daf7ecba56f73ef98f94222ee01"}, - {file = "grpcio-1.56.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:64bd3abcf9fb4a9fa4ede8d0d34686314a7075f62a1502217b227991d9ca4245"}, - {file = "grpcio-1.56.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:fdc3a895791af4addbb826808d4c9c35917c59bb5c430d729f44224e51c92d61"}, - {file = "grpcio-1.56.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:4f84a6fd4482e5fe73b297d4874b62a535bc75dc6aec8e9fe0dc88106cd40397"}, - {file = "grpcio-1.56.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14e70b4dda3183abea94c72d41d5930c333b21f8561c1904a372d80370592ef3"}, - {file = "grpcio-1.56.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b5ce42a5ebe3e04796246ba50357f1813c44a6efe17a37f8dc7a5c470377312"}, - {file = "grpcio-1.56.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8219f17baf069fe8e42bd8ca0b312b875595e43a70cabf397be4fda488e2f27d"}, - {file = "grpcio-1.56.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:defdd14b518e6e468466f799aaa69db0355bca8d3a5ea75fb912d28ba6f8af31"}, - {file = "grpcio-1.56.0-cp311-cp311-win32.whl", hash = "sha256:50f4daa698835accbbcc60e61e0bc29636c0156ddcafb3891c987e533a0031ba"}, - {file = "grpcio-1.56.0-cp311-cp311-win_amd64.whl", hash = "sha256:59c4e606993a47146fbeaf304b9e78c447f5b9ee5641cae013028c4cca784617"}, - {file = "grpcio-1.56.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:b1f4b6f25a87d80b28dd6d02e87d63fe1577fe6d04a60a17454e3f8077a38279"}, - {file = "grpcio-1.56.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:c2148170e01d464d41011a878088444c13413264418b557f0bdcd1bf1b674a0e"}, - {file = "grpcio-1.56.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:0409de787ebbf08c9d2bca2bcc7762c1efe72eada164af78b50567a8dfc7253c"}, - {file = "grpcio-1.56.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66f0369d27f4c105cd21059d635860bb2ea81bd593061c45fb64875103f40e4a"}, - {file = "grpcio-1.56.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38fdf5bd0a1c754ce6bf9311a3c2c7ebe56e88b8763593316b69e0e9a56af1de"}, - {file = "grpcio-1.56.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:79d4c5911d12a7aa671e5eb40cbb50a830396525014d2d6f254ea2ba180ce637"}, - {file = "grpcio-1.56.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5d2fc471668a7222e213f86ef76933b18cdda6a51ea1322034478df8c6519959"}, - {file = "grpcio-1.56.0-cp37-cp37m-win_amd64.whl", hash = "sha256:991224fd485e088d3cb5e34366053691a4848a6b7112b8f5625a411305c26691"}, - {file = "grpcio-1.56.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:c6f36621aabecbaff3e70c4d1d924c76c8e6a7ffec60c331893640a4af0a8037"}, - {file = "grpcio-1.56.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:1eadd6de258901929223f422ffed7f8b310c0323324caf59227f9899ea1b1674"}, - {file = "grpcio-1.56.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:72836b5a1d4f508ffbcfe35033d027859cc737972f9dddbe33fb75d687421e2e"}, - {file = "grpcio-1.56.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f92a99ab0c7772fb6859bf2e4f44ad30088d18f7c67b83205297bfb229e0d2cf"}, - {file = "grpcio-1.56.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa08affbf672d051cd3da62303901aeb7042a2c188c03b2c2a2d346fc5e81c14"}, - {file = "grpcio-1.56.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2db108b4c8e29c145e95b0226973a66d73ae3e3e7fae00329294af4e27f1c42"}, - {file = "grpcio-1.56.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8674fdbd28266d8efbcddacf4ec3643f76fe6376f73283fd63a8374c14b0ef7c"}, - {file = "grpcio-1.56.0-cp38-cp38-win32.whl", hash = "sha256:bd55f743e654fb050c665968d7ec2c33f03578a4bbb163cfce38024775ff54cc"}, - {file = "grpcio-1.56.0-cp38-cp38-win_amd64.whl", hash = "sha256:c63bc5ac6c7e646c296fed9139097ae0f0e63f36f0864d7ce431cce61fe0118a"}, - {file = "grpcio-1.56.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c0bc9dda550785d23f4f025be614b7faa8d0293e10811f0f8536cf50435b7a30"}, - {file = "grpcio-1.56.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:d596408bab632ec7b947761e83ce6b3e7632e26b76d64c239ba66b554b7ee286"}, - {file = "grpcio-1.56.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:76b6e6e1ee9bda32e6e933efd61c512e9a9f377d7c580977f090d1a9c78cca44"}, - {file = "grpcio-1.56.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7beb84ebd0a3f732625124b73969d12b7350c5d9d64ddf81ae739bbc63d5b1ed"}, - {file = "grpcio-1.56.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83ec714bbbe9b9502177c842417fde39f7a267031e01fa3cd83f1ca49688f537"}, - {file = "grpcio-1.56.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4feee75565d1b5ab09cb3a5da672b84ca7f6dd80ee07a50f5537207a9af543a4"}, - {file = "grpcio-1.56.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b4638a796778329cc8e142e4f57c705adb286b3ba64e00b0fa91eeb919611be8"}, - {file = "grpcio-1.56.0-cp39-cp39-win32.whl", hash = "sha256:437af5a7673bca89c4bc0a993382200592d104dd7bf55eddcd141cef91f40bab"}, - {file = "grpcio-1.56.0-cp39-cp39-win_amd64.whl", hash = "sha256:4241a1c2c76e748023c834995cd916570e7180ee478969c2d79a60ce007bc837"}, - {file = "grpcio-1.56.0.tar.gz", hash = "sha256:4c08ee21b3d10315b8dc26f6c13917b20ed574cdbed2d2d80c53d5508fdcc0f2"}, + {file = "grpcio-1.60.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:d020cfa595d1f8f5c6b343530cd3ca16ae5aefdd1e832b777f9f0eb105f5b139"}, + {file = "grpcio-1.60.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b98f43fcdb16172dec5f4b49f2fece4b16a99fd284d81c6bbac1b3b69fcbe0ff"}, + {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:20e7a4f7ded59097c84059d28230907cd97130fa74f4a8bfd1d8e5ba18c81491"}, + {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452ca5b4afed30e7274445dd9b441a35ece656ec1600b77fff8c216fdf07df43"}, + {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43e636dc2ce9ece583b3e2ca41df5c983f4302eabc6d5f9cd04f0562ee8ec1ae"}, + {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e306b97966369b889985a562ede9d99180def39ad42c8014628dd3cc343f508"}, + {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f897c3b127532e6befdcf961c415c97f320d45614daf84deba0a54e64ea2457b"}, + {file = "grpcio-1.60.0-cp310-cp310-win32.whl", hash = "sha256:b87efe4a380887425bb15f220079aa8336276398dc33fce38c64d278164f963d"}, + {file = "grpcio-1.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:a9c7b71211f066908e518a2ef7a5e211670761651039f0d6a80d8d40054047df"}, + {file = "grpcio-1.60.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:fb464479934778d7cc5baf463d959d361954d6533ad34c3a4f1d267e86ee25fd"}, + {file = "grpcio-1.60.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:4b44d7e39964e808b071714666a812049765b26b3ea48c4434a3b317bac82f14"}, + {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:90bdd76b3f04bdb21de5398b8a7c629676c81dfac290f5f19883857e9371d28c"}, + {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91229d7203f1ef0ab420c9b53fe2ca5c1fbeb34f69b3bc1b5089466237a4a134"}, + {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b36a2c6d4920ba88fa98075fdd58ff94ebeb8acc1215ae07d01a418af4c0253"}, + {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:297eef542156d6b15174a1231c2493ea9ea54af8d016b8ca7d5d9cc65cfcc444"}, + {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:87c9224acba0ad8bacddf427a1c2772e17ce50b3042a789547af27099c5f751d"}, + {file = "grpcio-1.60.0-cp311-cp311-win32.whl", hash = "sha256:95ae3e8e2c1b9bf671817f86f155c5da7d49a2289c5cf27a319458c3e025c320"}, + {file = "grpcio-1.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:467a7d31554892eed2aa6c2d47ded1079fc40ea0b9601d9f79204afa8902274b"}, + {file = "grpcio-1.60.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:a7152fa6e597c20cb97923407cf0934e14224af42c2b8d915f48bc3ad2d9ac18"}, + {file = "grpcio-1.60.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:7db16dd4ea1b05ada504f08d0dca1cd9b926bed3770f50e715d087c6f00ad748"}, + {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:b0571a5aef36ba9177e262dc88a9240c866d903a62799e44fd4aae3f9a2ec17e"}, + {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fd9584bf1bccdfff1512719316efa77be235469e1e3295dce64538c4773840b"}, + {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6a478581b1a1a8fdf3318ecb5f4d0cda41cacdffe2b527c23707c9c1b8fdb55"}, + {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:77c8a317f0fd5a0a2be8ed5cbe5341537d5c00bb79b3bb27ba7c5378ba77dbca"}, + {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1c30bb23a41df95109db130a6cc1b974844300ae2e5d68dd4947aacba5985aa5"}, + {file = "grpcio-1.60.0-cp312-cp312-win32.whl", hash = "sha256:2aef56e85901c2397bd557c5ba514f84de1f0ae5dd132f5d5fed042858115951"}, + {file = "grpcio-1.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:e381fe0c2aa6c03b056ad8f52f8efca7be29fb4d9ae2f8873520843b6039612a"}, + {file = "grpcio-1.60.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:92f88ca1b956eb8427a11bb8b4a0c0b2b03377235fc5102cb05e533b8693a415"}, + {file = "grpcio-1.60.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:e278eafb406f7e1b1b637c2cf51d3ad45883bb5bd1ca56bc05e4fc135dfdaa65"}, + {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:a48edde788b99214613e440fce495bbe2b1e142a7f214cce9e0832146c41e324"}, + {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de2ad69c9a094bf37c1102b5744c9aec6cf74d2b635558b779085d0263166454"}, + {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073f959c6f570797272f4ee9464a9997eaf1e98c27cb680225b82b53390d61e6"}, + {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c826f93050c73e7769806f92e601e0efdb83ec8d7c76ddf45d514fee54e8e619"}, + {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9e30be89a75ee66aec7f9e60086fadb37ff8c0ba49a022887c28c134341f7179"}, + {file = "grpcio-1.60.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b0fb2d4801546598ac5cd18e3ec79c1a9af8b8f2a86283c55a5337c5aeca4b1b"}, + {file = "grpcio-1.60.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:9073513ec380434eb8d21970e1ab3161041de121f4018bbed3146839451a6d8e"}, + {file = "grpcio-1.60.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:74d7d9fa97809c5b892449b28a65ec2bfa458a4735ddad46074f9f7d9550ad13"}, + {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:1434ca77d6fed4ea312901122dc8da6c4389738bf5788f43efb19a838ac03ead"}, + {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e61e76020e0c332a98290323ecfec721c9544f5b739fab925b6e8cbe1944cf19"}, + {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675997222f2e2f22928fbba640824aebd43791116034f62006e19730715166c0"}, + {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5208a57eae445ae84a219dfd8b56e04313445d146873117b5fa75f3245bc1390"}, + {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:428d699c8553c27e98f4d29fdc0f0edc50e9a8a7590bfd294d2edb0da7be3629"}, + {file = "grpcio-1.60.0-cp38-cp38-win32.whl", hash = "sha256:83f2292ae292ed5a47cdcb9821039ca8e88902923198f2193f13959360c01860"}, + {file = "grpcio-1.60.0-cp38-cp38-win_amd64.whl", hash = "sha256:705a68a973c4c76db5d369ed573fec3367d7d196673fa86614b33d8c8e9ebb08"}, + {file = "grpcio-1.60.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c193109ca4070cdcaa6eff00fdb5a56233dc7610216d58fb81638f89f02e4968"}, + {file = "grpcio-1.60.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:676e4a44e740deaba0f4d95ba1d8c5c89a2fcc43d02c39f69450b1fa19d39590"}, + {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5ff21e000ff2f658430bde5288cb1ac440ff15c0d7d18b5fb222f941b46cb0d2"}, + {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c86343cf9ff7b2514dd229bdd88ebba760bd8973dac192ae687ff75e39ebfab"}, + {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fd3b3968ffe7643144580f260f04d39d869fcc2cddb745deef078b09fd2b328"}, + {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:30943b9530fe3620e3b195c03130396cd0ee3a0d10a66c1bee715d1819001eaf"}, + {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b10241250cb77657ab315270b064a6c7f1add58af94befa20687e7c8d8603ae6"}, + {file = "grpcio-1.60.0-cp39-cp39-win32.whl", hash = "sha256:79a050889eb8d57a93ed21d9585bb63fca881666fc709f5d9f7f9372f5e7fd03"}, + {file = "grpcio-1.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a97a681e82bc11a42d4372fe57898d270a2707f36c45c6676e49ce0d5c41353"}, + {file = "grpcio-1.60.0.tar.gz", hash = "sha256:2199165a1affb666aa24adf0c97436686d0a61bc5fc113c037701fb7c7fceb96"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.56.0)"] +protobuf = ["grpcio-tools (>=1.60.0)"] [[package]] name = "httplib2" @@ -1374,13 +1303,13 @@ pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0 [[package]] name = "identify" -version = "2.5.24" +version = "2.5.33" description = "File identification library for Python" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, - {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, + {file = "identify-2.5.33-py2.py3-none-any.whl", hash = "sha256:d40ce5fcd762817627670da8a7d8d8e65f24342d14539c59488dc603bf662e34"}, + {file = "identify-2.5.33.tar.gz", hash = "sha256:161558f9fe4559e1557e1bff323e8631f6a0e4837f7497767c1782832f16b62d"}, ] [package.extras] @@ -1388,13 +1317,13 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] @@ -1410,40 +1339,40 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.7.0" +version = "7.0.1" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, - {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "importlib-resources" -version = "5.12.0" +version = "6.1.1" description = "Read resources from Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, - {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] [[package]] name = "iniconfig" @@ -1456,180 +1385,63 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "ipycanvas" -version = "0.13.1" -description = "Interactive widgets library exposing the browser's Canvas API" -optional = true -python-versions = "*" -files = [ - {file = "ipycanvas-0.13.1-py2.py3-none-any.whl", hash = "sha256:53771e27a86de5b153873a4ffd495fddbf530990fb5609f20fb59ab95ce33035"}, - {file = "ipycanvas-0.13.1.tar.gz", hash = "sha256:f9c3940681bc38383390f8c46ea5d8445d6e11c6da6484c37d89df5ae1dac131"}, -] - -[package.dependencies] -ipywidgets = ">=7.6.0,<9" -numpy = "*" -pillow = ">=6.0" - -[[package]] -name = "ipydatawidgets" -version = "4.3.5" -description = "A set of widgets to help facilitate reuse of large datasets across widgets" -optional = true -python-versions = ">=3.7" -files = [ - {file = "ipydatawidgets-4.3.5-py2.py3-none-any.whl", hash = "sha256:d590cdb7c364f2f6ab346f20b9d2dd661d27a834ef7845bc9d7113118f05ec87"}, - {file = "ipydatawidgets-4.3.5.tar.gz", hash = "sha256:394f2489576587cfd755377a09a067f46cad22081965092021fd1abcbe7852a8"}, -] - -[package.dependencies] -ipywidgets = ">=7.0.0" -numpy = "*" -traittypes = ">=0.2.0" - -[package.extras] -docs = ["recommonmark", "sphinx", "sphinx-rtd-theme"] -test = ["nbval (>=0.9.2)", "pytest (>=4)", "pytest-cov"] - -[[package]] -name = "ipyevents" -version = "2.0.1" -description = "A custom widget for returning mouse and keyboard events to Python" -optional = true -python-versions = "*" -files = [ - {file = "ipyevents-2.0.1-py2.py3-none-any.whl", hash = "sha256:9f255fdab40e7598b1143ace90153c5f4e52be15dc6f1b94f575a043a5970c17"}, - {file = "ipyevents-2.0.1.tar.gz", hash = "sha256:23eb2afab13d9056397f120a88051dd3beb067b698d08b33adffc9e077f019cb"}, -] - -[package.dependencies] -ipywidgets = ">=7.6.0" - -[package.extras] -docs = ["jupyterlab (>=3)", "nbsphinx", "sphinx"] -test = ["nbval", "pytest", "pytest-cov"] - -[[package]] -name = "ipykernel" -version = "6.24.0" -description = "IPython Kernel for Jupyter" -optional = true -python-versions = ">=3.8" -files = [ - {file = "ipykernel-6.24.0-py3-none-any.whl", hash = "sha256:2f5fffc7ad8f1fd5aadb4e171ba9129d9668dbafa374732cf9511ada52d6547f"}, - {file = "ipykernel-6.24.0.tar.gz", hash = "sha256:29cea0a716b1176d002a61d0b0c851f34536495bc4ef7dd0222c88b41b816123"}, -] - -[package.dependencies] -appnope = {version = "*", markers = "platform_system == \"Darwin\""} -comm = ">=0.1.1" -debugpy = ">=1.6.5" -ipython = ">=7.23.1" -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -matplotlib-inline = ">=0.1" -nest-asyncio = "*" -packaging = "*" -psutil = "*" -pyzmq = ">=20" -tornado = ">=6.1" -traitlets = ">=5.4.0" - -[package.extras] -cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] -pyqt5 = ["pyqt5"] -pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] - [[package]] name = "ipython" -version = "8.12.2" +version = "8.18.1" description = "IPython: Productive Interactive Computing" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "ipython-8.12.2-py3-none-any.whl", hash = "sha256:ea8801f15dfe4ffb76dea1b09b847430ffd70d827b41735c64a0638a04103bfc"}, - {file = "ipython-8.12.2.tar.gz", hash = "sha256:c7b80eb7f5a855a88efc971fda506ff7a91c280b42cdae26643e0f601ea281ea"}, + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] - -[[package]] -name = "ipython-genutils" -version = "0.2.0" -description = "Vestigial utilities from IPython" -optional = true -python-versions = "*" -files = [ - {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, - {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, -] - -[[package]] -name = "ipyvtklink" -version = "0.2.3" -description = "ipywidget for vtkRenderWindow" -optional = true -python-versions = ">=3.5.*" -files = [ - {file = "ipyvtklink-0.2.3-py3-none-any.whl", hash = "sha256:2d310a24bd130e077c346ff6ab0991f236794e1d76a1fff5edda92e5e758a143"}, - {file = "ipyvtklink-0.2.3.tar.gz", hash = "sha256:7e5a8d0b0b4da9ae5db96618a8ed6ecdbe7b83b0c79b9b52c998129b35da825d"}, -] - -[package.dependencies] -ipycanvas = ">=0.5.0" -ipyevents = ">=0.8.0" -ipywidgets = ">=7.7,<8.0" +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] [[package]] name = "ipywidgets" -version = "7.7.5" -description = "IPython HTML widgets for Jupyter" +version = "8.1.1" +description = "Jupyter interactive widgets" optional = true -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "ipywidgets-7.7.5-py2.py3-none-any.whl", hash = "sha256:d9644e473282ca28a6bc0327372bcad7a41877d0092fea1ed70bd15f28be9270"}, - {file = "ipywidgets-7.7.5.tar.gz", hash = "sha256:2392943ed30253c84ac36f23f707fa1c9d34461ae5356944481a84d5b08d69b2"}, + {file = "ipywidgets-8.1.1-py3-none-any.whl", hash = "sha256:2b88d728656aea3bbfd05d32c747cfd0078f9d7e159cf982433b58ad717eed7f"}, + {file = "ipywidgets-8.1.1.tar.gz", hash = "sha256:40211efb556adec6fa450ccc2a77d59ca44a060f4f9f136833df59c9f538e6e8"}, ] [package.dependencies] -ipykernel = ">=4.5.1" -ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} -ipython-genutils = ">=0.2.0,<0.3.0" -jupyterlab-widgets = {version = ">=1.0.0,<3", markers = "python_version >= \"3.6\""} +comm = ">=0.1.3" +ipython = ">=6.1.0" +jupyterlab-widgets = ">=3.0.9,<3.1.0" traitlets = ">=4.3.1" -widgetsnbextension = ">=3.6.4,<3.7.0" +widgetsnbextension = ">=4.0.9,<4.1.0" [package.extras] -test = ["ipykernel", "mock", "pytest (>=3.6.0)", "pytest-cov"] +test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] [[package]] name = "isoduration" @@ -1647,57 +1459,54 @@ arrow = ">=0.15.0" [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = true python-versions = ">=3.8.0" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "jaraco-classes" -version = "3.2.3" +version = "3.3.0" description = "Utility functions for Python class constructs" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, - {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, + {file = "jaraco.classes-3.3.0-py3-none-any.whl", hash = "sha256:10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb"}, + {file = "jaraco.classes-3.3.0.tar.gz", hash = "sha256:c063dd08e89217cee02c8d5e5ec560f2c8ce6cdc2fcdc2e68f7b2e5547ed3621"}, ] [package.dependencies] more-itertools = "*" [package.extras] -docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "jedi" -version = "0.18.2" +version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." optional = true python-versions = ">=3.6" files = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, ] [package.dependencies] -parso = ">=0.8.0,<0.9.0" +parso = ">=0.8.3,<0.9.0" [package.extras] 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)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jeepney" @@ -1744,26 +1553,26 @@ files = [ [[package]] name = "jsonschema" -version = "4.17.3" +version = "4.20.0" description = "An implementation of JSON Schema validation for Python" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, - {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, + {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"}, + {file = "jsonschema-4.20.0.tar.gz", hash = "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa"}, ] [package.dependencies] -attrs = ">=17.4.0" +attrs = ">=22.2.0" fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} -pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} -pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rpds-py = ">=0.7.1" uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} @@ -1771,15 +1580,29 @@ webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-n format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = true +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + [[package]] name = "jupyter-client" -version = "8.3.0" +version = "8.6.0" description = "Jupyter protocol implementation and client libraries" optional = true python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.3.0-py3-none-any.whl", hash = "sha256:7441af0c0672edc5d28035e92ba5e32fadcfa8a4e608a434c228836a89df6158"}, - {file = "jupyter_client-8.3.0.tar.gz", hash = "sha256:3af69921fe99617be1670399a0b857ad67275eefcfa291e2c81a160b7b650f5f"}, + {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, + {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, ] [package.dependencies] @@ -1796,13 +1619,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.3.1" +version = "5.7.0" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = true python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.3.1-py3-none-any.whl", hash = "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce"}, - {file = "jupyter_core-5.3.1.tar.gz", hash = "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba"}, + {file = "jupyter_core-5.7.0-py3-none-any.whl", hash = "sha256:16eea462f7dad23ba9f86542bdf17f830804e2028eb48d609b6134d91681e983"}, + {file = "jupyter_core-5.7.0.tar.gz", hash = "sha256:cb8d3ed92144d2463a3c5664fdd686a3f0c1442ea45df8babb1c1a9e6333fe03"}, ] [package.dependencies] @@ -1811,24 +1634,25 @@ pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_ traitlets = ">=5.3" [package.extras] -docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-events" -version = "0.6.3" +version = "0.9.0" description = "Jupyter Event System library" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyter_events-0.6.3-py3-none-any.whl", hash = "sha256:57a2749f87ba387cd1bfd9b22a0875b889237dbf2edc2121ebb22bde47036c17"}, - {file = "jupyter_events-0.6.3.tar.gz", hash = "sha256:9a6e9995f75d1b7146b436ea24d696ce3a35bfa8bfe45e0c33c334c79464d0b3"}, + {file = "jupyter_events-0.9.0-py3-none-any.whl", hash = "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf"}, + {file = "jupyter_events-0.9.0.tar.gz", hash = "sha256:81ad2e4bc710881ec274d31c6c50669d71bbaa5dd9d01e600b56faa85700d399"}, ] [package.dependencies] -jsonschema = {version = ">=3.2.0", extras = ["format-nongpl"]} +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} python-json-logger = ">=2.0.4" pyyaml = ">=5.3" +referencing = "*" rfc3339-validator = "*" rfc3986-validator = ">=0.1.1" traitlets = ">=5.3" @@ -1836,17 +1660,17 @@ traitlets = ">=5.3" [package.extras] cli = ["click", "rich"] docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] -test = ["click", "coverage", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "pytest-cov", "rich"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] [[package]] name = "jupyter-server" -version = "2.7.0" +version = "2.12.2" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = true python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.7.0-py3-none-any.whl", hash = "sha256:6a77912aff643e53fa14bdb2634884b52b784a4be77ce8e93f7283faed0f0849"}, - {file = "jupyter_server-2.7.0.tar.gz", hash = "sha256:36da0a266d31a41ac335a366c88933c17dfa5bb817a48f5c02c16d303bc9477f"}, + {file = "jupyter_server-2.12.2-py3-none-any.whl", hash = "sha256:abcfa33f98a959f908c8733aa2d9fa0101d26941cbd49b148f4cef4d3046fc61"}, + {file = "jupyter_server-2.12.2.tar.gz", hash = "sha256:5eae86be15224b5375cdec0c3542ce72ff20f7a25297a2a8166a250bb455a519"}, ] [package.dependencies] @@ -1855,7 +1679,7 @@ argon2-cffi = "*" jinja2 = "*" jupyter-client = ">=7.4.4" jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -jupyter-events = ">=0.6.0" +jupyter-events = ">=0.9.0" jupyter-server-terminals = "*" nbconvert = ">=6.4.4" nbformat = ">=5.3.0" @@ -1864,7 +1688,7 @@ packaging = "*" prometheus-client = "*" pywinpty = {version = "*", markers = "os_name == \"nt\""} pyzmq = ">=24" -send2trash = "*" +send2trash = ">=1.8.2" terminado = ">=0.8.3" tornado = ">=6.2.0" traitlets = ">=5.6.0" @@ -1876,34 +1700,36 @@ test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-sc [[package]] name = "jupyter-server-proxy" -version = "4.0.0" +version = "4.1.0" description = "A JupyterLab extension accompanying the PyPI package jupyter-server-proxy adding launcher items for configured server processes." optional = true python-versions = ">=3.8" files = [ - {file = "jupyter_server_proxy-4.0.0-py3-none-any.whl", hash = "sha256:8075afce3465a5e987e43ec837c307f9b9ac7398ebcff497abf1f51303d23470"}, - {file = "jupyter_server_proxy-4.0.0.tar.gz", hash = "sha256:f5dc12dd204baca71b013df3522c14403692a2d37cb7adcd77851dbab71533b5"}, + {file = "jupyter_server_proxy-4.1.0-py3-none-any.whl", hash = "sha256:3a417d6996e47a90ba5ec5dd2603887cfd2efbc4abf850a1a0fbe77e3b4d04e9"}, + {file = "jupyter_server_proxy-4.1.0.tar.gz", hash = "sha256:2cfac3b4232fe7144e8e60296b4f861708b4f13b29260a2cf28976bf8e617f70"}, ] [package.dependencies] aiohttp = "*" importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} jupyter-server = ">=1.0" -simpervisor = ">=0.4" +simpervisor = ">=1.0" [package.extras] -acceptance = ["jupyter-server-proxy[test]", "notebook (<7)", "robotframework-jupyterlibrary (>=0.4.2)"] +acceptance = ["jupyter-server-proxy[test]", "robotframework-jupyterlibrary (>=0.4.2)"] +classic = ["jupyter-server (<2)", "jupyterlab (>=3.0.0,<4.0.0a0)", "notebook (<7.0.0a0)"] +lab = ["jupyter-server (>=2)", "jupyterlab (>=4.0.5,<5.0.0a0)", "nbclassic", "notebook (>=7)"] test = ["pytest", "pytest-cov", "pytest-html"] [[package]] name = "jupyter-server-terminals" -version = "0.4.4" +version = "0.5.1" description = "A Jupyter Server Extension Providing Terminals." optional = true python-versions = ">=3.8" files = [ - {file = "jupyter_server_terminals-0.4.4-py3-none-any.whl", hash = "sha256:75779164661cec02a8758a5311e18bb8eb70c4e86c6b699403100f1585a12a36"}, - {file = "jupyter_server_terminals-0.4.4.tar.gz", hash = "sha256:57ab779797c25a7ba68e97bcfb5d7740f2b5e8a83b5e8102b10438041a7eac5d"}, + {file = "jupyter_server_terminals-0.5.1-py3-none-any.whl", hash = "sha256:5e63e947ddd97bb2832db5ef837a258d9ccd4192cd608c1270850ad947ae5dd7"}, + {file = "jupyter_server_terminals-0.5.1.tar.gz", hash = "sha256:16d3be9cf48be6a1f943f3a6c93c033be259cf4779184c66421709cf63dccfea"}, ] [package.dependencies] @@ -1911,214 +1737,213 @@ pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} terminado = ">=0.8.3" [package.extras] -docs = ["jinja2", "jupyter-server", "mistune (<3.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] -test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] [[package]] name = "jupyterlab-pygments" -version = "0.2.2" +version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, - {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, ] [[package]] name = "jupyterlab-widgets" -version = "1.1.4" -description = "A JupyterLab extension." +version = "3.0.9" +description = "Jupyter interactive widgets for JupyterLab" optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "jupyterlab_widgets-1.1.4-py3-none-any.whl", hash = "sha256:769eb7bfef7e8ab70a7737104555531b09bcfba982f89465d2ae67b99b3f3e81"}, - {file = "jupyterlab_widgets-1.1.4.tar.gz", hash = "sha256:ea6e7612725e94d0966d64c6344910686f4bf8610533cd40daeba6980659b14d"}, + {file = "jupyterlab_widgets-3.0.9-py3-none-any.whl", hash = "sha256:3cf5bdf5b897bf3bccf1c11873aa4afd776d7430200f765e0686bd352487b58d"}, + {file = "jupyterlab_widgets-3.0.9.tar.gz", hash = "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c"}, ] [[package]] name = "keyring" -version = "24.2.0" +version = "24.3.0" description = "Store and access your passwords safely." optional = true python-versions = ">=3.8" files = [ - {file = "keyring-24.2.0-py3-none-any.whl", hash = "sha256:4901caaf597bfd3bbd78c9a0c7c4c29fcd8310dab2cffefe749e916b6527acd6"}, - {file = "keyring-24.2.0.tar.gz", hash = "sha256:ca0746a19ec421219f4d713f848fa297a661a8a8c1504867e55bfb5e09091509"}, + {file = "keyring-24.3.0-py3-none-any.whl", hash = "sha256:4446d35d636e6a10b8bce7caa66913dd9eca5fd222ca03a3d42c38608ac30836"}, + {file = "keyring-24.3.0.tar.gz", hash = "sha256:e730ecffd309658a08ee82535a3b5ec4b4c8669a9be11efb66249d8e0aeb9a25"}, ] [package.dependencies] importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} -importlib-resources = {version = "*", markers = "python_version < \"3.9\""} "jaraco.classes" = "*" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -completion = ["shtab"] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +completion = ["shtab (>=1.1.0)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "kiwisolver" -version = "1.4.4" +version = "1.4.5" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.7" files = [ - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, - {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] [[package]] name = "lazy-object-proxy" -version = "1.9.0" +version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = true -python-versions = ">=3.7" -files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, -] - -[[package]] -name = "linkify-it-py" -version = "2.0.2" -description = "Links recognition library with FULL unicode support." -optional = true -python-versions = ">=3.7" -files = [ - {file = "linkify-it-py-2.0.2.tar.gz", hash = "sha256:19f3060727842c254c808e99d465c80c49d2c7306788140987a1a7a29b0d6ad2"}, - {file = "linkify_it_py-2.0.2-py3-none-any.whl", hash = "sha256:a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541"}, -] - -[package.dependencies] -uc-micro-py = "*" - -[package.extras] -benchmark = ["pytest", "pytest-benchmark"] -dev = ["black", "flake8", "isort", "pre-commit", "pyproject-flake8"] -doc = ["myst-parser", "sphinx", "sphinx-book-theme"] -test = ["coverage", "pytest", "pytest-cov"] - -[[package]] -name = "markdown" -version = "3.4.3" -description = "Python implementation of John Gruber's Markdown." -optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Markdown-3.4.3-py3-none-any.whl", hash = "sha256:065fd4df22da73a625f14890dd77eb8040edcbd68794bcd35943be14490608b2"}, - {file = "Markdown-3.4.3.tar.gz", hash = "sha256:8bf101198e004dc93e84a12a7395e31aac6a9c9942848ae1d99b9d72cf9b3520"}, + {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win32.whl", hash = "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win32.whl", hash = "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win32.whl", hash = "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd"}, + {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, ] -[package.dependencies] -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} - -[package.extras] -testing = ["coverage", "pyyaml"] - [[package]] name = "markdown-it-py" version = "3.0.0" @@ -2170,6 +1995,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -2204,52 +2039,39 @@ files = [ [[package]] name = "matplotlib" -version = "3.7.2" +version = "3.8.2" description = "Python plotting package" optional = false -python-versions = ">=3.8" -files = [ - {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:2699f7e73a76d4c110f4f25be9d2496d6ab4f17345307738557d345f099e07de"}, - {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a8035ba590658bae7562786c9cc6ea1a84aa49d3afab157e414c9e2ea74f496d"}, - {file = "matplotlib-3.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f8e4a49493add46ad4a8c92f63e19d548b2b6ebbed75c6b4c7f46f57d36cdd1"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71667eb2ccca4c3537d9414b1bc00554cb7f91527c17ee4ec38027201f8f1603"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:152ee0b569a37630d8628534c628456b28686e085d51394da6b71ef84c4da201"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070f8dddd1f5939e60aacb8fa08f19551f4b0140fab16a3669d5cd6e9cb28fc8"}, - {file = "matplotlib-3.7.2-cp310-cp310-win32.whl", hash = "sha256:fdbb46fad4fb47443b5b8ac76904b2e7a66556844f33370861b4788db0f8816a"}, - {file = "matplotlib-3.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:23fb1750934e5f0128f9423db27c474aa32534cec21f7b2153262b066a581fd1"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:30e1409b857aa8a747c5d4f85f63a79e479835f8dffc52992ac1f3f25837b544"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:50e0a55ec74bf2d7a0ebf50ac580a209582c2dd0f7ab51bc270f1b4a0027454e"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac60daa1dc83e8821eed155796b0f7888b6b916cf61d620a4ddd8200ac70cd64"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305e3da477dc8607336ba10bac96986d6308d614706cae2efe7d3ffa60465b24"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c308b255efb9b06b23874236ec0f10f026673ad6515f602027cc8ac7805352d"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60c521e21031632aa0d87ca5ba0c1c05f3daacadb34c093585a0be6780f698e4"}, - {file = "matplotlib-3.7.2-cp311-cp311-win32.whl", hash = "sha256:26bede320d77e469fdf1bde212de0ec889169b04f7f1179b8930d66f82b30cbc"}, - {file = "matplotlib-3.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4860132c8c05261a5f5f8467f1b269bf1c7c23902d75f2be57c4a7f2394b3e"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:a1733b8e84e7e40a9853e505fe68cc54339f97273bdfe6f3ed980095f769ddc7"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d9881356dc48e58910c53af82b57183879129fa30492be69058c5b0d9fddf391"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f081c03f413f59390a80b3e351cc2b2ea0205839714dbc364519bcf51f4b56ca"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cd120fca3407a225168238b790bd5c528f0fafde6172b140a2f3ab7a4ea63e9"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2c1590b90aa7bd741b54c62b78de05d4186271e34e2377e0289d943b3522273"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d2ff3c984b8a569bc1383cd468fc06b70d7b59d5c2854ca39f1436ae8394117"}, - {file = "matplotlib-3.7.2-cp38-cp38-win32.whl", hash = "sha256:5dea00b62d28654b71ca92463656d80646675628d0828e08a5f3b57e12869e13"}, - {file = "matplotlib-3.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f506a1776ee94f9e131af1ac6efa6e5bc7cb606a3e389b0ccb6e657f60bb676"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6515e878f91894c2e4340d81f0911857998ccaf04dbc1bba781e3d89cbf70608"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:71f7a8c6b124e904db550f5b9fe483d28b896d4135e45c4ea381ad3b8a0e3256"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12f01b92ecd518e0697da4d97d163b2b3aa55eb3eb4e2c98235b3396d7dad55f"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7e28d6396563955f7af437894a36bf2b279462239a41028323e04b85179058b"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbcf59334ff645e6a67cd5f78b4b2cdb76384cdf587fa0d2dc85f634a72e1a3e"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:318c89edde72ff95d8df67d82aca03861240512994a597a435a1011ba18dbc7f"}, - {file = "matplotlib-3.7.2-cp39-cp39-win32.whl", hash = "sha256:ce55289d5659b5b12b3db4dc9b7075b70cef5631e56530f14b2945e8836f2d20"}, - {file = "matplotlib-3.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:2ecb5be2b2815431c81dc115667e33da0f5a1bcf6143980d180d09a717c4a12e"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fdcd28360dbb6203fb5219b1a5658df226ac9bebc2542a9e8f457de959d713d0"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c3cca3e842b11b55b52c6fb8bd6a4088693829acbfcdb3e815fa9b7d5c92c1b"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebf577c7a6744e9e1bd3fee45fc74a02710b214f94e2bde344912d85e0c9af7c"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:936bba394682049919dda062d33435b3be211dc3dcaa011e09634f060ec878b2"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bc221ffbc2150458b1cd71cdd9ddd5bb37962b036e41b8be258280b5b01da1dd"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35d74ebdb3f71f112b36c2629cf32323adfbf42679e2751252acd468f5001c07"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717157e61b3a71d3d26ad4e1770dc85156c9af435659a25ee6407dc866cb258d"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:20f844d6be031948148ba49605c8b96dfe7d3711d1b63592830d650622458c11"}, - {file = "matplotlib-3.7.2.tar.gz", hash = "sha256:a8cdb91dddb04436bd2f098b8fdf4b81352e68cf4d2c6756fcc414791076569b"}, +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, + {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, + {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, + {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, + {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, + {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, + {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, + {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, + {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, + {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, + {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, + {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, + {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, + {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, + {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, + {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, + {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, + {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, + {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, + {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, + {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, + {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, + {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, + {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, + {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, ] [package.dependencies] @@ -2257,11 +2079,11 @@ contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} -kiwisolver = ">=1.0.1" -numpy = ">=1.20" +kiwisolver = ">=1.3.1" +numpy = ">=1.21,<2" packaging = ">=20.0" -pillow = ">=6.2.0" -pyparsing = ">=2.3.1,<3.1" +pillow = ">=8" +pyparsing = ">=2.3.1" python-dateutil = ">=2.7" [[package]] @@ -2289,25 +2111,6 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] -[[package]] -name = "mdit-py-plugins" -version = "0.4.0" -description = "Collection of plugins for markdown-it-py" -optional = true -python-versions = ">=3.8" -files = [ - {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, - {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, -] - -[package.dependencies] -markdown-it-py = ">=1.0.0,<4.0.0" - -[package.extras] -code-style = ["pre-commit"] -rtd = ["myst-parser", "sphinx-book-theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - [[package]] name = "mdurl" version = "0.1.2" @@ -2321,24 +2124,24 @@ files = [ [[package]] name = "mistune" -version = "3.0.1" +version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = true python-versions = ">=3.7" files = [ - {file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"}, - {file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"}, + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] [[package]] name = "more-itertools" -version = "9.1.0" +version = "10.1.0" description = "More routines for operating on iterables, beyond itertools" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, - {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, + {file = "more-itertools-10.1.0.tar.gz", hash = "sha256:626c369fa0eb37bac0291bce8259b332fd59ac792fa5497b59837309cd5b114a"}, + {file = "more_itertools-10.1.0-py3-none-any.whl", hash = "sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6"}, ] [[package]] @@ -2426,37 +2229,38 @@ files = [ [[package]] name = "mypy" -version = "1.4.1" +version = "1.8.0" description = "Optional static typing for Python" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mypy-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:566e72b0cd6598503e48ea610e0052d1b8168e60a46e0bfd34b3acf2d57f96a8"}, - {file = "mypy-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca637024ca67ab24a7fd6f65d280572c3794665eaf5edcc7e90a866544076878"}, - {file = "mypy-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dde1d180cd84f0624c5dcaaa89c89775550a675aff96b5848de78fb11adabcd"}, - {file = "mypy-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c4d8e89aa7de683e2056a581ce63c46a0c41e31bd2b6d34144e2c80f5ea53dc"}, - {file = "mypy-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:bfdca17c36ae01a21274a3c387a63aa1aafe72bff976522886869ef131b937f1"}, - {file = "mypy-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7549fbf655e5825d787bbc9ecf6028731973f78088fbca3a1f4145c39ef09462"}, - {file = "mypy-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98324ec3ecf12296e6422939e54763faedbfcc502ea4a4c38502082711867258"}, - {file = "mypy-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141dedfdbfe8a04142881ff30ce6e6653c9685b354876b12e4fe6c78598b45e2"}, - {file = "mypy-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8207b7105829eca6f3d774f64a904190bb2231de91b8b186d21ffd98005f14a7"}, - {file = "mypy-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:16f0db5b641ba159eff72cff08edc3875f2b62b2fa2bc24f68c1e7a4e8232d01"}, - {file = "mypy-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:470c969bb3f9a9efcedbadcd19a74ffb34a25f8e6b0e02dae7c0e71f8372f97b"}, - {file = "mypy-1.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5952d2d18b79f7dc25e62e014fe5a23eb1a3d2bc66318df8988a01b1a037c5b"}, - {file = "mypy-1.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:190b6bab0302cec4e9e6767d3eb66085aef2a1cc98fe04936d8a42ed2ba77bb7"}, - {file = "mypy-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9d40652cc4fe33871ad3338581dca3297ff5f2213d0df345bcfbde5162abf0c9"}, - {file = "mypy-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01fd2e9f85622d981fd9063bfaef1aed6e336eaacca00892cd2d82801ab7c042"}, - {file = "mypy-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2460a58faeea905aeb1b9b36f5065f2dc9a9c6e4c992a6499a2360c6c74ceca3"}, - {file = "mypy-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2746d69a8196698146a3dbe29104f9eb6a2a4d8a27878d92169a6c0b74435b6"}, - {file = "mypy-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ae704dcfaa180ff7c4cfbad23e74321a2b774f92ca77fd94ce1049175a21c97f"}, - {file = "mypy-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:43d24f6437925ce50139a310a64b2ab048cb2d3694c84c71c3f2a1626d8101dc"}, - {file = "mypy-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c482e1246726616088532b5e964e39765b6d1520791348e6c9dc3af25b233828"}, - {file = "mypy-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43b592511672017f5b1a483527fd2684347fdffc041c9ef53428c8dc530f79a3"}, - {file = "mypy-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34a9239d5b3502c17f07fd7c0b2ae6b7dd7d7f6af35fbb5072c6208e76295816"}, - {file = "mypy-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5703097c4936bbb9e9bce41478c8d08edd2865e177dc4c52be759f81ee4dd26c"}, - {file = "mypy-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e02d700ec8d9b1859790c0475df4e4092c7bf3272a4fd2c9f33d87fac4427b8f"}, - {file = "mypy-1.4.1-py3-none-any.whl", hash = "sha256:45d32cec14e7b97af848bddd97d85ea4f0db4d5a149ed9676caa4eb2f7402bb4"}, - {file = "mypy-1.4.1.tar.gz", hash = "sha256:9bbcd9ab8ea1f2e1c8031c21445b511442cc45c89951e49bbf852cbb70755b1b"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, + {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, + {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, + {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, + {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, + {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, + {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, + {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, + {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, + {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, + {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, + {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, + {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, + {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, + {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, + {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, + {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, + {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, ] [package.dependencies] @@ -2467,7 +2271,7 @@ typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] -python2 = ["typed-ast (>=1.4.0,<2)"] +mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] @@ -2482,49 +2286,14 @@ files = [ ] [[package]] -name = "nbclassic" -version = "1.0.0" -description = "Jupyter Notebook as a Jupyter Server extension." +name = "nbclient" +version = "0.9.0" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = true -python-versions = ">=3.7" +python-versions = ">=3.8.0" files = [ - {file = "nbclassic-1.0.0-py3-none-any.whl", hash = "sha256:f99e4769b4750076cd4235c044b61232110733322384a94a63791d2e7beacc66"}, - {file = "nbclassic-1.0.0.tar.gz", hash = "sha256:0ae11eb2319455d805596bf320336cda9554b41d99ab9a3c31bf8180bffa30e3"}, -] - -[package.dependencies] -argon2-cffi = "*" -ipykernel = "*" -ipython-genutils = "*" -jinja2 = "*" -jupyter-client = ">=6.1.1" -jupyter-core = ">=4.6.1" -jupyter-server = ">=1.8" -nbconvert = ">=5" -nbformat = "*" -nest-asyncio = ">=1.5" -notebook-shim = ">=0.2.3" -prometheus-client = "*" -pyzmq = ">=17" -Send2Trash = ">=1.8.0" -terminado = ">=0.8.3" -tornado = ">=6.1" -traitlets = ">=4.2.1" - -[package.extras] -docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -json-logging = ["json-logging"] -test = ["coverage", "nbval", "pytest", "pytest-cov", "pytest-jupyter", "pytest-playwright", "pytest-tornasync", "requests", "requests-unixsocket", "testpath"] - -[[package]] -name = "nbclient" -version = "0.8.0" -description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -optional = true -python-versions = ">=3.8.0" -files = [ - {file = "nbclient-0.8.0-py3-none-any.whl", hash = "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548"}, - {file = "nbclient-0.8.0.tar.gz", hash = "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55"}, + {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, + {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"}, ] [package.dependencies] @@ -2540,13 +2309,13 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.6.0" +version = "7.14.0" description = "Converting Jupyter Notebooks" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "nbconvert-7.6.0-py3-none-any.whl", hash = "sha256:5a445c6794b0791984bc5436608fe2c066cb43c83920c7bc91bde3b765e9a264"}, - {file = "nbconvert-7.6.0.tar.gz", hash = "sha256:24fcf27efdef2b51d7f090cc5ce5a9b178766a55be513c4ebab08c91899ab550"}, + {file = "nbconvert-7.14.0-py3-none-any.whl", hash = "sha256:483dde47facdaa4875903d651305ad53cd76e2255ae3c61efe412a95f2d22a24"}, + {file = "nbconvert-7.14.0.tar.gz", hash = "sha256:92b9a44b63e5a7fb4f6fa0ef41261e35c16925046ccd1c04a5c8099bf100476e"}, ] [package.dependencies] @@ -2573,18 +2342,18 @@ docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sp qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["ipykernel", "ipywidgets (>=7)", "pre-commit", "pytest", "pytest-dependency"] -webpdf = ["pyppeteer (>=1,<1.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest"] +webpdf = ["playwright"] [[package]] name = "nbformat" -version = "5.9.0" +version = "5.9.2" description = "The Jupyter Notebook format" optional = true python-versions = ">=3.8" files = [ - {file = "nbformat-5.9.0-py3-none-any.whl", hash = "sha256:8c8fa16d6d05062c26177754bfbfac22de644888e2ef69d27ad2a334cf2576e5"}, - {file = "nbformat-5.9.0.tar.gz", hash = "sha256:e98ebb6120c3efbafdee2a40af2a140cadee90bb06dd69a2a63d9551fcc7f976"}, + {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, + {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, ] [package.dependencies] @@ -2599,13 +2368,38 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nest-asyncio" -version = "1.5.6" +version = "1.5.8" description = "Patch asyncio to allow nested event loops" optional = true python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, + {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, + {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, +] + +[[package]] +name = "nh3" +version = "0.2.15" +description = "Python bindings to the ammonia HTML sanitization library." +optional = true +python-versions = "*" +files = [ + {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9c0d415f6b7f2338f93035bba5c0d8c1b464e538bfbb1d598acd47d7969284f0"}, + {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6f42f99f0cf6312e470b6c09e04da31f9abaadcd3eb591d7d1a88ea931dca7f3"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac19c0d68cd42ecd7ead91a3a032fdfff23d29302dbb1311e641a130dfefba97"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0d77272ce6d34db6c87b4f894f037d55183d9518f948bba236fe81e2bb4e28"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8d595df02413aa38586c24811237e95937ef18304e108b7e92c890a06793e3bf"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86e447a63ca0b16318deb62498db4f76fc60699ce0a1231262880b38b6cff911"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3277481293b868b2715907310c7be0f1b9d10491d5adf9fce11756a97e97eddf"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60684857cfa8fdbb74daa867e5cad3f0c9789415aba660614fe16cd66cbb9ec7"}, + {file = "nh3-0.2.15-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3b803a5875e7234907f7d64777dfde2b93db992376f3d6d7af7f3bc347deb305"}, + {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0d02d0ff79dfd8208ed25a39c12cbda092388fff7f1662466e27d97ad011b770"}, + {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f3b53ba93bb7725acab1e030bc2ecd012a817040fd7851b332f86e2f9bb98dc6"}, + {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b1e97221cedaf15a54f5243f2c5894bb12ca951ae4ddfd02a9d4ea9df9e1a29d"}, + {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5167a6403d19c515217b6bcaaa9be420974a6ac30e0da9e84d4fc67a5d474c5"}, + {file = "nh3-0.2.15-cp37-abi3-win32.whl", hash = "sha256:427fecbb1031db085eaac9931362adf4a796428ef0163070c484b5a768e71601"}, + {file = "nh3-0.2.15-cp37-abi3-win_amd64.whl", hash = "sha256:bc2d086fb540d0fa52ce35afaded4ea526b8fc4d3339f783db55c95de40ef02e"}, + {file = "nh3-0.2.15.tar.gz", hash = "sha256:d1e30ff2d8d58fb2a14961f7aac1bbb1c51f9bdd7da727be35c63826060b0bf3"}, ] [[package]] @@ -2622,200 +2416,94 @@ files = [ [package.dependencies] setuptools = "*" -[[package]] -name = "notebook" -version = "6.5.4" -description = "A web-based notebook environment for interactive computing" -optional = true -python-versions = ">=3.7" -files = [ - {file = "notebook-6.5.4-py3-none-any.whl", hash = "sha256:dd17e78aefe64c768737b32bf171c1c766666a21cc79a44d37a1700771cab56f"}, - {file = "notebook-6.5.4.tar.gz", hash = "sha256:517209568bd47261e2def27a140e97d49070602eea0d226a696f42a7f16c9a4e"}, -] - -[package.dependencies] -argon2-cffi = "*" -ipykernel = "*" -ipython-genutils = "*" -jinja2 = "*" -jupyter-client = ">=5.3.4" -jupyter-core = ">=4.6.1" -nbclassic = ">=0.4.7" -nbconvert = ">=5" -nbformat = "*" -nest-asyncio = ">=1.5" -prometheus-client = "*" -pyzmq = ">=17" -Send2Trash = ">=1.8.0" -terminado = ">=0.8.3" -tornado = ">=6.1" -traitlets = ">=4.2.1" - -[package.extras] -docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -json-logging = ["json-logging"] -test = ["coverage", "nbval", "pytest", "pytest-cov", "requests", "requests-unixsocket", "selenium (==4.1.5)", "testpath"] - -[[package]] -name = "notebook-shim" -version = "0.2.3" -description = "A shim layer for notebook traits and config" -optional = true -python-versions = ">=3.7" -files = [ - {file = "notebook_shim-0.2.3-py3-none-any.whl", hash = "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7"}, - {file = "notebook_shim-0.2.3.tar.gz", hash = "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9"}, -] - -[package.dependencies] -jupyter-server = ">=1.8,<3" - -[package.extras] -test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] - [[package]] name = "numpy" -version = "1.24.4" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, - {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, - {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, - {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, - {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, - {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, - {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, - {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, - {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, - {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, - {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] name = "numpydoc" -version = "1.5.0" +version = "1.6.0" description = "Sphinx extension to support docstrings in Numpy format" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "numpydoc-1.5.0-py3-none-any.whl", hash = "sha256:c997759fb6fc32662801cece76491eedbc0ec619b514932ffd2b270ae89c07f9"}, - {file = "numpydoc-1.5.0.tar.gz", hash = "sha256:b0db7b75a32367a0e25c23b397842c65e344a1206524d16c8069f0a1c91b5f4c"}, + {file = "numpydoc-1.6.0-py3-none-any.whl", hash = "sha256:b6ddaa654a52bdf967763c1e773be41f1c3ae3da39ee0de973f2680048acafaa"}, + {file = "numpydoc-1.6.0.tar.gz", hash = "sha256:ae7a5380f0a06373c3afe16ccd15bd79bc6b07f2704cbc6f1e7ecc94b4f5fc0d"}, ] [package.dependencies] Jinja2 = ">=2.10" -sphinx = ">=4.2" +sphinx = ">=5" +tabulate = ">=0.8.10" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["matplotlib", "pytest", "pytest-cov"] +developer = ["pre-commit (>=3.3)", "tomli"] +doc = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pydata-sphinx-theme (>=0.13.3)", "sphinx (>=7)"] +test = ["matplotlib", "pytest", "pytest-cov"] [[package]] name = "overrides" -version = "7.3.1" +version = "7.4.0" description = "A decorator to automatically detect mismatch when overriding a method." optional = true python-versions = ">=3.6" files = [ - {file = "overrides-7.3.1-py3-none-any.whl", hash = "sha256:6187d8710a935d09b0bcef8238301d6ee2569d2ac1ae0ec39a8c7924e27f58ca"}, - {file = "overrides-7.3.1.tar.gz", hash = "sha256:8b97c6c1e1681b78cbc9424b138d880f0803c2254c5ebaabdde57bb6c62093f2"}, + {file = "overrides-7.4.0-py3-none-any.whl", hash = "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d"}, + {file = "overrides-7.4.0.tar.gz", hash = "sha256:9502a3cca51f4fac40b5feca985b6703a5c1f6ad815588a7ca9e285b9dca6757"}, ] [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] - -[[package]] -name = "pandas" -version = "2.0.3" -description = "Powerful data structures for data analysis, time series, and statistics" -optional = true -python-versions = ">=3.8" -files = [ - {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, - {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, - {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, - {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, - {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, - {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, - {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, - {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, - {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, - {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, - {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, - {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, - {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, - {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, - {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, - {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, - {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, - {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, - {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, - {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, - {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, - {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, - {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, - {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, - {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.1" - -[package.extras] -all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] -aws = ["s3fs (>=2021.08.0)"] -clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] -compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] -computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] -feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2021.07.0)"] -gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] -hdf5 = ["tables (>=3.6.1)"] -html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] -mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] -parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] -plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] -spss = ["pyreadstat (>=1.1.2)"] -sql-other = ["SQLAlchemy (>=1.4.16)"] -test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.6.3)"] [[package]] name = "pandocfilters" @@ -2828,57 +2516,6 @@ files = [ {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, ] -[[package]] -name = "panel" -version = "1.0.4" -description = "The powerful data exploration & web app framework for Python." -optional = true -python-versions = ">=3.8" -files = [ - {file = "panel-1.0.4-py2.py3-none-any.whl", hash = "sha256:61975f7f003d7b5d5469ba8a429d48aadce0491363114d1ed20ad041ab76473b"}, - {file = "panel-1.0.4.tar.gz", hash = "sha256:407d21ba6de58543730056d015ebe9acd41e51880783986df43fc170ff9f0cce"}, -] - -[package.dependencies] -bleach = "*" -bokeh = ">=3.1.1,<3.2.0" -linkify-it-py = "*" -markdown = "*" -markdown-it-py = "*" -mdit-py-plugins = "*" -pandas = ">=1.2" -param = ">=1.12.0" -pyviz-comms = ">=0.7.4" -requests = "*" -tqdm = ">=4.48.0" -typing-extensions = "*" -xyzservices = ">=2021.09.1" - -[package.extras] -all = ["aiohttp", "altair", "channels", "croniter", "datashader", "diskcache", "django (<4)", "fastparquet", "flake8", "flaky", "folium", "graphviz", "holoviews (>=1.16.0)", "hvplot", "ipyleaflet", "ipympl", "ipython (>=7.0)", "ipyvolume", "ipyvuetify", "ipywidgets", "ipywidgets-bokeh", "jupyter-bokeh (>=3.0.7)", "jupyterlab", "lxml", "matplotlib", "nbsite (==0.8.0)", "nbval", "networkx (>=2.5)", "numpy (<1.24)", "pandas (>=1.3)", "parameterized", "pillow", "playwright", "plotly", "plotly (>=4.0)", "pre-commit", "psutil", "pydeck", "pygraphviz", "pyinstrument (>=4.0)", "pytest", "pytest-cov", "pytest-playwright", "pytest-xdist", "python-graphviz", "pyvista", "reacton", "scikit-image", "scikit-learn", "scipy", "seaborn", "streamz", "twine", "vega-datasets", "vtk", "xarray", "xgboost"] -build = ["bleach", "bokeh (>=3.1.1,<3.2.0)", "cryptography (<39)", "packaging", "param (>=1.9.2)", "pyviz-comms (>=0.7.4)", "requests", "setuptools (>=42)", "tqdm (>=4.48.0)", "urllib3 (<2.0)"] -doc = ["holoviews (>=1.16.0)", "jupyterlab", "matplotlib", "nbsite (==0.8.0)", "pillow", "plotly"] -examples = ["aiohttp", "altair", "channels", "croniter", "datashader", "django (<4)", "fastparquet", "folium", "graphviz", "holoviews (>=1.16.0)", "hvplot", "ipyleaflet", "ipympl", "ipyvolume", "ipyvuetify", "ipywidgets", "ipywidgets-bokeh", "jupyter-bokeh (>=3.0.7)", "lxml", "networkx (>=2.5)", "plotly (>=4.0)", "pydeck", "pygraphviz", "pyinstrument (>=4.0)", "python-graphviz", "pyvista", "reacton", "scikit-image", "scikit-learn", "seaborn", "streamz", "vega-datasets", "vtk", "xarray", "xgboost"] -recommended = ["holoviews (>=1.16.0)", "jupyterlab", "matplotlib", "pillow", "plotly"] -tests = ["diskcache", "flake8", "flaky", "folium", "holoviews (>=1.16.0)", "ipympl", "ipython (>=7.0)", "ipyvuetify", "lxml", "nbval", "numpy (<1.24)", "pandas (>=1.3)", "parameterized", "pre-commit", "psutil", "pytest", "pytest-cov", "pytest-xdist", "reacton", "scipy", "twine"] -ui = ["playwright", "pytest-playwright"] - -[[package]] -name = "param" -version = "1.13.0" -description = "Make your Python code clearer and more reliable by declaring Parameters." -optional = true -python-versions = ">=2.7" -files = [ - {file = "param-1.13.0-py2.py3-none-any.whl", hash = "sha256:a2e3b7b07ca7dd1adaa4fb3020a3ef4fe434f27ede453a9d94194c5155677e30"}, - {file = "param-1.13.0.tar.gz", hash = "sha256:59d55048d42a85e148a69837df42bd11c3391d47fad15ba57d118e145f001ef2"}, -] - -[package.extras] -all = ["aiohttp", "coverage", "flake8", "graphviz", "ipython (!=8.7.0)", "myst-nb (==0.12.2)", "myst-parser", "nbconvert", "nbsite (==0.8.0rc2)", "pandas", "panel", "pydata-sphinx-theme (<0.9.0)", "pygraphviz", "pytest", "sphinx-copybutton"] -doc = ["aiohttp", "graphviz", "ipython (!=8.7.0)", "myst-nb (==0.12.2)", "myst-parser", "nbconvert", "nbsite (==0.8.0rc2)", "pandas", "panel", "pydata-sphinx-theme (<0.9.0)", "pygraphviz", "sphinx-copybutton"] -tests = ["coverage", "flake8", "pytest"] - [[package]] name = "parso" version = "0.8.3" @@ -2896,13 +2533,13 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pep517" -version = "0.13.0" +version = "0.13.1" description = "Wrappers to build Python packages using PEP 517 hooks" optional = true python-versions = ">=3.6" files = [ - {file = "pep517-0.13.0-py3-none-any.whl", hash = "sha256:4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b"}, - {file = "pep517-0.13.0.tar.gz", hash = "sha256:ae69927c5c172be1add9203726d4b84cf3ebad1edcd5f71fcdc746e66e829f59"}, + {file = "pep517-0.13.1-py3-none-any.whl", hash = "sha256:31b206f67165b3536dd577c5c3f1518e8fbaf38cbc57efff8369a392feff1721"}, + {file = "pep517-0.13.1.tar.gz", hash = "sha256:1b2fa2ffd3938bb4beffe5d6146cbcb2bda996a5a4da9f31abffd8b24e07b317"}, ] [package.dependencies] @@ -2910,97 +2547,102 @@ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = true python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] ptyprocess = ">=0.5" -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -optional = true -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - [[package]] name = "pillow" -version = "10.0.0" +version = "10.2.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891"}, - {file = "Pillow-10.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614"}, - {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b"}, - {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c"}, - {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1"}, - {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf"}, - {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3"}, - {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992"}, - {file = "Pillow-10.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de"}, - {file = "Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485"}, - {file = "Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f"}, - {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3"}, - {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d"}, - {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd"}, - {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629"}, - {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538"}, - {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d"}, - {file = "Pillow-10.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f"}, - {file = "Pillow-10.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37"}, - {file = "Pillow-10.0.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883"}, - {file = "Pillow-10.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e"}, - {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640"}, - {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568"}, - {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223"}, - {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff"}, - {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551"}, - {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5"}, - {file = "Pillow-10.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199"}, - {file = "Pillow-10.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca"}, - {file = "Pillow-10.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3"}, - {file = "Pillow-10.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3"}, - {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43"}, - {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d"}, - {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530"}, - {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51"}, - {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86"}, - {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7"}, - {file = "Pillow-10.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0"}, - {file = "Pillow-10.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa"}, - {file = "Pillow-10.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90"}, - {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967"}, - {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d"}, - {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3"}, - {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba"}, - {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3"}, - {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017"}, - {file = "Pillow-10.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6"}, - {file = "Pillow-10.0.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0"}, - {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba"}, - {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3"}, - {file = "Pillow-10.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334"}, - {file = "Pillow-10.0.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2"}, - {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed"}, - {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684"}, - {file = "Pillow-10.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3"}, - {file = "Pillow-10.0.0.tar.gz", hash = "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, + {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, + {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "pkginfo" @@ -3016,41 +2658,30 @@ files = [ [package.extras] testing = ["pytest", "pytest-cov"] -[[package]] -name = "pkgutil-resolve-name" -version = "1.3.10" -description = "Resolve a name to an object." -optional = true -python-versions = ">=3.6" -files = [ - {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, - {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, -] - [[package]] name = "platformdirs" -version = "3.8.0" +version = "4.1.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.8.0-py3-none-any.whl", hash = "sha256:ca9ed98ce73076ba72e092b23d3c93ea6c4e186b3f1c3dad6edd98ff6ffcca2e"}, - {file = "platformdirs-3.8.0.tar.gz", hash = "sha256:b0cabcb11063d21a0b261d557acb0a9d2126350e63b70cdf7db6347baea456dc"}, + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" -version = "1.2.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, ] [package.extras] @@ -3059,13 +2690,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pooch" -version = "1.7.0" +version = "1.8.0" description = "\"Pooch manages your Python library's sample data files: it automatically downloads and stores them in a local directory, with support for versioning and corruption checks.\"" optional = true python-versions = ">=3.7" files = [ - {file = "pooch-1.7.0-py3-none-any.whl", hash = "sha256:74258224fc33d58f53113cf955e8d51bf01386b91492927d0d1b6b341a765ad7"}, - {file = "pooch-1.7.0.tar.gz", hash = "sha256:f174a1041b6447f0eef8860f76d17f60ed2f857dc0efa387a7f08228af05d998"}, + {file = "pooch-1.8.0-py3-none-any.whl", hash = "sha256:1bfba436d9e2ad5199ccad3583cca8c241b8736b5bb23fe67c213d52650dbb66"}, + {file = "pooch-1.8.0.tar.gz", hash = "sha256:f59981fd5b9b5d032dcde8f4a11eaa492c2ac6343fae3596a2fdae35fc54b0a0"}, ] [package.dependencies] @@ -3080,13 +2711,13 @@ xxhash = ["xxhash (>=1.4.3)"] [[package]] name = "pre-commit" -version = "3.3.3" +version = "3.6.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pre_commit-3.3.3-py2.py3-none-any.whl", hash = "sha256:10badb65d6a38caff29703362271d7dca483d01da88f9d7e05d0b97171c136cb"}, - {file = "pre_commit-3.3.3.tar.gz", hash = "sha256:a2256f489cd913d575c145132ae196fe335da32d91a8294b7afe6622335dd023"}, + {file = "pre_commit-3.6.0-py2.py3-none-any.whl", hash = "sha256:c255039ef399049a5544b6ce13d135caba8f2c28c3b4033277a788f434308376"}, + {file = "pre_commit-3.6.0.tar.gz", hash = "sha256:d30bad9abf165f7785c15a21a1f46da7d0677cb00ee7ff4c579fd38922efe15d"}, ] [package.dependencies] @@ -3098,13 +2729,13 @@ virtualenv = ">=20.10.0" [[package]] name = "prometheus-client" -version = "0.17.0" +version = "0.19.0" description = "Python client for the Prometheus monitoring system." optional = true -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.17.0-py3-none-any.whl", hash = "sha256:a77b708cf083f4d1a3fb3ce5c95b4afa32b9c521ae363354a4a910204ea095ce"}, - {file = "prometheus_client-0.17.0.tar.gz", hash = "sha256:9c3b26f1535945e85b8934fb374678d263137b78ef85f305b1156c7c881cd11b"}, + {file = "prometheus_client-0.19.0-py3-none-any.whl", hash = "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92"}, + {file = "prometheus_client-0.19.0.tar.gz", hash = "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1"}, ] [package.extras] @@ -3112,13 +2743,13 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.39" +version = "3.0.43" description = "Library for building powerful interactive command lines in Python" optional = true python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, ] [package.dependencies] @@ -3126,47 +2757,47 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "4.23.3" +version = "4.25.1" description = "" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "protobuf-4.23.3-cp310-abi3-win32.whl", hash = "sha256:514b6bbd54a41ca50c86dd5ad6488afe9505901b3557c5e0f7823a0cf67106fb"}, - {file = "protobuf-4.23.3-cp310-abi3-win_amd64.whl", hash = "sha256:cc14358a8742c4e06b1bfe4be1afbdf5c9f6bd094dff3e14edb78a1513893ff5"}, - {file = "protobuf-4.23.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2991f5e7690dab569f8f81702e6700e7364cc3b5e572725098215d3da5ccc6ac"}, - {file = "protobuf-4.23.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:08fe19d267608d438aa37019236db02b306e33f6b9902c3163838b8e75970223"}, - {file = "protobuf-4.23.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3b01a5274ac920feb75d0b372d901524f7e3ad39c63b1a2d55043f3887afe0c1"}, - {file = "protobuf-4.23.3-cp37-cp37m-win32.whl", hash = "sha256:aca6e86a08c5c5962f55eac9b5bd6fce6ed98645d77e8bfc2b952ecd4a8e4f6a"}, - {file = "protobuf-4.23.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0149053336a466e3e0b040e54d0b615fc71de86da66791c592cc3c8d18150bf8"}, - {file = "protobuf-4.23.3-cp38-cp38-win32.whl", hash = "sha256:84ea0bd90c2fdd70ddd9f3d3fc0197cc24ecec1345856c2b5ba70e4d99815359"}, - {file = "protobuf-4.23.3-cp38-cp38-win_amd64.whl", hash = "sha256:3bcbeb2bf4bb61fe960dd6e005801a23a43578200ea8ceb726d1f6bd0e562ba1"}, - {file = "protobuf-4.23.3-cp39-cp39-win32.whl", hash = "sha256:5cb9e41188737f321f4fce9a4337bf40a5414b8d03227e1d9fbc59bc3a216e35"}, - {file = "protobuf-4.23.3-cp39-cp39-win_amd64.whl", hash = "sha256:29660574cd769f2324a57fb78127cda59327eb6664381ecfe1c69731b83e8288"}, - {file = "protobuf-4.23.3-py3-none-any.whl", hash = "sha256:447b9786ac8e50ae72cae7a2eec5c5df6a9dbf9aa6f908f1b8bda6032644ea62"}, - {file = "protobuf-4.23.3.tar.gz", hash = "sha256:7a92beb30600332a52cdadbedb40d33fd7c8a0d7f549c440347bc606fb3fe34b"}, + {file = "protobuf-4.25.1-cp310-abi3-win32.whl", hash = "sha256:193f50a6ab78a970c9b4f148e7c750cfde64f59815e86f686c22e26b4fe01ce7"}, + {file = "protobuf-4.25.1-cp310-abi3-win_amd64.whl", hash = "sha256:3497c1af9f2526962f09329fd61a36566305e6c72da2590ae0d7d1322818843b"}, + {file = "protobuf-4.25.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:0bf384e75b92c42830c0a679b0cd4d6e2b36ae0cf3dbb1e1dfdda48a244f4bcd"}, + {file = "protobuf-4.25.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:0f881b589ff449bf0b931a711926e9ddaad3b35089cc039ce1af50b21a4ae8cb"}, + {file = "protobuf-4.25.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:ca37bf6a6d0046272c152eea90d2e4ef34593aaa32e8873fc14c16440f22d4b7"}, + {file = "protobuf-4.25.1-cp38-cp38-win32.whl", hash = "sha256:abc0525ae2689a8000837729eef7883b9391cd6aa7950249dcf5a4ede230d5dd"}, + {file = "protobuf-4.25.1-cp38-cp38-win_amd64.whl", hash = "sha256:1484f9e692091450e7edf418c939e15bfc8fc68856e36ce399aed6889dae8bb0"}, + {file = "protobuf-4.25.1-cp39-cp39-win32.whl", hash = "sha256:8bdbeaddaac52d15c6dce38c71b03038ef7772b977847eb6d374fc86636fa510"}, + {file = "protobuf-4.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:becc576b7e6b553d22cbdf418686ee4daa443d7217999125c045ad56322dda10"}, + {file = "protobuf-4.25.1-py3-none-any.whl", hash = "sha256:a19731d5e83ae4737bb2a089605e636077ac001d18781b3cf489b9546c7c80d6"}, + {file = "protobuf-4.25.1.tar.gz", hash = "sha256:57d65074b4f5baa4ab5da1605c02be90ac20c8b40fb137d6a8df9f416b0d0ce2"}, ] [[package]] name = "psutil" -version = "5.9.5" +version = "5.9.7" description = "Cross-platform lib for process and system monitoring in Python." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, - {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, - {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, - {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, - {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, - {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, - {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, - {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, + {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, + {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, + {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, + {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, + {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, + {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, + {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, + {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, + {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, + {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, + {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, + {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, + {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, + {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, + {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, ] [package.extras] @@ -3199,13 +2830,13 @@ tests = ["pytest"] [[package]] name = "pyasn1" -version = "0.5.0" +version = "0.5.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, - {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, + {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, + {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, ] [[package]] @@ -3235,13 +2866,13 @@ files = [ [[package]] name = "pydata-sphinx-theme" -version = "0.13.3" +version = "0.14.4" description = "Bootstrap-based Sphinx theme from the PyData community" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydata_sphinx_theme-0.13.3-py3-none-any.whl", hash = "sha256:bf41ca6c1c6216e929e28834e404bfc90e080b51915bbe7563b5e6fda70354f0"}, - {file = "pydata_sphinx_theme-0.13.3.tar.gz", hash = "sha256:827f16b065c4fd97e847c11c108bf632b7f2ff53a3bca3272f63f3f3ff782ecc"}, + {file = "pydata_sphinx_theme-0.14.4-py3-none-any.whl", hash = "sha256:ac15201f4c2e2e7042b0cad8b30251433c1f92be762ddcefdb4ae68811d918d9"}, + {file = "pydata_sphinx_theme-0.14.4.tar.gz", hash = "sha256:f5d7a2cb7a98e35b9b49d3b02cec373ad28958c2ed5c9b1ffe6aff6c56e9de5b"}, ] [package.dependencies] @@ -3251,41 +2882,43 @@ beautifulsoup4 = "*" docutils = "!=0.17.0" packaging = "*" pygments = ">=2.7" -sphinx = ">=4.2" +sphinx = ">=5.0" typing-extensions = "*" [package.extras] +a11y = ["pytest-playwright"] dev = ["nox", "pre-commit", "pydata-sphinx-theme[doc,test]", "pyyaml"] -doc = ["ablog (>=0.11.0rc2)", "colorama", "ipyleaflet", "jupyter_sphinx", "linkify-it-py", "matplotlib", "myst-nb", "nbsphinx", "numpy", "numpydoc", "pandas", "plotly", "rich", "sphinx-copybutton", "sphinx-design", "sphinx-favicon (>=1.0.1)", "sphinx-sitemap", "sphinx-togglebutton", "sphinxcontrib-youtube", "sphinxext-rediraffe", "xarray"] -test = ["codecov", "pytest", "pytest-cov", "pytest-regressions"] +doc = ["ablog (>=0.11.0rc2)", "colorama", "ipykernel", "ipyleaflet", "jupyter_sphinx", "jupyterlite-sphinx", "linkify-it-py", "matplotlib", "myst-parser", "nbsphinx", "numpy", "numpydoc", "pandas", "plotly", "rich", "sphinx-autoapi (>=3.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-favicon (>=1.0.1)", "sphinx-sitemap", "sphinx-togglebutton", "sphinxcontrib-youtube (<1.4)", "sphinxext-rediraffe", "xarray"] +test = ["pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "pygments" -version = "2.15.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = true python-versions = ">=3.7" files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pylint" -version = "2.17.4" +version = "2.17.7" description = "python code static checker" optional = true python-versions = ">=3.7.2" files = [ - {file = "pylint-2.17.4-py3-none-any.whl", hash = "sha256:7a1145fb08c251bdb5cca11739722ce64a63db479283d10ce718b2460e54123c"}, - {file = "pylint-2.17.4.tar.gz", hash = "sha256:5dcf1d9e19f41f38e4e85d10f511e5b9c35e1aa74251bf95cdd8cb23584e2db1"}, + {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, + {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, ] [package.dependencies] -astroid = ">=2.15.4,<=2.17.0-dev0" +astroid = ">=2.15.8,<=2.17.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -3304,74 +2937,38 @@ testutils = ["gitpython (>3)"] [[package]] name = "pypandoc" -version = "1.11" +version = "1.12" description = "Thin wrapper for pandoc." optional = true python-versions = ">=3.6" files = [ - {file = "pypandoc-1.11-py3-none-any.whl", hash = "sha256:b260596934e9cfc6513056110a7c8600171d414f90558bf4407e68b209be8007"}, - {file = "pypandoc-1.11.tar.gz", hash = "sha256:7f6d68db0e57e0f6961bec2190897118c4d305fc2d31c22cd16037f22ee084a5"}, + {file = "pypandoc-1.12-py3-none-any.whl", hash = "sha256:efb4f7d68ead8bec32e22b62f02d5608a1700978b51bfc4af286fd6acfe9d218"}, + {file = "pypandoc-1.12.tar.gz", hash = "sha256:8f44740a9f074e121d81b489f073160421611d4ead62d1b306aeb11aab3c32df"}, ] [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, ] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] -[[package]] -name = "pyrsistent" -version = "0.19.3" -description = "Persistent/Functional/Immutable data structures" -optional = true -python-versions = ">=3.7" -files = [ - {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, - {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, - {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, - {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, - {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, - {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, -] - [[package]] name = "pytest" -version = "7.4.0" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = true python-versions = ">=3.7" files = [ - {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, - {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -3443,93 +3040,38 @@ files = [ {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, ] -[[package]] -name = "pythreejs" -version = "2.4.2" -description = "Interactive 3D graphics for the Jupyter Notebook and JupyterLab, using Three.js and Jupyter Widgets." -optional = true -python-versions = ">=3.7" -files = [ - {file = "pythreejs-2.4.2-py3-none-any.whl", hash = "sha256:8418807163ad91f4df53b58c4e991b26214852a1236f28f1afeaadf99d095818"}, - {file = "pythreejs-2.4.2.tar.gz", hash = "sha256:a568bfdc4c3797c4c2339158928edc7dcf6fa4a267b08e3cec5121e2078b5bd6"}, -] - -[package.dependencies] -ipydatawidgets = ">=1.1.1" -ipywidgets = ">=7.2.1" -numpy = "*" -traitlets = "*" - -[package.extras] -docs = ["nbsphinx (>=0.2.13)", "nbsphinx-link", "sphinx (>=1.5)", "sphinx-rtd-theme"] -examples = ["ipywebrtc", "matplotlib", "scikit-image", "scipy"] -test = ["nbval", "numpy (>=1.14)", "pytest-check-links"] - -[[package]] -name = "pytz" -version = "2023.3" -description = "World timezone definitions, modern and historical" -optional = true -python-versions = "*" -files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, -] - [[package]] name = "pyvista" -version = "0.40.1" +version = "0.43.3" description = "Easier Pythonic interface to VTK" optional = true python-versions = ">=3.8" files = [ - {file = "pyvista-0.40.1-py3-none-any.whl", hash = "sha256:f5ffd25d26f48201b81073eb07cbc4f8ce8b441ccd765fb8686244ea5466a59b"}, - {file = "pyvista-0.40.1.tar.gz", hash = "sha256:96950ff298705df230f9fe2169f1bd276ef346a319085c9af7d02079d11e8327"}, + {file = "pyvista-0.43.3-py3-none-any.whl", hash = "sha256:5eb589bbea294761cd44aed0330481019e8eca2ddb950a1f332a5a132000e93d"}, + {file = "pyvista-0.43.3.tar.gz", hash = "sha256:e039cdeb0c7cbb42a16fbdfbbede65a7dc656def787e76c79a43eb0badc88c9b"}, ] [package.dependencies] -ipyvtklink = {version = "*", optional = true, markers = "extra == \"jupyter\""} ipywidgets = {version = "*", optional = true, markers = "extra == \"jupyter\""} jupyter-server-proxy = {version = "*", optional = true, markers = "extra == \"jupyter\""} matplotlib = ">=3.0.1" nest-asyncio = {version = "*", optional = true, markers = "extra == \"jupyter\""} -numpy = "*" -panel = {version = "*", optional = true, markers = "extra == \"jupyter\""} +numpy = ">=1.21.0" pillow = "*" pooch = "*" -pythreejs = {version = "*", optional = true, markers = "extra == \"jupyter\""} scooby = ">=0.5.1" -trame = {version = ">=2.5.0", optional = true, markers = "extra == \"jupyter\""} -trame-client = {version = ">=2.9.4", optional = true, markers = "extra == \"jupyter\""} -trame-server = {version = ">=2.11.4", optional = true, markers = "extra == \"jupyter\""} -trame-vtk = {version = ">=2.5.3", optional = true, markers = "extra == \"jupyter\""} +trame = {version = ">=2.5.2", optional = true, markers = "extra == \"jupyter\""} +trame-client = {version = ">=2.12.7", optional = true, markers = "extra == \"jupyter\""} +trame-server = {version = ">=2.11.7", optional = true, markers = "extra == \"jupyter\""} +trame-vtk = {version = ">=2.5.8", optional = true, markers = "extra == \"jupyter\""} +trame-vuetify = {version = ">=2.3.1", optional = true, markers = "extra == \"jupyter\""} vtk = "*" [package.extras] -all = ["pyvista[colormaps,io,jupyter,trame]"] +all = ["pyvista[colormaps,io,jupyter]"] colormaps = ["cmocean", "colorcet"] io = ["imageio", "meshio (>=5.2)"] -jupyter = ["ipyvtklink", "ipywidgets", "jupyter-server-proxy", "nest-asyncio", "panel", "pythreejs", "trame (>=2.5.0)", "trame-client (>=2.9.4)", "trame-server (>=2.11.4)", "trame-vtk (>=2.5.3)"] -trame = ["trame (>=2.5.0)", "trame-client (>=2.9.4)", "trame-server (>=2.11.4)", "trame-vtk (>=2.5.3)"] - -[[package]] -name = "pyviz-comms" -version = "2.3.2" -description = "Bidirectional communication for the HoloViz ecosystem." -optional = true -python-versions = ">=3.7" -files = [ - {file = "pyviz_comms-2.3.2-py2.py3-none-any.whl", hash = "sha256:2e9f6574409ef6c44331b41ff254cbde05fffca140aca8ac47ca13d9223b4499"}, - {file = "pyviz_comms-2.3.2.tar.gz", hash = "sha256:542a10fed8242d3a9d468ed0a14d6a2537e589c3f8a7986c79c374591254d6b4"}, -] - -[package.dependencies] -param = "*" - -[package.extras] -all = ["flake8", "jupyter-packaging (>=0.7.9,<0.8.0)", "jupyterlab (>=3.0,<4.0)", "keyring", "pytest", "rfc3986", "setuptools (>=40.8.0)", "twine"] -build = ["jupyter-packaging (>=0.7.9,<0.8.0)", "jupyterlab (>=3.0,<4.0)", "keyring", "rfc3986", "setuptools (>=40.8.0)", "twine"] -tests = ["flake8", "pytest"] +jupyter = ["ipywidgets", "jupyter-server-proxy", "nest-asyncio", "trame (>=2.5.2)", "trame-client (>=2.12.7)", "trame-server (>=2.11.7)", "trame-vtk (>=2.5.8)", "trame-vuetify (>=2.3.1)"] [[package]] name = "pywin32" @@ -3567,152 +3109,179 @@ files = [ [[package]] name = "pywinpty" -version = "2.0.10" +version = "2.0.12" description = "Pseudo terminal support for Windows from Python." optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pywinpty-2.0.10-cp310-none-win_amd64.whl", hash = "sha256:4c7d06ad10f6e92bc850a467f26d98f4f30e73d2fe5926536308c6ae0566bc16"}, - {file = "pywinpty-2.0.10-cp311-none-win_amd64.whl", hash = "sha256:7ffbd66310b83e42028fc9df7746118978d94fba8c1ebf15a7c1275fdd80b28a"}, - {file = "pywinpty-2.0.10-cp37-none-win_amd64.whl", hash = "sha256:38cb924f2778b5751ef91a75febd114776b3af0ae411bc667be45dd84fc881d3"}, - {file = "pywinpty-2.0.10-cp38-none-win_amd64.whl", hash = "sha256:902d79444b29ad1833b8d5c3c9aabdfd428f4f068504430df18074007c8c0de8"}, - {file = "pywinpty-2.0.10-cp39-none-win_amd64.whl", hash = "sha256:3c46aef80dd50979aff93de199e4a00a8ee033ba7a03cadf0a91fed45f0c39d7"}, - {file = "pywinpty-2.0.10.tar.gz", hash = "sha256:cdbb5694cf8c7242c2ecfaca35c545d31fa5d5814c3d67a4e628f803f680ebea"}, + {file = "pywinpty-2.0.12-cp310-none-win_amd64.whl", hash = "sha256:21319cd1d7c8844fb2c970fb3a55a3db5543f112ff9cfcd623746b9c47501575"}, + {file = "pywinpty-2.0.12-cp311-none-win_amd64.whl", hash = "sha256:853985a8f48f4731a716653170cd735da36ffbdc79dcb4c7b7140bce11d8c722"}, + {file = "pywinpty-2.0.12-cp312-none-win_amd64.whl", hash = "sha256:1617b729999eb6713590e17665052b1a6ae0ad76ee31e60b444147c5b6a35dca"}, + {file = "pywinpty-2.0.12-cp38-none-win_amd64.whl", hash = "sha256:189380469ca143d06e19e19ff3fba0fcefe8b4a8cc942140a6b863aed7eebb2d"}, + {file = "pywinpty-2.0.12-cp39-none-win_amd64.whl", hash = "sha256:7520575b6546db23e693cbd865db2764097bd6d4ef5dc18c92555904cd62c3d4"}, + {file = "pywinpty-2.0.12.tar.gz", hash = "sha256:8197de460ae8ebb7f5d1701dfa1b5df45b157bb832e92acba316305e18ca00dd"}, ] [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" optional = true python-versions = ">=3.6" files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [[package]] name = "pyzmq" -version = "25.1.0" +version = "25.1.2" description = "Python bindings for 0MQ" optional = true python-versions = ">=3.6" files = [ - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a6169e69034eaa06823da6a93a7739ff38716142b3596c180363dee729d713d"}, - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:19d0383b1f18411d137d891cab567de9afa609b214de68b86e20173dc624c101"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1e931d9a92f628858a50f5bdffdfcf839aebe388b82f9d2ccd5d22a38a789dc"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97d984b1b2f574bc1bb58296d3c0b64b10e95e7026f8716ed6c0b86d4679843f"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:154bddda2a351161474b36dba03bf1463377ec226a13458725183e508840df89"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cb6d161ae94fb35bb518b74bb06b7293299c15ba3bc099dccd6a5b7ae589aee3"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:90146ab578931e0e2826ee39d0c948d0ea72734378f1898939d18bc9c823fcf9"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:831ba20b660b39e39e5ac8603e8193f8fce1ee03a42c84ade89c36a251449d80"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a522510e3434e12aff80187144c6df556bb06fe6b9d01b2ecfbd2b5bfa5c60c"}, - {file = "pyzmq-25.1.0-cp310-cp310-win32.whl", hash = "sha256:be24a5867b8e3b9dd5c241de359a9a5217698ff616ac2daa47713ba2ebe30ad1"}, - {file = "pyzmq-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:5693dcc4f163481cf79e98cf2d7995c60e43809e325b77a7748d8024b1b7bcba"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:13bbe36da3f8aaf2b7ec12696253c0bf6ffe05f4507985a8844a1081db6ec22d"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:69511d604368f3dc58d4be1b0bad99b61ee92b44afe1cd9b7bd8c5e34ea8248a"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a983c8694667fd76d793ada77fd36c8317e76aa66eec75be2653cef2ea72883"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:332616f95eb400492103ab9d542b69d5f0ff628b23129a4bc0a2fd48da6e4e0b"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58416db767787aedbfd57116714aad6c9ce57215ffa1c3758a52403f7c68cff5"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cad9545f5801a125f162d09ec9b724b7ad9b6440151b89645241d0120e119dcc"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d6128d431b8dfa888bf51c22a04d48bcb3d64431caf02b3cb943269f17fd2994"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b15247c49d8cbea695b321ae5478d47cffd496a2ec5ef47131a9e79ddd7e46c"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:442d3efc77ca4d35bee3547a8e08e8d4bb88dadb54a8377014938ba98d2e074a"}, - {file = "pyzmq-25.1.0-cp311-cp311-win32.whl", hash = "sha256:65346f507a815a731092421d0d7d60ed551a80d9b75e8b684307d435a5597425"}, - {file = "pyzmq-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b45d722046fea5a5694cba5d86f21f78f0052b40a4bbbbf60128ac55bfcc7b6"}, - {file = "pyzmq-25.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f45808eda8b1d71308c5416ef3abe958f033fdbb356984fabbfc7887bed76b3f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b697774ea8273e3c0460cf0bba16cd85ca6c46dfe8b303211816d68c492e132"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b324fa769577fc2c8f5efcd429cef5acbc17d63fe15ed16d6dcbac2c5eb00849"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:5873d6a60b778848ce23b6c0ac26c39e48969823882f607516b91fb323ce80e5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f0d9e7ba6a815a12c8575ba7887da4b72483e4cfc57179af10c9b937f3f9308f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:414b8beec76521358b49170db7b9967d6974bdfc3297f47f7d23edec37329b00"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:01f06f33e12497dca86353c354461f75275a5ad9eaea181ac0dc1662da8074fa"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win32.whl", hash = "sha256:b5a07c4f29bf7cb0164664ef87e4aa25435dcc1f818d29842118b0ac1eb8e2b5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:968b0c737797c1809ec602e082cb63e9824ff2329275336bb88bd71591e94a90"}, - {file = "pyzmq-25.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47b915ba666c51391836d7ed9a745926b22c434efa76c119f77bcffa64d2c50c"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5af31493663cf76dd36b00dafbc839e83bbca8a0662931e11816d75f36155897"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5489738a692bc7ee9a0a7765979c8a572520d616d12d949eaffc6e061b82b4d1"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1fc56a0221bdf67cfa94ef2d6ce5513a3d209c3dfd21fed4d4e87eca1822e3a3"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:75217e83faea9edbc29516fc90c817bc40c6b21a5771ecb53e868e45594826b0"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3830be8826639d801de9053cf86350ed6742c4321ba4236e4b5568528d7bfed7"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3575699d7fd7c9b2108bc1c6128641a9a825a58577775ada26c02eb29e09c517"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win32.whl", hash = "sha256:95bd3a998d8c68b76679f6b18f520904af5204f089beebb7b0301d97704634dd"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dbc466744a2db4b7ca05589f21ae1a35066afada2f803f92369f5877c100ef62"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:3bed53f7218490c68f0e82a29c92335daa9606216e51c64f37b48eb78f1281f4"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb52e826d16c09ef87132c6e360e1879c984f19a4f62d8a935345deac43f3c12"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ddbef8b53cd16467fdbfa92a712eae46dd066aa19780681a2ce266e88fbc7165"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9301cf1d7fc1ddf668d0abbe3e227fc9ab15bc036a31c247276012abb921b5ff"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e23a8c3b6c06de40bdb9e06288180d630b562db8ac199e8cc535af81f90e64b"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4a82faae00d1eed4809c2f18b37f15ce39a10a1c58fe48b60ad02875d6e13d80"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8398a1b1951aaa330269c35335ae69744be166e67e0ebd9869bdc09426f3871"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d40682ac60b2a613d36d8d3a0cd14fbdf8e7e0618fbb40aa9fa7b796c9081584"}, - {file = "pyzmq-25.1.0-cp38-cp38-win32.whl", hash = "sha256:33d5c8391a34d56224bccf74f458d82fc6e24b3213fc68165c98b708c7a69325"}, - {file = "pyzmq-25.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c66b7ff2527e18554030319b1376d81560ca0742c6e0b17ff1ee96624a5f1afd"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:af56229ea6527a849ac9fb154a059d7e32e77a8cba27e3e62a1e38d8808cb1a5"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdca18b94c404af6ae5533cd1bc310c4931f7ac97c148bbfd2cd4bdd62b96253"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b6b42f7055bbc562f63f3df3b63e3dd1ebe9727ff0f124c3aa7bcea7b3a00f9"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c2fc7aad520a97d64ffc98190fce6b64152bde57a10c704b337082679e74f67"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86a26415a8b6af02cd8d782e3a9ae3872140a057f1cadf0133de685185c02b"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851fb2fe14036cfc1960d806628b80276af5424db09fe5c91c726890c8e6d943"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2a21fec5c3cea45421a19ccbe6250c82f97af4175bc09de4d6dd78fb0cb4c200"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bad172aba822444b32eae54c2d5ab18cd7dee9814fd5c7ed026603b8cae2d05f"}, - {file = "pyzmq-25.1.0-cp39-cp39-win32.whl", hash = "sha256:4d67609b37204acad3d566bb7391e0ecc25ef8bae22ff72ebe2ad7ffb7847158"}, - {file = "pyzmq-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:71c7b5896e40720d30cd77a81e62b433b981005bbff0cb2f739e0f8d059b5d99"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb27ef9d3bdc0c195b2dc54fcb8720e18b741624686a81942e14c8b67cc61a6"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c4fc2741e0513b5d5a12fe200d6785bbcc621f6f2278893a9ca7bed7f2efb7d"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fc34fdd458ff77a2a00e3c86f899911f6f269d393ca5675842a6e92eea565bae"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8751f9c1442624da391bbd92bd4b072def6d7702a9390e4479f45c182392ff78"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6581e886aec3135964a302a0f5eb68f964869b9efd1dbafdebceaaf2934f8a68"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5482f08d2c3c42b920e8771ae8932fbaa0a67dff925fc476996ddd8155a170f3"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7fbcafa3ea16d1de1f213c226005fea21ee16ed56134b75b2dede5a2129e62"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adecf6d02b1beab8d7c04bc36f22bb0e4c65a35eb0b4750b91693631d4081c70"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6d39e42a0aa888122d1beb8ec0d4ddfb6c6b45aecb5ba4013c27e2f28657765"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7018289b402ebf2b2c06992813523de61d4ce17bd514c4339d8f27a6f6809492"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9e68ae9864d260b18f311b68d29134d8776d82e7f5d75ce898b40a88df9db30f"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e21cc00e4debe8f54c3ed7b9fcca540f46eee12762a9fa56feb8512fd9057161"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f666ae327a6899ff560d741681fdcdf4506f990595201ed39b44278c471ad98"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f5efcc29056dfe95e9c9db0dfbb12b62db9c4ad302f812931b6d21dd04a9119"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:48e5e59e77c1a83162ab3c163fc01cd2eebc5b34560341a67421b09be0891287"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:108c96ebbd573d929740d66e4c3d1bdf31d5cde003b8dc7811a3c8c5b0fc173b"}, - {file = "pyzmq-25.1.0.tar.gz", hash = "sha256:80c41023465d36280e801564a69cbfce8ae85ff79b080e1913f6e90481fb8957"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, + {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, + {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, + {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, + {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, + {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, + {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b6d09a8962a91151f0976008eb7b29b433a560fde056ec7a3db9ec8f1075438"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967668420f36878a3c9ecb5ab33c9d0ff8d054f9c0233d995a6d25b0e95e1b6b"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5edac3f57c7ddaacdb4d40f6ef2f9e299471fc38d112f4bc6d60ab9365445fb0"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dabfb10ef897f3b7e101cacba1437bd3a5032ee667b7ead32bbcdd1a8422fe7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c6441e0398c2baacfe5ba30c937d274cfc2dc5b55e82e3749e333aabffde561"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:16b726c1f6c2e7625706549f9dbe9b06004dfbec30dbed4bf50cbdfc73e5b32a"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a86c2dd76ef71a773e70551a07318b8e52379f58dafa7ae1e0a4be78efd1ff16"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win32.whl", hash = "sha256:359f7f74b5d3c65dae137f33eb2bcfa7ad9ebefd1cab85c935f063f1dbb245cc"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:55875492f820d0eb3417b51d96fea549cde77893ae3790fd25491c5754ea2f68"}, + {file = "pyzmq-25.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8c8a419dfb02e91b453615c69568442e897aaf77561ee0064d789705ff37a92"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807c87fa893527ae8a524c15fc505d9950d5e856f03dae5921b5e9aa3b8783b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e319ed7d6b8f5fad9b76daa0a68497bc6f129858ad956331a5835785761e003"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c53687dde4d9d473c587ae80cc328e5b102b517447456184b485587ebd18b62"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9add2e5b33d2cd765ad96d5eb734a5e795a0755f7fc49aa04f76d7ddda73fd70"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e690145a8c0c273c28d3b89d6fb32c45e0d9605b2293c10e650265bf5c11cfec"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00a06faa7165634f0cac1abb27e54d7a0b3b44eb9994530b8ec73cf52e15353b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win32.whl", hash = "sha256:0f97bc2f1f13cb16905a5f3e1fbdf100e712d841482b2237484360f8bc4cb3d7"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6cc0020b74b2e410287e5942e1e10886ff81ac77789eb20bec13f7ae681f0fdd"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:bef02cfcbded83473bdd86dd8d3729cd82b2e569b75844fb4ea08fee3c26ae41"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e10a4b5a4b1192d74853cc71a5e9fd022594573926c2a3a4802020360aa719d8"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c5f80e578427d4695adac6fdf4370c14a2feafdc8cb35549c219b90652536ae"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dde6751e857910c1339890f3524de74007958557593b9e7e8c5f01cd919f8a7"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea1608dd169da230a0ad602d5b1ebd39807ac96cae1845c3ceed39af08a5c6df"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0f513130c4c361201da9bc69df25a086487250e16b5571ead521b31ff6b02220"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:019744b99da30330798bb37df33549d59d380c78e516e3bab9c9b84f87a9592f"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e2713ef44be5d52dd8b8e2023d706bf66cb22072e97fc71b168e01d25192755"}, + {file = "pyzmq-25.1.2-cp38-cp38-win32.whl", hash = "sha256:07cd61a20a535524906595e09344505a9bd46f1da7a07e504b315d41cd42eb07"}, + {file = "pyzmq-25.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb7e49a17fb8c77d3119d41a4523e432eb0c6932187c37deb6fbb00cc3028088"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, + {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, + {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, + {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, ] [package.dependencies] @@ -3720,23 +3289,38 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "readme-renderer" -version = "40.0" -description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" +version = "42.0" +description = "readme_renderer is a library for rendering readme descriptions for Warehouse" optional = true python-versions = ">=3.8" files = [ - {file = "readme_renderer-40.0-py3-none-any.whl", hash = "sha256:e18feb2a1e7706f2865b81ebb460056d93fb29d69daa10b223c00faa7bd9a00a"}, - {file = "readme_renderer-40.0.tar.gz", hash = "sha256:9f77b519d96d03d7d7dce44977ba543090a14397c4f60de5b6eb5b8048110aa4"}, + {file = "readme_renderer-42.0-py3-none-any.whl", hash = "sha256:13d039515c1f24de668e2c93f2e877b9dbe6c6c32328b90a40a49d8b2b85f36d"}, + {file = "readme_renderer-42.0.tar.gz", hash = "sha256:2d55489f83be4992fe4454939d1a051c33edbab778e82761d060c9fc6b308cd1"}, ] [package.dependencies] -bleach = ">=2.1.0" docutils = ">=0.13.1" +nh3 = ">=0.2.14" Pygments = ">=2.5.1" [package.extras] md = ["cmarkgfm (>=0.8.0)"] +[[package]] +name = "referencing" +version = "0.32.0" +description = "JSON Referencing + Python" +optional = true +python-versions = ">=3.8" +files = [ + {file = "referencing-0.32.0-py3-none-any.whl", hash = "sha256:bdcd3efb936f82ff86f993093f6da7435c7de69a3b3a5a06678a6050184bee99"}, + {file = "referencing-0.32.0.tar.gz", hash = "sha256:689e64fe121843dcfd57b71933318ef1f91188ffb45367332700a86ac8fd6161"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "requests" version = "2.31.0" @@ -3813,23 +3397,130 @@ files = [ [[package]] name = "rich" -version = "13.4.2" +version = "13.7.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = true python-versions = ">=3.7.0" files = [ - {file = "rich-13.4.2-py3-none-any.whl", hash = "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec"}, - {file = "rich-13.4.2.tar.gz", hash = "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"}, + {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, + {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, ] [package.dependencies] markdown-it-py = ">=2.2.0" pygments = ">=2.13.0,<3.0.0" -typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "rpds-py" +version = "0.16.2" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = true +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:509b617ac787cd1149600e731db9274ebbef094503ca25158e6f23edaba1ca8f"}, + {file = "rpds_py-0.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:413b9c17388bbd0d87a329d8e30c1a4c6e44e2bb25457f43725a8e6fe4161e9e"}, + {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2946b120718eba9af2b4dd103affc1164a87b9e9ebff8c3e4c05d7b7a7e274e2"}, + {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35ae5ece284cf36464eb160880018cf6088a9ac5ddc72292a6092b6ef3f4da53"}, + {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc6a7620ba7639a3db6213da61312cb4aa9ac0ca6e00dc1cbbdc21c2aa6eb57"}, + {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cb6fe8ecdfffa0e711a75c931fb39f4ba382b4b3ccedeca43f18693864fe850"}, + {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dace7b26a13353e24613417ce2239491b40a6ad44e5776a18eaff7733488b44"}, + {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1bdbc5fcb04a7309074de6b67fa9bc4b418ab3fc435fec1f2779a0eced688d04"}, + {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f42e25c016927e2a6b1ce748112c3ab134261fc2ddc867e92d02006103e1b1b7"}, + {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eab36eae3f3e8e24b05748ec9acc66286662f5d25c52ad70cadab544e034536b"}, + {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0474df4ade9a3b4af96c3d36eb81856cb9462e4c6657d4caecfd840d2a13f3c9"}, + {file = "rpds_py-0.16.2-cp310-none-win32.whl", hash = "sha256:84c5a4d1f9dd7e2d2c44097fb09fffe728629bad31eb56caf97719e55575aa82"}, + {file = "rpds_py-0.16.2-cp310-none-win_amd64.whl", hash = "sha256:2bd82db36cd70b3628c0c57d81d2438e8dd4b7b32a6a9f25f24ab0e657cb6c4e"}, + {file = "rpds_py-0.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:adc0c3d6fc6ae35fee3e4917628983f6ce630d513cbaad575b4517d47e81b4bb"}, + {file = "rpds_py-0.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ec23fcad480e77ede06cf4127a25fc440f7489922e17fc058f426b5256ee0edb"}, + {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07aab64e2808c3ebac2a44f67e9dc0543812b715126dfd6fe4264df527556cb6"}, + {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a4ebb8b20bd09c5ce7884c8f0388801100f5e75e7f733b1b6613c713371feefc"}, + {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3d7e2ea25d3517c6d7e5a1cc3702cffa6bd18d9ef8d08d9af6717fc1c700eed"}, + {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f28ac0e8e7242d140f99402a903a2c596ab71550272ae9247ad78f9a932b5698"}, + {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19f00f57fdd38db4bb5ad09f9ead1b535332dbf624200e9029a45f1f35527ebb"}, + {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3da5a4c56953bdbf6d04447c3410309616c54433146ccdb4a277b9cb499bc10e"}, + {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec2e1cf025b2c0f48ec17ff3e642661da7ee332d326f2e6619366ce8e221f018"}, + {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e0441fb4fdd39a230477b2ca9be90868af64425bfe7b122b57e61e45737a653b"}, + {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9f0350ef2fba5f34eb0c9000ea328e51b9572b403d2f7f3b19f24085f6f598e8"}, + {file = "rpds_py-0.16.2-cp311-none-win32.whl", hash = "sha256:5a80e2f83391ad0808b4646732af2a7b67550b98f0cae056cb3b40622a83dbb3"}, + {file = "rpds_py-0.16.2-cp311-none-win_amd64.whl", hash = "sha256:e04e56b4ca7a770593633556e8e9e46579d66ec2ada846b401252a2bdcf70a6d"}, + {file = "rpds_py-0.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5e6caa3809e50690bd92fa490f5c38caa86082c8c3315aa438bce43786d5e90d"}, + {file = "rpds_py-0.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e53b9b25cac9065328901713a7e9e3b12e4f57ef4280b370fbbf6fef2052eef"}, + {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af27423662f32d7501a00c5e7342f7dbd1e4a718aea7a239781357d15d437133"}, + {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d4dd5fb16eb3825742bad8339d454054261ab59fed2fbac84e1d84d5aae7ba"}, + {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e061de3b745fe611e23cd7318aec2c8b0e4153939c25c9202a5811ca911fd733"}, + {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b811d182ad17ea294f2ec63c0621e7be92a1141e1012383461872cead87468f"}, + {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5552f328eaef1a75ff129d4d0c437bf44e43f9436d3996e8eab623ea0f5fcf73"}, + {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dcbe1f8dd179e4d69b70b1f1d9bb6fd1e7e1bdc9c9aad345cdeb332e29d40748"}, + {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8aad80645a011abae487d356e0ceb359f4938dfb6f7bcc410027ed7ae4f7bb8b"}, + {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6f5549d6ed1da9bfe3631ca9483ae906f21410be2445b73443fa9f017601c6f"}, + {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d452817e0d9c749c431a1121d56a777bd7099b720b3d1c820f1725cb40928f58"}, + {file = "rpds_py-0.16.2-cp312-none-win32.whl", hash = "sha256:888a97002e986eca10d8546e3c8b97da1d47ad8b69726dcfeb3e56348ebb28a3"}, + {file = "rpds_py-0.16.2-cp312-none-win_amd64.whl", hash = "sha256:d8dda2a806dfa4a9b795950c4f5cc56d6d6159f7d68080aedaff3bdc9b5032f5"}, + {file = "rpds_py-0.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:071980663c273bf3d388fe5c794c547e6f35ba3335477072c713a3176bf14a60"}, + {file = "rpds_py-0.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:726ac36e8a3bb8daef2fd482534cabc5e17334052447008405daca7ca04a3108"}, + {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9e557db6a177470316c82f023e5d571811c9a4422b5ea084c85da9aa3c035fc"}, + {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:90123853fc8b1747f80b0d354be3d122b4365a93e50fc3aacc9fb4c2488845d6"}, + {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a61f659665a39a4d17d699ab3593d7116d66e1e2e3f03ef3fb8f484e91908808"}, + {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc97f0640e91d7776530f06e6836c546c1c752a52de158720c4224c9e8053cad"}, + {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a54e99a2b9693a37ebf245937fd6e9228b4cbd64b9cc961e1f3391ec6c7391"}, + {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd4b677d929cf1f6bac07ad76e0f2d5de367e6373351c01a9c0a39f6b21b4a8b"}, + {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5ef00873303d678aaf8b0627e111fd434925ca01c657dbb2641410f1cdaef261"}, + {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:349cb40897fd529ca15317c22c0eab67f5ac5178b5bd2c6adc86172045210acc"}, + {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2ddef620e70eaffebed5932ce754d539c0930f676aae6212f8e16cd9743dd365"}, + {file = "rpds_py-0.16.2-cp38-none-win32.whl", hash = "sha256:882ce6e25e585949c3d9f9abd29202367175e0aab3aba0c58c9abbb37d4982ff"}, + {file = "rpds_py-0.16.2-cp38-none-win_amd64.whl", hash = "sha256:f4bd4578e44f26997e9e56c96dedc5f1af43cc9d16c4daa29c771a00b2a26851"}, + {file = "rpds_py-0.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:69ac7ea9897ec201ce68b48582f3eb34a3f9924488a5432a93f177bf76a82a7e"}, + {file = "rpds_py-0.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a9880b4656efe36ccad41edc66789e191e5ee19a1ea8811e0aed6f69851a82f4"}, + {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee94cb58c0ba2c62ee108c2b7c9131b2c66a29e82746e8fa3aa1a1effbd3dcf1"}, + {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24f7a2eb3866a9e91f4599851e0c8d39878a470044875c49bd528d2b9b88361c"}, + {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca57468da2d9a660bcf8961637c85f2fbb2aa64d9bc3f9484e30c3f9f67b1dd7"}, + {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccd4e400309e1f34a5095bf9249d371f0fd60f8a3a5c4a791cad7b99ce1fd38d"}, + {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80443fe2f7b3ea3934c5d75fb0e04a5dbb4a8e943e5ff2de0dec059202b70a8b"}, + {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4d6a9f052e72d493efd92a77f861e45bab2f6be63e37fa8ecf0c6fd1a58fedb0"}, + {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:35953f4f2b3216421af86fd236b7c0c65935936a94ea83ddbd4904ba60757773"}, + {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:981d135c7cdaf6cd8eadae1c950de43b976de8f09d8e800feed307140d3d6d00"}, + {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d0dd7ed2f16df2e129496e7fbe59a34bc2d7fc8db443a606644d069eb69cbd45"}, + {file = "rpds_py-0.16.2-cp39-none-win32.whl", hash = "sha256:703d95c75a72e902544fda08e965885525e297578317989fd15a6ce58414b41d"}, + {file = "rpds_py-0.16.2-cp39-none-win_amd64.whl", hash = "sha256:e93ec1b300acf89730cf27975ef574396bc04edecc358e9bd116fb387a123239"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:44627b6ca7308680a70766454db5249105fa6344853af6762eaad4158a2feebe"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3f91df8e6dbb7360e176d1affd5fb0246d2b88d16aa5ebc7db94fd66b68b61da"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d904c5693e08bad240f16d79305edba78276be87061c872a4a15e2c301fa2c0"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:290a81cfbe4673285cdf140ec5cd1658ffbf63ab359f2b352ebe172e7cfa5bf0"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b634c5ec0103c5cbebc24ebac4872b045cccb9456fc59efdcf6fe39775365bd2"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a297a4d08cc67c7466c873c78039d87840fb50d05473db0ec1b7b03d179bf322"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2e75e17bd0bb66ee34a707da677e47c14ee51ccef78ed6a263a4cc965a072a1"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f1b9d9260e06ea017feb7172976ab261e011c1dc2f8883c7c274f6b2aabfe01a"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:162d7cd9cd311c1b0ff1c55a024b8f38bd8aad1876b648821da08adc40e95734"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:9b32f742ce5b57201305f19c2ef7a184b52f6f9ba6871cc042c2a61f0d6b49b8"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac08472f41ea77cd6a5dae36ae7d4ed3951d6602833af87532b556c1b4601d63"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:495a14b72bbe217f2695dcd9b5ab14d4f8066a00f5d209ed94f0aca307f85f6e"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:8d6b6937ae9eac6d6c0ca3c42774d89fa311f55adff3970fb364b34abde6ed3d"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a61226465bda9283686db8f17d02569a98e4b13c637be5a26d44aa1f1e361c2"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5cf6af100ffb5c195beec11ffaa8cf8523057f123afa2944e6571d54da84cdc9"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6df15846ee3fb2e6397fe25d7ca6624af9f89587f3f259d177b556fed6bebe2c"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1be2f033df1b8be8c3167ba3c29d5dca425592ee31e35eac52050623afba5772"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96f957d6ab25a78b9e7fc9749d754b98eac825a112b4e666525ce89afcbd9ed5"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:088396c7c70e59872f67462fcac3ecbded5233385797021976a09ebd55961dfe"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4c46ad6356e1561f2a54f08367d1d2e70a0a1bb2db2282d2c1972c1d38eafc3b"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:47713dc4fce213f5c74ca8a1f6a59b622fc1b90868deb8e8e4d993e421b4b39d"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f811771019f063bbd0aa7bb72c8a934bc13ebacb4672d712fc1639cfd314cccc"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f19afcfc0dd0dca35694df441e9b0f95bc231b512f51bded3c3d8ca32153ec19"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4b682c5775d6a3d21e314c10124599976809455ee67020e8e72df1769b87bc3"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c647ca87fc0ebe808a41de912e9a1bfef9acb85257e5d63691364ac16b81c1f0"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:302bd4983bbd47063e452c38be66153760112f6d3635c7eeefc094299fa400a9"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf721ede3eb7b829e4a9b8142bd55db0bdc82902720548a703f7e601ee13bdc3"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:358dafc89ce3894c7f486c615ba914609f38277ef67f566abc4c854d23b997fa"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cad0f59ee3dc35526039f4bc23642d52d5f6616b5f687d846bfc6d0d6d486db0"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cffa76b385dfe1e38527662a302b19ffb0e7f5cf7dd5e89186d2c94a22dd9d0c"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:83640a5d7cd3bff694747d50436b8b541b5b9b9782b0c8c1688931d6ee1a1f2d"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:ed99b4f7179d2111702020fd7d156e88acd533f5a7d3971353e568b6051d5c97"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4022b9dc620e14f30201a8a73898a873c8e910cb642bcd2f3411123bc527f6ac"}, + {file = "rpds_py-0.16.2.tar.gz", hash = "sha256:781ef8bfc091b19960fc0142a23aedadafa826bc32b433fdfe6fd7f964d7ef44"}, +] + [[package]] name = "rsa" version = "4.9" @@ -3846,51 +3537,55 @@ pyasn1 = ">=0.1.3" [[package]] name = "scipy" -version = "1.9.3" +version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" optional = true -python-versions = ">=3.8" -files = [ - {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, - {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, - {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, - {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, - {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, - {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, - {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, +python-versions = ">=3.9" +files = [ + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, ] [package.dependencies] -numpy = ">=1.18.5,<1.26.0" +numpy = ">=1.22.4,<1.29.0" [package.extras] -dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] -test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "scooby" -version = "0.7.2" +version = "0.9.2" description = "A Great Dane turned Python environment detective" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "scooby-0.7.2-py3-none-any.whl", hash = "sha256:75b77d22ecc22a5578fb0bb2957e8d024fa863fe905cd43447a86860afe37978"}, - {file = "scooby-0.7.2.tar.gz", hash = "sha256:6ba082ede5a82952b42538f913b3dfe3581ab79f5628e6c6efd3481f6cb5756e"}, + {file = "scooby-0.9.2-py3-none-any.whl", hash = "sha256:3cbc59de9febf8c8ba1e01bc7d08b4eca18ece3212d38b08a6f45188f88c8ea9"}, + {file = "scooby-0.9.2.tar.gz", hash = "sha256:28df643bb7c2087547b2e2220070e2f89e815ddbc515fbc28dd5df2b0a14293e"}, ] [package.extras] @@ -3929,19 +3624,19 @@ win32 = ["pywin32"] [[package]] name = "setuptools" -version = "68.0.0" +version = "69.0.3" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, - {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, + {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, + {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "simpervisor" @@ -3992,13 +3687,13 @@ files = [ [[package]] name = "soupsieve" -version = "2.4.1" +version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, - {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, ] [[package]] @@ -4112,45 +3807,54 @@ sphinx = ">=3" [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.4" +version = "1.0.7" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, - {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, + {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"}, + {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +version = "1.0.5" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = true -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, + {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"}, + {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.1" +version = "2.0.4" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, - {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, + {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"}, + {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["html5lib", "pytest"] @@ -4171,43 +3875,49 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +version = "1.0.6" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = true -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, + {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"}, + {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +version = "1.1.9" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = true -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, + {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, + {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "stack-data" -version = "0.6.2" +version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = true python-versions = "*" files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, ] [package.dependencies] @@ -4218,15 +3928,29 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = true +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + [[package]] name = "terminado" -version = "0.17.1" +version = "0.18.0" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "terminado-0.17.1-py3-none-any.whl", hash = "sha256:8650d44334eba354dd591129ca3124a6ba42c3d5b70df5051b6921d506fdaeae"}, - {file = "terminado-0.17.1.tar.gz", hash = "sha256:6ccbbcd3a4f8a25a5ec04991f39a0b8db52dfcd487ea0e578d977e6752380333"}, + {file = "terminado-0.18.0-py3-none-any.whl", hash = "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e"}, + {file = "terminado-0.18.0.tar.gz", hash = "sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded"}, ] [package.dependencies] @@ -4237,6 +3961,7 @@ tornado = ">=6.1.0" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] [[package]] name = "tinycss2" @@ -4269,278 +3994,123 @@ files = [ [[package]] name = "tomlkit" -version = "0.11.8" +version = "0.12.3" description = "Style preserving TOML library" optional = true python-versions = ">=3.7" files = [ - {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, - {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, + {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, + {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, ] [[package]] name = "tornado" -version = "6.3.2" +version = "6.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = true python-versions = ">= 3.8" files = [ - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, - {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, - {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, - {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, ] [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "traitlets" -version = "5.9.0" +version = "5.14.1" description = "Traitlets Python configuration system" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, + {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, + {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] - -[[package]] -name = "traittypes" -version = "0.2.1" -description = "Scipy trait types" -optional = true -python-versions = "*" -files = [ - {file = "traittypes-0.2.1-py2.py3-none-any.whl", hash = "sha256:1340af133810b6eee1a2eb2e988f862b0d12b6c2d16f282aaf3207b782134c2e"}, - {file = "traittypes-0.2.1.tar.gz", hash = "sha256:be6fa26294733e7489822ded4ae25da5b4824a8a7a0e0c2dccfde596e3489bd6"}, -] - -[package.dependencies] -traitlets = ">=4.2.2" - -[package.extras] -test = ["numpy", "pandas", "pytest", "xarray"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "trame" -version = "2.5.0" +version = "3.5.0" description = "Trame, a framework to build applications in plain Python" optional = true python-versions = "*" files = [ - {file = "trame-2.5.0-py3-none-any.whl", hash = "sha256:15dad2872b4bb6eeef6eb8ad681f6314357c99ed95c2c8461453f60c2440f02d"}, - {file = "trame-2.5.0.tar.gz", hash = "sha256:3ac22be1961945e7240f396ad415c73446c45f5a4af1cb4afb80ffa1a7d6a24e"}, + {file = "trame-3.5.0-py3-none-any.whl", hash = "sha256:7788e967b98e2aec5fa0b685ac5cd13d3b1e5721c229ac864f99089dadb3212f"}, + {file = "trame-3.5.0.tar.gz", hash = "sha256:706a112bf4164ab8d024301ae0d174bae8df40f2fb82f0ec7b017f53a33bb03f"}, ] [package.dependencies] -trame-client = ">=2.7.7" -trame-components = "<3.0.0" -trame-deckgl = "<3.0.0" -trame-markdown = "<3.0.0" -trame-matplotlib = "<3.0.0" -trame-plotly = "<3.0.0" -trame-rca = "<3.0.0" -trame-router = "<3.0.0" -trame-server = ">=2.11.0" -trame-simput = "<3.0.0" -trame-vega = "<3.0.0" -trame-vtk = "<3.0.0" -trame-vuetify = "<3.0.0" +trame-client = ">=2.14.0" +trame-server = ">=2.13.1" [[package]] name = "trame-client" -version = "2.9.4" +version = "2.14.2" description = "Internal client of trame" optional = true python-versions = "*" files = [ - {file = "trame-client-2.9.4.tar.gz", hash = "sha256:4e4975ea29749ac343a2079c1d0f450ab41a49654e5a8bf8f8e49861adea2529"}, - {file = "trame_client-2.9.4-py3-none-any.whl", hash = "sha256:22c189b996a2aa7f49cbb856665976997228fea31095b45b1134eaf8833b5b3f"}, + {file = "trame-client-2.14.2.tar.gz", hash = "sha256:81c35c26a98e4dca8873b84a7dcfe53d39594f827e12f9d217db040ef9c74f35"}, + {file = "trame_client-2.14.2-py3-none-any.whl", hash = "sha256:050116b584ebb9e5e599ce8c9bcdc3c1028fe436e969ef38c50206e329572e7f"}, ] [package.extras] test = ["Pillow", "pixelmatch", "pytest", "pytest-xprocess", "seleniumbase"] -[[package]] -name = "trame-components" -version = "2.1.1" -description = "Core components for trame widgets" -optional = true -python-versions = "*" -files = [ - {file = "trame-components-2.1.1.tar.gz", hash = "sha256:02a07b9186f98bcb702d78c72e67a93f32e8882b91a087c23b5fff487616992e"}, - {file = "trame_components-2.1.1-py3-none-any.whl", hash = "sha256:16d26df647da54aaa2ab00b6ea4bcdc041431f4ad3dfb81e391fa2889379304f"}, -] - -[package.dependencies] -trame-client = "*" - -[[package]] -name = "trame-deckgl" -version = "2.0.2" -description = "Deck.gl widget for trame" -optional = true -python-versions = "*" -files = [ - {file = "trame-deckgl-2.0.2.tar.gz", hash = "sha256:7ed91887f2afc9a0971cdbb4e275206209828923c566d90e6616efd7d6c17537"}, - {file = "trame_deckgl-2.0.2-py3-none-any.whl", hash = "sha256:7f320d44ec67e5e8fadf02da30eed3a1b2b7a9b6b116fcfb19a7948c1c5e65dc"}, -] - -[package.dependencies] -trame-client = "*" - -[[package]] -name = "trame-markdown" -version = "2.0.2" -description = "Markdown widget for trame" -optional = true -python-versions = "*" -files = [ - {file = "trame-markdown-2.0.2.tar.gz", hash = "sha256:7d4979acb0b2382c144aaa461825b76bde4dc4120869c1a7dda41543485cafc6"}, - {file = "trame_markdown-2.0.2-py3-none-any.whl", hash = "sha256:bc529eb9084b2f6dcf9631b94a0cabdb83a2da379075aadd45071eef1a686d57"}, -] - -[package.dependencies] -trame-client = "*" - -[[package]] -name = "trame-matplotlib" -version = "2.0.2" -description = "Markdown widget for trame" -optional = true -python-versions = "*" -files = [ - {file = "trame-matplotlib-2.0.2.tar.gz", hash = "sha256:114dccf02d52163049032f449ad24114f82fc8d68bd0c1814a692714202447eb"}, - {file = "trame_matplotlib-2.0.2-py3-none-any.whl", hash = "sha256:b010200765b77305a5aa440a95227a8e637400928ff6fd2f4c216174fed88134"}, -] - -[package.dependencies] -trame-client = "*" - -[[package]] -name = "trame-plotly" -version = "2.1.1" -description = "Plotly figure widget for trame" -optional = true -python-versions = "*" -files = [ - {file = "trame-plotly-2.1.1.tar.gz", hash = "sha256:cecc5b0daa5f2d704e4e5e16a3ddb814809bb559237646f1123ef3c01824bedf"}, - {file = "trame_plotly-2.1.1-py3-none-any.whl", hash = "sha256:a9ee9418bc088225dfa589d4b9e711686124b1b4880bc51b4fffd98643f91066"}, -] - -[package.dependencies] -trame-client = "*" - -[[package]] -name = "trame-rca" -version = "0.3.1" -description = "Remote Controlled Area widget for trame" -optional = true -python-versions = "*" -files = [ - {file = "trame-rca-0.3.1.tar.gz", hash = "sha256:eb898bc567c76758854603c0b2e12493dd9d160b6ce33653b46def271f66f3d2"}, - {file = "trame_rca-0.3.1-py3-none-any.whl", hash = "sha256:238b01233fc96cfbef422d1494ddacdae65127a0964444f4fe73a99627d0ed2a"}, -] - -[package.dependencies] -trame-client = "*" -wslink = "*" - -[[package]] -name = "trame-router" -version = "2.0.2" -description = "Vue Router widgets for trame" -optional = true -python-versions = "*" -files = [ - {file = "trame-router-2.0.2.tar.gz", hash = "sha256:60dfe172a394b6a9a4d8b17b22717821b10a68dd09af8a577a8afb715f314b4e"}, - {file = "trame_router-2.0.2-py3-none-any.whl", hash = "sha256:edf5a8572a6b38db1f6f831deff49d11c698c095261243085b79799b1d948dff"}, -] - -[package.dependencies] -trame-client = "*" - [[package]] name = "trame-server" -version = "2.11.4" +version = "2.14.0" description = "Internal server side implementation of trame" optional = true python-versions = "*" files = [ - {file = "trame-server-2.11.4.tar.gz", hash = "sha256:99178d6fe2919f9e592df671acce14c0048cb9835f2d582388a849f0b2984002"}, - {file = "trame_server-2.11.4-py3-none-any.whl", hash = "sha256:513cc0253c897bd032fd136c67e6def30718fb42a5ca5be3d1a546abed44459e"}, -] - -[package.dependencies] -wslink = ">=1.9.0" - -[[package]] -name = "trame-simput" -version = "2.3.2" -description = "Simput implementation for trame" -optional = true -python-versions = "*" -files = [ - {file = "trame-simput-2.3.2.tar.gz", hash = "sha256:fa5e6f89ba1f69d8b8d69e1bbcba61190378eb21858c41bc2f7f03ea18ea87d0"}, - {file = "trame_simput-2.3.2-py3-none-any.whl", hash = "sha256:5ecf0f4f44a0cb29ce75d95f7bf271c9d09d3a1a8118c1317c1ee2f4b34df184"}, -] - -[package.dependencies] -pyyaml = "*" -trame-client = "*" - -[[package]] -name = "trame-vega" -version = "2.0.3" -description = "Vega widget for trame" -optional = true -python-versions = "*" -files = [ - {file = "trame-vega-2.0.3.tar.gz", hash = "sha256:27c58fc1ab15af86ec1a376e9523534f6b81ac4100d3d624d74a131de91fe189"}, - {file = "trame_vega-2.0.3-py3-none-any.whl", hash = "sha256:a5aba9fb909ac581906acbfe2f1e09ef7762050bc58272f8b4bac654fbc384ea"}, + {file = "trame-server-2.14.0.tar.gz", hash = "sha256:b0fa22997492c6e80765681e6a88f11f54bbdf8e9415d5f0d0efce2f62b7292d"}, + {file = "trame_server-2.14.0-py3-none-any.whl", hash = "sha256:1966d8e721b6f1e2d8ce7968cc0aa0ebf5a4382781dabaf34781df83fcd2aed7"}, ] [package.dependencies] -trame-client = "*" +more-itertools = "*" +wslink = ">=1.12.2" [[package]] name = "trame-vtk" -version = "2.5.4" +version = "2.6.3" description = "VTK widgets for trame" optional = true python-versions = "*" files = [ - {file = "trame-vtk-2.5.4.tar.gz", hash = "sha256:71eb9c28982b3bd3dc735ef5daabf1e8a1f2b83c6f64d9632abdba0115dd1fff"}, - {file = "trame_vtk-2.5.4-py3-none-any.whl", hash = "sha256:fdb8dd82530a02a6f69be8da98d4a922da7d98d813533a818f0e0bf374b2a50a"}, + {file = "trame-vtk-2.6.3.tar.gz", hash = "sha256:3314f6a9a5ed844ef23f0296bb221fe05d9fc3ec9bf7a853b6b433da41000d52"}, + {file = "trame_vtk-2.6.3-py3-none-any.whl", hash = "sha256:6bc90437695eceedc52f2845554b218e2460db650ce3e6d5f9cf07759796d4f7"}, ] [package.dependencies] @@ -4548,13 +4118,13 @@ trame-client = "*" [[package]] name = "trame-vuetify" -version = "2.2.4" +version = "2.3.1" description = "Vuetify widgets for trame" optional = true python-versions = "*" files = [ - {file = "trame-vuetify-2.2.4.tar.gz", hash = "sha256:41316c16cf6af2446e980a0bbc32a549209bb27cc5fd4d18b87945e607ccc69a"}, - {file = "trame_vuetify-2.2.4-py3-none-any.whl", hash = "sha256:fede3b08db60f50e0f6ab36594c662c6cee010b7514376bfdfbece8a5c2ba9ee"}, + {file = "trame-vuetify-2.3.1.tar.gz", hash = "sha256:9775c4833ec87ba400c8cdb4eef1dce24396fd841968369563bb34bb0b60ee4a"}, + {file = "trame_vuetify-2.3.1-py3-none-any.whl", hash = "sha256:455b179143f44e71719f9b8feeb36ec9aabf1d25e79c637a425c8cb153405335"}, ] [package.dependencies] @@ -4583,41 +4153,27 @@ rich = ">=12.0.0" urllib3 = ">=1.26.0" [[package]] -name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" +name = "types-python-dateutil" +version = "2.8.19.14" +description = "Typing stubs for python-dateutil" optional = true -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, -] - -[[package]] -name = "tzdata" -version = "2023.3" -description = "Provider of IANA time zone data" -optional = true -python-versions = ">=2" +python-versions = "*" files = [ - {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, - {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, + {file = "types-python-dateutil-2.8.19.14.tar.gz", hash = "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b"}, + {file = "types_python_dateutil-2.8.19.14-py3-none-any.whl", hash = "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9"}, ] [[package]] -name = "uc-micro-py" -version = "1.0.2" -description = "Micro subset of unicode data files for linkify-it-py projects." +name = "typing-extensions" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "uc-micro-py-1.0.2.tar.gz", hash = "sha256:30ae2ac9c49f39ac6dce743bd187fcd2b574b16ca095fa74cd9396795c954c54"}, - {file = "uc_micro_py-1.0.2-py3-none-any.whl", hash = "sha256:8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] -[package.extras] -test = ["coverage", "pytest", "pytest-cov"] - [[package]] name = "uri-template" version = "1.3.0" @@ -4645,69 +4201,72 @@ files = [ [[package]] name = "urllib3" -version = "2.0.3" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, - {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.23.1" +version = "20.25.0" description = "Virtual Python Environment builder" optional = true python-versions = ">=3.7" files = [ - {file = "virtualenv-20.23.1-py3-none-any.whl", hash = "sha256:34da10f14fea9be20e0fd7f04aba9732f84e593dac291b757ce42e3368a39419"}, - {file = "virtualenv-20.23.1.tar.gz", hash = "sha256:8ff19a38c1021c742148edc4f81cb43d7f8c6816d2ede2ab72af5b84c749ade1"}, + {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, + {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, ] [package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.12,<4" -platformdirs = ">=3.5.1,<4" +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezer (>=0.4.6)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.8)", "time-machine (>=2.9)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "vtk" -version = "9.2.6" +version = "9.3.0" description = "VTK is an open-source toolkit for 3D computer graphics, image processing, and visualization" optional = true python-versions = "*" files = [ - {file = "vtk-9.2.6-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:acf8b0e0a2b51b8aa36cee1ea1ba0b73c565871efaa14cf2606d9bef36feba3a"}, - {file = "vtk-9.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ec9827287f1743c736ea9b51572d20dcd15a065170808f97408eebd404275b4"}, - {file = "vtk-9.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3473f3b3dc919d3e2ef0cc9927654731941fd7b79d3dcaa343cdaff3e4e40838"}, - {file = "vtk-9.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:37561b19b4b70c7034d9e689238560d7afec49ff89704b9bb3c9bb89a90ee54e"}, - {file = "vtk-9.2.6-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9289f6ee5432f0a00aeb7b674d7ca03054bc50fa6c74126751f8b19f931f52fc"}, - {file = "vtk-9.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0b947a33a7c5562ac4d9c8dce389f4ed720cc2559389048993ae45cbed3bbeb1"}, - {file = "vtk-9.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87930115c8067a2d482beebc48a50fcacdc0154d8d7c763471a9be8b5eb76cc3"}, - {file = "vtk-9.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:6c3ca0663f251fbd6e26d93294801ceee6c3cc329f6070dccde3b68046ab9ee7"}, - {file = "vtk-9.2.6-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:86c548da22a0bd9ce9e060364925e8fa0a551064f9660ae1d486ac3118ffb770"}, - {file = "vtk-9.2.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7622e98b3590bf909f056a1bad55575760727fd673c3e8e224134d52b11d00d"}, - {file = "vtk-9.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:bb28432277136774e91eb1084a8f5f1c4c952d4e74f74626a16ac6e199eba5c5"}, - {file = "vtk-9.2.6-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:feb9d211583d7b1dd45ca6616bf2f9622d0eadf9e3084f53d20de819e5808d42"}, - {file = "vtk-9.2.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bc1123b6f2f3746d35325cf1a48630c8f49a3516c9970a5bdea15823909bbca"}, - {file = "vtk-9.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:78103568e97d947026cd39a70e6719277d7341f984c06abaec64d3429e200a6f"}, - {file = "vtk-9.2.6-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8236e00d0ad24730f4b783bbc038108426e6a78c892fd6ae9a8e8eb846f3e8e3"}, - {file = "vtk-9.2.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:affbb15762bcb6d9632a668ec53c6a3102d4f6c14c4178f01489c0b711114521"}, - {file = "vtk-9.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:f9d3450c00ced28f942a0a7dc5f27a667cf6b171d9ef5a090cb7c8e21dd1a121"}, - {file = "vtk-9.2.6-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9b396909a4372d3be4a01fde4a0af4f3e410742d73d185982c6f48a61090ebfe"}, - {file = "vtk-9.2.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9d41a18bbd6fac18a814bbaeeb615044da036afc2bd98cdf7ea52853fd1ef950"}, - {file = "vtk-9.2.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79991dccbc483a8e5d23e5d3ae1e358fee0526fe8f710d07868ecae58c6b9535"}, - {file = "vtk-9.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:2d905a686ee1b28dd2ac3c3595a3fbcbd171e4b1f9aabac3c8019c6f3a4f8157"}, + {file = "vtk-9.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7d3492cb6c52b23dc0c6e664938b8119254a77b5e3099106e2567ed0b6473162"}, + {file = "vtk-9.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3f4e86bff7a4cd71bd6205bd18cf4b6ab70956ecf9cbd73e77a95b2210d98ef"}, + {file = "vtk-9.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a827fb5f05ab78b2cbad81f5d3a3d7065fa995cc907cecdfa7a7b76374130ef3"}, + {file = "vtk-9.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:2aae778297817335ddd6698b4c124c109d8ac476512691fe19446614ae43ba56"}, + {file = "vtk-9.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a3cd59108b21f55b873a63878a0decec0a707bd960b59d5e15b37d1ad873590f"}, + {file = "vtk-9.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d2bdd2c60f0fa5d1926c11b72d96dc23caf9ff41781bae76e48edd09fb8aa03"}, + {file = "vtk-9.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a02bf6067cae7abfd7f6b1330c69555b715be8ec71a3c8d6471af45a96e8e56"}, + {file = "vtk-9.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:ff0eedcde5821c023623f70951f2499e9d59e709e288b67a2e2334abafacc322"}, + {file = "vtk-9.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:94678fa0476e113500f3b99e9692b92b83a5b058caace7bac3b5f780b12b36ed"}, + {file = "vtk-9.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:371b96afca3ed41a0bf1cd80a42f4b906ca2f470a13df32f39b22a9169d996d7"}, + {file = "vtk-9.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cfa8d73acbab386b9d6ef8a1a01149fd096a21a23547f10bf0cf98d88300724"}, + {file = "vtk-9.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:75d27b73270a42923ebefd87a8522f7717618c36825b8058c4d3aa8e64d6145d"}, + {file = "vtk-9.3.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:6b4a6f9d4ae16a417edf3cd750da5cb87e9676d1db1da6a6772a9e492567a452"}, + {file = "vtk-9.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd3536979c177dd12f9365a1072e217d64503596add6986318d466aab565d51"}, + {file = "vtk-9.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:296f185482df591d7b2c2a734f3a68884352efd89cade37f3345ddc4dcb6e019"}, + {file = "vtk-9.3.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:9d5c837a4d865ec80752d8ca8ee719be8341af66601df0da94ee78ae0806bb4b"}, + {file = "vtk-9.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cdfb7e51a63ee2f06b1aa84e643f046b746116397a89cb50d20956731e88209"}, + {file = "vtk-9.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2902c8601ada0e653a4d34ebca0f17768fb559f05fe9f4502dcdda136d847a1e"}, + {file = "vtk-9.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:f0798c2ae607be930656347491c520945984ab657ab00804d159323962e97102"}, + {file = "vtk-9.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d92c9a70902da512dfbcd3f064f825b7b5b6d62edd197d3754549f7c0ff516"}, + {file = "vtk-9.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:17810f82aeee7143057fcb2d963245f57450800a7b913c5d66ed915f09740d3d"}, + {file = "vtk-9.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:7a564f31dbe514276abffb1d3204120ead15506a24ecaa2560009ba304896dae"}, + {file = "vtk-9.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b22a0d03305160d6612da0a378759083ef7691d0f83f1b1496418777ee3a2a3"}, + {file = "vtk-9.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdd81c9904647ace8d13ad255d8e5293fb81be8125e1a139a707aaf9e6f0e9e2"}, + {file = "vtk-9.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:f0a44c926ba18fd9e2ad7c07ae0adabb4ca62af28c69c96bcbaa884e0b240249"}, ] [package.dependencies] @@ -4719,13 +4278,13 @@ web = ["wslink (>=1.0.4)"] [[package]] name = "wcwidth" -version = "0.2.6" +version = "0.2.12" description = "Measures the displayed width of unicode strings in a terminal" optional = true python-versions = "*" files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, + {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, + {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, ] [[package]] @@ -4756,127 +4315,119 @@ files = [ [[package]] name = "websocket-client" -version = "1.6.1" +version = "1.7.0" description = "WebSocket client for Python with low level API options" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "websocket-client-1.6.1.tar.gz", hash = "sha256:c951af98631d24f8df89ab1019fc365f2227c0892f12fd150e935607c79dd0dd"}, - {file = "websocket_client-1.6.1-py3-none-any.whl", hash = "sha256:f1f9f2ad5291f0225a49efad77abf9e700b6fef553900623060dad6e26503b9d"}, + {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, + {file = "websocket_client-1.7.0-py3-none-any.whl", hash = "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588"}, ] [package.extras] -docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] [[package]] name = "widgetsnbextension" -version = "3.6.4" -description = "IPython HTML widgets for Jupyter" +version = "4.0.9" +description = "Jupyter interactive widgets for Jupyter Notebook" optional = true -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "widgetsnbextension-3.6.4-py2.py3-none-any.whl", hash = "sha256:3d2d4994aea8681eb438493e439f59f82ba81d91f388a12e55147ae137f4120e"}, - {file = "widgetsnbextension-3.6.4.tar.gz", hash = "sha256:ad1356c575d5add908afe886255deafb3f9b1589146a99279d1dcba5a05d16a5"}, + {file = "widgetsnbextension-4.0.9-py3-none-any.whl", hash = "sha256:91452ca8445beb805792f206e560c1769284267a30ceb1cec9f5bcc887d15175"}, + {file = "widgetsnbextension-4.0.9.tar.gz", hash = "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385"}, ] -[package.dependencies] -notebook = ">=4.4.1" - [[package]] name = "wrapt" -version = "1.15.0" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." optional = true -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6" files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] [[package]] name = "wslink" -version = "1.11.1" +version = "1.12.4" description = "Python/JavaScript library for communicating over WebSocket" optional = true python-versions = "*" files = [ - {file = "wslink-1.11.1-py3-none-any.whl", hash = "sha256:76c7e094030c265e3ffde05a4f2340bfd8b0ca3cfdb4d6afae1ce324c8ed313e"}, - {file = "wslink-1.11.1.tar.gz", hash = "sha256:094cb04c767c0dce478730f59f4f21d0221c2f18f2886d8e104e17577d2d6a2d"}, + {file = "wslink-1.12.4-py3-none-any.whl", hash = "sha256:20d53c81c720c3d9054957312e6c1c190040c8908741e1803d2752a0d8f7a638"}, + {file = "wslink-1.12.4.tar.gz", hash = "sha256:4e1b181f6adf1b52bf27ac531493bdac06ef1ce0277d7b09fbbd24f33a228be9"}, ] [package.dependencies] @@ -4885,98 +4436,103 @@ aiohttp = "<4" [package.extras] ssl = ["cryptography"] -[[package]] -name = "xyzservices" -version = "2023.5.0" -description = "Source of XYZ tiles providers" -optional = true -python-versions = ">=3.8" -files = [ - {file = "xyzservices-2023.5.0-py3-none-any.whl", hash = "sha256:53b923518d1f7ba22ee77c955c1da34716524bf1910737b097d3208f893af0fe"}, - {file = "xyzservices-2023.5.0.tar.gz", hash = "sha256:f0ffaeb7f1c090cff98de6e9a5d4c1c3dde5a8c30f98044dc1e12b11d4576ebc"}, -] - [[package]] name = "yarl" -version = "1.9.2" +version = "1.9.4" description = "Yet another URL library" optional = true python-versions = ">=3.7" files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, ] [package.dependencies] @@ -4985,27 +4541,27 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.15.0" +version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] -all = ["Sphinx", "ansys-sphinx-theme", "build", "mypy", "mypy-extensions", "numpydoc", "pre-commit", "pylint", "pypandoc", "pytest", "pytest-cov", "pytest-rerunfailures", "pyvista", "scipy", "sphinx-autodoc-typehints", "sphinx-copybutton", "sphinx-design", "sphinx_gallery", "twine"] +all = ["Sphinx", "ansys-sphinx-theme", "build", "fatpack", "mypy", "mypy-extensions", "numpydoc", "pre-commit", "pylint", "pypandoc", "pytest", "pytest-cov", "pytest-rerunfailures", "pyvista", "scipy", "sphinx-autodoc-typehints", "sphinx-copybutton", "sphinx-design", "sphinx_gallery", "twine"] build = ["build", "twine"] -docs = ["Sphinx", "ansys-sphinx-theme", "numpydoc", "pypandoc", "pyvista", "scipy", "sphinx-autodoc-typehints", "sphinx-copybutton", "sphinx-design", "sphinx_gallery"] +docs = ["Sphinx", "ansys-sphinx-theme", "fatpack", "numpydoc", "pypandoc", "pyvista", "scipy", "sphinx-autodoc-typehints", "sphinx-copybutton", "sphinx-design", "sphinx_gallery"] pre-commit = ["mypy", "mypy-extensions", "pre-commit", "pylint"] test = ["pytest", "pytest-cov", "pytest-rerunfailures"] [metadata] lock-version = "2.0" -python-versions = ">=3.8,<4.0" -content-hash = "cae796f55ec48c960a2667ee0acda854ef3fae112ab6f93f0b1165a36816b04b" +python-versions = ">=3.9,<3.13" +content-hash = "663dbcfd27e6bcd55df47c5ecc515b3badfe3c59be6d0144a94c6659ea2fb6d5" diff --git a/pyproject.toml b/pyproject.toml index f04f6931b..92c1999fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api" # Check https://python-poetry.org/docs/pyproject/ for all available sections name = "ansys-dpf-composites" version = "0.4.0" -description = "A python wrapper for ansys dpf composites" +description = "Post-processing of composite structures based on Ansys DPF" license = "MIT" authors = ["ANSYS, Inc. "] maintainers = ["PyAnsys developers "] @@ -24,7 +24,7 @@ packages = [ ] [tool.poetry.dependencies] -python = ">=3.8,<4.0" +python = ">=3.9,<3.13" packaging = "*" numpy = "^1.22" build = {version = "^0.8.0", optional = true} @@ -40,15 +40,15 @@ pytest = {version = "^7.1.2", optional = true} pytest-cov = {version = "^3.0.0", optional = true} mypy = {version = "^1.2.0", optional = true} mypy-extensions = {version = "^1.0.0", optional = true} -# If this version changes also the link in doc/src/conf.py intersphinx-mapping has to change ansys-dpf-core = ">=0.8,<1" matplotlib = {version = "^3.5.0"} -pyvista = {version = ">=0.36.1,<1", extras=["jupyter"], optional=true} +pyvista = {version = ">=0.40.2,<1", extras=["jupyter", "trame"], optional=true} pre-commit = {version = "*", optional = true} # Upper bound because there is a problem with examples in versions > 1.20.1 sphinx-autodoc-typehints = {version = "^1.19,<1.20.2", optional = true} pylint = {version = "^2.13", optional = true} scipy = {version = ">=1.9.0", optional = true} +fatpack = {version = ">=0.5", optional = true} pytest-rerunfailures = {version = "^11.1.2", optional = true} [tool.poetry.extras] @@ -71,10 +71,11 @@ all = [ "pre-commit", "pypandoc", "scipy", + "fatpack", "sphinx-autodoc-typehints", ] docs = ["Sphinx", "ansys-sphinx-theme", "sphinx-copybutton", "numpydoc", "sphinx_gallery", - "pypandoc", "sphinx-autodoc-typehints", "sphinx-design", "scipy", "pyvista"] + "pypandoc", "sphinx-autodoc-typehints", "sphinx-design", "scipy", "pyvista", "fatpack"] test = ["pytest", "pytest-cov", "pytest-rerunfailures"] build = ["build", "twine"] pre-commit = ["pre-commit", "mypy", "mypy-extensions", "pylint"] @@ -120,6 +121,6 @@ ignored-classes = [ ] [tool.mypy] -python_version = 3.8 +python_version = 3.9 mypy_path = "$MYPY_CONFIG_FILE_DIR/src:$MYPY_CONFIG_FILE_DIR/tests" ignore_missing_imports = true diff --git a/release_checklist.rst b/release_checklist.rst new file mode 100644 index 000000000..f6f35d18b --- /dev/null +++ b/release_checklist.rst @@ -0,0 +1,8 @@ +* Check the release_checklist in the dpf_composites repo + +* As soon as the docker image with the version tag is available, add explicit tests for the new version. This should happen when a release branch is created for normal releases and + once the image is tagged manually for pre-releases. + * Add docker pull for the container with the new version tag in ci_cd.yml + * Add pytest run for the new version in tox.ini +* Update the compatibility in the docs: intro.rst / Compatibility +* Follow this guide (https://dev.docs.pyansys.com/how-to/releasing.html) to create a release branch and release. Also bump version in test_metadata.py test. diff --git a/src/ansys/dpf/composites/__init__.py b/src/ansys/dpf/composites/__init__.py index 5bf3fa01d..6c0e6e273 100644 --- a/src/ansys/dpf/composites/__init__.py +++ b/src/ansys/dpf/composites/__init__.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Module for the post-processing of composite structures.""" try: @@ -14,6 +36,7 @@ data_sources, failure_criteria, layup_info, + ply_wise_data, result_definition, sampling_point, select_indices, @@ -27,6 +50,7 @@ "data_sources", "failure_criteria", "layup_info", + "ply_wise_data", "result_definition", "sampling_point", "server_helpers", diff --git a/src/ansys/dpf/composites/_composite_model_factory.py b/src/ansys/dpf/composites/_composite_model_factory.py index 497c421c4..8ae365ec0 100644 --- a/src/ansys/dpf/composites/_composite_model_factory.py +++ b/src/ansys/dpf/composites/_composite_model_factory.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Composite Model Interface Factory.""" from typing import Callable, Optional, Union diff --git a/src/ansys/dpf/composites/_composite_model_impl.py b/src/ansys/dpf/composites/_composite_model_impl.py index d10cc73fb..05aad31de 100644 --- a/src/ansys/dpf/composites/_composite_model_impl.py +++ b/src/ansys/dpf/composites/_composite_model_impl.py @@ -1,6 +1,29 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Composite Model Interface.""" # New interface after 2023 R2 -from typing import Any, Callable, Collection, Dict, List, Optional, Sequence, cast +from collections.abc import Collection, Sequence +from typing import Any, Callable, Optional, cast from warnings import warn import ansys.dpf.core as dpf @@ -10,6 +33,7 @@ from numpy.typing import NDArray from .composite_scope import CompositeScope +from .constants import FAILURE_LABEL, REF_SURFACE_NAME, TIME_LABEL, FailureOutput from .data_sources import ( CompositeDataSources, ContinuousFiberCompositesFiles, @@ -19,15 +43,24 @@ from .layup_info import ( ElementInfo, LayerProperty, + LayupModelContextType, LayupPropertiesProvider, add_layup_info_to_mesh, get_element_info_provider, ) +from .layup_info._layup_info import _get_layup_model_context +from .layup_info._reference_surface import ( + _get_map_to_reference_surface_operator, + _get_reference_surface_and_mapping_field, +) from .layup_info.material_operators import MaterialOperators, get_material_operators from .layup_info.material_properties import MaterialProperty, get_constant_property_dict from .result_definition import FailureMeasureEnum from .sampling_point import SamplingPointNew -from .server_helpers import upload_continuous_fiber_composite_files_to_server +from .server_helpers import ( + upload_continuous_fiber_composite_files_to_server, + version_equal_or_later, +) from .unit_system import get_unit_system @@ -49,6 +82,66 @@ def inner(*args: Sequence[Any], **kwargs: Sequence[Any]) -> Any: return inner +def _merge_containers( + non_ref_surface_container: FieldsContainer, ref_surface_container: FieldsContainer +) -> FieldsContainer: + """ + Merge the results fields container. + + Merges the results fields container of the non-reference surface and the reference surface. + """ + assert sorted(non_ref_surface_container.labels) == sorted(ref_surface_container.labels) + + ref_surface_time_ids = ref_surface_container.get_available_ids_for_label(TIME_LABEL) + non_ref_surface_time_ids = non_ref_surface_container.get_available_ids_for_label(TIME_LABEL) + + assert sorted(ref_surface_time_ids) == sorted(non_ref_surface_time_ids) + + out_container = dpf.FieldsContainer() + out_container.labels = [TIME_LABEL, FAILURE_LABEL] + out_container.time_freq_support = non_ref_surface_container.time_freq_support + + def add_to_output_container(time_id: int, source_container: FieldsContainer) -> None: + fields = source_container.get_fields({TIME_LABEL: time_id}) + for field in fields: + failure_enum = _get_failure_enum_from_name(field.name) + out_container.add_field({TIME_LABEL: time_id, FAILURE_LABEL: failure_enum}, field) + + for current_time_id in ref_surface_time_ids: + add_to_output_container(current_time_id, ref_surface_container) + add_to_output_container(current_time_id, non_ref_surface_container) + + return out_container + + +def _get_failure_enum_from_name(name: str) -> FailureOutput: + if name.startswith("Failure Mode"): + if name.endswith(REF_SURFACE_NAME): + return FailureOutput.FAILURE_MODE_REF_SURFACE + else: + return FailureOutput.FAILURE_MODE + + if name.startswith("IRF") or name.startswith("SF") or name.startswith("SM"): + if name.endswith(REF_SURFACE_NAME): + return FailureOutput.FAILURE_VALUE_REF_SURFACE + else: + return FailureOutput.FAILURE_VALUE + + if name.startswith("Layer Index"): + return FailureOutput.MAX_LAYER_INDEX + + if name.startswith("Global Layer in Stack"): + return FailureOutput.MAX_GLOBAL_LAYER_IN_STACK + + if name.startswith("Local Layer in Element"): + return FailureOutput.MAX_LOCAL_LAYER_IN_ELEMENT + + if name.startswith("Solid Element Id"): + return FailureOutput.MAX_SOLID_ELEMENT_ID + + raise RuntimeError("Could not determine failure output from name: " + name) + + class CompositeModelImpl: """Provides access to the basic composite postprocessing functionality. @@ -105,11 +198,36 @@ def __init__( data_sources=self.data_sources, material_operators=self.material_operators, unit_system=self._unit_system, + rst_stream_provider=self._get_rst_streams_provider(), ) + # self._layup_provider.outputs.layup_model_context_type.get_data() does not work because + # int32 is not supported in the Python API. See bug 946754. + if version_equal_or_later(self._server, "8.0"): + self._layup_model_type = LayupModelContextType( + _get_layup_model_context(self._layup_provider) + ) + else: + self._layup_model_type = ( + LayupModelContextType.ACP + if len(composite_files.composite) > 0 + else LayupModelContextType.NOT_AVAILABLE + ) + + if self._supports_reference_surface_operators(): + self._reference_surface_and_mapping_field = _get_reference_surface_and_mapping_field( + data_sources=self.data_sources.composite, unit_system=self._unit_system + ) + + self._map_to_reference_surface_operator = _get_map_to_reference_surface_operator( + reference_surface_and_mapping_field=self._reference_surface_and_mapping_field, + element_layer_indices_field=self.get_mesh().property_field("element_layer_indices"), + ) + self._element_info_provider = get_element_info_provider( mesh=self.get_mesh(), stream_provider_or_data_source=self._get_rst_streams_provider(), + material_provider=self.material_operators.material_provider, ) self._layup_properties_provider = LayupPropertiesProvider( layup_provider=self._layup_provider, mesh=self.get_mesh() @@ -144,6 +262,34 @@ def material_operators(self) -> MaterialOperators: """Material operators.""" return self._material_operators + @property + def material_names(self) -> dict[str, int]: + """ + Material name to DPF material ID map. + + This property can be used to filter analysis plies + or element layers. + """ + try: + helper_op = dpf.Operator("composite::materials_container_helper") + except Exception as exc: + raise RuntimeError( + f"Operator composite::materials_container_helper doesn't exist. " + f"This could be because the server version is 2024 R1-pre0. The " + f"latest preview or the unified installer can be used instead. " + f"Error: {exc}" + ) from exc + + helper_op.inputs.materials_container(self._material_operators.material_provider.outputs) + string_field = helper_op.outputs.material_names() + material_ids = string_field.scoping.ids + + names = {} + for dpf_mat_id in material_ids: + names[string_field.data[string_field.scoping.index(dpf_mat_id)]] = dpf_mat_id + + return names + @_deprecated_composite_definition_label def get_mesh(self, composite_definition_label: Optional[str] = None) -> MeshedRegion: """Get the underlying DPF meshed region. @@ -167,6 +313,14 @@ def get_layup_operator(self, composite_definition_label: Optional[str] = None) - """ return self._layup_provider + @property + def layup_model_type(self) -> LayupModelContextType: + """Get the context type of the lay-up model. + + Type can be one of the following values: ``NOT_AVAILABLE``, ``ACP``, ``RST``, ``MIXED``. + """ + return self._layup_model_type + @_deprecated_composite_definition_label def evaluate_failure_criteria( self, @@ -225,8 +379,6 @@ def evaluate_failure_criteria( # is irrelevant for cases without a ply scope, we set it to False here. write_data_for_full_element_scope = False - has_layup_provider = len(self._composite_files.composite) > 0 - # configure primary scoping scope_config = dpf.DataTree() if time_in: @@ -241,14 +393,16 @@ def evaluate_failure_criteria( scope_config_reader_op.inputs.ply_ids(selected_plies_op.outputs.strings) # configure operator to chunk the scope - chunking_data_tree = dpf.DataTree({"max_chunk_size": 50000}) + chunking_data_tree = dpf.DataTree({"max_chunk_size": max_chunk_size}) if ns_in: chunking_data_tree.add({"named_selections": ns_in}) chunking_generator = dpf.Operator("composite::scope_generator") chunking_generator.inputs.stream_provider(self._get_rst_streams_provider()) chunking_generator.inputs.data_tree(chunking_data_tree) - chunking_generator.inputs.data_sources(self.data_sources.composite) + if self.data_sources.composite: + chunking_generator.inputs.data_sources(self.data_sources.composite) + if element_scope_in: element_scope = dpf.Scoping(location="elemental") element_scope.ids = element_scope_in @@ -289,7 +443,14 @@ def evaluate_failure_criteria( self._get_rst_streams_provider() ) evaluate_failure_criterion_per_scope_op.inputs.mesh(self.get_mesh()) - evaluate_failure_criterion_per_scope_op.inputs.has_layup_provider(has_layup_provider) + if version_equal_or_later(self._server, "8.0"): + evaluate_failure_criterion_per_scope_op.inputs.layup_model_context_type( + self.layup_model_type.value + ) + else: + evaluate_failure_criterion_per_scope_op.inputs.has_layup_provider( + self.layup_model_type != LayupModelContextType.NOT_AVAILABLE + ) evaluate_failure_criterion_per_scope_op.inputs.section_data_container( self._layup_provider.outputs.section_data_container ) @@ -302,6 +463,8 @@ def evaluate_failure_criteria( # Ensure that sandwich criteria are evaluated evaluate_failure_criterion_per_scope_op.inputs.request_sandwich_results(True) + # Note: the min/max layer indices are 1-based starting with + # Workbench 2024 R1 (DPF server 7.1) minmax_el_op = dpf.Operator("composite::minmax_per_element_operator") minmax_el_op.inputs.fields_container( evaluate_failure_criterion_per_scope_op.outputs.failure_container @@ -312,7 +475,10 @@ def evaluate_failure_criteria( self.material_operators.material_support_provider.outputs ) - if has_layup_provider and write_data_for_full_element_scope: + if ( + self.layup_model_type != LayupModelContextType.NOT_AVAILABLE + and write_data_for_full_element_scope + ): add_default_data_op = dpf.Operator("composite::add_default_data") add_default_data_op.inputs.requested_element_scoping(chunking_generator.outputs) add_default_data_op.inputs.time_id( @@ -345,14 +511,31 @@ def evaluate_failure_criteria( merge_index = merge_index + 1 if merge_index == 0: - raise RuntimeError( - "No output is generated! Please check the scope (element and ply ids)." + raise RuntimeError("No output is generated! Check the scope (element and ply IDs).") + + if self._supports_reference_surface_operators(): + self._map_to_reference_surface_operator.inputs.min_container( + min_merger.outputs.merged_fields_container() + ) + self._map_to_reference_surface_operator.inputs.max_container( + max_merger.outputs.merged_fields_container() ) - if measure == FailureMeasureEnum.INVERSE_RESERVE_FACTOR: - return max_merger.outputs.merged_fields_container() + if measure == FailureMeasureEnum.INVERSE_RESERVE_FACTOR: + return _merge_containers( + max_merger.outputs.merged_fields_container(), + self._map_to_reference_surface_operator.outputs.max_container(), + ) + else: + return _merge_containers( + min_merger.outputs.merged_fields_container(), + self._map_to_reference_surface_operator.outputs.min_container(), + ) else: - return min_merger.outputs.merged_fields_container() + if measure == FailureMeasureEnum.INVERSE_RESERVE_FACTOR: + return max_merger.outputs.merged_fields_container() + else: + return min_merger.outputs.merged_fields_container() @_deprecated_composite_definition_label def get_sampling_point( @@ -496,7 +679,7 @@ def get_constant_property_dict( self, material_properties: Collection[MaterialProperty], composite_definition_label: Optional[str] = None, - ) -> Dict[np.int64, Dict[MaterialProperty, float]]: + ) -> dict[np.int64, dict[MaterialProperty, float]]: """Get a dictionary with constant properties. This method returns a dictionary with ``dpf_material_id`` as the key and @@ -578,7 +761,7 @@ def add_interlaminar_normal_stresses( def get_all_layered_element_ids(self) -> Sequence[int]: """Get all layered element IDs.""" return cast( - List[int], + list[int], self.get_mesh().property_field("element_layer_indices").scoping.ids, ) @@ -611,3 +794,16 @@ def _first_composite_definition_label_if_only_one(self) -> str: f"Multiple composite definition keys exist: {self.composite_definition_labels}. " f"Specify a key explicitly." ) + + # Whether the reference surface operators are available or supported by the server + def _supports_reference_surface_operators(self) -> bool: + if not version_equal_or_later(self._server, "8.0"): + return False + + if ( + self.layup_model_type == LayupModelContextType.ACP + or self.layup_model_type == LayupModelContextType.MIXED + ): + return True + + return False diff --git a/src/ansys/dpf/composites/_composite_model_impl_2023r2.py b/src/ansys/dpf/composites/_composite_model_impl_2023r2.py index bd5f3c4d4..f4a96cf0f 100644 --- a/src/ansys/dpf/composites/_composite_model_impl_2023r2.py +++ b/src/ansys/dpf/composites/_composite_model_impl_2023r2.py @@ -1,5 +1,28 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Composite Model Interface 2023R2.""" -from typing import Collection, Dict, List, Optional, Sequence, cast +from collections.abc import Collection, Sequence +from typing import Optional, cast from warnings import warn import ansys.dpf.core as dpf @@ -18,6 +41,7 @@ from .layup_info import ( ElementInfo, LayerProperty, + LayupModelContextType, LayupPropertiesProvider, add_layup_info_to_mesh, get_element_info_provider, @@ -129,7 +153,7 @@ def __init__( engineering_data_source=self._data_sources.engineering_data, ) - self._composite_infos: Dict[str, CompositeInfo] = {} + self._composite_infos: dict[str, CompositeInfo] = {} for composite_definition_label in self._data_sources.old_composite_sources: self._composite_infos[composite_definition_label] = CompositeInfo( data_sources=self._data_sources, @@ -143,7 +167,7 @@ def __init__( warn( "The post-processing of composite models with multiple lay-up" " definitions (assemblies) is deprecated with DPF servers older than 7.0" - " (2024 R1). Please use DPF server 7.0 or later.", + " (2024 R1). DPF server 7.0 or later should be used instead.", DeprecationWarning, stacklevel=2, ) @@ -193,6 +217,15 @@ def material_operators(self) -> MaterialOperators: """Material operators.""" return self._material_operators + @property + def material_names(self) -> dict[str, int]: + """Get material name to DPF material ID map.""" + raise NotImplementedError( + "material_names is not implemented" + " for this version of DPF. DPF server 7.0 (2024 R1)" + " or later should be used instead." + ) + def get_layup_operator(self, composite_definition_label: Optional[str] = None) -> Operator: """Get the lay-up operator. @@ -209,12 +242,22 @@ def get_layup_operator(self, composite_definition_label: Optional[str] = None) - composite_definition_label = self._first_composite_definition_label_if_only_one() return self._composite_infos[composite_definition_label].layup_provider + @property + def layup_model_type(self) -> LayupModelContextType: + """Get the context type of the lay-up model.""" + raise NotImplementedError( + "layup_model_type is not implemented" + " for this version of DPF. DPF server 8.0 (2024 R2)" + " or later should be used instead." + ) + def evaluate_failure_criteria( self, combined_criterion: CombinedFailureCriterion, composite_scope: Optional[CompositeScope] = None, measure: FailureMeasureEnum = FailureMeasureEnum.INVERSE_RESERVE_FACTOR, write_data_for_full_element_scope: bool = True, + max_chunk_size: int = 50000, ) -> FieldsContainer: """Get a fields container with the evaluated failure criteria. @@ -239,6 +282,8 @@ def evaluate_failure_criteria( part of ``composite_scope.plies``. If no element scope is specified (``composite_scope.elements``), a (potentially zero) failure value is written for all elements. + max_chunk_size: + A higher value results in more memory consumption, but faster evaluation. .. note:: @@ -362,7 +407,7 @@ def get_element_info( Parameters ---------- element_id: - Element ID or label. + Element ID/label. composite_definition_label: Label of the composite definition, which is the dictionary key in the :attr:`.ContinuousFiberCompositesFiles.composite` @@ -467,7 +512,7 @@ def get_constant_property_dict( self, material_properties: Collection[MaterialProperty], composite_definition_label: Optional[str] = None, - ) -> Dict[np.int64, Dict[MaterialProperty, float]]: + ) -> dict[np.int64, dict[MaterialProperty, float]]: """Get a dictionary with constant properties. Returns a dictionary with ``dpf_material_id`` as the key and @@ -550,8 +595,9 @@ def get_all_layered_element_ids(self) -> Sequence[int]: """Get all layered element IDs.""" raise NotImplementedError( "get_all_layered_element_ids is not implemented" - " for this version of DPF. Please upgrade to 7.0 (2024 R1)" - " or later. Use get_all_layered_element_ids_for_composite_definition_label" + " for this version of DPF. DPF server 7.0 (2024 R1)" + " or later should be used instead. Use " + "get_all_layered_element_ids_for_composite_definition_label" " instead." ) @@ -574,7 +620,7 @@ def get_all_layered_element_ids_for_composite_definition_label( " Or update the the latest version." ) return cast( - List[int], + list[int], self.get_mesh(composite_definition_label) .property_field("element_layer_indices") .scoping.ids, diff --git a/src/ansys/dpf/composites/_indexer.py b/src/ansys/dpf/composites/_indexer.py index 84931c0a9..193f9e111 100644 --- a/src/ansys/dpf/composites/_indexer.py +++ b/src/ansys/dpf/composites/_indexer.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Indexer helper classes.""" from dataclasses import dataclass from typing import Optional, Protocol, cast @@ -85,13 +107,18 @@ class FieldIndexerNoDataPointer: def __init__(self, field: Field): """Create indexer and get data.""" - index_by_id = setup_index_by_id(field.scoping) - self._indices = index_by_id.mapping - self._max_id = index_by_id.max_id - self._data: NDArray[np.double] = np.array(field.data, dtype=np.double) + if field.scoping.size > 0: + index_by_id = setup_index_by_id(field.scoping) + self._indices = index_by_id.mapping + self._max_id = index_by_id.max_id + self._data: NDArray[np.double] = np.array(field.data, dtype=np.double) + else: + self._indices = np.array([], dtype=np.int64) + self._max_id = 0 + self._data = np.array([], dtype=np.double) def by_id(self, entity_id: int) -> Optional[np.double]: - """Get index by id. + """Get index by ID. Parameters ---------- @@ -110,18 +137,27 @@ class PropertyFieldIndexerNoDataPointerNoBoundsCheck: def __init__(self, field: PropertyField): """Create indexer and get data.""" - index_by_id = setup_index_by_id(field.scoping) - self._indices = index_by_id.mapping - self._data: NDArray[np.int64] = np.array(field.data, dtype=np.int64) + if field.scoping.size > 0: + index_by_id = setup_index_by_id(field.scoping) + self._indices = index_by_id.mapping + self._data: NDArray[np.int64] = np.array(field.data, dtype=np.int64) + self._max_id = index_by_id.max_id + else: + self._indices = np.array([], dtype=np.int64) + self._data = np.array([], dtype=np.int64) + self._max_id = 0 def by_id(self, entity_id: int) -> Optional[np.int64]: - """Get index by id. + """Get index by ID. Parameters ---------- entity_id """ - return cast(np.int64, self._data[self._indices[entity_id]]) + if entity_id > self._max_id: + return None + else: + return cast(np.int64, self._data[self._indices[entity_id]]) class PropertyFieldIndexerWithDataPointer: @@ -129,19 +165,26 @@ class PropertyFieldIndexerWithDataPointer: def __init__(self, field: PropertyField): """Create indexer and get data.""" - index_by_id = setup_index_by_id(field.scoping) - self._indices = index_by_id.mapping - self._max_id = index_by_id.max_id - - self._data: NDArray[np.int64] = np.array(field.data, dtype=np.int64) - self._n_components = field.component_count - - self._data_pointer: NDArray[np.int64] = np.append( - field._data_pointer, len(self._data) * self._n_components - ) + if field.scoping.size > 0: + index_by_id = setup_index_by_id(field.scoping) + self._indices = index_by_id.mapping + self._max_id = index_by_id.max_id + + self._data: NDArray[np.int64] = np.array(field.data, dtype=np.int64) + self._n_components = field.component_count + + self._data_pointer: NDArray[np.int64] = np.append( + field._data_pointer, len(self._data) * self._n_components + ) + else: + self._max_id = 0 + self._indices = np.array([], dtype=np.int64) + self._data = np.array([], dtype=np.int64) + self._n_components = 0 + self._data_pointer = np.array([], dtype=np.int64) def by_id(self, entity_id: int) -> Optional[NDArray[np.int64]]: - """Get index by id. + """Get index by ID. Parameters ---------- @@ -168,19 +211,26 @@ class FieldIndexerWithDataPointer: def __init__(self, field: Field): """Create indexer and get data.""" - index_by_id = setup_index_by_id(field.scoping) - self._indices = index_by_id.mapping - self._max_id = index_by_id.max_id - - self._data: NDArray[np.double] = np.array(field.data, dtype=np.double) - self._n_components = field.component_count - - self._data_pointer: NDArray[np.int64] = np.append( - field._data_pointer, len(self._data) * self._n_components - ) + if field.scoping.size > 0: + index_by_id = setup_index_by_id(field.scoping) + self._indices = index_by_id.mapping + self._max_id = index_by_id.max_id + + self._data: NDArray[np.double] = np.array(field.data, dtype=np.double) + self._n_components = field.component_count + + self._data_pointer: NDArray[np.int64] = np.append( + field._data_pointer, len(self._data) * self._n_components + ) + else: + self._max_id = 0 + self._indices = np.array([], dtype=np.int64) + self._data = np.array([], dtype=np.double) + self._n_components = 0 + self._data_pointer = np.array([], dtype=np.int64) def by_id(self, entity_id: int) -> Optional[NDArray[np.double]]: - """Get index by id. + """Get index by ID. Parameters ---------- @@ -207,19 +257,24 @@ class PropertyFieldIndexerWithDataPointerNoBoundsCheck: def __init__(self, field: PropertyField): """Create indexer and get data.""" - index_by_id = setup_index_by_id(field.scoping) - self._indices = index_by_id.mapping - - self._data: NDArray[np.int64] = np.array(field.data, dtype=np.int64) - - self._n_components = field.component_count - - self._data_pointer: NDArray[np.int64] = np.append( - field._data_pointer, len(self._data) * self._n_components - ) + if field.scoping.size > 0: + index_by_id = setup_index_by_id(field.scoping) + self._indices = index_by_id.mapping + + self._data: NDArray[np.int64] = np.array(field.data, dtype=np.int64) + self._n_components = field.component_count + + self._data_pointer: NDArray[np.int64] = np.append( + field._data_pointer, len(self._data) * self._n_components + ) + else: + self._indices = np.array([], dtype=np.int64) + self._data = np.array([], dtype=np.int64) + self._n_components = 0 + self._data_pointer = np.array([], dtype=np.int64) def by_id(self, entity_id: int) -> Optional[NDArray[np.int64]]: - """Get index by id. + """Get index by ID. Parameters ---------- diff --git a/src/ansys/dpf/composites/_sampling_point_helpers.py b/src/ansys/dpf/composites/_sampling_point_helpers.py index 0f8d06802..92dc3f2a9 100644 --- a/src/ansys/dpf/composites/_sampling_point_helpers.py +++ b/src/ansys/dpf/composites/_sampling_point_helpers.py @@ -1,5 +1,28 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Wrapper for the sampling point operator.""" -from typing import Any, Collection, Dict, List, Sequence, cast +from collections.abc import Collection, Sequence +from typing import Any, cast from matplotlib.patches import Rectangle import matplotlib.pyplot as plt @@ -70,7 +93,7 @@ def _next(outer_data: Any, comp: str) -> Any: def get_indices_from_sp( - interface_indices: Dict[Spot, int], + interface_indices: dict[Spot, int], number_of_plies: int, spots_per_ply: int, spots: Collection[Spot] = (Spot.BOTTOM, Spot.MIDDLE, Spot.TOP), @@ -124,7 +147,7 @@ def get_offsets_by_spots_from_sp( def get_ply_wise_critical_failures_from_sp( sampling_point: SamplingPoint, -) -> List[FailureResult]: +) -> list[FailureResult]: """Get the critical failure value and modes per ply.""" num_plies = sampling_point.number_of_plies @@ -193,7 +216,6 @@ def add_ply_sequence_to_plot_to_sp( width = x_bound[1] - x_bound[0] for index, ply in enumerate(sampling_point.analysis_plies): - angle = float(ply["angle"]) hatch = "x" if ply["is_core"] else "" height = offsets[(index + 1) * num_spots - 1] - offsets[index * num_spots] @@ -201,7 +223,11 @@ def add_ply_sequence_to_plot_to_sp( axes.add_patch(Rectangle(xy=origin, width=width, height=height, fill=False, hatch=hatch)) mat = ply["material"] th = float(ply["thickness"]) - text = f"{mat}\nangle={angle:.3}, th={th:.3}" + if "angle" in ply.keys(): + angle = float(ply["angle"]) + text = f"{mat}\nangle={angle:.3}, th={th:.3}" + else: + text = f"{mat}\nth={th:.3}" axes.annotate( text=text, xy=(origin[0] + width / 2.0, origin[1] + height / 2.0), diff --git a/src/ansys/dpf/composites/_typing_helper.py b/src/ansys/dpf/composites/_typing_helper.py index 9ac0b5c5a..2b8a2164c 100644 --- a/src/ansys/dpf/composites/_typing_helper.py +++ b/src/ansys/dpf/composites/_typing_helper.py @@ -1,7 +1,29 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Helpers for defining type annotations.""" import os from typing import Union __all__ = ["PATH"] -PATH = Union[str, os.PathLike] +PATH = Union[str, os.PathLike[str]] diff --git a/src/ansys/dpf/composites/composite_model.py b/src/ansys/dpf/composites/composite_model.py index 5e4bb49b1..bca222f77 100644 --- a/src/ansys/dpf/composites/composite_model.py +++ b/src/ansys/dpf/composites/composite_model.py @@ -1,5 +1,28 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Composite Model.""" -from typing import Collection, Dict, Optional, Sequence +from collections.abc import Collection, Sequence +from typing import Optional import ansys.dpf.core as dpf from ansys.dpf.core import FieldsContainer, MeshedRegion, Operator, UnitSystem @@ -11,7 +34,7 @@ from .composite_scope import CompositeScope from .data_sources import CompositeDataSources, ContinuousFiberCompositesFiles from .failure_criteria import CombinedFailureCriterion -from .layup_info import ElementInfo, LayerProperty +from .layup_info import ElementInfo, LayerProperty, LayupModelContextType from .layup_info.material_operators import MaterialOperators from .layup_info.material_properties import MaterialProperty from .result_definition import FailureMeasureEnum @@ -106,6 +129,11 @@ def material_operators(self) -> MaterialOperators: """Material operators.""" return self._implementation.material_operators + @property + def material_names(self) -> dict[str, int]: + """Get material name to DPF material ID map.""" + return self._implementation.material_names + def get_mesh(self, composite_definition_label: Optional[str] = None) -> MeshedRegion: """Get the underlying DPF meshed region. @@ -135,12 +163,22 @@ def get_layup_operator(self, composite_definition_label: Optional[str] = None) - """ return self._implementation.get_layup_operator(composite_definition_label) + @property + def layup_model_type(self) -> LayupModelContextType: + """Get the context type of the lay-up model. + + The type specifies whether the lay-up data was loaded from an ACP model, RST, or both. + Type can be one of the following values: ``NOT_AVAILABLE``, ``ACP``, ``RST``, ``MIXED``. + """ + return self._implementation.layup_model_type + def evaluate_failure_criteria( self, combined_criterion: CombinedFailureCriterion, composite_scope: Optional[CompositeScope] = None, measure: FailureMeasureEnum = FailureMeasureEnum.INVERSE_RESERVE_FACTOR, write_data_for_full_element_scope: bool = True, + max_chunk_size: int = 50000, ) -> FieldsContainer: """Get a fields container with the evaluated failure criteria. @@ -165,6 +203,8 @@ def evaluate_failure_criteria( part of ``composite_scope.plies``. If no element scope is specified (``composite_scope.elements``), a (potentially zero) failure value is written for all elements. + max_chunk_size: + A higher value results in more memory consumption, but faster evaluation. .. note:: @@ -173,7 +213,11 @@ def evaluate_failure_criteria( """ return self._implementation.evaluate_failure_criteria( - combined_criterion, composite_scope, measure, write_data_for_full_element_scope + combined_criterion, + composite_scope, + measure, + write_data_for_full_element_scope, + max_chunk_size, ) def get_sampling_point( @@ -298,7 +342,7 @@ def get_constant_property_dict( self, material_properties: Collection[MaterialProperty], composite_definition_label: Optional[str] = None, - ) -> Dict[np.int64, Dict[MaterialProperty, float]]: + ) -> dict[np.int64, dict[MaterialProperty, float]]: """Get a dictionary with constant properties. Returns a dictionary with ``dpf_material_id`` as the key and diff --git a/src/ansys/dpf/composites/composite_scope.py b/src/ansys/dpf/composites/composite_scope.py index 9f2c2ae3e..674c9cbcd 100644 --- a/src/ansys/dpf/composites/composite_scope.py +++ b/src/ansys/dpf/composites/composite_scope.py @@ -1,6 +1,29 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Composite Scope.""" +from collections.abc import Sequence from dataclasses import dataclass -from typing import Optional, Sequence +from typing import Optional @dataclass(frozen=True) diff --git a/src/ansys/dpf/composites/constants.py b/src/ansys/dpf/composites/constants.py index 11f59abef..fbe20c507 100644 --- a/src/ansys/dpf/composites/constants.py +++ b/src/ansys/dpf/composites/constants.py @@ -1,8 +1,39 @@ -"""Collection of constants used across PyDPF Composites.""" +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +"""Collection of constants used across PyDPF Composites.""" from enum import IntEnum -__all__ = ("Spot", "Sym3x3TensorComponent", "FailureOutput") +__all__ = ( + "Spot", + "Sym3x3TensorComponent", + "FailureOutput", + "REF_SURFACE_NAME", + "FAILURE_LABEL", + "TIME_LABEL", +) + +FAILURE_LABEL = "failure_label" +TIME_LABEL = "time" class Spot(IntEnum): @@ -33,3 +64,11 @@ class FailureOutput(IntEnum): FAILURE_MODE = 0 FAILURE_VALUE = 1 MAX_LAYER_INDEX = 2 + FAILURE_MODE_REF_SURFACE = 3 + FAILURE_VALUE_REF_SURFACE = 4 + MAX_GLOBAL_LAYER_IN_STACK = 5 + MAX_LOCAL_LAYER_IN_ELEMENT = 6 + MAX_SOLID_ELEMENT_ID = 7 + + +REF_SURFACE_NAME = "Reference Surface" diff --git a/src/ansys/dpf/composites/data_sources.py b/src/ansys/dpf/composites/data_sources.py index 2beb0e2af..535350206 100644 --- a/src/ansys/dpf/composites/data_sources.py +++ b/src/ansys/dpf/composites/data_sources.py @@ -1,8 +1,31 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Composite data sources.""" +from collections.abc import Sequence from dataclasses import dataclass import os import pathlib -from typing import Callable, Dict, List, Optional, Sequence, Union, cast +from typing import Callable, Optional, Union, cast from ansys.dpf.core import DataSources @@ -45,8 +68,8 @@ class CompositeDefinitionFiles: class ContinuousFiberCompositesFiles: """Provides the container for continuous fiber composite file paths.""" - rst: List[_PATH] - composite: Dict[str, CompositeDefinitionFiles] + rst: list[_PATH] + composite: dict[str, CompositeDefinitionFiles] engineering_data: _PATH # True if files are local and false if files # have already been uploaded to the server @@ -54,8 +77,8 @@ class ContinuousFiberCompositesFiles: def __init__( self, - rst: Union[List[_PATH], _PATH], - composite: Dict[str, CompositeDefinitionFiles], + rst: Union[list[_PATH], _PATH], + composite: dict[str, CompositeDefinitionFiles], engineering_data: _PATH, files_are_local: bool = True, ) -> None: @@ -75,19 +98,31 @@ def __init__( True if files are on the local machine, False if they have already been uploaded to the DPF server.. """ - if isinstance(rst, (str, pathlib.Path)): - rst = [rst] self.rst = rst # type: ignore self.composite = composite self.engineering_data = engineering_data self.files_are_local = files_are_local + # The constructor pretends that rst can also be just a path + # but the property rst must be a list + def __setattr__(self, prop, val): # type: ignore + """Convert values if needed.""" + if prop == "rst": + val = self._get_rst_list(val) + super().__setattr__(prop, val) + + @staticmethod + def _get_rst_list(value: Union[list[_PATH], _PATH]) -> list[_PATH]: + if isinstance(value, (str, pathlib.Path)): + value = [value] + return value # type: ignore + @dataclass class ShortFiberCompositesFiles: """Provides the container for short fiber composite file paths.""" - rst: List[_PATH] + rst: list[_PATH] dsdat: _PATH engineering_data: _PATH # True if files are local and false if files @@ -96,7 +131,7 @@ class ShortFiberCompositesFiles: def __init__( self, - rst: Union[List[_PATH], _PATH], + rst: Union[list[_PATH], _PATH], dsdat: _PATH, engineering_data: _PATH, files_are_local: bool = True, @@ -116,15 +151,26 @@ def __init__( True if files are on the local machine, False if they have already been uploaded to the DPF server.. """ - if isinstance(rst, (str, pathlib.Path)): - rst = [rst] self.rst = rst # type: ignore self.dsdat = dsdat self.engineering_data = engineering_data self.files_are_local = files_are_local + # The constructor pretends that rst can also be just a path + # but the property rst must be a list. + def __setattr__(self, prop, val): # type: ignore + """Convert values if needed.""" + if prop == "rst": + val = self._get_rst_list(val) + super().__setattr__(prop, val) + + @staticmethod + def _get_rst_list(value: Union[list[_PATH], _PATH]) -> list[_PATH]: + if isinstance(value, (str, pathlib.Path)): + value = [value] + return value # type: ignore + -# roosre June 2023: todo add deprecation warning where composite definition label is used @dataclass(frozen=True) class CompositeDataSources: """Provides data sources related to the composite lay-up. @@ -132,17 +178,19 @@ class CompositeDataSources: Parameters ---------- rst: + Result file. Currently only RST (MAPDL) is supported. material_support: - NOTE: The 'material_support' is explicitly listed since it is currently not + NOTE: The ``material_support`` parameter is explicitly listed because it is currently not supported (by the DPF Core) to use a distributed RST file as source for the material support. Instead, we create a separate DataSources object for the material support from the first RST file. This is a workaround until the support for distributed RST is added. engineering_data: + File with the material properties. - old_composite_sources: - This member is used to support assemblies in combination with the old + old_composite_sources : + Member used to support assemblies in combination with the old DPF server (<7.0). It should be removed once the support of this server version is dropped. @@ -150,10 +198,10 @@ class CompositeDataSources: rst: DataSources material_support: DataSources - composite: DataSources + composite: Optional[DataSources] engineering_data: DataSources - old_composite_sources: Dict[str, DataSources] + old_composite_sources: dict[str, DataSources] def _get_mapping_path_file_from_definitions_path_if_exists( @@ -465,7 +513,7 @@ def get_composite_files_from_workbench_result_folder( def _get_data_sources_from_rst_files( - rst_files: List[_PATH], + rst_files: list[_PATH], ) -> DataSources: """Get a DPF data sources object from a list of RST files. @@ -517,7 +565,6 @@ def get_composites_data_sources( old_composite_data_sources = {} for key, composite_files in continuous_composite_files.composite.items(): - old_datasource = DataSources() if set_part_key: composite_data_source.add_file_path_for_specified_result( composite_files.definition, _LAYUPFILE_INDEX_KEY, key @@ -542,6 +589,11 @@ def get_composites_data_sources( old_composite_data_sources[key] = old_datasource + # Reset composite data source if no composite files are provided because a + # data source cannot be empty + if len(continuous_composite_files.composite) == 0: + composite_data_source = None + return CompositeDataSources( rst=rst_data_source, material_support=material_support_data_source, diff --git a/src/ansys/dpf/composites/example_helper/__init__.py b/src/ansys/dpf/composites/example_helper/__init__.py index 258e63d10..9dc4c152a 100644 --- a/src/ansys/dpf/composites/example_helper/__init__.py +++ b/src/ansys/dpf/composites/example_helper/__init__.py @@ -1,9 +1,31 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Helper to get example files.""" from dataclasses import dataclass import os import tempfile -from typing import Dict, List, Optional, cast +from typing import Optional, cast import urllib.request import ansys.dpf.core as dpf @@ -13,6 +35,7 @@ ContinuousFiberCompositesFiles, ShortFiberCompositesFiles, ) +from ..server_helpers import upload_file_to_unique_tmp_folder EXAMPLE_REPO = "https://github.com/ansys/example-data/raw/master/pydpf-composites/" @@ -25,14 +48,14 @@ class _ContinuousFiberCompositeFiles: @dataclass class _ContinuousFiberCompositesExampleFilenames: - rst: List[str] - composite: Dict[str, _ContinuousFiberCompositeFiles] + rst: list[str] + composite: dict[str, _ContinuousFiberCompositeFiles] engineering_data: str @dataclass class _ShortFiberCompositesExampleFilenames: - rst: List[str] + rst: list[str] dsdat: str engineering_data: str @@ -69,7 +92,7 @@ class _ShortFiberExampleLocation: files: _ShortFiberCompositesExampleFilenames -_continuous_fiber_examples: Dict[str, _ContinuousFiberExampleLocation] = { +_continuous_fiber_examples: dict[str, _ContinuousFiberExampleLocation] = { "shell": _ContinuousFiberExampleLocation( directory="shell", files=_ContinuousFiberCompositesExampleFilenames( @@ -118,9 +141,19 @@ class _ShortFiberExampleLocation: }, ), ), + "fatigue": _ContinuousFiberExampleLocation( + directory="fatigue", + files=_ContinuousFiberCompositesExampleFilenames( + rst=["file.rst"], + engineering_data="MatML.xml", + composite={ + "shell": _ContinuousFiberCompositeFiles(definition="ACPCompositeDefinitions.h5"), + }, + ), + ), } -_short_fiber_examples: Dict[str, _ShortFiberExampleLocation] = { +_short_fiber_examples: dict[str, _ShortFiberExampleLocation] = { "short_fiber": _ShortFiberExampleLocation( directory="short_fiber", files=_ShortFiberCompositesExampleFilenames( @@ -145,7 +178,7 @@ def _download_and_upload_file( urllib.request.urlretrieve(file_url, local_path) if server.local_server: return local_path - return cast(str, dpf.upload_file_in_tmp_folder(local_path, server=server)) + return upload_file_to_unique_tmp_folder(local_path, server=server) def get_short_fiber_example_files( @@ -179,6 +212,7 @@ def get_server_path(filename: str) -> str: def get_continuous_fiber_example_files( server: dpf.server, example_key: str, + skip_acp_layup_files: bool = False, ) -> ContinuousFiberCompositesFiles: """Get continuous fiber example file by example key. @@ -197,16 +231,17 @@ def get_server_path(filename: str) -> str: return _download_and_upload_file(example_files.directory, filename, tmpdir, server) all_composite_files = {} - for key, composite_examples_files_for_scope in example_files.files.composite.items(): - composite_files = CompositeDefinitionFiles( - definition=get_server_path(composite_examples_files_for_scope.definition), - ) - if composite_examples_files_for_scope.mapping is not None: - composite_files.mapping = get_server_path( - composite_examples_files_for_scope.mapping + if not skip_acp_layup_files: + for key, composite_examples_files_for_scope in example_files.files.composite.items(): + composite_files = CompositeDefinitionFiles( + definition=get_server_path(composite_examples_files_for_scope.definition), ) + if composite_examples_files_for_scope.mapping is not None: + composite_files.mapping = get_server_path( + composite_examples_files_for_scope.mapping + ) - all_composite_files[key] = composite_files + all_composite_files[key] = composite_files return ContinuousFiberCompositesFiles( rst=[get_server_path(rst_path) for rst_path in example_files.files.rst], diff --git a/src/ansys/dpf/composites/failure_criteria/__init__.py b/src/ansys/dpf/composites/failure_criteria/__init__.py index 6f3b89fc3..ea8fb15fc 100644 --- a/src/ansys/dpf/composites/failure_criteria/__init__.py +++ b/src/ansys/dpf/composites/failure_criteria/__init__.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Module of failure criteria.""" from ._combined_failure_criterion import CombinedFailureCriterion diff --git a/src/ansys/dpf/composites/failure_criteria/_combined_failure_criterion.py b/src/ansys/dpf/composites/failure_criteria/_combined_failure_criterion.py index f665c1161..e7375e2ad 100644 --- a/src/ansys/dpf/composites/failure_criteria/_combined_failure_criterion.py +++ b/src/ansys/dpf/composites/failure_criteria/_combined_failure_criterion.py @@ -1,7 +1,30 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Combined Failure Criterion.""" +from collections.abc import Sequence import json -from typing import Any, Dict, Sequence +from typing import Any from ._failure_criterion_base import FailureCriterionBase @@ -36,7 +59,7 @@ def __init__( failure_criteria: List of failure criteria. """ - self._failure_criteria: Dict[str, FailureCriterionBase] = {} + self._failure_criteria: dict[str, FailureCriterionBase] = {} for fc in failure_criteria: self.insert(fc) @@ -48,7 +71,7 @@ def _get_name(self) -> str: def _set_name(self, value: str) -> None: self._name = value - def _get_failure_criteria(self) -> Dict[str, FailureCriterionBase]: + def _get_failure_criteria(self) -> dict[str, FailureCriterionBase]: return self._failure_criteria name = property(_get_name, _set_name, doc="Name of the combined failure criterion.") @@ -100,7 +123,7 @@ def remove(self, key: str) -> FailureCriterionBase: return self._failure_criteria.pop(key) - def to_dict(self) -> Dict[str, Any]: + def to_dict(self) -> dict[str, Any]: """Return the combined failure criterion as a dictionary. Returns diff --git a/src/ansys/dpf/composites/failure_criteria/_core_failure.py b/src/ansys/dpf/composites/failure_criteria/_core_failure.py index f4975c5b3..629d224eb 100644 --- a/src/ansys/dpf/composites/failure_criteria/_core_failure.py +++ b/src/ansys/dpf/composites/failure_criteria/_core_failure.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Core failure criterion.""" import inspect diff --git a/src/ansys/dpf/composites/failure_criteria/_cuntze.py b/src/ansys/dpf/composites/failure_criteria/_cuntze.py index 6e8a8e053..c96946e1c 100644 --- a/src/ansys/dpf/composites/failure_criteria/_cuntze.py +++ b/src/ansys/dpf/composites/failure_criteria/_cuntze.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Cuntze failure criterion.""" import inspect diff --git a/src/ansys/dpf/composites/failure_criteria/_face_sheet_wrinkling.py b/src/ansys/dpf/composites/failure_criteria/_face_sheet_wrinkling.py index 7c9e947cc..c7a2905f6 100644 --- a/src/ansys/dpf/composites/failure_criteria/_face_sheet_wrinkling.py +++ b/src/ansys/dpf/composites/failure_criteria/_face_sheet_wrinkling.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Face Sheet Wrinkling Criterion for sandwich structures.""" import inspect diff --git a/src/ansys/dpf/composites/failure_criteria/_failure_criterion_base.py b/src/ansys/dpf/composites/failure_criteria/_failure_criterion_base.py index 244a80804..5c650cb0e 100644 --- a/src/ansys/dpf/composites/failure_criteria/_failure_criterion_base.py +++ b/src/ansys/dpf/composites/failure_criteria/_failure_criterion_base.py @@ -1,7 +1,30 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Defines the base class of composite failure criterion.""" +from collections.abc import Sequence import json -from typing import Any, Dict, Sequence +from typing import Any class FailureCriterionBase: @@ -26,7 +49,7 @@ def _get_name(self) -> str: ) name = property(_get_name, doc="Name of the failure criterion. Read only.") - def to_dict(self) -> Dict[str, Any]: + def to_dict(self) -> dict[str, Any]: """:return: a dict with all properties.""" properties = self._get_properties(exclude=["name"]) diff --git a/src/ansys/dpf/composites/failure_criteria/_failure_mode_enum.py b/src/ansys/dpf/composites/failure_criteria/_failure_mode_enum.py index a4d4c103e..2780de47b 100644 --- a/src/ansys/dpf/composites/failure_criteria/_failure_mode_enum.py +++ b/src/ansys/dpf/composites/failure_criteria/_failure_mode_enum.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from enum import Enum # Use the functional API because otherwise it is impossible to use diff --git a/src/ansys/dpf/composites/failure_criteria/_hashin.py b/src/ansys/dpf/composites/failure_criteria/_hashin.py index 3d2f1ee83..a111d6e25 100644 --- a/src/ansys/dpf/composites/failure_criteria/_hashin.py +++ b/src/ansys/dpf/composites/failure_criteria/_hashin.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Hashin failure criterion.""" import inspect diff --git a/src/ansys/dpf/composites/failure_criteria/_hoffman.py b/src/ansys/dpf/composites/failure_criteria/_hoffman.py index 1f0141c14..e9bf80509 100644 --- a/src/ansys/dpf/composites/failure_criteria/_hoffman.py +++ b/src/ansys/dpf/composites/failure_criteria/_hoffman.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Hoffman failure criterion.""" from ._quadratic_failure_criterion import _DOC_DIM, _DOC_WF, QuadraticFailureCriterion diff --git a/src/ansys/dpf/composites/failure_criteria/_larc.py b/src/ansys/dpf/composites/failure_criteria/_larc.py index f14db2ea9..53608bd21 100644 --- a/src/ansys/dpf/composites/failure_criteria/_larc.py +++ b/src/ansys/dpf/composites/failure_criteria/_larc.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """LaRC failure criterion.""" import inspect diff --git a/src/ansys/dpf/composites/failure_criteria/_max_strain.py b/src/ansys/dpf/composites/failure_criteria/_max_strain.py index f1c0c3365..83c476f05 100644 --- a/src/ansys/dpf/composites/failure_criteria/_max_strain.py +++ b/src/ansys/dpf/composites/failure_criteria/_max_strain.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Defines the MaxStrain failure criterion.""" import inspect diff --git a/src/ansys/dpf/composites/failure_criteria/_max_stress.py b/src/ansys/dpf/composites/failure_criteria/_max_stress.py index 60fc538e4..87f6f3460 100644 --- a/src/ansys/dpf/composites/failure_criteria/_max_stress.py +++ b/src/ansys/dpf/composites/failure_criteria/_max_stress.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Defines the MaxStress failure criterion.""" import inspect diff --git a/src/ansys/dpf/composites/failure_criteria/_puck.py b/src/ansys/dpf/composites/failure_criteria/_puck.py index f00cb4543..fb9226346 100644 --- a/src/ansys/dpf/composites/failure_criteria/_puck.py +++ b/src/ansys/dpf/composites/failure_criteria/_puck.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Puck Failure Criterion.""" import inspect diff --git a/src/ansys/dpf/composites/failure_criteria/_quadratic_failure_criterion.py b/src/ansys/dpf/composites/failure_criteria/_quadratic_failure_criterion.py index 588aacdc1..88352e661 100644 --- a/src/ansys/dpf/composites/failure_criteria/_quadratic_failure_criterion.py +++ b/src/ansys/dpf/composites/failure_criteria/_quadratic_failure_criterion.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Base class for quadratic failure criterion.""" from ._failure_criterion_base import FailureCriterionBase diff --git a/src/ansys/dpf/composites/failure_criteria/_shear_crimping.py b/src/ansys/dpf/composites/failure_criteria/_shear_crimping.py index 5fa4d7ae2..0645e32cc 100644 --- a/src/ansys/dpf/composites/failure_criteria/_shear_crimping.py +++ b/src/ansys/dpf/composites/failure_criteria/_shear_crimping.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Shear Crimping Failure Criterion.""" import inspect diff --git a/src/ansys/dpf/composites/failure_criteria/_tsai_hill.py b/src/ansys/dpf/composites/failure_criteria/_tsai_hill.py index 969bb8cfc..e724bdc26 100644 --- a/src/ansys/dpf/composites/failure_criteria/_tsai_hill.py +++ b/src/ansys/dpf/composites/failure_criteria/_tsai_hill.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Tsai-Hill failure criterion.""" from ._quadratic_failure_criterion import _DOC_DIM, _DOC_WF, QuadraticFailureCriterion diff --git a/src/ansys/dpf/composites/failure_criteria/_tsai_wu.py b/src/ansys/dpf/composites/failure_criteria/_tsai_wu.py index fe9e3431d..e96ce91e4 100644 --- a/src/ansys/dpf/composites/failure_criteria/_tsai_wu.py +++ b/src/ansys/dpf/composites/failure_criteria/_tsai_wu.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Tsai-Wu failure criterion.""" from ._quadratic_failure_criterion import _DOC_DIM, _DOC_WF, QuadraticFailureCriterion diff --git a/src/ansys/dpf/composites/failure_criteria/_von_mises.py b/src/ansys/dpf/composites/failure_criteria/_von_mises.py index 00a8021c1..0bb94f9dc 100644 --- a/src/ansys/dpf/composites/failure_criteria/_von_mises.py +++ b/src/ansys/dpf/composites/failure_criteria/_von_mises.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Von Mises Criterion.""" import inspect diff --git a/src/ansys/dpf/composites/layup_info/__init__.py b/src/ansys/dpf/composites/layup_info/__init__.py index f7cd49679..543c709c4 100644 --- a/src/ansys/dpf/composites/layup_info/__init__.py +++ b/src/ansys/dpf/composites/layup_info/__init__.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Provides methods for reading the composite lay-up information.""" from . import material_operators, material_properties @@ -7,10 +29,12 @@ AnalysisPlyInfoProvider, ElementInfo, ElementInfoProvider, + LayupModelContextType, LayupPropertiesProvider, get_all_analysis_ply_names, get_analysis_ply_index_to_name_map, get_dpf_material_id_by_analyis_ply_map, + get_dpf_material_id_by_analysis_ply_map, get_element_info_provider, ) @@ -22,9 +46,11 @@ "LayerProperty", "LayupProperty", "LayupPropertiesProvider", + "LayupModelContextType", "get_all_analysis_ply_names", "get_analysis_ply_index_to_name_map", "get_dpf_material_id_by_analyis_ply_map", + "get_dpf_material_id_by_analysis_ply_map", "get_element_info_provider", "material_properties", "material_operators", diff --git a/src/ansys/dpf/composites/layup_info/_add_layup_info_to_mesh.py b/src/ansys/dpf/composites/layup_info/_add_layup_info_to_mesh.py index 35d1a3e46..ff742da8b 100644 --- a/src/ansys/dpf/composites/layup_info/_add_layup_info_to_mesh.py +++ b/src/ansys/dpf/composites/layup_info/_add_layup_info_to_mesh.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Helper functions to add lay-up information to a DPF meshed region.""" from typing import Optional from warnings import warn @@ -11,12 +33,15 @@ def _get_composite_data_sources_for_layup_provider( data_sources: CompositeDataSources, composite_definition_label: Optional[str] = None -) -> DataSources: +) -> Optional[DataSources]: """ - Prepare DataSources of composite for the DPF server. + Extract the DataSources object depending on the server version. - Ensure that DataSources object is compatible with the version of the layup provider. + Ensure that the ``DataSources`` object is compatible with the version of the lay-up provider. """ + if data_sources.composite is None: + return None + # import is here because of circular dependencies from ..server_helpers import version_older_than @@ -50,6 +75,7 @@ def add_layup_info_to_mesh( mesh: MeshedRegion, unit_system: Optional[UnitSystemProvider] = None, composite_definition_label: Optional[str] = None, + rst_stream_provider: Optional[Operator] = None, ) -> Operator: """Add lay-up information to the mesh. @@ -71,21 +97,24 @@ def add_layup_info_to_mesh( dictionary key in the :attr:`.ContinuousFiberCompositesFiles.composite` attribute. This parameter is only required for assemblies. See the note about assemblies in the description for the :class:`.CompositeModel` class. - Returns - ------- - : - Lay-up provider operator. - """ - composite_data_sources = _get_composite_data_sources_for_layup_provider( - data_sources, composite_definition_label - ) + rst_stream_provider: + Pass RST stream to load the section data directly from the RST file. This parameter is + supported in DPF version 8.0 (2024 R2) and later. + """ # Set up the lay-up provider. # Reads the composite definition file and enriches the mesh # with the composite lay-up information. layup_provider = Operator("composite::layup_provider_operator") layup_provider.inputs.mesh(mesh) - layup_provider.inputs.data_sources(composite_data_sources) + + composite_data_sources = _get_composite_data_sources_for_layup_provider( + data_sources, composite_definition_label + ) + + if composite_data_sources: + layup_provider.inputs.data_sources(composite_data_sources) + layup_provider.inputs.abstract_field_support( material_operators.material_support_provider.outputs.abstract_field_support ) @@ -101,6 +130,14 @@ def add_layup_info_to_mesh( unit_system = material_operators.result_info_provider layup_provider.inputs.unit_system(unit_system) + + if rst_stream_provider: + from ..server_helpers import version_equal_or_later + + # pylint: disable=protected-access + if version_equal_or_later(layup_provider._server, "8.0"): + layup_provider.inputs.rst_stream(rst_stream_provider) + layup_provider.run() return layup_provider diff --git a/src/ansys/dpf/composites/layup_info/_enums.py b/src/ansys/dpf/composites/layup_info/_enums.py index f5256b3b9..8b2c860ae 100644 --- a/src/ansys/dpf/composites/layup_info/_enums.py +++ b/src/ansys/dpf/composites/layup_info/_enums.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from enum import IntEnum diff --git a/src/ansys/dpf/composites/layup_info/_layup_info.py b/src/ansys/dpf/composites/layup_info/_layup_info.py index c76041d73..555e7474f 100644 --- a/src/ansys/dpf/composites/layup_info/_layup_info.py +++ b/src/ansys/dpf/composites/layup_info/_layup_info.py @@ -1,7 +1,32 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Lay-up information provider.""" +from collections.abc import Collection, Sequence from dataclasses import dataclass -from typing import Any, Collection, Dict, List, Optional, Sequence, Union, cast +from enum import Enum +from typing import Any, Optional, Union, cast +from warnings import warn import ansys.dpf.core as dpf from ansys.dpf.core import DataSources, MeshedRegion, Operator, PropertyField @@ -19,7 +44,7 @@ PropertyFieldIndexerWithDataPointer, PropertyFieldIndexerWithDataPointerNoBoundsCheck, ) -from ..server_helpers import version_older_than +from ..server_helpers import version_equal_or_later, version_older_than from ._enums import LayupProperty @@ -58,6 +83,21 @@ def _get_analysis_ply(mesh: MeshedRegion, name: str, skip_check: bool = False) - return mesh.property_field(property_field_name) +def _get_layup_model_context(layup_provider: dpf.Operator) -> int: + """Get the lay-up model context from the lay-up provider.""" + return cast(int, layup_provider.get_output(218, int)) + + +# Note: Must be in sync with the ``LayupModelContextTypeEnum`` object in the C++ code. +class LayupModelContextType(Enum): + """Type of the lay-up information.""" + + NOT_AVAILABLE = 0 # no layup data + ACP = 1 # lay-up data was read from ACP + RST = 2 # lay-up data was read from RST + MIXED = 3 # lay-up data was read from RST and ACP + + @dataclass(frozen=True) class ElementInfo: """Provides lay-up information for an element. @@ -105,7 +145,7 @@ class ElementInfo: Map of keyopt_8 to number of spots. Example: Element 181 with keyopt8==1 has two spots """ -_n_spots_by_element_type_and_keyopt_dict: Dict[int, Dict[int, int]] = { +_n_spots_by_element_type_and_keyopt_dict: dict[int, dict[int, int]] = { 181: {0: 0, 1: 2, 2: 3}, 281: {0: 0, 1: 2, 2: 3}, 185: {0: 0, 1: 2}, @@ -190,7 +230,7 @@ def ply_element_ids(self) -> Sequence[np.int64]: def get_dpf_material_id_by_analyis_ply_map( mesh: MeshedRegion, data_source_or_streams_provider: Union[DataSources, Operator], -) -> Dict[str, np.int64]: +) -> dict[str, np.int64]: """Get Dict that maps analysis ply names to dpf_material_ids. Parameters @@ -200,6 +240,38 @@ def get_dpf_material_id_by_analyis_ply_map( data_source_or_streams_provider: DPF data source with rst file or streams_provider. The streams provider is available from :attr:`.CompositeModel.core_model` (under metadata.streams_provider). + + Notes + ----- + Cache the output because the computation can be performance-critical. + """ + warn( + "`get_dpf_material_id_by_analyis_ply_map` is deprecated. " + " and was replaced by `get_dpf_material_id_by_analysis_ply_map`.", + category=DeprecationWarning, + stacklevel=2, + ) + return get_dpf_material_id_by_analysis_ply_map(mesh, data_source_or_streams_provider) + + +def get_dpf_material_id_by_analysis_ply_map( + mesh: MeshedRegion, + data_source_or_streams_provider: Union[DataSources, Operator], +) -> dict[str, np.int64]: + """Get the dictionary that maps analysis ply names to DPF material IDs. + + Parameters + ---------- + mesh + DPF Meshed region enriched with lay-up information + data_source_or_streams_provider: + DPF data source with RST file or streams provider. The streams provider is + available from the :attr:`.CompositeModel.core_model` attribute + (under ``metadata.streams_provider``). + + Note + ---- + Cache the output because the computation can be performance-critical. """ # Note: The stream_provider_or_data_source is not strictly needed for this workflow # We just need it because get_element_info_provider provider needs it (which needs @@ -240,7 +312,7 @@ def get_dpf_material_id_by_analyis_ply_map( def get_analysis_ply_index_to_name_map( mesh: MeshedRegion, -) -> Dict[int, str]: +) -> dict[int, str]: """Get Dict that maps analysis ply indices to analysis ply names. The resulting dict can be used to map from the indices stored in @@ -258,7 +330,7 @@ def get_analysis_ply_index_to_name_map( mesh, analysis_ply_name, skip_check=True ) first_element_id = analysis_ply_property_field.scoping.id(0) - analysis_ply_indices: List[int] = local_field.get_entity_data_by_id(first_element_id) + analysis_ply_indices: list[int] = local_field.get_entity_data_by_id(first_element_id) layer_index = analysis_ply_property_field.get_entity_data(0)[0] assert layer_index is not None @@ -305,6 +377,7 @@ def __init__( keyopt_8_values: PropertyField, keyopt_3_values: PropertyField, material_ids: PropertyField, + solver_material_ids: Optional[PropertyField] = None, no_bounds_checks: bool = False, ): """Initialize ElementInfoProvider.""" @@ -337,6 +410,14 @@ def get_indexer_no_data_pointer(field: PropertyField) -> PropertyFieldIndexerSin self.mesh = mesh self.corner_nodes_by_element_type = _get_corner_nodes_by_element_type_array() + self.apdl_material_indexer = get_indexer_no_data_pointer(self.mesh.elements.materials_field) + + self.solver_material_to_dpf_id = {} + if solver_material_ids is not None: + for dpf_mat_id in solver_material_ids.scoping.ids: + mapdl_mat_ids = solver_material_ids.get_entity_data_by_id(dpf_mat_id) + for mapdl_mat_id in mapdl_mat_ids: + self.solver_material_to_dpf_id[mapdl_mat_id] = dpf_mat_id def get_element_info(self, element_id: int) -> Optional[ElementInfo]: """Get :class:`~ElementInfo` for a given element id. @@ -381,6 +462,16 @@ def get_element_info(self, element_id: int) -> Optional[ElementInfo]: assert layer_data[0] + 1 == len(layer_data), "Invalid size of layer data" n_layers = layer_data[0] is_layered = True + elif self.solver_material_to_dpf_id: + is_layered = False + n_layers = 1 + mapdl_mat_id = self.apdl_material_indexer.by_id(element_id) + if mapdl_mat_id: + dpf_material_ids = np.array( + [self.solver_material_to_dpf_id[mapdl_mat_id]], dtype=np.int64 + ) + else: + raise RuntimeError(f"Could not evaluate material of element {element_id}.") corner_nodes_dpf = self.corner_nodes_by_element_type[element_type] if corner_nodes_dpf < 0: @@ -405,6 +496,7 @@ def get_element_info(self, element_id: int) -> Optional[ElementInfo]: def get_element_info_provider( mesh: MeshedRegion, stream_provider_or_data_source: Union[Operator, DataSources], + material_provider: Optional[Operator] = None, no_bounds_checks: bool = False, ) -> ElementInfoProvider: """Get :class:`~ElementInfoProvider` Object. @@ -414,6 +506,8 @@ def get_element_info_provider( mesh stream_provider_or_data_source dpf stream provider or dpf data source + material_provider + DPF operator that provides material information. no_bounds_checks Disable bounds checks. Improves performance but can result in cryptic error messages @@ -453,6 +547,14 @@ def get_keyopt_property_field(keyopt: int) -> PropertyField: ) raise RuntimeError(message) + # pylint: disable=protected-access + if material_provider and version_equal_or_later(mesh._server, "8.0"): + helper_op = dpf.Operator("composite::materials_container_helper") + helper_op.inputs.materials_container(material_provider.outputs) + solver_material_ids = helper_op.outputs.solver_material_ids() + else: + solver_material_ids = None + fields = { "layer_indices": mesh.property_field("element_layer_indices"), "element_types_apdl": mesh.property_field("apdl_element_type"), @@ -460,6 +562,7 @@ def get_keyopt_property_field(keyopt: int) -> PropertyField: "keyopt_8_values": get_keyopt_property_field(8), "keyopt_3_values": get_keyopt_property_field(3), "material_ids": mesh.property_field("element_layered_material_ids"), + "solver_material_ids": solver_material_ids, } return ElementInfoProvider(mesh, **fields, no_bounds_checks=no_bounds_checks) diff --git a/src/ansys/dpf/composites/layup_info/_reference_surface.py b/src/ansys/dpf/composites/layup_info/_reference_surface.py new file mode 100644 index 000000000..1a0b61bf9 --- /dev/null +++ b/src/ansys/dpf/composites/layup_info/_reference_surface.py @@ -0,0 +1,58 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from dataclasses import dataclass + +from ansys.dpf.core import DataSources, Field, Operator, PropertyField + +from ansys.dpf.composites.unit_system import UnitSystemProvider + + +@dataclass(frozen=True) +class _ReferenceSurfaceMeshAndMappingField: + mesh: Field + mapping_field: Field + + +def _get_reference_surface_and_mapping_field( + data_sources: DataSources, unit_system: UnitSystemProvider +) -> _ReferenceSurfaceMeshAndMappingField: + ref_surface_operator = Operator("composite::reference_surface_operator") + ref_surface_operator.inputs.data_sources.connect(data_sources) + ref_surface_operator.inputs.unit_system.connect(unit_system) + return _ReferenceSurfaceMeshAndMappingField( + mesh=ref_surface_operator.outputs.mesh(), + mapping_field=ref_surface_operator.outputs.mapping_field(), + ) + + +def _get_map_to_reference_surface_operator( + reference_surface_and_mapping_field: _ReferenceSurfaceMeshAndMappingField, + element_layer_indices_field: PropertyField, +) -> Operator: + map_to_reference_surface_operator = Operator("composite::map_to_reference_surface_operator") + map_to_reference_surface_operator.inputs.mapping_field.connect( + reference_surface_and_mapping_field.mapping_field + ) + map_to_reference_surface_operator.inputs.mesh.connect(reference_surface_and_mapping_field.mesh) + map_to_reference_surface_operator.inputs.layers_per_element.connect(element_layer_indices_field) + return map_to_reference_surface_operator diff --git a/src/ansys/dpf/composites/layup_info/material_operators.py b/src/ansys/dpf/composites/layup_info/material_operators.py index c5e309776..1e0e4ce63 100644 --- a/src/ansys/dpf/composites/layup_info/material_operators.py +++ b/src/ansys/dpf/composites/layup_info/material_operators.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Helper function to get material-related operators.""" from typing import Optional from warnings import warn diff --git a/src/ansys/dpf/composites/layup_info/material_properties.py b/src/ansys/dpf/composites/layup_info/material_properties.py index 5582ba620..d05b5d772 100644 --- a/src/ansys/dpf/composites/layup_info/material_properties.py +++ b/src/ansys/dpf/composites/layup_info/material_properties.py @@ -1,6 +1,29 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Helpers to get material properties.""" +from collections.abc import Collection from enum import Enum -from typing import Collection, Dict, Set, Union, cast +from typing import Union, cast from ansys.dpf.core import DataSources, MeshedRegion, Operator, types import numpy as np @@ -136,7 +159,7 @@ def get_all_dpf_material_ids( DPF data source or stream provider that contains the RST file. """ element_info_provider = get_element_info_provider(mesh, data_source_or_streams_provider) - all_material_ids: Set["np.int64"] = set() + all_material_ids: set["np.int64"] = set() for element_id in mesh.elements.scoping.ids: element_info = element_info_provider.get_element_info(element_id) if element_info is not None: @@ -149,7 +172,7 @@ def get_constant_property_dict( materials_provider: Operator, data_source_or_streams_provider: Union[DataSources, Operator], mesh: MeshedRegion, -) -> Dict[np.int64, Dict[MaterialProperty, float]]: +) -> dict[np.int64, dict[MaterialProperty, float]]: """Get a dictionary with constant properties. Returns a dictionary with the DPF material ID as a key and @@ -171,7 +194,7 @@ def get_constant_property_dict( mesh: DPF meshed region enriched with lay-up information. """ - properties: Dict[np.int64, Dict[MaterialProperty, float]] = {} + properties: dict[np.int64, dict[MaterialProperty, float]] = {} unit_system = get_unit_system(data_source_or_streams_provider) for dpf_material_id in get_all_dpf_material_ids( mesh=mesh, data_source_or_streams_provider=data_source_or_streams_provider diff --git a/src/ansys/dpf/composites/ply_wise_data.py b/src/ansys/dpf/composites/ply_wise_data.py new file mode 100644 index 000000000..6b88cb75c --- /dev/null +++ b/src/ansys/dpf/composites/ply_wise_data.py @@ -0,0 +1,116 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""Methods to get ply-wise data from a result field.""" + +from enum import Enum, IntEnum +from typing import Union + +from ansys.dpf.core import Field, MeshedRegion, Operator, operators +from ansys.dpf.gate.common import locations + +__all__ = ("SpotReductionStrategy", "get_ply_wise_data") + + +class SpotReductionStrategy(Enum): + """Provides the strategy for getting from spot values (BOT, MID, TOP) to a single value.""" + + MIN = "MIN" + MAX = "MAX" + AVG = "AVG" + BOT = "BOT" + MID = "MID" + TOP = "TOP" + + +def get_ply_wise_data( + field: Field, + ply_name: str, + mesh: MeshedRegion, + spot_reduction_strategy: SpotReductionStrategy = SpotReductionStrategy.AVG, + requested_location: str = locations.elemental_nodal, + component: Union[IntEnum, int] = 0, +) -> Field: + """Get ply-wise data from a field. + + Parameters + ---------- + field: + Field to extract data from. + ply_name: + Name of the ply to extract data from. + mesh : + Meshed region that needs to be enriched with composite information. + Use the ``CompositeModel.get_mesh()`` method to get the meshed region. + spot_reduction_strategy : + Reduction strategy for getting from spot values (BOT, MID, TOP) to a single value + per corner node and layer. The default is ``AVG``. + requested_location : + Location of the output field. Important: The function always averages nodal values + for ``"elemental"`` or ``"nodal"`` locations, + irrespective of ``"spot_reduction_strategy"``. + Options are ``"elemental"``, ``"elemental_nodal"``, and ``"nodal"``. + The default is ``"elemental_nodal"``. + component : + Component to extract data from. The default is ``0``. + """ + component_int = component.value if isinstance(component, IntEnum) else component + component_selector = operators.logic.component_selector() + + component_selector.inputs.field.connect(field) + component_selector.inputs.component_number.connect(component_int) + single_component_field = component_selector.outputs.field() + + filter_ply_data_op = Operator("composite::filter_ply_data_operator") + filter_ply_data_op.inputs.field(single_component_field) + filter_ply_data_op.inputs.mesh(mesh) + filter_ply_data_op.inputs.ply_id(ply_name) + filter_ply_data_op.inputs.reduction_strategy(spot_reduction_strategy.value) + elemental_nodal_data = filter_ply_data_op.outputs.field() + + if requested_location == locations.elemental_nodal: + return elemental_nodal_data + + if requested_location == locations.elemental: + # Note Jan 2024 we currently always average over the nodes in an element. It would also be + # useful to be able to get the max or min value over the nodes in an element. + # This could be done with the max_by_entity_operator but this workflow is currently + # broken due to BUG 964544 + elemental_nodal_to_elemental = operators.averaging.elemental_mean() + elemental_nodal_to_elemental.inputs.field.connect(elemental_nodal_data) + out_field = elemental_nodal_to_elemental.outputs.field() + out_field.location = locations.elemental + return out_field + + if requested_location == locations.nodal: + elemental_nodal_to_nodal = operators.averaging.elemental_nodal_to_nodal() + elemental_nodal_to_nodal.inputs.mesh.connect(mesh) + elemental_nodal_to_nodal.inputs.field.connect(elemental_nodal_data) + out_field = elemental_nodal_to_nodal.outputs.field() + out_field.location = locations.nodal + return out_field + + raise RuntimeError( + f"Invalid requested location {requested_location}. " + f"Valid locations are {locations.elemental_nodal}, " + f"{locations.elemental}, and {locations.nodal}." + ) diff --git a/src/ansys/dpf/composites/result_definition.py b/src/ansys/dpf/composites/result_definition.py index f8dcbe78f..7d0472e99 100644 --- a/src/ansys/dpf/composites/result_definition.py +++ b/src/ansys/dpf/composites/result_definition.py @@ -1,9 +1,32 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Object to represent the result definition used by the failure operator in DPF Composites.""" +from collections.abc import Sequence from dataclasses import dataclass, field from enum import Enum import json -from typing import Any, Dict, List, Optional, Sequence, Union +from typing import Any, Optional, Union from ._typing_helper import PATH as _PATH from .failure_criteria import CombinedFailureCriterion @@ -147,12 +170,12 @@ def scopes(self, value: Sequence[ResultDefinitionScope]) -> None: self._composite_scopes = value @property - def rst_files(self) -> List[_PATH]: + def rst_files(self) -> list[_PATH]: """Path of the result (RST) files.""" return self._rst_files @rst_files.setter - def rst_files(self, value: List[_PATH]) -> None: + def rst_files(self, value: list[_PATH]) -> None: self._rst_files = list(value) @property @@ -216,7 +239,7 @@ def max_chunk_size(self) -> int: def max_chunk_size(self, value: int) -> None: self._max_chunk_size = value - def to_dict(self) -> Dict[str, Any]: + def to_dict(self) -> dict[str, Any]: """Get the result definition in a dictionary representation.""" cfc = self.combined_failure_criterion if not cfc: @@ -243,9 +266,9 @@ def to_dict(self) -> Dict[str, Any]: def get_scope( result_definition_scope: ResultDefinitionScope, - rst_files: List[_PATH], + rst_files: list[_PATH], material_file: _PATH, - ) -> Dict[str, Any]: + ) -> dict[str, Any]: write_for_full_scope = result_definition_scope.write_data_for_full_element_scope mapping_entry = [] if result_definition_scope.mapping_file is not None: diff --git a/src/ansys/dpf/composites/sampling_point.py b/src/ansys/dpf/composites/sampling_point.py index 0e5d211d8..63049b534 100644 --- a/src/ansys/dpf/composites/sampling_point.py +++ b/src/ansys/dpf/composites/sampling_point.py @@ -1,6 +1,29 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Wrapper for the sampling point operator.""" +from collections.abc import Collection, Sequence import json -from typing import Any, Collection, Dict, List, Optional, Sequence, Union +from typing import Any, Optional, Union from ansys.dpf.core import UnitSystem import numpy as np @@ -21,9 +44,11 @@ ) from .constants import Spot from .failure_criteria import CombinedFailureCriterion +from .layup_info._layup_info import _get_layup_model_context from .layup_info.material_operators import MaterialOperators from .result_definition import FailureMeasureEnum from .sampling_point_types import FailureResult, SamplingPoint, SamplingPointFigure +from .server_helpers import version_equal_or_later from .unit_system import get_unit_system @@ -101,7 +126,7 @@ def __init__( self._rst_data_source = rst_data_source self._spots_per_ply = 0 - self._interface_indices: Dict[Spot, int] = {} + self._interface_indices: dict[Spot, int] = {} self._results: Any = None self._is_uptodate = False self._unit_system = get_unit_system(self._rst_data_source, default_unit_system) @@ -328,8 +353,14 @@ def run(self) -> None: ) evaluate_failure_criterion_per_scope_op.inputs.stream_provider(self._rst_streams_provider) evaluate_failure_criterion_per_scope_op.inputs.mesh(self._meshed_region) - has_layup_provider = True - evaluate_failure_criterion_per_scope_op.inputs.has_layup_provider(has_layup_provider) + # pylint: disable=protected-access + if version_equal_or_later(self._meshed_region._server, "8.0"): + layup_model_context = _get_layup_model_context(self._layup_provider) + evaluate_failure_criterion_per_scope_op.inputs.layup_model_context_type( + layup_model_context + ) + else: + evaluate_failure_criterion_per_scope_op.inputs.has_layup_provider(True) evaluate_failure_criterion_per_scope_op.inputs.section_data_container( self._layup_provider.outputs.section_data_container ) @@ -448,7 +479,7 @@ def get_offsets_by_spots( self._update_and_check_results() return get_offsets_by_spots_from_sp(self, spots, core_scale_factor) - def get_ply_wise_critical_failures(self) -> List[FailureResult]: + def get_ply_wise_critical_failures(self) -> list[FailureResult]: """Get the critical failure value and modes per ply.""" self._update_and_check_results() return get_ply_wise_critical_failures_from_sp(self) diff --git a/src/ansys/dpf/composites/sampling_point_2023r2.py b/src/ansys/dpf/composites/sampling_point_2023r2.py index f74c646fa..a978fb3de 100644 --- a/src/ansys/dpf/composites/sampling_point_2023r2.py +++ b/src/ansys/dpf/composites/sampling_point_2023r2.py @@ -1,7 +1,30 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Wrapper for the sampling point operator.""" +from collections.abc import Collection, Sequence import hashlib import json -from typing import Any, Collection, Dict, List, Optional, Sequence, Union +from typing import Any, Optional, Union import ansys.dpf.core as dpf from ansys.dpf.core import UnitSystem @@ -89,7 +112,7 @@ def __init__( self._result_definition = result_definition self._spots_per_ply = 0 - self._interface_indices: Dict[Spot, int] = {} + self._interface_indices: dict[Spot, int] = {} self._name = name used_server = get_or_create_server(server) if not used_server: @@ -400,7 +423,7 @@ def get_offsets_by_spots( self._update_and_check_results() return get_offsets_by_spots_from_sp(self, spots, core_scale_factor) - def get_ply_wise_critical_failures(self) -> List[FailureResult]: + def get_ply_wise_critical_failures(self) -> list[FailureResult]: """Get the critical failure value and modes per ply.""" self._update_and_check_results() return get_ply_wise_critical_failures_from_sp(self) diff --git a/src/ansys/dpf/composites/sampling_point_types.py b/src/ansys/dpf/composites/sampling_point_types.py index 0f10a84c5..ad796bd42 100644 --- a/src/ansys/dpf/composites/sampling_point_types.py +++ b/src/ansys/dpf/composites/sampling_point_types.py @@ -1,6 +1,29 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Wrapper for the sampling point operator.""" +from collections.abc import Collection, Sequence import dataclasses -from typing import Any, Collection, List, Protocol, Sequence, Union +from typing import Any, Protocol, Union import numpy as np import numpy.typing as npt @@ -246,7 +269,7 @@ def get_offsets_by_spots( Factor for scaling the thickness of core plies. """ - def get_ply_wise_critical_failures(self) -> List[FailureResult]: + def get_ply_wise_critical_failures(self) -> list[FailureResult]: """Get the critical failure value and modes per ply.""" def get_polar_plot( diff --git a/src/ansys/dpf/composites/select_indices.py b/src/ansys/dpf/composites/select_indices.py index f05ef647f..2e4c8798e 100644 --- a/src/ansys/dpf/composites/select_indices.py +++ b/src/ansys/dpf/composites/select_indices.py @@ -1,5 +1,28 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Functions to get elementary indices based on filter input.""" -from typing import Collection, Optional +from collections.abc import Collection +from typing import Optional import numpy as np from numpy.typing import NDArray @@ -55,6 +78,13 @@ def get_selected_indices( Notes ----- Returns an empty selection if any of the collections is empty. + + The indices (nodes, layers, and spots) are 0-based. Pay attention to this + when using the "composite::minmax_per_element_operator" or + :func:`evaluate_failure_criteria + ` + where the min/max layer indices + are 1-based starting with Workbench 2024 R1 (DPF server 7.1). """ if layers is None: layer_indices: Collection[int] = range(element_info.n_layers) diff --git a/src/ansys/dpf/composites/server_helpers/__init__.py b/src/ansys/dpf/composites/server_helpers/__init__.py index 675b20ed5..9201489f2 100644 --- a/src/ansys/dpf/composites/server_helpers/__init__.py +++ b/src/ansys/dpf/composites/server_helpers/__init__.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Utilities for managing the DPF server. Helper functions for managing the DPF server, in particular for loading @@ -8,6 +30,7 @@ from ._load_plugin import load_composites_plugin from ._upload_files_to_server import ( upload_continuous_fiber_composite_files_to_server, + upload_file_to_unique_tmp_folder, upload_short_fiber_composite_files_to_server, ) from ._versions import version_equal_or_later, version_older_than @@ -16,6 +39,7 @@ "load_composites_plugin", "connect_to_or_start_server", "upload_short_fiber_composite_files_to_server", + "upload_file_to_unique_tmp_folder", "upload_continuous_fiber_composite_files_to_server", "version_older_than", "version_equal_or_later", diff --git a/src/ansys/dpf/composites/server_helpers/_connect_to_or_start_server.py b/src/ansys/dpf/composites/server_helpers/_connect_to_or_start_server.py index 5fc424ef3..c67e13205 100644 --- a/src/ansys/dpf/composites/server_helpers/_connect_to_or_start_server.py +++ b/src/ansys/dpf/composites/server_helpers/_connect_to_or_start_server.py @@ -1,10 +1,32 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Helpers to connect to or start a DPF server with the DPF Composites plugin.""" import os -from typing import Any, Callable, Dict, Optional, Union +from typing import Any, Callable, Optional, Union from ansys.dpf.core import connect_to_server from ansys.dpf.core import server as _dpf_server -from ansys.dpf.core import server_context, start_local_server +from ansys.dpf.core import start_local_server from ansys.dpf.composites.server_helpers._load_plugin import load_composites_plugin @@ -68,7 +90,7 @@ def connect_to_or_start_server( if port_in_env is not None: port = int(port_in_env) - connect_kwargs: Dict[str, Union[int, str]] = {} + connect_kwargs: dict[str, Union[int, str]] = {} if port is not None: connect_kwargs["port"] = port if ip is not None: @@ -77,16 +99,10 @@ def connect_to_or_start_server( if len(list(connect_kwargs.keys())) > 0: server = connect_to_server( **connect_kwargs, - context=_dpf_server.server_context.ServerContext( - server_context.LicensingContextType.premium - ), ) else: server = start_local_server( ansys_path=ansys_path, - context=_dpf_server.server_context.ServerContext( - server_context.LicensingContextType.premium - ), ) required_version = "6.0" diff --git a/src/ansys/dpf/composites/server_helpers/_load_plugin.py b/src/ansys/dpf/composites/server_helpers/_load_plugin.py index 51ca1e13b..2abcba4d2 100644 --- a/src/ansys/dpf/composites/server_helpers/_load_plugin.py +++ b/src/ansys/dpf/composites/server_helpers/_load_plugin.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Helper to load composites plugin.""" import os import pathlib diff --git a/src/ansys/dpf/composites/server_helpers/_upload_files_to_server.py b/src/ansys/dpf/composites/server_helpers/_upload_files_to_server.py index 007bc8fc5..5322a6f9b 100644 --- a/src/ansys/dpf/composites/server_helpers/_upload_files_to_server.py +++ b/src/ansys/dpf/composites/server_helpers/_upload_files_to_server.py @@ -1,4 +1,28 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import pathlib from typing import cast +import uuid import ansys.dpf.core as dpf from ansys.dpf.core.server_types import BaseServer @@ -11,6 +35,34 @@ ) +def upload_file_to_unique_tmp_folder(path_on_client: _PATH, server: BaseServer) -> str: + """Upload file to a unique temporary folder on the server. + + Parameters + ---------- + path_on_client: + Client side path of the file which should be uploaded to the server. + server: + DPF server. + """ + tmp_dir = pathlib.Path( + dpf.make_tmp_dir_server() + ) # Returns the dpf tmp folder (only one per server) + path_on_client = pathlib.Path(path_on_client) + if server.os == "posix": + path_on_server = str(tmp_dir) + "/" + str(uuid.uuid4()) + "/" + path_on_client.name + else: + path_on_server = str(tmp_dir) + "\\" + str(uuid.uuid4()) + "\\" + path_on_client.name + + uploaded_path = cast(str, dpf.upload_file(path_on_client, path_on_server, server=server)) + if uploaded_path == "": + raise RuntimeError( + f"Failed to upload file {path_on_client} to server. " + f"Attempted to upload to {path_on_server}." + ) + return uploaded_path + + def upload_short_fiber_composite_files_to_server( data_files: ShortFiberCompositesFiles, server: BaseServer ) -> ShortFiberCompositesFiles: @@ -27,7 +79,7 @@ def upload_short_fiber_composite_files_to_server( return data_files def upload(filename: _PATH) -> str: - return cast(str, dpf.upload_file_in_tmp_folder(filename, server=server)) + return upload_file_to_unique_tmp_folder(filename, server=server) return ShortFiberCompositesFiles( rst=[upload(filename) for filename in data_files.rst], @@ -55,7 +107,7 @@ def upload_continuous_fiber_composite_files_to_server( return data_files def upload(filename: _PATH) -> _PATH: - return cast(str, dpf.upload_file_in_tmp_folder(filename, server=server)) + return upload_file_to_unique_tmp_folder(filename, server=server) all_composite_files = {} for key, composite_files_by_scope in data_files.composite.items(): diff --git a/src/ansys/dpf/composites/server_helpers/_versions.py b/src/ansys/dpf/composites/server_helpers/_versions.py index a329d73f9..92d7f8d81 100644 --- a/src/ansys/dpf/composites/server_helpers/_versions.py +++ b/src/ansys/dpf/composites/server_helpers/_versions.py @@ -1,5 +1,26 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + import dataclasses -from typing import Dict from ansys.dpf.core.server_types import BaseServer from packaging import version @@ -12,9 +33,18 @@ class _DpfVersionInfo: description: str -_DPF_VERSIONS: Dict[str, _DpfVersionInfo] = { +_DPF_VERSIONS: dict[str, _DpfVersionInfo] = { "5.0": _DpfVersionInfo("5.0", "2023 R1", "Initial release of DPF Composites."), - "7.0": _DpfVersionInfo("7.0", "2024 R1", "DPF Composites plugin with sub-operators."), + "7.0": _DpfVersionInfo("7.0", "2024 R1 pre 0", "DPF Composites plugin with sub-operators."), + "7.1": _DpfVersionInfo( + "7.1", "2024 R1", "DPF Composites: layer index starts at 1. Material names." + ), + "8.0": _DpfVersionInfo( + "8.0", + "2024 R2 pre 0", + "DPF Composites: reference surface support and \ + section data from RST", + ), } diff --git a/src/ansys/dpf/composites/unit_system.py b/src/ansys/dpf/composites/unit_system.py index ec0377c65..37727fe26 100644 --- a/src/ansys/dpf/composites/unit_system.py +++ b/src/ansys/dpf/composites/unit_system.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + """Unit system helper.""" __all__ = ("get_unit_system", "UnitSystemProvider") @@ -41,9 +63,8 @@ def get_unit_system( if default_unit_system is None: raise RuntimeError( "The result file does not specify a unit system." - " Please define a default unit system. " - "A default unit system can be passed when " - "creating a CompositeModel." + " A default unit system must be defined.. " + "It can be passed when creating a CompositeModel." ) return default_unit_system else: diff --git a/tests/__init__.py b/tests/__init__.py index e69de29bb..3bc3c8e5b 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -0,0 +1,21 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. diff --git a/tests/basic_workflow_test.py b/tests/basic_workflow_test.py index c9b92922a..c9efdc5ae 100644 --- a/tests/basic_workflow_test.py +++ b/tests/basic_workflow_test.py @@ -1,9 +1,33 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + import os import pathlib import ansys.dpf.core as dpf import pytest +from ansys.dpf.composites.server_helpers import upload_file_to_unique_tmp_folder + from .utils import get_basic_combined_failure_criterion @@ -20,10 +44,12 @@ def test_basic_workflow(dpf_server, distributed_rst): material_path = os.path.join(TEST_DATA_ROOT_DIR, "material.engd") if not dpf_server.local_server: - rst_paths = [dpf.upload_file_in_tmp_folder(path, server=dpf_server) for path in rst_paths] + rst_paths = [ + upload_file_to_unique_tmp_folder(path, server=dpf_server) for path in rst_paths + ] - h5_path = dpf.upload_file_in_tmp_folder(h5_path, server=dpf_server) - material_path = dpf.upload_file_in_tmp_folder(material_path, server=dpf_server) + h5_path = upload_file_to_unique_tmp_folder(h5_path, server=dpf_server) + material_path = upload_file_to_unique_tmp_folder(material_path, server=dpf_server) eng_data_path = material_path composite_definitions_path = h5_path @@ -87,6 +113,8 @@ def test_basic_workflow(dpf_server, distributed_rst): failure_evaluator.inputs.stresses_container(stress_operator.outputs.fields_container) failure_evaluator.inputs.mesh(mesh_provider.outputs.mesh) + # Note: the min/max layer indices are 1-based starting with + # Workbench 2024 R1 (DPF server 7.1) minmax_per_element = dpf.Operator("composite::minmax_per_element_operator") minmax_per_element.inputs.fields_container(failure_evaluator.outputs.fields_container) minmax_per_element.inputs.mesh(mesh_provider.outputs.mesh) diff --git a/tests/composite_model_scoping_test.py b/tests/composite_model_scoping_test.py index c0bbfb914..b1a5ff6d2 100644 --- a/tests/composite_model_scoping_test.py +++ b/tests/composite_model_scoping_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + import pathlib import numpy as np @@ -58,8 +80,8 @@ def test_composite_model_named_selection_scope(dpf_server, data_files, distribut failure_container = composite_model.evaluate_failure_criteria(cfc, scope) irfs = failure_container.get_field({"failure_label": FailureOutput.FAILURE_VALUE}) assert len(irfs.data) == 2 - assert irfs.data[0] == pytest.approx(1.4792790331384016, 1e-8) - assert irfs.data[1] == pytest.approx(1.3673715033617213, 1e-8) + assert irfs.get_entity_data_by_id(2) == pytest.approx(1.4792790331384016, 1e-8) + assert irfs.get_entity_data_by_id(3) == pytest.approx(1.3673715033617213, 1e-8) def test_composite_model_ply_scope(dpf_server): @@ -102,21 +124,50 @@ def test_composite_model_ply_scope(dpf_server): if version_older_than(dpf_server, "7.0"): # the old implementation did not allow to distinguish between plies of the different parts. # So both plies select the shell and solid elements. + expected_irfs_by_element_id = { + 1: 0.66603946, + 2: 0.66603946, + 7: 3.24925826, + 8: 3.24925826, + 9: 0.52981576, + 10: 0.52981576, + } + + expected_modes_by_element_id = {1: 310.0, 2: 310.0, 7: 310.0, 8: 310.0, 9: 212.0, 10: 222.0} assert len(irfs.data) == 6 - assert irfs.data == pytest.approx( - np.array([0.66603946, 0.66603946, 3.24925826, 0.52981576, 3.24925826, 0.52981576]), - abs=1e-3, - ) - assert modes.data == pytest.approx( - np.array([310.0, 310.0, 310.0, 222.0, 310.0, 212.0]), abs=0.1 - ) + for element_id in irfs.scoping.ids: + assert expected_irfs_by_element_id[element_id] == pytest.approx( + irfs.get_entity_data_by_id(element_id), abs=1e-3 + ) + assert expected_modes_by_element_id[element_id] == pytest.approx( + modes.get_entity_data_by_id(element_id), abs=0.1 + ) + else: # ply scoping is now part specific thanks to the labels assert len(irfs.data) == 4 - assert irfs.data == pytest.approx( - np.array([0.14762838, 0.14762838, 3.24925826, 3.24925826]), abs=1e-3 - ) - assert modes.data == pytest.approx(np.array([222, 212, 310, 310]), abs=0.1) + + expected_irfs_by_element_id = { + 1: 0.14762838, + 2: 0.14762838, + 7: 3.24925826, + 8: 3.24925826, + } + + expected_modes_by_element_id = { + 1: 222, + 2: 212, + 7: 310, + 8: 310, + } + + for element_id in irfs.scoping.ids: + assert irfs.get_entity_data_by_id(element_id) == pytest.approx( + expected_irfs_by_element_id[element_id], abs=1e-3 + ) + assert modes.get_entity_data_by_id(element_id) == pytest.approx( + expected_modes_by_element_id[element_id], abs=1e-1 + ) def test_composite_model_named_selection_and_ply_scope(dpf_server, data_files, distributed_rst): @@ -147,8 +198,15 @@ def test_composite_model_named_selection_and_ply_scope(dpf_server, data_files, d modes = failure_container.get_field({"failure_label": FailureOutput.FAILURE_MODE}) assert len(irfs.data) == 2 assert len(modes.data) == 2 - assert irfs.data == pytest.approx(np.array([0.49282684, 0.32568454]), abs=1e-3) - assert modes.data == pytest.approx(np.array([222.0, 222.0]), abs=1e-1) + expected_irfs_by_id = {2: 0.49282684, 3: 0.32568454} + expected_modes_by_id = {2: 222.0, 3: 222.0} + for element_id in irfs.scoping.ids: + assert irfs.get_entity_data_by_id(element_id) == pytest.approx( + expected_irfs_by_id[element_id], abs=1e-3 + ) + assert modes.get_entity_data_by_id(element_id) == pytest.approx( + expected_modes_by_id[element_id], abs=1e-1 + ) def test_composite_model_time_scope(dpf_server): @@ -173,6 +231,5 @@ def test_composite_model_time_scope(dpf_server): scope = CompositeScope(time=time) failure_container = composite_model.evaluate_failure_criteria(cfc, scope) irfs = failure_container.get_field({"failure_label": FailureOutput.FAILURE_VALUE}) - modes = failure_container.get_field({"failure_label": FailureOutput.FAILURE_MODE}) assert len(irfs.data) == 4 assert max(irfs.data) == pytest.approx(expected_max_irf, abs=1e-6) diff --git a/tests/composite_model_test.py b/tests/composite_model_test.py index 04b13aa89..c2ba894e1 100644 --- a/tests/composite_model_test.py +++ b/tests/composite_model_test.py @@ -1,20 +1,50 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + import pathlib from ansys.dpf.core import unit_systems import pytest from ansys.dpf.composites.composite_model import CompositeModel, CompositeScope -from ansys.dpf.composites.constants import FailureOutput +from ansys.dpf.composites.constants import FAILURE_LABEL, FailureOutput from ansys.dpf.composites.data_sources import ( CompositeDefinitionFiles, ContinuousFiberCompositesFiles, get_composite_files_from_workbench_result_folder, ) -from ansys.dpf.composites.failure_criteria import CombinedFailureCriterion, MaxStressCriterion -from ansys.dpf.composites.layup_info import LayerProperty, get_analysis_ply_index_to_name_map +from ansys.dpf.composites.failure_criteria import ( + CombinedFailureCriterion, + FailureModeEnum, + MaxStressCriterion, +) +from ansys.dpf.composites.layup_info import ( + LayerProperty, + LayupModelContextType, + get_analysis_ply_index_to_name_map, +) from ansys.dpf.composites.layup_info.material_properties import MaterialProperty from ansys.dpf.composites.result_definition import FailureMeasureEnum -from ansys.dpf.composites.server_helpers import version_older_than +from ansys.dpf.composites.server_helpers import version_equal_or_later, version_older_than from .helper import Timer @@ -29,6 +59,8 @@ def test_basic_functionality_of_composite_model(dpf_server, data_files, distribu timer = Timer() composite_model = CompositeModel(data_files, server=dpf_server) + if version_equal_or_later(dpf_server, "8.0"): + assert composite_model.layup_model_type == LayupModelContextType.ACP timer.add("After Setup model") combined_failure_criterion = CombinedFailureCriterion( @@ -83,11 +115,68 @@ def test_basic_functionality_of_composite_model(dpf_server, data_files, distribu assert [ply["id"] for ply in sampling_point.analysis_plies] == analysis_ply_ids + if version_equal_or_later(dpf_server, "7.1"): + ref_material_names = [ + "Epoxy Carbon UD (230 GPa) Prepreg", + "Epoxy Carbon Woven (230 GPa) Wet", + "Honeycomb", + "Structural Steel", + ] + mat_names = composite_model.material_names + assert len(mat_names) == len(ref_material_names) + for mat_name in ref_material_names: + assert mat_name in mat_names.keys() + timer.add("After getting properties") timer.summary() +def test_model_with_multiple_timesteps(dpf_server): + TEST_DATA_ROOT_DIR = ( + pathlib.Path(__file__).parent / "data" / "workflow_example" / "multiple_time_steps" + ) + + data_files = get_composite_files_from_workbench_result_folder(TEST_DATA_ROOT_DIR) + + composite_model = CompositeModel(data_files, server=dpf_server) + + combined_failure_criterion = CombinedFailureCriterion( + "max stress", failure_criteria=[MaxStressCriterion()] + ) + + expected_data_by_time_index = { + 0: {1: 1.47927903, 2: 1.47927903, 3: 1.3673715, 4: 1.3673715}, + 1: {1: 0.09834992, 2: 0.09834992, 3: 0.06173922, 4: 0.06173922}, + } + + for time_index, time in enumerate(composite_model.get_result_times_or_frequencies()): + failure_output = composite_model.evaluate_failure_criteria( + combined_criterion=combined_failure_criterion, + composite_scope=CompositeScope(time=time), + ) + + # Note evaluate_failure_criteria supports only a single time step + irf_field = failure_output.get_field({FAILURE_LABEL: FailureOutput.FAILURE_VALUE}) + + for element_id, expected_value in expected_data_by_time_index[time_index].items(): + assert irf_field.get_entity_data_by_id(element_id) == pytest.approx(expected_value) + + # Just check that the other fields are available + def check_field_size(failure_label: FailureOutput): + field = failure_output.get_field({FAILURE_LABEL: failure_label}) + assert len(field.scoping.ids) == 4 + + check_field_size(FailureOutput.FAILURE_MODE) + check_field_size(FailureOutput.MAX_LAYER_INDEX) + + if version_equal_or_later(dpf_server, "8.0"): + check_field_size(FailureOutput.FAILURE_MODE_REF_SURFACE) + check_field_size(FailureOutput.MAX_GLOBAL_LAYER_IN_STACK) + check_field_size(FailureOutput.MAX_LOCAL_LAYER_IN_ELEMENT) + check_field_size(FailureOutput.MAX_SOLID_ELEMENT_ID) + + def test_assembly_model(dpf_server): """Verify the handling of assemblies.""" @@ -103,7 +192,7 @@ def test_assembly_model(dpf_server): composite_model = CompositeModel(files, server=dpf_server) timer.add("After Setup model") - assert composite_model.composite_definition_labels == [solid_label, shell_label] + assert sorted(composite_model.composite_definition_labels) == sorted([solid_label, shell_label]) combined_failure_criterion = CombinedFailureCriterion( "max strain & max stress", failure_criteria=[MaxStressCriterion()] @@ -115,6 +204,12 @@ def test_assembly_model(dpf_server): ) timer.add("After get failure output") + + def check_output(failure_label: FailureOutput, expected_output: dict[int, float]): + for element_id, expected_value in expected_output.items(): + failure_field = failure_output.get_field({FAILURE_LABEL: failure_label}) + assert failure_field.get_entity_data_by_id(element_id) == pytest.approx(expected_value) + expected_output = { 1: 1.11311715, 2: 1.11311715, @@ -125,9 +220,72 @@ def test_assembly_model(dpf_server): 9: 0.62122959, 10: 0.62122959, } + check_output(FailureOutput.FAILURE_VALUE, expected_output) + + expected_modes = { + 1: FailureModeEnum.s1t.value, + 2: FailureModeEnum.s1t.value, + 5: FailureModeEnum.s2t.value, + 6: FailureModeEnum.s2t.value, + 7: FailureModeEnum.na.value, + 8: FailureModeEnum.na.value, + 9: FailureModeEnum.s2t.value, + 10: FailureModeEnum.s2t.value, + } + check_output(FailureOutput.FAILURE_MODE, expected_modes) + + expected_layer_index = { + 1: 2, + 2: 2, + 5: 2, + 6: 2, + 7: 1, + 8: 1, + 9: 1, + 10: 1, + } + + if not version_equal_or_later(dpf_server, "7.1"): + for element_id in expected_layer_index: + # Older versions of the server returned a layer index that starts + # at 0 instead of 1 + expected_layer_index[element_id] -= 1 + + check_output(FailureOutput.MAX_LAYER_INDEX, expected_layer_index) + + expected_output_ref_surface = { + 1: 1.85777034, + 2: 1.85777034, + 3: 1.11311715, + 4: 1.11311715, + } - for element_id, expected_value in expected_output.items(): - assert failure_output[1].get_entity_data_by_id(element_id) == pytest.approx(expected_value) + if version_equal_or_later(dpf_server, "8.0"): + check_output(FailureOutput.FAILURE_VALUE_REF_SURFACE, expected_output_ref_surface) + + expected_output_local_layer = { + 1: 2, + 2: 2, + 3: 2, + 4: 2, + } + check_output(FailureOutput.MAX_LOCAL_LAYER_IN_ELEMENT, expected_output_local_layer) + + expected_output_global_layer = { + 1: 2, + 2: 2, + 3: 2, + 4: 2, + } + check_output(FailureOutput.MAX_GLOBAL_LAYER_IN_STACK, expected_output_global_layer) + + expected_output_solid_element = { + 1: 5, + 2: 6, + 3: 1, + 4: 2, + } + check_output(FailureOutput.MAX_SOLID_ELEMENT_ID, expected_output_solid_element) property_dict = composite_model.get_constant_property_dict( [MaterialProperty.Stress_Limits_Xt], composite_definition_label=solid_label diff --git a/tests/conftest.py b/tests/conftest.py index fb9314d38..1c039cbcb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,29 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from __future__ import annotations from collections import namedtuple +from collections.abc import Mapping from contextlib import closing import os import pathlib @@ -8,7 +31,6 @@ import subprocess import sys from types import MappingProxyType -from typing import Mapping import uuid import ansys.dpf.core as dpf @@ -30,6 +52,7 @@ LICENSE_SERVER_OPTION_KEY = "--license-server" ANSYSLMD_LICENSE_FILE_KEY = "ANSYSLMD_LICENSE_FILE" DOCKER_IMAGE_TAG_KEY = "--image-tag" +DEFAULT_DOCKER_IMAGE_TAG = "latest" def pytest_addoption(parser: pytest.Parser) -> None: @@ -58,7 +81,7 @@ def pytest_addoption(parser: pytest.Parser) -> None: parser.addoption( DOCKER_IMAGE_TAG_KEY, action="store", - default="latest", + default=DEFAULT_DOCKER_IMAGE_TAG, help="Tag of pydpf-composites container to start for the tests. Default is 'latest'.", ) @@ -193,11 +216,7 @@ def __init__(self, ansys_path: str): self.ansys_path = ansys_path def __enter__(self): - context = dpf.server.server_context.ServerContext( - dpf.server_context.LicensingContextType.premium - ) - - server = dpf.start_local_server(ansys_path=self.ansys_path, context=context) + server = dpf.start_local_server(ansys_path=self.ansys_path) return ServerContext(port=None, platform=sys.platform, server=server) def __exit__(self, *args): @@ -259,7 +278,7 @@ def dpf_server(request: pytest.FixtureRequest): ] if len(active_options) > 1: - if (docker_image_tag is not None) and docker_image_tag == "latest": + if (docker_image_tag is not None) and docker_image_tag == DEFAULT_DOCKER_IMAGE_TAG: # We don't want to fail if docker_image_tag is not set explicitly # because it has a default value. docker_image_tag = None @@ -299,9 +318,7 @@ def start_server(): server = _try_until_timeout(start_server, "Failed to start server.") _wait_until_server_is_up(server) - server.apply_context( - dpf.server.server_context.ServerContext(dpf.server_context.LicensingContextType.premium) - ) + load_composites_plugin(server, ansys_path=installer_path) yield server diff --git a/tests/data/model_with_beams_shells_solids/mixed_model.wbpz b/tests/data/model_with_beams_shells_solids/mixed_model.wbpz new file mode 100644 index 0000000000000000000000000000000000000000..6b4a4cd0e92bd245ab360242b80e5a7961797520 GIT binary patch literal 356396 zcmZ7cbyOSA`vwft(n9g}1BK#kX>oT?i?c z2ytHjAMgn06%LY7P$cim;-mj>eoRmBA$r_XB4j7xE5)uf;i^2v7sZ0#hSflXhmCzL z@VCrBhJ?$Gv`bbqIE>PviuMOBq(qu1O8*z8%gp;gVZ*a=+Dt;IBjvCRfJki1j`by?;hI zANSt$V>%NHtKeI$=R;B1uUl##%ZeT#sX3l)%3qSc8X};OQ=E|4tbGRnLDphB0}0jz zwemFN9&iES6L59u>iau8l|C*invOar2%fb1(+BUWznd4l@a(VJkH;f;s9P=;=(sC# zDf3=pNKbWMhVg_mK4qj{(@gRjA8E^A!-?E1c6rUCL8|rBZ~SuyZ|WNeqooIwU4t(Z zBb}x0!vb!OG40pIcyef1p9{NhQb;sE|3TGcXjElZ zbsrhEE9=(BX*>j3n%^=En=m`?wmS0?YI2c~sz;-M9=mE2pY7E>>DptDeHcTDcU(Ud zgxqtk1&=GhBy9XMCLIT+PE1%XUjeJ!7UcspRJG=nj{8x=AP>p5!_Dx#pr0&9Jf*N7 zvwt_d`r=muF<*ksV93-5I0#kd1qH z+?4~F;@{E6!)p?#Z+^fNRLgb&Lu(01M(zHgl@#p69AWKX>ls>)NXF#pX07!G)NZbv zXI+f?R-30K7t*`djn}0tL#BmKQ#KOa@HVH=n^~J`Q zykAn?6>bta-#zXx%FNO(m!*%kvaDSS*B24Sd1WIDcV(qlmY1onZGExtiQE`bS@-3` z6w}mM$^aGzkbdRtFY}h-Wi_~t{#OZJdtf7nflSl(gQLjQvUGL#>=I23$xSo^<11(D zy&@M?yX$ki84CnSDcrtkEghYSUl_;{4!9$1ba^b~` zZ{sayG5TrOh_Bw`4q*zv+@~8W9hWNat84-mwvn^U@2j{aJYk;ReozmirOJ(Vb%1z) zXUF#3pGNYFN~EDsL-QTdww-b`YsU1i>3UmfrKH~SSoHbazBrkuUH>GeN!)%dmK}|D zx4&`+xvqPmmV8o3;MXf{+&5W>3y(^{l!mtcJtjwddy#5l7eKPM#K6XvG#zU+C;-g= z-noArBpJ0nQ3vJek&(797g!LB@m@f*6Tp00s$4Gf>f9IyC2T6g`j%u?JMJ4eI+ z^K7;m5%d7`#XC+F-*0l<0`s)cG&#c^9Xo9MdJ!JXvc71nGii10(JZGr0|+AIO!N?xMi{y!+m<&NQdKmQ|F0b?(bYC!QCUtR$wCrK=Q zfQ{{_6ns+GR}c{4{c$N}Asv-v+)_fqu!~+4ngLuLj5#~M0YZS!m78{R!R`*F9Z?ci zI=3$82U5Oksd1o{*<$McN^FeP0NNhPuTW5fwyzhlyLz=Vp8oM6r8v1n(CRa$UiY@> zymn=&`1JIi8TV+H139xH+b>Jgr>3{AC^g`j3+C}@tC5^OGFtLtLOk)uDax(6nehz1 zZQK#?6P}@(1SB7jvrcsC=X^DKODZ0;Bfz>)EaIDElD+p9WdBUFvn*YI?HjgMU$Ou^+3lx~@c7W6m6(mOL6hh_@4ywf@uC$z5d8 z2@5LzZT#g5zkLQ_2j~xZQ?K0h%_O+Rmw|)uy0`5>K(TVd-~pztBk#+>`!z7|e_nk9 z^!LNaFREaCc`lD~DKs*yQm9>F%`ZO}`sUzrT{8>c+7V5c#XrA?&X*w385x`Tnj(Cp zOe&D)^XCx@x98Uk1`04HZxY#}K*(*>?6N;9aa0%Gy8ns5M=JfRiTTlo^<~36Jl~V` zq6Uwn4_0!mhk04xCh+y$Y21=y_A=1Cznp zz)X9JGxj|Q@tey4|5JnNWs^iPd_w`H)Es*DCzB3z2_L<7COe5)7v1trO7%Qy}ufEU~Oz3 zPdab)1aPi8W;;2J-1Zm_=Ey~rjPjAL+#MS^tfSAauBm3Qdww;uMM?978bXAQexL1* zM07nrZH0?mNTX6)&OgGEF(uu1v1@w)J@;E<31=h_Eq!n2sVzmuHR@)oFd5U!-aaoXL?atxT!U4G1YAg_#I%G8?E5j-EcBvvZvLACFRn>V&Ms_z zpM4MC^*~O>Ei)_IN?O+&k*J&ii_O)*-hTdD{Pi}FLXvnHYrXqg^jzMfa*ZSxdq1h$ zn1sD{gbA3aW3TRWJ1)H)iJq{i$#&Q8251Z+{j?9)aI_M_x?cL&H&19DB(Fw2&;&5P zLiAifh35g)x0rWnq2wh*x2s+P1S6pl*%YmG#{^5}rM6BPXmdpZMb*MUpH)+qq+#;JE2@H^|CO`pWj$G>?$VET(-ocd2l$%3@Z5#n)4X z_25hm`FF6K&U`8rTJYZZ*3PpKwTLsnlo-cntFk42ePn40m{wZ0vrtx&9X=J}DRoG; zrhf3p{^003(&;OT_H#l0YOxwuouzR&XPf{X-FY~h$cms0OaZfQ7m3H3JO&OOi=#E* zk;EP~m8*(;(0EI8<|c&zH=jq_+SsUmIc9Nj$Dv!Gg+Np6WS-My6;O}*vyG)Y@RPaj zx-=DNz=NF^P+F0(Un}xu?Hd@K%$8iSK$}Q}w$thk$`8Hjjdzk$!}^Y-QgxAg+i5q4 z(fu=+6k~Ut9bO4Lh{4HR&GP4VzU|wj2Zdrt74-@-WZHC|#8ZMy&>TjPN+(d-aoF|* z`YK~X1j5qF0Q{cRB;WzfTO!R>ZrCs<>#jT}e_j&R`O-ZW#4$=)i9N zULoiYPA~T=*`z(WwQg{#-g;=Y9W(V;+F$9T9HXCx*YO;<2G}h0hu)DxvSLs6C{7H# zs!sL(e!fn0PXuV*<_hG*cKT@_iLQ1ns={fFs}oI39Qiu7Q*r0G!<)opHIdMMOZOX) zQe($#X`A>qu=hf|w7T4!vA()u`M<1?xeb3znY)Dz(^&nV;JS{*lyJ_Gp@YNo_Wkat zhw(F2Ws(4)UM9KWkaF@&$EvM$w&7UD*cF3ver&_^+8rh~8qUQYN-tq_ZMcDGQlZ@% zN9#!cX>mWeT)OTXhegIEIyA*+%Q710#}}()o_o6H+TUbf&6(4jFjOf4E}imH zBs^`by=QpMJtPlyny25r_rX;BSkwNGXAO8YXzPd0;c-QwB!w>Jn)Dn3E4Q0h1IFSQ zYzx^ZHK$+@{i&{rMqZ_MN7Z24sJYt|=~sr8qY|xoWw;V!ob6OIv&c;ZeK-FF;T~jm z30m)Ooo}q$(96m=@6)fDMKuDsP&c`duFh(hJxw+iT8g%xvce1pQTl|3SD$O7`z}O%a34J)6G#d_v``Gpi_CK?; zagi>EO#oBYej%D&kIwF)4%gFu>*wonY<*;np9*KTiyIw9=cGH`Khy(}^hlM;aRSbX zffeYoKUn+fxJ9kfw^$99D-DA?u4@y`IT++-+#T0xU$pD)H5dwxw4da4lcT<^6bbDs zK`Oc`rd2~LMN+}xt@f7f0!c3A_ef>KbORuw$r)c8g=HC#s&>mZmpHjyVOG)jZlqS# ze#A^t-g0sVP{Q+AcA4C@>o1^0G$89M&fn}s55-s8&uIGLYtWCd?E$x{~=*Wt77O2fa6Iv${uWu&$ygC5qt_S3Pn=u+uSh863dy={6+ zsM_xunW?%ptGX)Y&QXPV5^YQI<#Vy%7X1&aOD8AqHms|^B;1<|UrZWE0a0k;=b zv9mnk#&id~dDe4iofqokYM(&xR_RBlHI914wF0;w4Ppj zdwuix2P#+1YjY(>!S({}rOLiH3zpdrN_pG{sS9!=-U-r6pkstM9_fCKM15qc*g!{L z=F4iTbHlu>OL};|H`-#~&X-(mY*=S^94je^T=^q~+dQjGJk2iUBUQ4Lxnf;NzbweQ z(CDBi1HXUodp$}_5T&;akvI=~f4=$t%|j`5*?ACtN- zdW9!V5>+420y-<4TMespL*{r$fhK!6x<64~b~x(DpX~jlRZ9324`j z-2GhEI(;PL#tRb#ugx_G%kL+*v(tB(Y-yJwOH zAg)m|7EF+@;pW)llA|YMusxwl{j!rIaWi;}u5O!-fk*G&7~*CrVa;$kF=JbJtZua8 zG^soDD)m;3*B{uKYRi~t?djM4_rzwH{DIVDAK#xtbaE}HGob9_P z+24AsU|196=+4q$t^$!{?M%6lA_+OKqv$y0xwmKNVi zOvC&=sZcY}F7H-InzOZV9)mt2xAvn*USsABF% zK7HGvv0OMPupe?1=_<#KsU>Z@oj>Z!>E_a30P^p-dEOXq`)>}DC=l_aJ4ek(>icHt z%Jgep2^hB}5_mR@fZE4Bm)x*+o_NP_Y@rj1W# zU@uF0@Zc@=e!|P%d`a^oH35Zo2QHwrn39~$888r+rMxWuf*-KuiyBUUGwy$>Q9pN$ ze0Xp_O^56;n)`-@lL%$lGKt0|bi7}_+$dFzvi4_<@WBZC&YK$V#DZGZiArIuRI|G( zRFzHB(BqDF7qW|k)@fS=<&pL}rO7Z&2L}015S2|{I+I?*j+R!8iXsK?#8+NG@31K@{B)GsW7vY`7`Xhje8f`rpC>EW|^i1E%j)X zHp~|d?T2Z@=}8+No=dPy*`;`M<(ZaSVDW)?s>^$e-aX!}Cz@L~ah2iWv3$G+!l(Y7 zIX6RGl}C~-4d)Nrqt+7COREcFITXRbuXWto*wcY)WS z4>LxXcn+o-RNFDUV6Dspxzb9MH8N?SE!&Iz^kJTyCqY@&QvRt#$IbI=){}>QXM8e$ z7fCSG4$AD?ggz6>q8>3m8++f*2E*XhBaL;}LGy<5hIvWzRS_KhECJ5NE8W~zdq|$2 zOL_azgsFd;HymIgXRYftF{pz8>qgMu(qQU08MQn{JIeZ=)$3u3x>9`(N2Ql3_fdUCz(+b*ABGVIX^j??=&u&ttG(SGqdy0?O1?Njy|p+O7vYcy4sZIWqx|zO}*FeBwBGQWHT~Up^+X)W}qn zx&1e`xez{B;gN^AqrC2WTWMRcHXG}{D#Gd_e6dx?!UPZRS>Y`M2^FNp)mydR|GukF zU?g)y*{+$dJCzF8kKFMfdnux01E&2ze(SUb3Mw(nLi_>EErW`qf3@fJt&t}4cKz`s z0{o&v>&9D*EvRD{c#T@mxe(S2$KEXde811x-U6SgqXv{teus=MbF@eLZaAZ3^@RWe zm{KQ5Mb4cLbAIb3yqQI66*D{`;jbe9an|+wK|Z3|FrMPq^WoGZH^j~ z-PBy&XpWuME}w`DA5iXyo0`>rS)H>uQ`2tPn&B5Yz=$=B9X!Gv>8~g*o%g6xbjyZhW&QIFEGn7tUPwsMay);;H4knW1Tk)ugg_2Jkd zZXTt|wSCdyC8B%vM0+ll!Q#f}=9WA&VMKo+Eptk_`DAhA#3f^=0FzlPF0FEv{x_^$ z3Lx(AE$dHM{Tyw6C6%APf8lyPwvFuA?w54Hmv!aJl4YMc+n4QmFZQdJw*@+|PZ_>> zg5FzuOaxJro^_0t7YIF&3Jq0C_Nx$yHh0QprS@xeM77q6}p%WPo zSlF4z7PL!BI1j$7-$O{L0U^Qz29Dm`wMKxnZCO}Th|rwxq+6h#@+xSy{}Qm{Y4d4p zgip7Dctx^RnFa{Q;Em?r*3gxS7?F zxp(1SZ2Ei80$SjoE^D|~pzXb8KlkpWv>Zw)Iqg-|=`yuH+Fv`5%0x&HY;?^yk7F~e z^*nz7$Cl@tbt;t?HkVW@ms7b&&*2%FX2LZm+#dTwA`DF(7S{)oR==$trY{yb@bUpb zFW>`LX#=e==Q)jp>Q#$J-qND>epz(K{o9ELdE?c^GJS;x>i2C^B@N8^^$pcyIXtV9 zvgSGm4$i6RG?&gjbM5dLyXr-ycGRI3Ot51yNB`J4jnKzB2IOORycHduHGlV{td-_^ z06cDNZd~K;YPC&^B_5eRbPy}=Un~np#GCA2DNPg5@eRInH9xu2Ub#(_GH=yU;r}8f z>TErtzRWV8IomkMh*E{KSAK}J4ua(My+_A00Tb3tu)M5e;z)>NV=iF&>#w5(4GHV{qEjXEDs@4x=n=HacycjfzT~@ zv671Z;RH@al?1G{BCWJW9nOTyRIZW9x|X(AAl!T(+DQ}nYRi~{nT^k<+Dj1pt=%z? zD92jtp&jd{la{nu5-~>|g|*u`V`v^tc!5W?uwm1t#*>T1un*Tttu)?XQiy)J?{{|= zDa{z*ZN0lSH&WDhFWQp?hzBhrCgdh2oRGr!P4u=y!zJO{+OxC%=Ig`t(1xS5hs}kI z?UO=@k<<93Sdmz8Ahyx)adUTZ@EH`hpj~bpu@E(5=7# z5q*-3D*JB#?xv6S9%x?DdD2IkNf=!*Dt@N2|`>PnzRI%X0CzV+D7|+ zQj2{DJrp7eSA9m(s!jrqS<80EW$1gKQnyNBH63rE>cLgEZS=fY9(HYy*!AyCEiw1zy02p9J+gc?9?Zridn{pU4|f9%U7 ziB)dzGyIDiU8N4E@32IXG}cvtrtar{oK$jnTb6sZ3%PyUNqq`!w5C{NZ`$176&C_; z4JHkH5+6*L^c{j;_-k_r4QE}QjfH(39b}9)&RDFkxLQIA6}nxSiMOWmwG-PxKvN!b zeQ+VD+vw1ihY!5Mc6zGr%g}A7J_@SpcjS6EuvkvkeX@wx=HLV!i@a`Y2pe@@i_z9= zhHFgih3rH@m~FLed5f+Jl=H;PeHbd&_KRkf=1WE?5jG%S+wuJzHlZ4nPO3$9+e0nt z4s~K9=-Rouk~un`)!@;1NrPQPY3GUHhPfjQIc&!WrYnM3DBi7qMtVr?%1j*`0z38$ zm(~_|Y**?sk$XQI*Qn`lcvX`cxi-)^xU&R2&~a*!34qY;ZBHh&5h8AGuzOWRVjG}~ zcPk>5V&Am1^&HkRzG{hIQs=R5<7)@j$6T{t1uxB{uVLUM?W*+*vCC8bQFC%pvT*;W z+9r43=+MVZUe|=HM1D`M|Ak+RVbpu4y$8#&gOEMXweN0@i$};u;wNn=c!sZMX`e+U zXFa$UuGWtJwmWG*P6liPvYgQI)?SA^NRJCj^n&Q@i{;U<()bX_3#`eu$-I{ARWB1pJ-4sxB zgSU8L1o!@R8I?Q@#|w_I+aDBv$eFD4RF9I4%)e*C8DQk(I%o8D;XIWu8oCgeip%sxx5y=kjm#M<*??nA_i4~fUCvwqlgnd@e{ z`r4h+W_!(@HqqJ=>uyk9Jqk_U4xrQu5S%g7CvTX1aHY5Br2SRDFn-@zi))^TXS_H8 z91NT(poh*gG_F^gH5O>wTj*8-#U5;Qm#sKj81>;D>{lD7q{3ueDn6FG`9jI=Ckun^ zBeZc30-l)>e*1T(?TbC#5*1Le*wX9$?@lq^{hsy2$X1I6lVC(~hKqs``Hb|YsF#M_ z^de(|CLUQ-dOo(0m&?9&Q2A*84YFF_S**LkqNWV!fwyW18#?k{*wt2sCe9zb%xOz_ z+uYTF*B}O>ruN~aZ4(4`T-!RI#;zD&PmjBzJj+-=?2!+IW2SYZ__qeP}7YC!(RLP+aqO`ej|IhA(oc zaw6aa&05BQ8SC_?o0HIWF;sU=s(_rXpVNzZi)g^dWIZeI@B9 z8I8BRurK3xvTSXrY}%GvuF}dkb{+z?`;^-fz4$5*_tm^jO!8McI)@vVB@9k>%|u|x zJ#O<6lpQ|!isaR?+r?6yzex#C$>yl$iErUqzCuQ(hbN7{Q}5~!liRpwCU(mqoShu1 zDxMD$yzWhmO{y(S7CI>3ojKXrAUKf_ma2eF_Al+P*db^8fhI4TZJTyrq&(0b`N`s)KO!2v`LgYfF@T87bZ4pB+vZ&l$*Q(ZP!|yI9 zBns_?b%y=HsKw^GqWS&#WSFr_?Nb4)o3Z&ki;3{Q)X~D}zu=6mqVpjwB)=37wooH{ zSZHo~Q=uA@o5DgTM47?cf<4IqyFc+Co%bMZUiWWN*zHdf_b!hb$gtZzVi*WGB5yYb zTOEY5#^j)x$d^20?`inpa%+1to@G=%X%)WK+9XE|vpf2*xL~q^!`POD{WX`_-!C(0 z@sHZcqkS_yE-yn^Gs_cu{}%N%ryZ*;&+DYbZyZeYeD&3NNp)pa0=x0bcV4YtpS44c z*}fSU9LXg0xX7vN!UvV3gn~s% zLI~W;S~&PkL^ki|(*uz}^h?0c7IIpFECwyEXNHmis=Z?@0}Mx>molZ%nYvrFZ!O+g zW+`M-+&)vX1s8eK%$wh*X=}Cpt^XnI@+S@+TQs&RZ)Jd1_Lv&`tqR6&s2? zK6@{%lepaiC4KvV*zX8!k}bM?2VQj2lPz|0&w-Mh$@@u7+*MNs-z3_OOnlU$j+Jx` zQ3w~%8!%CD(6XTrh^HN<2noRplXuGfrAZ2u^;K>qC62Nqjye%sr@g4C_tG!V@Sx%f z3$Ai{xnqELZYlr7RZRI2WO%do?PD>QiyS*+Q=W>fKwd^^{1kK;se)ddxS~bm+Am$0 zXa?8VwE}alAKRzGAQX;Gj$dA$sIrB^NaP-2vibn_*}1`+u~+r9eivWcqTtOTkhs>S z_A9wt`O^i?il$t;Q`@&(jOPVCS9Y&Q!bh#;!#+I`@c#Hwo$isqul{|_`fi?qafn}d z%isIQUGszj;_)%Wg(-fj6m~pXrLPdBJR>Y2FMH|6WQ-{uPguXFowD3eT#?pbG%}Ok zEPG{TE#c}$PcYWK&mkLQ$&Qof7`{IkXxswbSI0vnA-n3-f#hy z8P7|VCXbxtin{2S2ie)(@+Sy>N}|~fvG5w-5ASk$rc{BE48OW*t+X6|{~#Zu==r2U zs$ww{6&?9~*$tQjY_^bovA{#LgDbojFRi)a>rHe)b@#29(+?2QuV4}tg#U&4ayatC zpQBgb*(yAR-n30L;t0gQf0hGRYWxYBuV_yQuQm6Td5oyKXC8x+4k{eD${y7INMwxg z$Y;p)tBPr}kp7|Y(MFWzOD7@3BKBE!(Klg+G#+l^C(o)7REckvqJH?#el;MHlWzJf z6`{s`UKYmsEC82YeLd`a?)_3;_7}@{OTO7PhL95K&C8jDoi*GN$2ct+YLnlF-$MC_ zlG1*wJiJDXMivCT4AZ=RMeO-}82ltwn)}vV6xLNkE4TC4i)Yb^G(P~>vRggxRq*B> z3vKK`qv3fFh11)tL$86cO2NZO_5{0Xx0Z8<53>iKUv%l|9eiPsuHhAzcl+dq9!+1)vf~nhja<94|G+y{~+Fi1mfrT z$MXMZs>J`5KeWX^+A`fq{0F8D{(JDM;AzCgzf{W_jI(>m5sU+TltLn-KqsCf@kC-p zRmm+p;E6ven(~sVsaxQZ>6{k*-@V6&M`*mC;Q?|1vL>^~yDSqfa z!VSVaH7D-*s4qp44W8|X1$uX9${d(DiO4;=boxc=Pc#+dB$+R}9whmi{t4j#Et*QQ z+joPXcq<3oWyBb2^@) zui%AG&;GsffvAJePxB`1baaEZOC%74BZ^OltNJMXhd}3xjVDexz%XH%v}}^E)r&EONan4rxGlaTq_!6a9tHZ3HJh<{*1Wh%7&u^neK z_?1iI2z^JPg}A9UzfsZWcLu@oV%TGRYBl<=Z=>^09|k(iv#Df%T4#$KD7?$?Q#&WF zW4)E0Xx+K{a2J1qn;|8o-1sS^uvz~GW@PyxuiE;f;8vBa~uKD*~ z>bC7O>o>y+@}Q*X_l$8j-?>LmpbKq$Y(M@Ew7k8{=R9|?-IA@ojeW|ApJOjp1)412 zyve?Nu+#8wgY}L%5BljoyqtZ)e?U1y&+z}wYvx@_U#MAU9uz(6GBdqpZmF z-S4o#KUrXs`C^;TPx09Qe_L+uxn5=OQ3KFTZxOZKc#nFneJQ1*Oa6`>fO2pa5wAT0 zc69 ziCtcT#vbkDPBj>cV;G=RD(nAVu#BAvS*uG)#x(wJO;I zev3$pQG(Y)62JQMWxa!qTgJ%+^_v@Ki~{E?3~|R0DdXr6n{?#THid%Phc1nDwU&$@ zPy3YAh1zQl2zJy9T(8$0|E8Mrvy^u#5c9PJ`M(#}iFy?}vHjEeiP)F0(Vv7Qu^+55 z4}=C1ZPcn#q`Kp3B;5ApLZ6Wxy;UeyRAL#@^P72rdkJ5od*nVr)$-XtzaYUmDqlg4 zFHc6)kX!Hd>$7}}QL|wox#b?qlQ#;IioRJ*kN=>gf3hgdd7(W-j=Ri5X&Y+brmrX+ zUP<@#(9PX`zEceFf6l-}oblG1ulldY_oUpvLhqVF*uqxz?s1Gm%m8ansv%|^0vDuV zW0_@hVGp8@zf}ei&1DDtI5}c{bUe799Xt`lN4M#54ktR&bW$wkDFbyC*!Y|Im%Y0R ztvA!VdX0FEIHx?#!+kpGM>#)X(7EYkR!+_BjRN@1V7xzwF zWBA6Rn=e(xY@CjIPW87JNG9#0+{8_mI@fIP9Fx%p>kv(R#grJ1GKcS;*O zOKMYFbGsot0isPB3Bw&J1Dzkm@B91udVY@{ntnIys}`!RZm8m`uB)%AA^478#Wfmo zLOr!sTeb0Ip=LptIZ&9>o;-?lPKUXSbk2%7kgkCm8eHsd`lDW`O=d}c$b3=%X%!cz zMDhY&ib0OgQff*zO?HwPCx<|6iu>!Rr%}^?ulxpma{p7t9Z_CneiZ1SL{2pQ!Ja%Z z#{0)l?QFK;zf&_Kk-aYx@$E5AFFN3)pP2qb6!dqeN*RWbJ!`Epdq>43*5DW(jnnCf z!#%~wmiVvQ1V0ZRr#)_Z2FRO|AI$Za3^7sMBRhEn35q(sKuW?-<*L+vM4c+AH;Xbj zP;I>ROa4uSB6d==CtDEjd|xhQivK974)r7EiQ&`|lfFo|Q@)giVcZ-8VH%(zyvc+4 zK3@btLGp&KL4^O3a%pz^qta)=gLr(FcUEq3XJmNFvRY!N>6lutH|jZ2r$!b41afAz zKuTO``ib+6#~V@Ex9bTfACGH)wu^5Xj2Rl^Y{jj5OG--!K2DLP^&yHG=@KU7_I5HA zc}jH~AZ=mrl%ct+@QaR*b-HRtaF5OlGr|SCPWe8PtOJ~PRHla4KPiVeon9D_dpnVe z0{APuQ(IE_Q!b6=7DNA8kt>QGsF+SarOHua&-hAZsX#zQon^cG3^Ba%_952>^Lv!q z@ErcLaaOUM#Y#lu=qL16<4Caqs#wah(AcGI7(giO^xm7yVej3#=I@i>RV~FKroH7} zAmdsg3mlpmA%4(C2bUcgPz0j{@5Jc%T&bot)k}Imjr?~hH^sK5hS>X+ZLKf1Q}yUC zPj<(L(S=u^gE}JT$Q(vD-nwwLv4{!((55mB0Ypu6g``IwCp@o@8aHR^BH`0eb99j4 z=)<|kj8B(S_mpAx4~2=_xKx$b<-rGw3A>$2x5atCQt58 zH&4ckDcPpdjRHbD^eMHe=!1n>6tUCO9KSlASBU*y6eLixZcyZL?{?(#hk_i6HC@!h zvQ9CKQ7`H3MYCMy@yFm1qBZ8BuXZfUuQY;j7c(qFV~~NYGq3iqfjQ;MABP<2 z3(cFqg~wUz{t^mCOUf~BHvICbsN!JNta&gGokT>CJE_EL6fsU6#~&VHG&WHhw+jfK zrJkuBY$SroL)%W``}g(DACo&toN4a{n(QPEgz2h9s?wNfRcEmK7(NZoKS9H>Sl{17 z7!!}1R~o8kXRV0;-u~7{a;iv|C9ehQ29o9Y$t$Am*yCQ_um(ZQ{&yzp(AW+pUIKqP z`EW^WL9dtjTpe}K{pDZdj83xEg#Y{U@!h0^)Ba$e;H1O?*Dn%a8|DT; z;&sNbxY3&AvLl-|6WFl&(tQRJ>FuEhE(U03);+X<<~6S3gu!!Nr1kfhIFfyjs4x3d z4dRK+FinR{E>`>t2a>oB4*voNpV#-?_Vo^;vgzq>x5jBCf1PNI14Og30{a_zgLji`$$*AjQnhs;gf<~CMdlIOr(9^)vxma7mvs2MqMSD> zSy?n>98oA;8$_JZuQ#f5>u+dd4|JnFhr*apq#lPgn{-Y!%iN1j7HxA&+_bT$8J8O8 zNpIB1WDg=%l#t zBCdGD|Ijdo_)>Xhs_e~g<~Rt8^F@h|5n1Z&6tN4sGjB^Q>fV%gA5{*&eE$avVI9C? zLhgB1A^Lld2)Ez14qVK*_WEt;vQ_)Fsa?-Uukr}Q^JrWpG0)%Ke3jDO;4r`dh6|@I zf+8zq2acdUS-9R&7(>5XY-Z5K1%M5!`=Y#ii9SvR5MpAN5l7NU$HHR#Z?H!C`YH;q zkffId$O{`jRuz_Jp&fh9a>STO!jjr=F%Xu(f+ZJ!dmTTFeVUv}7pYa$Hi-S#PEs#> zU+-=O^;?*zp90@4;Jtn=~)^B7>fkwA3ceE%h7W1WC5`9~J>>EM%f*>giNmrS}Fksy~rZ?)|HV32BN z*LwQS?bi*SFXw)&r@r_{%ug6h-(TQvzaPBsTu-wI*kDoR2b@ZefB04 zC;nYl&WAy3*01N(=`clUa;T%$*ajiN48uE57iAjnFcIxe#{X_4AA>(_)IK}j>b!n_ zLlx9a{s<3X9uEx&G~plA>@vL!j0@}x1_+!Q$z^V)DQ)527YCBD#FJvC-wopeOyhS0 z8`%cWJF&?Y-li!RCoaUw=2@8fzNvq`FWZ}I6P z^!BZ*8EzM-u2rAmL=bo^TS1K5=>~OL5@v3N9P_G~6!$-vH0kBc3xQ;K}PIS0;snzn~&~GlGqC zwR7rkut-ApudTrm--@ikG-niVXwGvY$5zxGXWqwj%HiDL^FGxOc@^|7%S=?`MF9Qd zN5Kj2WP=00{K=8ILds1ZLnMhZT)NalP8t5A2{6j!D!#WW`+dG#xh?BQ+V=h2f5e1) z-Q17WLH8Bp?9Dg^t_IJTk-u}g9G_|hO;MDvU?1|2v4=Bb}S zr~GyMQ#9iy-|^LXJ|@DSd9{)~YTS&E>Gt56HoNuC2)(zjTu0i?$Y+ zy~mp}!rwb1y7^yCz8El+{&EnRwl)4DE~5KO5C34A*3o0He|VrLufPwgZeqe+1v3S2 z`K>(B0~?2-En{OW^FH~nX2OT&o1@UjE0sTc0oowTMKYO1qLRq_jOA4=n+PID-*VovxaI@`q#rKy_3tm?Ej?DA|lg4^gCqJ(?pm~Pej@0 z-9MlC@)*f38vAGJ#oYO^{4@GE-$8`DB%jpFdN)oG>g_+DvHL&Yh>(x$_N183qBL#$ zmHsE{swL3{80+k&w~!B0}=(603KZo_)~q64CtMK>aBt1AX|;#&nu83s+Yd2k86I&Mb9Us@#%HFQ9YPIC0aOc7)K>0q?sFLnW^{nX1}TF**2=< zMmYSGYOoV`^bc(j7ROXcorlw7t2n+!O*IS*X1e@XJR^jwrU0lt;l$~=kOFd^ zSRZX&VetS-Y5@;-e|~40u)mig2Rr4ueufPst_=9?Az1!5%Wq%2&?@+0e$5yi46oT$ ze5-9Sbr6}!C5GxDMZpJ}23mrakEY_Zz!?>ht=NKI#gaX6vtiDu^i%R^vW0k-j^CC6 zx^|a2ywc(i{}w?0cD*}enO{~-p7m0CN-3S+pFWdzk8N5=6Fp~Spl9gZ%;REJ=H^K3 zhNeg4MRlA!rT(DsW`E~RPN3Nfn_!~Fq_<(_HDVug25!WEhqomP$ldA4fwF<@e$x0E zR;mRG&Y})==FGq8lvPo+Rg<^7Z(l#@kEA?J1}IV>qBiA1dGllx;)5p%ba^_m@JS+7 zo$%Nf$WsX4$3``=o|*H^k$t^kZ#MB&Q}#UCIenj#;+tX=d7d}b-{0>NLneP27kQSq z3oU|_r*Df)D$M;QX((bh$Xp6znho7wN38$ZI9s`M=E?Zs=1~hntj;`euTGkMdcKUOLfR|xxZCOwA%ZSfAA=M zh#!=FQ$-VeI$A4ad13aKjBM_!17>(mW6V8$ig~vN%CTl!LNcVN8@Uxc0M5^PK#Qp@ ze#<{)(Icq7gkH6{!FWP2PHhAJDpFB7>nwuQKs5+7^C|V^4M^r%B<=|YAI5*_vPhCu z2)TO3bQ`fzeAC3ZrRaU>=f`%#I7I(tm!|;p6Xknd!3&sj%P(qwht)ICcj=QPzJC({ z3NGbF!0#rPEn)Ewh}4t$7l0lt9q1?Z`X@3e)@0fX+<-daXRG)R&#}MvbRy~iNkier zBfKP1{?LIf6{YUeav|k58JGrMY|z zD>$__?X8#uD*4_vs=w%q5J}*@^9@>@ZA3=DoZYuwxyEnMADKhw}cTf!!R6>#iQZ z<=z~Qk*<)pxo=Z^7z-|N(PtbI&HAN=(*1V=3~4ZsP)Qr0uc6)?#rAbWp3OD zicTh#SA-i>AE&0@di{Dr-r7)H~Q{2Nh zX8*UuJNXlT8_1%R1C@RQRB~Nn-ON{SDAlee()q=5@F?;}P-hp@*%6Be2OBbq{rp&k z{HhrJAM6UWtUfNc#_gca2YQ)zadIc$C?eG3m$e#(egg#fY<*|{sdT!??V&(^ z-~4>X?J*a^`2P0PQxc@U_rUr`?rxH3F#MN{iyY74v_48QX=Lg=bvUeh=YaM(_qP9svA2q9tL>sjODV+) zDOMa>C~n1yhvKCahXTb~EKppEh5)5Nakt{`4#gAPA-KDHfMCJ$^M2#MIp^k_i|mY% zon(ycy`J^VHP_5sk0sbZb`Xa$kduw=qa>ht&e$(@}wv$zcI60gp>-7cU_zS4W1cF}xce<~zB8+Q+<|5v!^DiLKyH1l*Ni4epx~ zV&lXf{_;cQPuQ)Qu^;1{C3jwscKe^IgV$bnf?WuZPz-^>;p!RHU?5{nR?Ty=4WJ;N z28Ft2a!K3rF!1T$%Th|roxw}f?}77XlP5g`Wffq6NUX29Q7~~ zv80V~6>+z9r;g}VOvwNpz?UbYT~E18{HG*?jtG#Z_y8U^VH{j;H?RR#d#G6Cu%9MJ zDyqdYDK-kEYFGNQ3p1~?wO$P>O-by5n>ZUp@_Qf{XVYB)>94za{^EHKfXSE_+&A*n z!1HX_Y{WoXtPu&9_`=*W6I3`L8Oc>IU}; zj#t4JtQTOI0IJgDCX#XM1wE_;M#EKbzvZ^Jp&`<(fQt(1Kq7BHNl5Z|J)Ei)p|DR? z70xk+OUd*LzPUYK*E=AK>ld5*wNkmgK24t=%lWK^@eiKIIZkEdoZjHsJ+-)8gM<6C zbD`i7tug{$402EHUHb0N%y#d`lS2i|2jAd|&_1}l- z-M10rXSbTC<^=_(?Hf7)_Z(nrK{D6>e*KOf!!ie)+ut#twIDzJ!RM%5i~Yn83UjB` zyr^hX*n}}*Mu=Z31lYV%DU!T zT$rkTv%;gu23yJK?ER6~g)Nvd)@C#jMT00#GEy8gd?a-2y5%0(s^(#&mdz4;OrKXG zK2u?CpekfMei0ScaicFNZpT`X)+jFV>ANHziCNm0muguGY;Qt&5-Y~8f?rA~Hc851 zYry?RGRJl76A5cs)#zDmk@a9Gf5;9hB({{s|ty*`s$|27Ba$Ix78|L_Rr zDMmnBcrgb1c%ws4L?t&AN2&g%h3Ipw zK4(ZTK>$)I`>97X4KrW3{KIgvJAgcnwhupYQ!dlpfJj0TY<4N~)b4<`cff;A$BupYyB*GG5!w40{)3IHi?#Fe?^iOU7 zLHdwZcBkm~KtiXK$7bx~?P?zmc`uBsX zWO4#P-_EkJ~dHHMw5~6^=(xf*gvjK3R2uA$d8Rb@KnY9EmeDw9~A}x$T3G` zXpKg=UtSoFiyh^{#`Rako@__U>#$-v!CCJ0whcNO^hKy^~jQS#0;N}@^z?D>3m%G}?PZbZR z1VfDg8l!pfV(~4773?Y+9iTUc9QpXA6zMCqy&HS8&aKv*@jBouTDRKMro5GB>_EDV z-mLD-w-RLXIrQ+g>wY4d*Y%1T@7Mws^R}?Je@cpt%RnHLpPKPR*+@okaY5bhqMOGY zm?=(q85^sHKDK;fVvE-(sg1c6{CF?_9UKa$w<=PDPWHbI**x$)&^M0b;rP`Z9*!4I z{DpjQWPD#oQA_g7@P*l?%nznkBgyRomH|LU;;F+GyPR%1^VOy_MLvdoK7v`SeW!cK<4;_~S&`h=5BN3;5g zATpX89oDmv0vt(h8te7oYKc_|P&b@ad85bsD5U9A=3(0cog;V#>SUtt$h2 zMm6C?5ZSG^W9d4+F~6qR3sP@z1nyqYIg(Vd^;xLd;9%}_KfhV0$m;VlmFUMs=st^2 z7JExl@VK8N2{x>%*Eai=yR$foKNok8@BJXkFUdw$otYpYPkmH>X+P4uI~64$4UfG6 z5!eHK$k;3EZ@h)?grAR_FG)xiz09|GbzjY3Oou0FntIQKQ53I&RtZIUgxN%Ju!UP2 zIiG&S{x<6GkA!evdI(m%BbPvnIgsjlg0E(r_1$QVz5 z$l}9$jcn_ms#Ev%U;e4)tDZLqN?j2k?M(VLbCeis)Vp3jivZ77{hd5U549U< zn@12f9y6;iX5=z!txP)&7KO}w&T4=(J!y;jiBuL39+dSu=Sk3zOop#mmlRdo6V4V) zgfv|g`6jN145iwuI9ziX+DvXWmO|=DqJ6xdflV^hnOvjHyCiC_&V#DiNp7CSVR=72 z9%Z3X^L==7Rc$GBj>}4Y^K3CowT<>hMsE${1~U%pKC5&Pv)WU{!g3s zoih|iO+ii3vMwKcpOn33r2C%&tvuLL^kc(jse2}OKPZ#0A0#x-e-7?<;nUE|yoRXZ z$8$Fvoh&uunL=7NFC;R(cCkl!e7F4`vLrvCeW|3&vLZiZL{DF-jRUZIF@0XQNXG=d zOn=>P>T5shp=d~|0|>ZbB{jqf9DmC#*yR**#UiWW_C3u!!&L9)Y_wfufD=Ge`pX-a z2A>@j#tcmTv+H2-8jwao9&#w7R_u_*9zs6cTiF4^2&Eq)!db~nAB!O!QM|sB;r;{4 zIuqudC4R4Ez@0k7K&iB;QC+V6cSW_zBgaCbm{7O<57D{Mz*Wew+ZUdklQE2@rrk$P zkea87V9_O2@`2-#<8Wg@45|1&ELvY~7b1x|bIk|6iE{n*7CVcA%?l7D*p7tBX9w`9S6l zmN&=lSE(J`8`{%Zw1N7{ZM?u@Npu@(Tl(`t-uW5c(||OqW}Eh54KP zeS!Vk10JqVo>OQXvOa`hQh2|2Nm$-QO4F}Lm3EhWac?~1 z7UzPtv=2+n7W0l-wT_y40k~)admPK^?B10!cQ$+a(#Q{sh!`w zrZn6 zVFu-_h4cb{>lFhDimS$%(6cV49QP*A)kVIs4FTxCZy z5JL#tXA`++_*Y{1($bin48rPNudxo*q#1K4T70wQ-fLAd1T;%BTsM3$Dsw;J^b@Y&9f!9!r!vtKBwCJNzM1`DQYPdqQLi{e z)ePL72_iT=Rpj^f6b0VV#p$a`-~9@`vpY)Q0#TTVTG%HLDC7d$U(Gpm(L3Bdvg}yCRzyU*7*P7c4-T@FK<;8_Uxz&i3;7|AWoBhot_S${TK3})*Vz(x?46BbV@8YuYtsn(LW0yhW z7jM9Hh3eL64Q3%I*h|J?nWiz9fby|4J9{)At2(s--h zsVsuk$8S341G1Rwr~>usiz_mMbPHLv+`Ty;e1CMm@?QBsv|aw0v7V3BuyFgkTmOLN zSmp}i8RVGOpdJ@((42A2#o;6qgLItgcHl&i;6~0N$~dhTlEF1%ET|UA@*3ddGD<08&H5@uPn~>m@FQ^kH^f21Gefm|Sy!QJ)2OhQ#h&{V{l0z8) z7&0QL^m3}#eQpMsBiJ)fujt{?*=Ill>tao-3udZ>w;*g6r zcO6OG7PX()7CgHgOL-u;i(`m@znBw7M&0X`01h99B6fz~>P(clKbpTE6vf{r z#Gr@`vs~qg7Wc1^>OaeRh&lN@k9;{_Lx1G)?uha{BL+o~DFMip07%1`mo73SD}R{s z9MKijbfX^n%!>9lCF02ZqenY2RvufUAx5|otnTMf86isyf5**d?wK-Bd@nz=*k&)` z3Q4|9nfeXZb;pYybueg>PO<&=Gtsi#ZKF?VXQcilMj(aNrw&cIPNs0hyCg4OlZRCC zE@(m6SycA5ni*Yw5^#aUtB^T{`QkLroKF5@Fc6TxAcUQ*$BRuVq;PV*#@Thws=E1k z^E|zqwml@=BrvFYuFr(37e6xiSIcS5?yABsogkCZ%D1}}KCqZ$#-Xn=Q)!27(U-LS zA)2_nUZTV0R_` z&&c6f$?m+YRRu@i3ff@tzNW~!NR)l&LC++EX*_7`M74l*+!%Rgey}zGU`kL?-a19E zkH(vv4Ves~i`rQ6bn7$noN~xLL=N=?-Trkig zDFf!V;UhqA#WoE~PEB=51O(BBN=H6+5z`%%t$6H(pUOP1FY zREuf_meKc5xV`d$0AAgiv=WO%YL{?NMTQ-qTO{M}ubT5FS1Jxq9bu313t;!P_)#3oV`%2p=Lhy zIL3MCMhvRpy_HI4?r2f#ky*eZFxUW5*QD9yt5s35fmX&dTMQG47 zAF{Vm`{R)|bdpO?MX-sYa}o~k{uotNM*P|!ITG(!S1b((kH&qKy#8>1V{$4 z--5Q*#m+XFP}i(`kZipqBb?sYK=Q45)$`jEM;W$Lsd|<-2jYu8a;O`?gSD^}4b(wO zl>IM#m-JP3x=mk$N>403>KcBeIPz6234p1p+1oy01sv^NvBA_+!0_9y<RIaPi@M+I(xQA6?IV2GWXsgrRM)0tb}JIv9Zb6!8q<$xJJy`I#9J22988x^ zJ;1p~$Fs|m$?(wUdcNYZPU0sRzO4b}oa%v=in5j}Axh_@r#$=NKr`T)vNFp@5pPz> zCJ(B3zke<+M@!~_*kbcMD9`h1OtxKr> zBWO%AsLQ4)wJ-W;xMHHO73MskG6AcBm_br}@%s&=YgE7F?B-NPg|J+Tdk6@7E8~q2 zE+9C2QMe~i_73>oZQ8%@!eU@MVLwfK<*l8-ow2SG;*{r)CD<>ej>`#hMX?jFw~`*7 zRmRe$Eplc4prH%Fvbp%FI!mfF9NlXo3G*hL+rH zv(|pdV#52Ty+9T4p0!r4U018h7>NITM=Kf-@CQ#kE^a&ito4~O_V?C-)1~$C-#-Im zZ$!mQFSN`7%>gp8V(Ns?7nP3 z9&x9+qKOPOj_TYI!?Z(DqeL50>w#5G5f%QZ;-hH!Dk;K@?OJyq|1B>wX8xUa^`%Tk zF+q=B+YzUTR3o?IehWk`|fs71r6TQOW>r*0%58q7-#Vo3ch}u@p#0<;CRzq^at@r3V-RRc&6$UK^^X-#Og`D z9kQg%Sx=h3S>(LK4rpY3oAVA3fMU(ftb7s>z{)B8ofof&l~ZcX=O_(di`1ODR~ai5 zOYTj_q$qd+n*4>)9W^8I6h#;tbj*VlBzZND-;U#xMwwbv~8r|3ri(H%i0# znyicU^lc_FZJd(9Gm&j3*iN#WF|eCQwnNu;I~7f-Yq4`S6mW%tBRp2%QpUc-Qi_?h znQ573quir*YIryzW38FqnOZNQI!c(dPiUXz`SX1U`Vb_QoXMEUsrG)Cb(dmS|0SVl zub+81GB;NR zQ%iwR+6o@^RzrSRL}Jd*Q;T$3p5DS4(ALzc(>ZE#reI_1;o;}h6ne!1zdzkDPg&ui zKAny{bp@9K{{oaE1>ZIoi*-nO_71G#9>pZG&YG|p_J-4Kc(IXtc-n8nd7vF5Y%czd zQMZ@ww#q$g_rpDB=T2t*mYGBeZNq5&d+JXQj27Sy?dF!BuXr`;uNfjUXc{i?(uA@v zUhz_gaPv?P&N@do_AnJ)aQ6H4_E7>^(pLv{^;m{)JD2=7hdA`g$1KN=b~?k8`n`1= zaio;*H2i;!l%>*FVtWIbm6aRE(yb?ixsF&S@xL z>OI7l{bISMZ5FN2-a)GZ`Croj5SlnUvDbo2uY$(@$yoc;(TON0SQ-6J z#{$XAS%w?ZcRgMokq=1YIlrOnxHu752K5SSlCUvoK4oY1^Ii|$h%_+V*M`Fit1bgL}H`3270 z=S{I_X9ZUhlq$>1YLUK9MwZAsaiU+>$mzMeb~S6n4R+bTp8#^ zU;RF0Im_uAW26oN7xClFX>J}Vf9Ts`te1S5i{BC5#5*G!L4s1*1Y&-GzTT9HHkETF zMQN5Ax4CWi6)+S;96Mbd!}{)xF-=S1d*fdT2M(3d_v~MLf8?|N z{z3!z0^L;PUB*=AJ!9-BNwU@?J_`^{!vE4C+(+?tV05)^HXhfju;=IK(HJir4psQK z(2zQGdehB>_?H5`!8h{{Z9xNw++|j3V1{!#Yhu#Re&gW$FKRyg@wHHREgQpoMeDI= z9auu8VXR8OYRPxpH%C#naMNADG(90iH?MZL$fG&Vr_!yLsufqTbU)1@cAab6udsY` zP+?!;ohNGZ$!u~^AK!Quc0H$KLpAfeJh_s^^>nx+sTCJ%#xuU)s-)CXVA?MET!de& zpd2;7CzXO7R5#nB8TcH=6<6`(fUw2q}yo<>tNL}Uxz1k(w^on z+YX|oS?Kur)5FOUHEq4U@?49Mr><+1&Q@}i6tCt@viw2I;Y}}yyEhQ5KH(tGTi{q1 z%2!{}A=1k3nX?uBJ7D-&1b5E5I$}X~GAPV=qIBwA71*gAheKOWyZxg-Ey1=PBiiN% zR1D7B^KaiaapjZE`I(d3%@T!m`d8sPd7hINM{D&XkqP}^%H#!TXvHWVG*^e0d4J~X zzXq*Z^O$oJ7>@d&js6s(th)@<(E-Pr?D`@%1&E*Oe`_=MD@N%{Ifto)HeAUt?-lMV zx4=WFQG%pRLYcAc@npjyhc?l2!BFY1%P?o6M3#a;$NU&Z$M$|@JN?)&APKBi0OY>) z+q+r-{k!sqX)WjPpnaUBl$I0LYDafTotuE4t-w&4?kN>aMe982eTb_fA2R9q2W$URT)f>Kkm}|5dO=%nd=CT~qsK=*XF`Qw(cUd;>SZAjIO12g*(Y%) zW%dTu0-!hxuiVD!-I>KD!W;oY}?7 z*$>4zjf^d(80z^NEx)ORhgZSyus;H#ueKbO#BfP$z7szt!^g0G>1P-E#9Xt|;_v2t z*LUAfW)PM8C!&a)<3SQ{d4udSdpNKa#q+0)sf&KnI4GkE0S9?1wt7F!T!1WdbQP5W zMweSnr>1f3e$BrHREp)k$DWaAKKAd`r=GIKn64zdCs+G_OoAz8s_IUme)8l`%abSK z|9>aJ$k^LD*gIRfn9G`5SlL;*SlQb-bN_#jg|XZd{NGrZ|M&BeA-)5Rwkz!%xK{Ti zQg3>DVUPvKlv3}Z-|YKavpK%#qhKcL6m!aOd0VT>TuOLYn3?VICp>vErE{fT7?&`ilq{qav$r)zW+S*Yy(rckV=7`=o0tXf`TW-uncV~C{dW@+z-;~=83AC_ zp8^vrewy&4SNHuTMIU6fu`EP(-QJJc9~Ei6oInC z{qgid08)TMqk}D~{^XEu?6MmbjaBMbT)H@IpCtrefty8UQ;zZNDZ=uOJk_vg z_@kzv6J{_IObh13!;HT?TM2NQkM3L6{R3`++Qx%wd{%_=3c@`5nEQ=s)S_Q>MfmSy zj|@l@^UiPDvPD*=jr6`hk1Y6#`it##t2~C=nog%_QAj+iy+vV!y|0?M6|Nz9H|_T< zScgm`@TKc72^W#Tyd&Ni00pge>0C;depV?B1I5<}EinyrCDje#bExvV)5!D%NqdJG0{;#m+`?M`QNuZXuAIZuiI(npPdD&lnGa95hI~^^0|aKlUb$sA_qflZFE* zO~Tp8&>|nf=@+7qyMpNVCuAapo4JmkNq3pCCFEVY(kzcQ@8e?uWb=yYLQP-|8DdrK z*IxA48s-m^^Y(;E{#KY`f~FU%3GPm>V_s2L-tDMg)ZPYt<00Z)XMTB>v#58Z0TP3ewCp#z-DpA=3NM zNmId!quIqQ(#!+RSMLYHZ3(P4OJoPt?5({H{!Z7WeXmlsC8#f5sC*TUEHwV7IEB{I z->Ma|w=-O6>Zn^|H4yG*n$P?93FDeQ^c({}+E_Y83+$Bu|ISc=)KrOxm zaL37w%O?y-hPqZif!+nfAGOZZ+wbc^WuxR&B|5oIhHignD(n;3O?FUpf{d?skZixP zs*KUL4}ABrSC}~(w0oXabZ;C3glLduGCLlfr;VzQPOrk#j5K#yziZ%rMhSb|^E>W| zF=(Ah%)i*TV&tamcA3OW*u|L^$t-q-dfTDRDvS7C-gOOc_P)6a{PBuzAP@BlZb%IA zN^bBQ+**gqFTxm)?f=|L57h%9EA-zPpi{!q@gx~!XyqPW(pE( z)H^^^UL~9>dG})eBqXX_^Im&|%`k(9Sq_~fw|galgZnNIn2r8PUCIRnE8`foPA~MZ zVylNJ=v^4;=Q(bpf{eX;K3+`QBB2M)<)>%IGelzh<#01-;61R3g3wQ`j zOQW}#NA)ZOhwrG^q_ubzZijo(!{dc zyJ`PvJk+;pd${)#?yX)gC>;NgGhys)+hqs$TcB@1Z+MmCO)s7w%-^emmRIgBHE$tc znU&3DXX+qhy(kZu%St3+>s5b5e~&_XMl;Iqg~T&Du=(&}%J6Dp3ef8yT_X9?xVE16 zuDyV<{pP^P`#gKaW#M|!aDvwT`Y?KRrhBnbb}=!8+PZ5k3BjpPd!Sl6_vW3rqn~QA zRq9xwRq92d)m>SB7Pa=osBNJY4ZOsvl;;Q44--LxrTD*rH@eC)K_&TF`5F@-ORK_) zNrdjtDS=HEL4u!+f47n1J>>to_uc;cgmw7ez}d3=D!XDU8-BONlhts2BdR(p&+G9c z`Z7_(*T4GMM^{c=J^fGrWSrT)c6c14w8nF8$kB_^-mHfq+JCW@%X6BzIHKX?R_A^b zFG)V|rv{4ZE6dDwBq7~~)WbvycdTSW= zpEgP*ZYL&M#sw$l0#Jw%13Fng>TPF!+q#}#w=uDAGgw6K%$%IuyzZSo)XYOtAC5ug z)R%a4T9~)^k@9CxJ}PBrC9WA7wWTa6k}^r_+UhClBhrj3!%3BCO?T(m}fCG8^Cn?z_j@7W(8`5Cp;j+=`z@iSRnTIqAHcw})PD$c&J;`Sms- zdf(3T-&R2?pE-t~s_jS^x5d&TnSho_(UuwCKQVoObFRTuN~6Y%aK5HtmTjpD?dep7 zrN1u!L9=~YLh9pU@?i%5?EU@AG=y`B{_m#eUXPs&L>Gyds(2OJ>?UDx9BtyAV5b^2 zc4bx}rrX?@p5QJ%M?xKztDIx{HvThFIOw4Lntteg^7Q(emRscuvJ zo5n@7yN@Y=69acB%SZ>XBr02aEqH(2z7b;#hkW3kSpeu!z1!uWWm&kutcWVZ@P|s< z=^#zTUpHeuuLQpszR0;RBsr3nyq1t0vzx@FXsb?-gXP#4lDzX};-_q;0b{H9xwU1{ z{gRt|9D!k#Sm!eZ}rPcmTToD?&z~`PX_nB>N28IFfeC_M41k- zR6Zax^}~28R#NHRO~o+Us+%GQ^`__%5$Du;HcuKfc=(K~cHn=t&p2?~^$?UipH+o= z>QnsXm)4o^+b+zE9eE`N5SO5miiS})1Fq9t^CCs*1mzvq#%BuBffA|>2BXip>n|&z zb7c~x50eX>KlIbxJiT-Y29XI1k7lMANG#sixrtQKlir& zo7?7G?b5jhckn4~EuKVmj!~V#DTb(p!I0{d(<$8z$l$reeNW28Lt}?bMfhMOF!Oe# zfOa%?2NRGc%Dugi6>v0<(}x&s-Y|jYcYJ@F8Qa^9)PaD?-&|ZY*oZn$o8Fd~^@vPF zbep`>lUturNyT!ni#@7Xns4kVNSj{EZdjaejDb?0pXX4UY=}HgUz0(N4eyIDNLf^f z)cX&a*m|p&p~jEXyOs72672PAYwb?6w+Mbl9|tHMFj$yb`Oj5yQU&X3)}_sN-vMX9 zW)SO{diSciR`Kx(U2@wn&JukC*k>(mSZNmbk4u513;aa6=0rVBcU!-UGLCojgHy$N zfKALkz0wW2F_^+u$yaJxLO$G0!an&`d)^|~_c^=+C`K}niPiAmH^6|ZHoAPKf_ zCMsL1()TZ{=^NK9zcLLN1oqMeeW`ds_NBP+Tjnpn7GAZgnL%oE7Om%2AmG@X%N>w6E>orR&xq@`J=>H+Vm7 zeYtK|SNW*W;9=*vztqB;a~c0tbr`9z!x&`xPzbTX+{8S3??V*~(B6g^gzU4^-L5Ko%CNZ;+sy2CXKa=8UxNcWgbnE8f3@YBao)c{AY|%*C)!vf8*28q2^u zLrjz$sI}gtE%&K4BWA*Z09nBU=vKFlmWVf`#aXhnx45rv@Ui+6&2eE$m-tN=_An2(4 zGUjQ@{RXlgjXbMQw#wj{tbV!}06~dYM3P-|JBV|Km(Fq{!K`jS1xfYHL}7-hY<#U2 z3uLxo=YZgkG0vG-uW~S-|n&YDGH%x zPqPWHAW9E0lC%e|rA_G6O|=fHd0u;dWa6PfH)v30!Y+qX$h5b3!3wB&{f;JATNM0J zMV}K0-g@Trv7}3kRVYYUbl*ADtul1|#*ssb_NqUU`)Y~P`qFVjTr^78O0J(bvln9> zdGoS+ulmRXk)VxOVaqUj*c0~OxhU{>H!c|ylK0}(yCQ5oN8j3O15I(B+35OB2}vN{ z=IPjJUN1%)5JSQO<=@Lf;$!6r^Pj8#D9&qmeHtsP+o8&HK}RoKao$0TY3KNtq;|w% zWXgpbcMl(tM3;gm%bii;^uUYvyLU^)^6qhZ5N$LW-=fqfIJ3;#gqh+1L<*jc>R!}8 z$h0O<-}s;5wvxj)=+j%Ba+@L5^M@^(t1=(i=R$A8r7ofUjjG?oPh+nxoRP~cEk@^1 z+%@q$N2a&$_$E%@jN5A3ZU}9mzio7+=d`M8_-@k#XRCm7*Tj*^|yrN~$hWL~xa&6VF`r8o`&2#cvrL#qg3-F-w!(+Cmc&pt; zm8(LJ1Mr|5r~w?}oD{f=(^~9=Dc%#-FbfV_G&AL$&cUHxPu$DU=L?cVf6Df6cHrYC zS*28E-mZD?0?Vjwo1;sDSAQ7Q)r*zewM{_b|Dn0wK>7ugLp=jc$j|!TD=n9PJ5vm&@*Kee7Yafgv%v3gbHtAI~h|uIz9p z#e|ImI`UGeCHVE1o>~{_cCk{fp3x6NFZ$2&NYWKG+##qcUC~xMy z!CjD%#u~^EP!F@AYTdbaogGI8>Hsd25}5sOcigy-LF94B>)`g-D)A4tMjJvI(mujI ztZ(SOC;;BMOK9odVFb8RIRx)MzM;3w6UKcp)WS59YqgZ7*D&=h#IZ zG3B+favErQzdn1k?4W$^v68mzP-?vBtzflnkJ|mwV%elILlj>A$-R8b7W7qA;vtLX z^bMP7(><0+fA3T8qnB(#W1*TS5NVs71-~v!U-fycLgDVEmM!2V zZ=iC`M3nn?Sh%taUH5@HGsEBC8zqOgFAhK0u-#fNgAVgfIlvifo)5X_lE$Ljj>rYj z&;urJKSXRqy&^Z_(fj=N#pUI^H|$WPMY2k(@~-C+`v&pCxy4n2&TS#K%ig_x=4FUg z`F#7F=ksdSz7vnESTzV!{81i?i+ts0((_XA*>-c6>fI%8jHzn9O7Sgkclq7BSw*b{ z$6S(?D|vAxnNFWw0?@*g4y+20 zV{UlIL)58Rx3f9{DUK~_MBfAIT-|D{BEGKt?Gmyc*}9hdMd0P^eUcE3QlvB8S)eJ9 z_hxrY1S4bz9WXxS5aF@~MF$d8$CmSHvKxD@k3HJ^+PFnrJ7j?Nfx+9!!?v@!?8YrL zBH%*~D*9rm&U)v1wcLDo{J|aK^~H*6 z>hV2KJFnMQKQ-B3RrrAYXDa1%2ExN&8c8^%LlTuhr)^T;+c0mEL8sh9eCG_Aws&sp z^xq-qP2peH4}+Y%tO@c_;Ww9!$&daNYRtdSD|@b>dDFd_&-3p(y03R@N0k15TqliG zWPu;+*In}YiXQBO_s#RXKP8w>JDnm|!0GN^J9O?Gl_Yf{0*Ei1ISCon?_+Gd%Ux1Y z65Fw~J4U5JDKgktEjN3o9`ElzO!p#P;>MeO+&RCU_SKC6btX^ZeZc7xZ;uTR_1z5? z(*thFYGWSy*wlA#81r-5_=#sWemn6zyr7r2Lo{*eYgo)jNl`kly2k)jt5CbFI=g(6 zHumnjSoU96y$@1%TGw=qB~D9)XiRNWuc6ce$ScPV<3`qh%&)mvTBkwRG-twf-S+(B zj*L|FA72Eo>?&U+%e#rEMF1$Oq}F6>n1}@{c*nncx|QknlsUEz6dG4{QM@u9KNXNp z-+|ZXF6pE8U{)U@0)*~o9K`jdVxye@quo1oNYDI=Bll#llrkf~OGp=fghZhc`SnD= zYco9)7JBb$QN$Kdy>QA@-FkUPiCoa-_&^T!?b~OV7D=I?ow|L+UArFT)$DEnInL&% z9z=fihMVTtwf0pODfxVl!^8DO;z~Qd;prg3Zg4JR;5RHb(~sA)ZwV+HJTW#JD-PX{ z2Z`XvH}n^&eO8esvCbIhi(7+{V+=ar0@)9OGP1QtjN%*uc9c{^!KP5sPSqo%evHgd zB=MCyv{Ph#Y02nI9lrV5Km;OnjqO7rEj(p&YRIF;IWOMn<7|QqCnW8ZxdsjpRuP@D zS5O=~su$*N)?fTdryv$69f1#{t?1cLX%IwLeKxSU@)laxxIXPZbOpJ;{kvc9lQz%4 zw4ZFs!tt$F{JD!aDZF`1C)IGnV|;$XI&fjQec2^Lu;6Q8%mU-y8@2OZQ6O*|;yD#wpwM-;eL2+X54(*Q#3|K3i?9sq}7CD2`%A7#oa$ zeEccY7FE-Hwv=EBxRl}Bvk?Ys4GjisN(70fZUck~){+37PNy>1qQh3XYOj6y1%0_= zQJjAJ2P{mMchB#(Dsb_|jLygnRt}vne^Z9r`T=q97!umDTNe0!kVKp1iY@;i#;z(T z4q(d?f&~rkk_49_5Zv7*1b26L8Qk67-C>ZRgS)%CySogqsrR?D3A|0WBgGD`h0V4$FS5uuDDlP3R)PD~|D6;=-eS*S+;^<)i4?pu6&s+vAqCYlFGzQ|i+lx;;FxyjR4$mk?hMHU5Q zYELL;hw`w-{Z8n?-;6VmD*2kL%In3~>-SD3Bgb^Qv)4w{bVMcWG64e{L@z@D)16$A)3~w@}~@mtH4HN=-tR&kh7V`nnrZ-MIYWo5nufR9f(t}h!vYl1WKi_{6J{=G2r2HjI8?@I z^*i|ZN|$K|Db@jG3h+N~(U#N1NfA61;9v70{E2X8pgqQlaUKmzWa7}({G*OGF$eX1 z&hAfty7-6;_E@(yxo^VrJ)W264cbwA@qYUARL?iPROIQe&3Af({fF3h*4boka}QZ~ zN=_+PZ(+;iO@t}DDJ%?V+E^~?wW@={LEV5yS$1+XW7V@Fdgx9X=YK1_IIM_rf)s~z zVHs@gfao8(lQcW4sw%V5@1+WsKQTdp5>e`yj17V6gMSf6m{ls?t|{{9Bc2>SmUysN z3?#<%$WTVV)&6u@{M+uohhKe@I_yZGwTU6aS=yK6II*IK0220nFTj>rZy>ML5Fa)` z?zwr$MJ=uiU%*fiKT;zhHWJmy&zy77?llUbGrVLi+{zt2KQL{0Yw;VLb|Bo1nO636 zizY-XM>ud*J*5GTVg7v6&^1 zmB01RxLZ1jjM#UsH+)STnq=~uxIhqRTn8fqt{;@e9JR*5^!0IoDU+>9m54Uon{%np z+Hc8sNi$s>0j98zQ!2sA$A}Ga9Oa)C%GsPl(H~+8rvD3;dK(HM?Eg?i@ZY5Sf5DQ2 zvyGteZ-AZq{{=}c#GLd%Fav~+GQf8w#MwzYV1sZeBf08sxMPHX$NvB({uprp2-paB18-XgM$|8i#d?O+UW zG&Hg`{J&C{@Z$PU>i-?v+P{!tU4C#}0N7g;<0L{}aWpXEwSq*3WdG?GDjerWkmu4>FJRQx&cpY#$sT+5ln0}@q#h~f90Ps6 zRjk+0WL(-hEG>NcHO;H(mB?==P5~MQZrylgB`2y6*9FPYH91rsF1CG7$<%k?pWs*e zr7=Nf`Z|v^$21Ph^v2i|UV-n_;2y{YIsOAH55o_Pt1JlNCT~Bkx>t4|Jx|-^Np@b8 z44X9WiRa4=)P!}b!1HjI*jy`+a7m4{Y9i;(h`xX0dER*EYnabmc&Q^ zKIHn?Fx@>idP-R|CR5{p2>9)wvmJj$$RLEGG$n`Os)4tl5S&EWb)Z$Fz5Vs{oEm=M zR97b79lM{Z?y)Asb`L|LxFvJA zO~Ij+iIJf-^-Tpa3E-xRU zb03~b$>%37;16*vPe|L@=U9+;H8r8s=%GJhzwNt^l^Siw5KNJL<$i^2;pTdk_ZMLk(~wk`>la;CADEV$R_IpH zSr$|mT^3Xj8y1uklk8Vt793gJ937rcfyyZlFZZvnYmbP)^!GNV3cN-)i5;+e(Wt!n zqE1-81`rZ;jtveDN2_p?9Oh0Kx?k~puw4BLjyasV%x=3s@8Pi#i!ofyxXDzpc_|v| zPa4%9VHoWi61(4@U0}ixr$mOHdXmo1JGh`sHUMUJI&Bim%cg**Fyz2y0LVx z4f6S6e)Z>IW{LF2S_FH$s}4x7!cE(?Jm%3^VtMGXvfV3RntYaLH>Xl-?8RaI(K_#2 z3fitzLZ(iP2|E@JZpC_n>7_@`!BO&)iCd**jEsScN7__`Z94cW~=QnVKm)yaP^ zW=p^(9tEw-Opceaef>fzRiry^cb_h-@BN|tG@Xx#>VyT@iyOzP7jb6wJZ zX?hT&QE3HO|I)r#J^0(b>0#bC!e^MXS75m?`0Iw(gFN38vCVTiN$2%h-XzU8ezfV? zUv0W8xVeArhs8gc6ilzkbvHDC*pWKh#vhUy@)`b>hYnA|iYL!0D8K?dC;@_hI1c>P=5$pbm<%lWb9C&-xtxvQ&+C*gZcl#l_-fuS6)3%mqxgJiEMY}f6iQO4(K`#oOz0imbuomv)is1`zb4fbi&gY z)*x{X6A)pYbHuXE1@>&WqLK;=#A1GTW9Ox2>w@iaX>Y&mvGDTv@bZP@W2y;q-t+a9 zxzzWoFs&g#f3shg<~YeDSL$~dTG{7$+*Qf@$dFqP9CFomW?5!|gG zytb@zMfLh_y9DNb+)a4{?c38Zt!PIFcv=$?HopdmI2v)XRHMrD7Khr|ai3Tn$aFN7b9218L{w zdt2`F#e6DQ?}-W4-xeA2P@OyWz&?bV8+;pKukD_ZO-D8~YK<{#I!~bwQ3f9nIYNdM zKh_Dx9woe%lgsFo16(8LLsA|7W--<$VT{`l@e(>OipREaBIoncS~fFYCak+&)o;I& zHxrnAN;Ec|6;@Z^u5Edt<1NaZm3`JDTuF`G$wzY9^BxEXZ}T%$oP8DnOaQ(?AiYhC z!K5wjiL8_~4@m<8%txd9$fharM|nZayNjRvAJ2tDV~=r&jmgPHOZdS`78ohwx^)b1Na_fM$IH5UQw;McuLTc9BVWSH+(Z(o=#TTol*(yP zjS7b6-%2Vq!KVQSh#$3i#p3pb5f;su#L9TbWN;;9}8<#m!JPXstE1##eJ@Dx< zaqZA%$Ckq+g$+df#OfWZl7q4RdTc&YF+Llpnu*EN&ZmO(T!Hq|fZBPz>sMU9QAgDy zFVtgjD$SvNBlYA$8aa@eyhaT0YW0_V3Xu*7khMpd&`zoY~g#SQoR>JIgH%oyMD;fou)wIM$wm8;Ecw zz{Dp)^0-dw^jtduPDYV)$r$r(O*E{Uco#rGZkYGP*YiGyN00fPt4Fk5lWuX#N!|pVwEtceoNgkYRR8saUJ`TeRK#?8a${&EIpw zEwdDbQ1Re(sdL7Q!^m>$YVW9VqB!~y`oihq;X1G36JueDjHP<%6=~g;Yvf14g7L;f zG`tU$=ab~j+Ka6aR%Hi7X4zJF{uBOjnduu-dDLx^*2Si?+4*gtZi+PlB0aD2ibw2v zCEwug0Bkz+S`%;7BdHf^bK&;#@1d^(K!vRU9FVEu+qO2l5)rGeLsa#lE1eEQ@zQF( zSq-N!2)IAYI@nMlW@gB!-nYT?&5XxxT_;ulp5~=6{YIqLDIl|&FQ#>AAcWfiUzT?V z1ZYXrZJ+&XIy_BzxZ3+-IdI)|f_2}teJpE2;;|DUz+x%uveBcwvO&m6`vwOZQky?A`C`fLX@61F zNpsil2IoFS%ct>siIq07ls7RsH=eV$xi-nYD&B%NUpsula;B=#S6<&nrWtn8|9sZf z`Fmd;>B*IAoraT>e&;_lG8ni^r4rT;2Oel;4_gk{?yUgILrayfJ}NyL)TxUk;1A z2CcG{h&E|_`5yM7f$O(-4d7(;p+Z=f-Ruul3fzH0Ou};(xgdrPCvsIA%QB4y2j#vM z&2JWGVBm`F^CoMJiStS9_#lO{^3QB-MGG~sbIj~v-%Ct+ML|k`=YGO6^+r~Pqq|)% zX>fJe6oPUb_Nx$|E=Mh3XT@^(2rwVFa=rGfwMi$~Jwk~=K5;;2oQZyeh}{{c^4;!A)W&%X7%T{HSIiP-2o*AFbysQS z)9^C2>EE4^p8UE|C*+5#F7a|lemt95?+2%`s?u-nSB$)#UC#K~n!A|a6=TP%KO@GB z%5CaWg0quLjAhpOyu@dQMbVfyc)hgk7^hly{GGcNA;s*l25cLz%d~~#K?Dcs#hcEF22QDezm7-YIHEaeC&r! zS&pTt`eo;y+Kl1E>_&k8Um&ij>rilA)J(=bYY|2C zJ>rnO*2?E;%t?IEyMENw>g=WfG0FL@!|#J$VtJh~%pcec6u2@)ZTIQM;{62{ZYo5G zMzm%&8&CTpkKv^qxbjwyu8gGwJci}tzwrq(ADijko<-TsKNHjjpl7rm39(C)Ajo_% z!M-RVtwq*u>7ep0)A@b5ZYGg(orG#CdWZ+o9!}9RwC+3%`U`GC#8b-lXmT*^^y=|D zuY1qym{clQ!e#($mMbII?Ha1Q%|5dqoPYf;d8SDaqcUfk;3Ut$t98o8NbNCQF~2ft zn8Zny{}oyc_;IvcoBN&Ro;Zpk>t*#aLyYdVavimEy3Bi^w}5Q>{q~ZO@V#k1o`UM5 z?N?jLa%VN|=uVj4{0LN#=;xx&UUgl@Yz~&Krgv`O#WKJLzqa=?MF)J-F+BeZ07Uw> zQIku(v41Q($R73AIf@_iUv0%u?8LIiM|V$e9UVF9`7i#;YlC66Kl{eJ|BOwAVm3Lg zZn}6VQcCx$f;C;_^ButZ( z&{J(>5d39HvZ|N&udj{oHYsh3q-fFCRIC7dr~Cf1-P>JU8(gm(qBb>otG5`rw9D6K z`33soZAdp^JdU%Flo57RAML;@CP*~qnkHwtjX9#e=Em-%HD&vYYNT2dk;y*al#Az^ zqJ@KioGby?FCe7NHmB{|nZGlssy z-`>dNfxO>;##eipT%J_@_IuzsADa|K%w@$f0`dpT{^M@?V`-i+OiqI9P<$Z481^pY zGq&Ob>T=~D`VI=m*ZbE>lL^Z7eRz@WO=Ui@w?mdzrxmA_8LJTMmVah4^2~qg75Qxq zo9C2CDD3aVZ&n|U+EIf$yo)XxTvVmCgvlR9U(%ESeBVfY7L@v|i(;I5GWTzysN6%lE`)NPYdNJi)>;#=WG|fJo*lN(b-Fiq6 z$D~ci_9VqFJj+V%yP`F&JvdS@mzn(&?Uf?53j zS>8!jqvu}`s<^)j`kX#sz&;Z!uJx#DNIAum&f&2=pJ~zn+`1h3#xc?g+B|dw2DatM2vXbLIWHG<;X#IQ>BxiMA zYtw>hGD{C`-qrLU=X72$IaWT=UAv4bG?Ln|IdwoW?cgN8HheB-3yx%utK?5kv3pTM z;FjpztYRTrucOnC8H_>M{Vs?G-QR%I)tO?Yfn*h)d>e69!ov8x?D19b9(}b27YK6c zyT;8LiFhYA1nMroYke^c5ItuIrrfVA#l>l8v0k}EnN)14KpdoA9qqS4aBKUd2C8OHp5A#sk;QbR@;GPvnN*jjUWAO&V45TB1VQoY@)soDBu z=YI&vED~HmjX?_$p_@KG(1X*dGJa$iZ(ydqyy zyy@cb{4E8G^M&(8caIq>Xb*>R>frVZ!BP1wf}B*VmRe(R?#~!yZlK|uCn#j|JGqa} zQmuEG&s9F=C+|ZPK8KTfilb+i@(^Z{>W^v_X?dTk6r|k&s(hLiRUA6e3A8lQ8?myF zJGyh&6`aY0i(t6+#ssOYP?n(x-rmxNOw^dTzuGZ$b;k=Jo2=cpRy?sJH02b&oiBKx#SPj~d`Suyx@zzi4O0JF<@$sFE42 z&P~!_?YtPhmoHJeyW z|rPlLp)kI-wK|a6L({7E{6k;veJ%e_E|AMMJnCZzO8IY&0=#&+}|9!K$Fu z*p_p~DUQM7>270b47XQYw@2YU?_TJT6EGmc3ph75D6^jAE21h%-wCSwg=#bkdh?i@ zXy)V_JL#?Nt0biehQ+?yteyo&9XHW#0x4UIL=GmK4mT9a_KTjYll9FXLHzr>QBMvV zEgP9tk-8i7cdsp*hU3hY>S(HSfHJ0rP*BZAA9m9~lwwbBg?XsAd-mbZwQ6U~=sM@i z2KUn4lz6p<^%50-Ac#)*eWRadbZ>qGS za7Y)gfNrR=L$m$tprLiqgRx*oafGiGPXdjUYoo%-roNS9L`f#D3TI_*XgOW(@QK2T_=O|E(t zY*IsfMXx}!>m=~}oR^`iFE1antzHMgv@ce{lLOAOY zZ9?7+*t7Wq;%EEQ%l_Xds#x6ijF-Omb?ZJyh)birYV?QPfEdTrBFwsR44!&RcnN)$ z%H#H_EjH$e5Wy}OhZIx2>!#*iOVnbSx4rqa$tk|zG3jo$WQbWAc6OZ(PdA}fa9XjZ zO|mG<-V}Ac&vV?g?pdGP+k@?~10aQFw9l+nZbN*Mphc#l%N;ndw6 z-jJkmF{1D-&c8ONH-|`OWlTPmNI(gPFVmwdtEpXX+G)Nz9rXPCm1PT8Fil{EM z-4~qm)E6I&qe|onaqEe2>{IAx&S_CAU*~tpDw*+?zj;7bST`RFs^nc7GRu|Z%;Hoc zJWo8H$uBTgdvGRot*AS(4MTRS z7Y6)n?9JaZ;96BG$M1y+rKKXo_*rv|!!>q&3#!tT zH?ehUAiel$^G_xzQw(|dM~*vp4qt_l{b_Jf^+{(?t5f=cI?u6GCzainN5F1j)zvGdmLP&)bVQ9x99oAbdOazbh%6ZEP~736oF1b3f@m zjUR>|!a1D;T0q{!(XvMQxj*J+fP)P9Q9vD+Hk;PRefE`HBJyl6_s%*g|Z%-K@t42xbxwde*BJ=x8+&a?(jA8P~b2Yw%XJ zc=n-i&vr4^640MfS6$&_7I)BzS>SMDG97{9MaU(`ZuRymvyfcI0|`J&aJt*R9IZ>> zXP5>y9WML9(MI4^uphio=!y=~X{n%@Sg%=u)mL^R*Y)m3(YmMa)=fGyCKythGk9rl zl=%af^;V_V&V9LC>ACMWvl@UpN&c^|D+~)0p^v^S(k1op(c3^5CfwChlxDUmxypv~ z5+Aycpk#%`1v@1&ch>o>Vv1KRP%2aVw3iAgQBTv@Zh6l6h)VaHU`S_OEfdM`=;#t> z#|_e?RCiZ*Dw_HU^1KJ{;%T^z*Nirh%5)2o7VLTtavjy>&w%iG|0)Qa>LIN2Cg^Dz zx76O0PrO*Ywm6h~OR=GAVmpg}BeC|18~|C5q73o|#dOAmS5K`ReVf{@ySiAOmx^9x z1B+fRq~w9wL1R7J7rUe}i#Gizv@`6#{*R?xF99R3_ zJ+J>NuWZJj{Z$%Lx=EO7V2BAsy@uE^#adV7Qn)+^s>DvZ}$QEXTo zzDUv&ZW?$$(muw^jv*D;{w$=R>S(!fZ(|A6eKM?Zti*1}A4h8vPboV~UcDS?XX?h^ zoF=XlJDfZoN99Byl9GYyFf1^@LX_TtIFql^4#OQJamuA?(nV&>AnKDMHaiR z(6tyQ&tz2dyc3!1yyPb}zH5)a=-(qpxt&f-O9LG?ypco}M4FgH!%`$Q-8_u&(&m5e zPq!vEw6-g=fe3E2``S;p*{d5mZ9-d3O1XzJi8KXozqP~y>~*GADBzHy8!ekccqh)7 zzYx3ryXC_#?Tk{UzH7hYyy*ZM!HvLROM6fxFph&R@z>EV@=+*NuS zO*>l3D3i?3SldXGW*dbwW1Fp>TVRUERjqwfO?SR1ntRYOtCykM3gq^4qaUk-vLrg< z%UO`^9s?Lnq~h$W`F7K7bv88Bi z(8fthV=?Vi0jLd4&>Zu7z*WaCNVmCSl&f0JTk`u$ z!48@VqeYIFN!6g8K~Iuli>eB!E^2j3O{I_V; zsC01L_<6@ef%fF6Yb}cDGpDI@8EDIhmUOA}b=#}N&-5~_S58_Ixiy?h*9|CUv=tFL z;mvwbS_t5Ln`%zgJV7eGeUgodWxZa_Q$t-j3P(eNyjUNY=aGzHL?-Bq_LFiY&D80Q>#86cZ&`55-hui`nK9bf+X-^QNIkPzZGGN`9 zQ{RfW33-1RUo$By7IhZ(v-C*4^~%;HV3jMuidUqV0eHs^4ZR(kVC~z#Ey7evW>o&U zTRR6welD9)%+34GnEWj<g0MILG;-*%SMGxb*t9h+;V7IKANB@#h*)2V2e*oriJ#sQqjTF^ zCdk4Nl?W2u2fDG0hFU5^%$E8rRZV-h4CN z-J};`FP;W9tn+UzoKsy+k+ih&2EpfXorTRayT&)-GS{V8A=aFn%!MU|&7yzJKpQL}3sQBNc%W%(IQ`d2{f15_ z|97SRlcsCvL(XvzV*09u2Z+L}J-g@RP)ApHSJ3nfkv8)W>63zZb14juO&l{wdyUtA zL~EXEL=4Db!Q7NJcBrgeX9m116{gGhnCm?+w+hc2krZ>JOQ&B8P-iN=6lLg~u!xI; zM63hABWD|MuGq%uiz_3A0GWz1YicY#-HQ3ndIy~k+jH4>hBEEO5ONT}eQ@GkI_*vM z!~y9OTeiPvyPnG8La~do7n&^>@5`U$Lz+_|)|G*|i3r=8oYLh+8ChD9&Yz-{j5}w3 z#Tjyhx_ucs^*7j%{n^W>CHwgb{U7>Bvy&^4sNDU|H04_P>04rCAS?UQJ1`0=`!qpWF9#uM@OD7td(nRQ4RR-#1R{_E_YU{Db%$(-d8cQ znkoK~(>Lt|SmgX*ZG&T)a2=`5Nlp6=X9-pmRmTHF-c`}s&)l<*XeTSgk7`;DwdxSa z3cIv7VTP8nMZEjaC5ZaH!o6_q-eEtMsc}h>ex^uFB|01tq8nTU&aOxMb9vZANYi$Q z6zeQd&XM(21UV-*DVLa?S=jvEHnG0CVcS#t!`SxzGA}!vw%U2R#Rz#CUyCkHiMwNoEDG39RHs{)Wpz~ z(8L^cUQk|GW?gx8W43>GcwJF)a#&k-cG&`#wPQe3Wh6o(xc@6tuE8h8;!_rp4a!(t zBsXD^&z!zW{eQYaS5aYfk=%-x+Ga-h8egNl#nHBgP`5bLkFT4c77Ms7nC@}zjG7So zH=)Iy9k+_|dZX)juYdyhi$PM`R{TwPnH2*E(d73CYqI@ZtOYM`9CD4Y@1MLS=Bu*2 zpl*)I;BxhMuNog6#2%r3E**fmfDwM?HO!cDDwvy^U||Bj8Zor3D? zVeaaG%`nfQE2fJx){E%~`XwYy|C$CwSe@Q$GS6<-6|z3z_6sc$6rz7jrOs+-qkZdgE@g7;o~{zXkS5nie!dwxRGSJ zV>^72BH7TXFY*FR-;Mhx46cN7H8L-7#kj7lpkcCMG4Q-$jZ945(S9>AP-AJZ zG68{TZU|PAfaS^Xi!8mP#iB~JG(5SKO9d^>f8Gm%{YLo$8thPmb~^^+D&u)a%x!r> zI(l3Qa|L`%Ngi!_Tu@lw?@cDd^)8g4>|>4YK8mqNMvv~^>8jMyh`lniw6gkr|8BP! zB3FER>iXn;M;!qL^%aEPwd_d6_En$RV07ebSo>EZ-YAMjvgYOQ^tHGN=)g>^qc7CoQ%5X(_7kh1Nd1Cg>Q0~APeh-&Qa`b_s2M1FWl5b;{5wCfOzJTQ!e(huz=eP& z4Ryifm(ao;<+exwI_q=(%EzzLd_byt)NQ|576jIkdJnDW_eoCb>o_A`kYVgbqU=#i zFe>h@tN98gf!D?WYb$~FS;(Z+{9786@L(-b9dahDGwz&0z7dgsJDtjTw}L@m-so@$ zv(QGMhAxra0M%KRD%oo&#z-B8r|@xf&J=AI_g+a`xRDCe9DZmYmV7#-L-e;pZZC;*QciwV^}FKNt{ z#Z84${8=Dv?@~PiZv#v4OIDPWFimhi1T9dcJ~DUarDST4^Z>rswm|o19o;|uJEV=+ zsnBpyk}-5!@nQ!~29HOI#hRU&E0!g^B{`m_eb!Uvo2oHzmA;MLD+aL&~ z_!U8L9GGWU`ngf6uPzC$F6PrD|LdsQg1@cL!#VvI4ny_ekk3nw#brI$wiTjVEzFfF zsa+$*l+Ca#B){p*1aqm*;e;qSZk_cGE^CDwy0sKs^!$Y6uq@sB@1anBg|c!b{~>~h z)%%0}$1n+l#f7Uc?etG-3rXrT?%7x#;`a&9-o3HOohvq_57J*Bs=4ZHu0b&LYzw5y zLjMeq$op}&h`x*M>9yL>Qwv1ZTZwEyRZ~u$bZ5f?CJdk^3=Bo{6@jj*O;Ai*arMlc za4)c&5$Na8EsK&Q1_f#b)dV&fzd8~!AQLd0a^{AmgFRUMeh923LG zJV%j2P0dPG8Zblt%7o+~YtK34l<_4sjmB*id85&nbLXwCY$VmH6rTg>MbEB{vkQfS zmoK=Vnh19AM_`G;GUBCFH%!f|eq{)Sef8D%E{~tJRzI?SDw(VJRz({wj}R;mUS)Lh z<^NvA8muGsTvdp5b-H`_L_~s0Xjf~V$i$carAzjjRvY0s@01STX?Mmowv2_V5*7ol z$rnHpxP~*4>3{uQxPcg5*^Z|MIOb*xTZ94Q0T1;;k7EXeI!JFD6f8;+9#zZb?Gay- z z8?hvVd+e)2cLZlZ#Q1=HvE-7lsC8B9`?MuP{T}*H~c~%%H z?4WQ@i=dQYupF27^HN?y6CBAgeZHE5bI2m=Z_SBynNN$sGRk!2de&$tjBrX&gb~~~ z!MqWlfH(pqqjGjQ7&^kEBJ#`B=xY@D!Q$AQClMHmWUlQiH|;Cci9ea<%*idq6|I3? zeZQ-5)G&VPmxWO=+B|r0&%3iz3?^fvp;e?i*h5OZ$7^Vn8NoM)88b;$^4+X;WzYy z`m6^1&c27a%lzGlT16n(Z+H>j{Vo`9XjwMHvT*O-&wSG3t4CZ59e(c8P=F&vK0h8p zG)b=pG;_i${iM;!_7qx z{2}BrDZBY`Ej0!lQ4{KJDjLOu6N|dHcjM^k>MyQ+-7Aiz-Zzs%H}=Cn=Npp|aMN#u zYBo3Opt)0f@J$;uG)48oBBhL|^}mN7xk5d-8K|t)T({wXU_Zu>6UinNm=n*%WHLMM zy!>E;4>iU}#q_gB4E*FaFEi^F_S!WzDYHufh*y6ak|0UrbV{5T2Y=i(nI&#B;>fW% z-efLe-oWs?%OOWN;?OqES02ly*d8lxix2VSUITqFlfxhaxP;O(06wK;&!NvkJP!_ zS?b*7=%?TSACv$WJBp#t)}I$isx!p_XyNd;wrLjnUT==JL?UuSG=~_%DD2SM+p+2= z?Mg-DG-wC*v7S#k2}-Zy%lgpQn4I%QwRg=C^a=^TQHC(2_vnwAykPc4rhk$>8=wuN z$c$qqBk(3$mlJ9THpn_&v>_PKIUEvKZ^^#+IjI3YBWCSS(dT`qqTv&z{{>6iwK{}E zFJfTKhbyflA!Qbydq)~9l9jH^3!TfwFKbj{EjQA(tJj*fusc5k= z#U7$W5=T`4*(dp6m!o?5{5LurgntTf4?e=&#!;Nyf91no4^Y|dXomu@=Ud3_heb19 z#b08MG@7{9N?6yEs7O6~i<|~2uJ74X>`hf0n`kOOq{grcu^X(-0YJ@xz-mI_V9w8! zPS6#xHM9sGwhtGogmBFed$*7ide|V5X-T2`?a%(2A@h5cYPiTI(RoO4jyeJf2_CkN zY?EEj-+Ei1@$07z|8>n%NUss4jWZ12bf07jtno$@$ZaTsDbr**4Ro^jTq*-1NG zMen~KwCp7Xlc6=S8f24tu}@8GHNK-A;NxjJlp2}rZsZB}yl)rlo{9$8$pf4oR!DBM zWxB3r4(=gNNOND8a^~S`mcZ!XU4kPiuLdDO@db6d5z3^2h z&y$L>v@jw+V)No7_S@fnJqjv!!)P6cLn}R%N%#3k`Se{5nxXCoL9QE=4wgzzS1NEw zq~`ZAM8^RhKKzN3*~>qD*yjXur~E#180rRR&&W6YN%z?3Y^^f%%Xg`H4RjggY&KF9 zoF1pTq3_3SXk=MDhtK|GK|BKj$)1u7CZE}u1EtO&^htQMSc+pvBT7$`!#yaJ!R`8* zYuP<`0gi2u%pRX`CV}$IF%(~C)&!d_s09?LW9{TXb!btYApcgnUsxGqQeSd81VQ|+ z7SKOy?C5AGf}U%B)$-2BLv5 zUQ&)S;luYcr`|5zUeUjf6Y1Mmnw!`spU?59DZxj^VcLhUt;gY9 z7(JK2+uz%8s8OQ7G+;FzN+9qPTJx1m#l-vC)j1rwaZA25OZYE*lDr}}w_=yNm|;4! z4CO|CpPY;O{>blK;44Gm_O|I-kZMMQf0U|jy=rCCqAaM|t)yR(lw4gDU7a~1#!!V4 zPS|LchG)a3q+?ocZBi>MtuQUnFCeHYudb>tEvjGN7{9}X{mUH_wy28hG!a`y60D$y zDNHet(dSy=s}nkGgVk5?@&UdMkh6(eqkrYoJ48-p#Z*;-b}LGuK<83NkQ2i9fHHNk z9nJ$4KZfR^*J-hwCL{Xd^T5)R>O|1D`o6 z&96ndkj^J$jFG%V0)k>EE}07f^CwbnVkk7dV|ZMvZ*O|~o~+5ofMw)M7c+qP}nwr$(CZR6jzZQHi3d+N^Ko7_=XC8<=hswY9O z?>%J@rzXHCjb=gumKs(tm8%y39;JlQnA(w|&Kf!x@SZ}l38azFV3bsk11c_@l)Jz$ zEM>qfi-CqYkQC>hD1bfFKpUhGDZWG#Xjx{7cWe=9mF!4e&TZeo97LGteb5m&ypP~q zmOytauVq0P)A9BY@EKc;XI~2g1zw~20R$Sjh8tw0hU5@%^`v|${P@)-YSlbz*{`DV zE8RoJd}{xa3*eYvf5>T5ItD#|VQ6-3>pcW}4jOlx1T$|MFh8t1Tm~0?yWo-UYpu}3Jz`R_}fD`w; zus?q6EnEO_K;8mUiTmHeEtJmLebi}Om;EF|-`9yK!FC;$;1f9wL-;9d zGF=V@VR55kh45AzG)D9V;Xi#Flw&r4@xBkUD4P8bFs+S^bqW@=biFK zMUxz0Y2*D%{1i!rvWb|tyz3?4o2-M z2sD@bIQ(u1hN>k>UWEz4wV0kOI1_wevBWBCsme%7 zM-Ztp%v3y=l)@>PEH;CsVH;Rx3fT}? zz{fw!fIO_kB43tc$ym%lFk9dT5qx}d0Q(R~`pt~YA)_C%>*>ak&-np@S)5L`T;!`;RSr%Q|*Vl$+)XN9SJ`^!vVRAs5kh7NILg5c0tvV#4=7<7uqGViET zteQe#*F_SQ;Frm!Laa#}3a9d7EH4`;)ysTpfca8@0EFVm4R98ZTJWPnP7!2fuNewW zJC>tRAy&HWD_&k|L!ydKiHuww#lGH3;;<7N0+$iGWSrgz1Pa3}h9A$)o8W-mc35qhsi@n!EeS($1pjmHL9XN{ zURNq{3PZ3?!hF=DVKu;jxeR)c)J8x{YJ?{tp#UoLW|g%O*NG2!Kyu^-(t|-+N#a^K zmQ*JqoDeS8L_~t3nwA$f2N^~-QKS?l$NEnI!uNoO%m%=lX+7eYYJmr0)K!~zVA+e<8~1VCK(R7L=y)T z9C%-L1mh&Q+@|#)6#%qk<}qG_IvUCGEt_w9sqYvgCLmLXZ*zX4nsdCGKUmW{pbRT? zwO2Z#FEU-lj9dXugnWi}koM$~=tvu>6y)?0XuSK^^nn|GBYSvcPL=m-RZJUAA}j1} z7P90WJk=HD;SisT?B`b$YD~&fEi)HDO4^U<9nfWxGu#qeXS9*w;|aTz<39-_1r$h& zJHu^9(C$)z6!|8X6ezQ;pwc~6n6Lg&5~8pEDLvs`vvGf!O4Up^z*GI_Y&Qg#lBNEf zs|IJVPc-~Z`7nNlcQKp`|2lZt+8PZRj~ZCv(!fW?T3mO^6!)Ji&pZui-;iw~Wxsb_ zki73?=^l~4G@?xk(vY*+f%^f?5>?tLli0DPT3}squ$i#AiCi=&!~>G!KR2!MGUwp& zX9ig)BM&p5m{7^9GGK~5;|>V18w-|kpcRTL*?Y*qY=M|ED!EC~#N(AD=W?*|Kf|?C zv(`%hy)^Bn60i@aS^mlgeXan3gy>KJw~pzX%zc9$SZqz0EFza9p$7{`Ys zanVqCQ$q&6Yy~u2F}##y^d`jABbeCy5bYLF-ptQ zG;%piPn^zZ67ohXxSH&+nC}j@MBZsYV54#nBZ$^s|BWg*C6jhX2o8l+=rclu&^6B3 z?gQR+BDiIAyg8|#LK!}KUd8F9S^HIF{LwF-#4H)^Ej$_+rP3!tY ze5)8%pvorN|IJ5pGc)`M8{wKR=x2e^u>(m2q8vD#uD$nk!#LupR+E2Z{deIQcq_{H z-~;hf>*FwGuF+s{L7{V!``l)*9`&w`vg0YGNRKRxx;sNu2(b#>Fzyl;XLpD;!vQJdZGQ z@9${Q!0SE!m{W9(qoWVx4u-rXL(vH_OoJ-{h)^YHWe<2 zC!jL8O$bo!q_Kw1$9|?S6?z^&Q`L`xgp-6<)*ql`NCfF|N>d=P-(ZoR4eMPDK?3hd z!PS|3r8-QT5%-%8mo@0*Tn_E?3O^b(TjiO&9ZzdULrUp{D z%ppX%Ako+#L?md|MkY#D%770#gYOa@FfUhL5@4{{GfG8i@e=XCIjxL%Cgq?gB5BaT@Y0TKy}G~oc{;T1UQCWy=*3DC8+&~;F%qJN&Ln&{sMHsec|+C zgR+z2`qq&Q*AAf3V2(0g?F7V4=|5`zK0mFj&ko0xpAlX zx$)K6!Tl*6oKFFLpYG)FmUmH3@n8-K4LkxgDAjzmm(-vbjRVlLbMA*dII3*IZ&6`r zr3a>6FfU(%3?=5X&;5x%g7Ay%pYx0}$X2)(#i5tWfOjk2TFwnO8~Ejmh68e?Gkg_% zw~yhKQ^|=s%shOw&;81Q2lwxzIv4@626Pd*K_K2B2=1d;%&#^X?gQRm4>7Jd?5iJ7 z%L5E!0ALJ=C-6*+m|ixZ7k->ADKd2Ho?QrHi$Br!*ry%;+lpW@5w^`c(U#-_s%;>6 zBf-zPUDipLO5Oy#ozCNfU~9i~|0LWd_$o-9;2&%qv|ije+kYLQ|J#8YW>eg}8w(zD zN%C(H+5}Kkz!7_6#D=7j2&CJ%l4p;1{qOG4PN>k2~wo(E)~6u7J>y=N&Gt zaP2MH2)LOH4}5Qck%2zI`yS{WJoj3|YyT`0B&uW|k&5abMS=myW(ZsfsdYg9cfUT| z|Ax39OEv(NKVOA46yl_4K6c1@z(2jZs)VO@_ajg1=akHgb@7NFgCFfr(*xiUryn(g z`{H44;2&i(`;C-@qo9{hzD*R?&CIM34{QZtI$#Fn02Cfo_#jl?9~W-T{urr*;f{R3 z3kIaFq6P#@=-Tp$P950m(Fr+fBC~+Ig!8))S|K34z(@8m^tI#nucS^woIJ&8=#iPU z`u!9EMa{lBxq`;Q96O=~q=NvIH3r}+F^S7f!%oZ~&^e}HfGF%Wc`3J`c>j?PXjv72 z8V$TKZde>WSc8EnfU^#4s4JTbXrD{iAk_JPOUk#B3P9x<&q7(10ICU>IOmdNPq9KY zy>jCKekY_!ZtusT7jqOOx(h+x_kf_zOkiM9m5`>wznVy;3! z|6q>+yXgqF0^<9xSpLOMDnb2&b%54eOR#nEBTujufWD6sZ&k$F5o!&b1$hFqb=*fb z!9AEeN9qmcV`{+v^+Q{Sw{@TzLWBI~moNmSrQYYchxE5WFT8qH zM!oMXc@lh+FNNly1`59wzmVg@+mU}Kxrgym1A*I-?|*R_1B8uI)RJ-bl^}lpV|gOS zD+b8NT8IDk-OoPg;SZo*HXq)y*~bUkL#QECdc{5)umX(5HBr`Yx zDuvVt0XgcY5MU?pH^5&00qOy46`WyFNUfL-%42fSUDpo#2Il~1*f(WHv0Uumq5+B* z;+8z%FajpvPre5*<9SA0xH@u->ET;v*4_Y_dZw`JA7qch)CNeZa})j0Iei-9m8UH*HvXyiY4T<%Ti55k1MmL68&W%2y!_)qvoh5t=j z2i7D2>H>Dk8fnOeAbEl-lU636Y54x=Tk@us;iGfE8Xn<2)Hw2m4U$g)XPp09^-GQl zXGxm;OP+#_6?0_^KtCJ{ngZzq7Nc-_jS8Ft*?_f>4Q%lq@z3=OECWYD7dYp;npQeW z*zlJ(i&z3p1wpa`#JLMu0Ns#RIs)7kbD=GwFLem|O1RWB1cdJ+KZTRIT$SV-=C_4> zL6H0{AK&L1#foN06J?Efz~X?tj9i&sKb;TM1K?Bi1NVXt!B(4*9DrRIDf@!(EdJZR z$jwwqA9E(M&?%G;!8kKXJHhB01YLoR(aqSghr@reTMsp^R z^veqwg7(ty<2vA-hl>7)Dw<%o>=aZYjbIyTR07-uJPA4@T{;JX5gBw1_|1m|UkXr~ zVDDpIgUiv}1NO67Y=L|N*#w{Q0P;e%4k(lL>kP1+0|L4s+5|uP_D>mTLw>|>%FWLQ z3_@~Q0?Y+D3uF^pIrld;0K^CX6j;KpXzn|z2kiYfbynmgEX57D2gsLTF}z0>r3ON_ z{0oUwpXU=)xOO-K$rTX=N@2p(v-7K))9aJV8+-!P!(+~WHL2KZhAs+WU7NS_a|&}; zN%V)BhpITvRGG^8e&`V6CMZU7d>33Ag>S)Q&VN$r3CjlQ#EG73^=~e2eye}nzv>fq zigv~p-A^qPt}_T_V~t&H(REPfo{cAdbycdz1{y&ga*-V!>FEo&nf)1EW&CxFjut)E z<`WG11Ug=}i5@Z5>x=_z#iCpv;yb(@vpw7QGi^erYdhxbM{TI==(SvuxyExOsP`6# zdv2}lsZ=L9m|c0e+#c5hBS8LT;+Nv>vyPR}7$kSK?>YigF9odL4R!~?&}$c=YnN<0 zwTaT`f7#!vb*E{umC}i1YvunwF=&69V$BNQNSvCD^U_ROr9iTG)#*yylXbSAm#UOj zKirCya@4(N!_H^U;IjTzmwQ}G`hGk`x!2~uM{h}P`q<(wl(xOn?xG}kI@8~N9t{fz zLrQ~wyCBnyxN8qn~mDKc>IcdsEK(x)pUV=w^ip`)_^MCJr z*eGLqD^|vPweIpg90oL6>yx`=<)_m{UYCy`y=&JT_=ttHzl=Azfi!@yt);`cy}3O? zzW$Nx(sFlirL@02@YuvvBXOZg7gr;D%XGdzKzcwrkVEe z2x5o581b8EY57ZgyPZ4cYqfWNCZ^!`(TBt9phwkzntYB-eh)G9Jwzicl($(=t2zp4 zy0$E=jB1Ytx3*ZvNKJf|-=>sDPHA!*Iaxat9DY}a@Zp!1kcY>rS$>=8tRdl{k?D_J zwJGg%OTO6*5}8)xYR`7qb-fCn0N+Nc?kJyRx3pbiozX8ryJ%*A_;Hk22ntP9Nl+Ij zC#J_Wd8*w#d#P*pF5WuN5T9zZx0&GW<)I;E;@^4(D28jx7v=P6v9)+kNa}8xe#L?> z1EDtC$-AV(t%lcd6HgvDEEx6#1deOMrE|cMC4+`H&rYd0RnRAYJrE@kuZFnqD*5`+ z&KjeW#&9UPJ1#%vBi5y~C;uDFdm>o_0@DN^b%Lx~bJ3ch*^a59hE>*LW14q-Aag#i z(U={;D4A-{zXV7neltw9sdc)ef;=ee$!_KC?a_6pFr=c`I8aV@9^v|AfN7v&(v-s<|EZoq;%0;C-6K9!)f=kD?>-=&*zl|!(AswozCFi9* z!LELVZ{NW>`2=HdvMX3od3=I?`Fy)k6yd2CKxrQ^U$t zPO_;qmrKn{b#(JFR4iWui^W0EtuWr$ruFlhmyhYR<C<;oVUI|!)zyPX88zGU5K$UCJ8~K7rw9}Hzt_tA{31w%EXm6$M?5Zn1N{YpX@mN?4|?c&YUoAD zChOA)ocp?uDoNg!)UVE?BapK%GV!qzUz6hWDn*N=<;NjP_j1`NcJcB@VOc;e6|tkI zEep(EtTEx6?RtOY;mit*1V=>X_0Pc*lbV)_S+2;QTlHpsOd<}5+B$_QXq%*!yFx-`GQ2p zdY)5aEtOPhm(w(PvqFEpI=ePyHpr^D8ue*Dls_BoIJy!<@W`xy+AZQQ#E@EsL=(^E2Rv zl%7zkg^?!QTUZsT6uk{=qjamw&ufp&725Ywqg1sw?#2^g{x{zB0h};jsOl^@+K7ak z3k#YaElOrhGl zai}!dfJ!{N_GL+o9!)9n?1R2dGzLP0CC5^~0-3_U*#xaKhvc#Gz4KD%e2>Vo+zUqD zyyNdHP4gaD34VtqBL1ecsXZ3oni)hYy0?M_soENs=8$x=;vV;a_}(a!Z??!3mfAlM z?e8Hx(#-17>ijxLoxhp8sV`?(FYXgf)|`KF*FalHI_!G+O<8^n4P>tN+@FwNxNc3C z0Y_5oH|>meZ922C&Utted^WQaPruzd#%H1MMC7`8o z{Rnb;@Wl7paJ)WqWM7{}Zhvqr$G)Olz~wt%flSM>=IY5!)ef}k={Q6A^&HvU@w6|t zN%%d1_^EUEBL^Twj^akqf}CNwobXoHDh0t^3W|f_Ftn#_WK|Pd-6$wFk&KOl7{auL zuMyDxjv3yoC@2+_nGgvo?RUBXyIEuR?*V6d28x%&%QAuSOVHMC^?(B(fh!wEL%_38 z+}K?M+Scd0$#F!?J5YE7qhl;MZJ%K=CQ%^UgokVq30S!e>{M4bG3gOosMbMX!Ax1l%@{*XN<$Tq zvR;`|Y4g-^`QZ&I18@@`f|JJj`89A3 z@d{+ajyJk>x-a$sfL(;nI03&2~GTW_!d>agF0HK(QDRby(bfegef)s@a$HE z+A&s$lxmcKjoH{mTcl8Bn;%a@6;q7jqLp2ETUo*C>mZkoU-8HNwtFS$lr4+mSX7(!6K0m0h0GpdldP%d*PsQ^-keXS2Ur^h~<%PUkWz6B~%S?7*WDk0C ziG3YRcf>?efSH~?6y4T#DRLf=8|Rrd(k#iBm>4qMbDo-|%Y#_nRbAIDzj%0MhW68< z=)J|9`EEa$fTE@h9#a^l{T{(=moa8&e}hh)Yo6yY3Pe+>rZ}u@z-7*O{s>9EK$Y(l z_p;ChL!wQiv)4L-L|do0 zJLFYXmA_M}4Ex}-}yq{NkU;qF*mW^68#NWYr^uMuN1JhQ{!^jl+%rM0Lgn< zfiBFOR*9pLSC!1t|``CO0VY#{|1IB zb-&%@-)UMJi%*`=k4*&DY`d!eF4_jKjBQ|?QI2kKo&zlbB@Y#snWmcSpmAIAcOtl4 zd~vv4&IW_U7io8hGFL+^i@pTeC2?43ppdph-CNGnm*Z|~@5S|*-3p#q2B&c#E(h3n z7uihAbtL3Ppmq(a1nDvAWoYX*!rnT|yzC9Lu=QOHrXr|zAy%tpoSQXRvQHI0h%#lI z26D+&m|(K1*}9Cp6l>v*F?Ii|;IIhN`FMrW30`EFqoJ7URQtwYo6n!D_h9PorKAQs zEv)m!!2Mosx)R%t8YkFfJPusmVj?e-^A_(hqM*6eMHAUXs z;3zF6p_eydHZP$HX01|XJ7U12UGAs<9<*}6*=*WhM_($eBdqq(I1XnLU}+)pEW#NQhnVH1_t^Of*) z`BAOPtgF~N^86!34kO=KSD=5~EABno#2bi%Exc_(?(daMd`_9|U;7?Den?lb-OjZY zx({isAlJaT1!UdB(N1~k2%tvf8N1gu`fU6seNv`rK?N}}lO`4AV?c5-nb>i4mIPl5 zr%G-K^fosk;>qf!KV?`?_nY)Had2Uwc?f*7tI+S$EA>1d!?N#Uk)2LgTlQRRGlAjP zR_B@cDuZ&@+n1-%#b;^J1CvA3qE+;7&okX`QvC~M?tpR6icsM%1;hjD->!mG@|il| zGtHAh_;{Yz?u$=e7)-mWmDhS;S^I~>(@=~X6^zJ}hgV*CH@Ra(>@&fv6c67{WTfqQ zmq3#Bx#QkPv>fu+m%Jt{_AKKR4ZMrK_o73q2y&ex;Yf!Mo&c;yTn7pHNT@<&YBXz3 zW9+P~4=H>yPuJ?vOLwd`UshI4C8KsKLx*XJ6k~SwWIcX*dbNcm$G(l!2F+TkKUOd?I_Xo7jdP3Og zs$V`?WXjtkt2rrD=_OJN)efoU-GAUt)#~SjQ7yoM!m)h^DVz~m)i8= z7AkO5;rI5>0GqOoB6|tuqb5T8=>WuXG*LRi;;MMl)ezLtxOKw36TsKd~ehB#Arya*CLO08e2J>;)oOD(}IrGkN2=i+Ad zWM+3{kL8zRO~GI{EiZKIOehY6TpCK8Po?x#3@bU#qyCaAUyrQ)GaXB-x>zH)%d$jj zm;F8OyFPzAI_Z2S&GuC#8W9@Txy?R;k=~e)9)Qh<`ka}DiLbGhEV&|PFz39xO z(<*a77tt*m24&O6SI5FOB1(8fB>jU^0jxT`?S7gfvt6fmZ zpDsdECf7RHF-VpgJhqxpFfIL~Q(p5;>jILDu~!+}A??GjF>IP}@Og zvW}s5vKb{dTcbM^6C7fD=e@=0E8lX~Bl44XCK(T_ozpOvy=Kw6k^YR2^yp06*TvLr zSHA)jxa)52<|bu{$Ls6g&oKoSUF}V3^nAw09w%a+eIB?3T8O*=->@nAAvO z>&~Dihc4G?3tCFbNHR~^Zd%aLqFWsoL#d9BG1>$gs?p%H6xT|uankYLY603fw}&K_{p z<8Tjb=#3UONsd}M!7rFgg{{(=a(U9RZX>z`9j$8R*XH%emr1N!mN>h|ah)$j{eHeS z{iXEk(4du0_zGXhOjzV7d2(f1$^`3mS4!4ij-jo8U;aLSS8=X>Wkz9M0a?=#9)2n5 zhpAbCM>OmG^zBZ@YqF$TL3)QfxBuuf#qrUAtI+2gI>vPO;hyGwi4!dCx?C?9+YxPy zomt=Cx401S_lJc~qb_pKf`>t9XyGi zlC}JhtU^nW7*+DHS6iA@J1rdS1>0@;%GJ9Hxv46SygfJrxU{y%i7N)DgP7SK)&Q+(4cVj|qpXhplpg!l?DldIE(0Id zE$LcyP!8~+_BRy+u)*Emi+MyUqa7G?aYTPsGB+QAI^^& z-Ne7zj01)@<5qi?2g7Nx<*jeMxfaihO^Rl>@Jao;5AK$L)1DeK$3U5 zh~D(3V#i?#JeP^E(oCc9zVs#jQrHk6? z(Z@G3Ov5GCOx_DYjrI-XA0cs$KMNW^Rrv~EOll2U>{;h1QTSDuQn{*XJSqg*V6dj93?w-gG_lUHl{w+>sqG8o~QR4k+b^8XYAMJedar@ z8(AW@%NRi3wy#SQKUnGX*9f#O6FdVdThqh62AjkK_xBLNfoODs^le0b?m4`>S^i@< z#7@BI^G@3uSfMqrlyIDMu4+;5ZM3$#%||8DV7%!yR9P~m;G2;4QL}Z6PKJNN`LSYD zS&z#*<`BP`N;sxQ@bmS0Ss5ZekVLL(6 zn~!epk5#S%vn%NZuv?vjzH{4gGH`Rtkb!r@+kyq+IZk+`ciym|v|&A9yy-k;@Iu`g z#l<_(!~CuW8}xisN{B`k*dxmYBXe@|8{Cri5y(h6Gdi_c6&4#9v;ud<>k@06%x1Qp zD|?-2XAK25GjXhdbC(%ykA2^NX}rb=ozJuUo>yk(wyJe35unaR$7&m|Nst#$Ig`$l zX%9DfFv^k@a#Q}=c2c$R#M`|ojxVzs+1$0m0oY*)IjD0q15*pHe4*_!0P1I zH1_LK2o6%7sZzUe>a2glBPpK6lOify*}34rTkBTx~4mXk>Q+H_88GcDp8SLZJ}>MH!OU4hL=wM=I>(KuzAwByX} zt)@)we;9H0->)?4H>@Xh3nn(3RF-DA5@lx#v!<%&(3S1hs~Buq z>Yvbmk1?^pc^EE06~C?)Y~f2T`U|;oSA!L@+V^?QPb#ij%Vi>i-?IUzxnJQKxJj6oj906T zdLHz5pw%a^H7&uIG|SYr&T;S2x1qu{;Hrp0Zv)_4c~Mb$VU%x~%mn2+V>(-BZ#cqq z7;&9y2rMvea?j!p5kDX_p8-b<#Oyb7VPS=(;#XbSiN1aRDZb4tu30&5SfLTUC<^OA zb>P99dHLMUUQ+~)jk@dBeHy!8XLjD_9|TbJhojYuMi32y`~kUkkeYUw!U}YZa(ZtLLGGm9KQzgG`{1skXfK2@5&!C z&6eKJ2O)d#Jl4Uii6xl|7J5vJb~n-T^>(#NtWRo`y9%}!F;qk)SGiotfLr*TIEBwrGx2j!wgW=hyA9bv^xajpD4WK(N zW1|&q-kvj{x7T}_(R~_-aT6yimZrXnIc}G@F1uexwl%E0*-L-{z1tqCzH);VI#z1C znyg~d6Lf)RVCME**JfQZ?e1lV6NT4|_weQS&yuPtGcq2M=CaA@4N~U8D_ecyw6Dlk z2|bXUX%MspROgZlNb{n8|_1{`YPwuo`JaUUIY#7Qts#xp$d zoWH!(JKIpjzQ4V}f9b}uc|f~Ix@jTvqTE+}yEUz)9jv=Ouyh@8A9IvQ6S{>z8*tBh z2_K1gVU=@aKN?_&bzi5A0%?b@<34(^Bej?=#@@7Zk1^8u+7_;~Lgy6dMkOK-xlg3# zo#z!AfZ21SgSDMR=>x7mVbvy6cg%oVy*D8E>+(Vm}qQM`mg2uxDGn{tKg`1u5sTj`>}8c>}W z=?(|Kqr6t3;dQ%$=3_jLZ<2HXoy-5Ub9k)Iw-zTwvfgYTEOrUce!^Kv%183K%nQc2 zq5d>EhZC1&1v=uslbV^|h$2mDqvKz}XhtlEO0oYtRCZIRp#B-$wwB9J;lj{Q13a2S z8dq06LVWLt9jZBV_k`+{`>(R#wYb8Tfr_OJAOcS3Jf;_C`Z{ubSF9g0Rg_Qn7{a=7(z znQEtX_O#?pr2;L`)r-6T@s{;C0w+9{=usoxQ8WBgbH`ljMW-A;7`g+7W3uw*?+t%u z^7yH*KUp6JxQVo4t(#=Ni?rN@_^dPWZEmSK1ZNP2myq$BN7mX3lDS35(B}8XiYQ6{ z^p##}D+WO=w;4db(0`+H83D3MOweB_41w-vsp)evL3^B%O{-&Dq?j?8IsOvr{4QDz zB|c%#L|T2NS1wb5!KU$^q(OWtN%T?dt`R&D#1_hIy!5oZcOC zp+I95nM3(w8>-x4YAXf`_z6%VOEk7XS+a$fGYL| zCfu(Q8h$X4IePXJlJd+sue&Ups@yLg8j8#L5idtPySGT)Ias>2@zhAY9Mv{hV|rwj za5RLzR-()7(KPVim@ExwbNp8ph(Ms`Yy58BCzIsH!<_mbsF;oWBDDG_MOE@Pzc z2-Ruq$c&V1WSvh7ZI0#ir41P6 zSOw%kJGccT!nNV2}5gAbt5!v9kx(wZuK4NHOhQPJLe<&ljzvW-*lNI$+NI-&D1`?Z=-LIrM^MJ%J} z=76kBA;VP$Yz&~-ASeNlg6seA9btsF3jW&r6le9^xQh3Ew@wZY0UQu`fcmFr=mA!H zJ;h)Z?XisbIDtag#4?8d`+urHt|_rW05wDabThVzY@_{Eyg-BbMW6|F-_ni$fL&R| zhG=XO^O=;Od1NjCnb7m!kV z3hCzPTr>Y3P5A<+e7=D$frJjf2mAStqaqq2?oXyV)d3rSLWBW+!z`n}#l*I+zhu_& z)%VQ+%pIILuFuh^Gm?X87q25E_uZ_GLqNe4NCqog7@>U8Efn|Fny$oGK9h51@YVl> zdqV@$-=m=;1cyUJ>7gMZzWd+u1(ehi8N4|J(|`AYLm52*m_`2_!@`Pd<262o4(|-;dwXgX^kW-08<9~pq)SFSid3evj6?^Q!n9b4T@WM zq7(?S8=Q_}ShHm35cglU#hpYj8Jm9vy8}^5x*2nGTXPgx3$UROOvxpT?4gpF{K!Kg z#r*N7G>d2aEK0uro)d%^9!1cmkZ!|`Ji&Jt#>oB#0yQYDVw{U2*#tNNumMtf&Y;8r z$^EggrH>GNgE&9Ey?{ymXDBy8tM- z2(kaDeR@|6q;}8`UJKNd;e@0o_{orwm>8xY(Jo#F%jef|5;FMV?^xQy5E>hJpdg}XXySkZs*i;Mn7 zyra7B?7_eHi%a@$iQ*6M|As&Y6v_Ga6_~ECL6Gu&`|%&nxc-bx&HsMUSM+;*^%p_B z_{DztyzBj|SN+=9_(n`9LVy0-d-+cNo-_W4KcVIhCqniv~@o002xTfBn>8z-p2$Fj{2MGhcDam=4SJhNW ze05p<>ZUE6mjSm4onPmoClPphW_kMpuYIt&CFu{)AH-(2{dGUqJjWi_zB5<5@As%n zpKYN+HuiKfb#h^W&rOWH41WDagstOy(|vk`>Q!XL_+cKTTO22c%9}BSpF2-vT%-zv zgKw~?*^lC5dp(7suM-yPx^;T){Kwlv8-~X>{ztorKg$iRFISO>&H6jO{B*{_a|dE5 zay=XB;)d0u|9x#QeZ8)n{XQOQnd`2%HJn)>j}gJ_1`$;jDU7Y>Mt3`oV-_$}3ZJZ} ztKNM8@#R2Va7%to1F2=gKd92Uv5~R5R0-U8B-!hD00uo5SQxl@hrZAj&11#*cXASO!lncAwN%Te<7v~tLH=S$x<$#FPlofrp@0`d34Y) z?z|DK{2Vy_nWH9?MspQK6TwYrr*To)oi7Irw3N88X3xy>r@Z*vwD{777U!W|>9Qcc z1{XXl%4HxMm7jas_N?5|=-Py>!|uIL>kF;s&xw;tQ`Fvix(_Z@eeOE zs7sx1jLA@GO63k(x#!#oRc|U4{Ug(ZR@H4rSWTu-k2x|L_q21e%6nW_b9LDbZjhMS za+$9wjMgF#eGAsbCU!-h2(XyiNuPlWTv=%e1Cy8RQ$PY84@uXUR}^#sI`EzBurx?Q z9VGv0-#M3c9$^9v0z-L`k|NQ+SMiouS;s|9nUAPr--(Q_-gNdYgp+>y1JxV#=x1&u z$2@ks!s^u0R$K}{GM_cQPCe_Q04|9lh`{X!ggccrj38o%$Dp{;$_okOw#wj^1G+Pk zaj5DPuxE*$Q2KHTDOS}1+UdXL{>OvBsvhH>l1J{|324)tlaw95De)=|++Nl6-41HP zOi9uT<231eq`B)LQpS!#FK{byc9f>k`Ol3~QG*!ilDnvtf)<^c$rPD#2uFXuibJezLen;877Jco z+j$lio`Ug>n9iAHHmdSMbxJs1ro7cu7?%36?EE%Q1a;{A^9!g;(U7MHDBIhrY*O8H zTIxhmCk3vQQB5axr$fT(Kvb}_g4W*5G^<8P=GN+lf><2Qm0k15Lcw`8>C@c?#hleK zU<7o;lfzV24O{%4!&=COc1Bwj%W}8Wf~h7fbsKe~P3INGTdoMfNC#pT>pGz;XkP}T zo^%Ms*Pcnnd`BsfUV$WsE#9K>mO{{;F7+JDyDWC!9_{TcP6tHIaq;T)DSYu)$4T9-!QtNc?2whf%np>brtP~2_doAJQB~0efMmU9=-}waYq@!ETN!rA zZo`>$l;=}n`%{Fu6C*%_f9ov*N{jn0)}YR_a+dQ$=H=J~BeI6k{NC`xGlb~=WB{#H z3eoNm{DE3Jn78klC@_s&5U4v9)jv?nhb_79zy)YyND2mM(C@GL(7m}USEev1iIX!4 zlRZ;9MlJH7JslpHnT*liVHNa8{kt`%lm%=M5V~}~=&v!ji9{oz`>056BKtwY`$C2- zD=e}R4sb*{s>CXwLM-67W??jF$7V^pErW_c|2Wbw$gyfsvG#b8(@jywjWhvtoEY(` z1<|0ho(egw%cMY%caT52WX2BZ3Xs$|!Xd_0Z=siRp%*l(vq2U(i_ZRK-7%UtN;mcq zS353JNw_4YjtDoa0MVd<0_jNT4ZPGsBrzv;r!mq4M29l=v5EM(^cx9F_H5n^Bl$6P z8wuLt(b=v-2%$Nl*X#hiB(WBX1Urw0e2)G?*x-xd`74_?HnG@~oCb zvgKN&@iC|{Ap&TdGk(V|T2FBLm`pg=WOfAY`T*o>0Q>wG&waZAw2S41pErk`p9fPG z+Ay>JC@twhtJH9U&~NV|phk|H30rR=0X*@ztI{@-tO9z=w(cGLa$Nee$Xsbx)+|8k zw2mkGwLj53(CEU8p{j0nj)3Yskv$6UXlE@yf$9V6Rd=I5V2iYBsj(7SI-B$|T47d7aHYWKB9G7DBK%+F`j z@53F9-#Ck(LLVMEbmaaMIxmC!Fh=f#vc}X5TboaN`^Io`Ls<=BSxAhD_bh1WT#4yL z^LI_Qrwzo#mF(rIUJ_&luOfS!wtKWC5RsM))1oz%Q(=y@Dm$t)lWJ-X&8Wy9uli?2 z5VYF$q~VSsN@YFng+LAq-C8%disg)(yni+7Gov>`60wuBUIV0!r1U?8y=6=$LDM#h zyD#qS;_mM5u(-qG?kwEM4J_{N?(XjH?(XjH_VGODoFCttoV=5CS9PURGn34u`?{*q zmG1x`v;v+ISC(RewfT0N^5a34;9+JkFVVwRZc+(a;_UeR)R*-Schs5we>M`vs@!ND z4?jAzx7>)W?Azr@W$^CFIyh$Xfp&uVAtXj(c$CU@$nxbCDaiwAgf30|1q}8%Zu814 zZx8c{Isl2p_JLH{{8F%?SZHq|JLVZ^v}O8MJ-00)F}N5>5-poVqcGDtTzk0sJj*f9 zA5x;KYGPG7KF`cZ1<^Davg-*;M+pBq2Vik^pk zZF*%!7@Zos!xpGhc4Sq9%ill-Iwc6c5nfXmMJ$-)^xGI|!HE(otYPQe+O7pQsEFs> z{xk8>S)Mw|Fw4KCp3o`BgA6pb6zPHq9(JK8W)0e?7PgdRQyfsbqAwH1Op$dU7vg8d zR*ytiAM9vb+}ReBv2GK$vDM_6M&x78SWT2$M*%21yDI$L!f54pPD?h8JYrUZp5uV= zU74W_)l34nc6@Tcv~zpoB=V3yGJN*_dJ`aPQ^=+v`qf%HSxR=QB~zk&eC7=@{gM^? zFYtP6C*J@#pDH=lE9JgvF)LD<8u!~gd`j79AD%!@?qm<>7OH%WtsvybW-=DvR>39B zFEPQ7SuDE4Br!MD%7hn4~) zdFCEVBb;G~^pwN@Idr&#D7grp|CXHaTs$#~|Lf0xe8Dx+eoWOi_H^ifafJ?4sm zfXt*IPD%AHWA&9y5%|sirPBKQ6pe5vZno=<%Mn4%E(N4#p+`v&=B?B3-T z_?WiZv$`(iGCO-FJ!L--L2-MSCGEO9p+-?w#m9tFHs>##9M_6tN>?MAi9y4sLQ?LS zO@_DQn_Ktq1b;JS2C}`OqWZ78@DhxA>!Tz~D|%-IlhV5^tIq3m7tM)2)F@`7?nwpT z#%i^7(AKoUgf@{eC%PP4j&%8r^PYNZeMnt(xNn+&1%hd@O)*jY#9v7-Mryl$z9#kC zB(nXBU3;~D_LeegIu{de_Sm|^DoIE6D_D9nDV~k*HO%~|1eBIhQSpb6ZSA6vpCan} zMDNyv{nVRIhS9>VP{9t~BC*fxg;1}t3^R(?!{w1VkTc4ecO7_czW7T*1=dCl_GT*h z=&Zi7k%1$wKy+yDg5Z@tBjspq=YzL~a%+{ohriW#l>QC$jU5Tr{bucB)%jiPMsoL4|zEwSqG0v8NSz0ftE?DE0X{1Z8e=c}*=( zclColT+1hplIQ`x>Not!%1E(mKccnI!1@?Bd}QFoFGp=7lG3zr?4kv^8nJ1!e_g0c zf6b2B8il8h?s?%OCynQ6z_uy6gHVskmyv~Tb>G(-$P}Xj;3R}sqB%SR^CO=Jv|H=C zAdd&rXfsTFfD%8}6r$BFK&onR;ul-VTY?FkSK~3oe1iNj2U5H&j7%YGWV2R?Y{ttK zH`2zf_g93rTdsKpL_NcRU%f#t=%w8>k%KZYlqy0^HSF?+4at(Rinovaf9Flw4C5m0 zxzEj56q`=wP84A}s!obk_-Pc)?xfCbxC_h-Qm#wM3RF)W;t5(z&`LJ#=bb3=DrLv# zapm)*o7!*tGqP9Zy&`yivr&)jtB+(=&mSdQb2H)9^Ax( z!>i0FZ#E;l8h836I~d7{6;b!MDWWJsE(9DIm-Jd48Pk}v@KVTZFpJo=fSlPtC5T%A zw;TP6Dd=1z_3%csZM9yh0VNzNiFB08>Gh(gEaBy!vN7DrQlJDQne#5c<6HYC0!n$! zirn#_lC&(B)T7nbWd##ju{2q;yev{z6DwLDX&Y|#Sx-aK)lFC3+*cEg9OTO2g5WqZ zXN!-v)ab13!c`2X38tgxWJrICC9Pqx5d-{wCc}4T`h}RD5`Lld;NM-}{HFR0Qy4C^ zs!040Pk^if(TknBFHxYrTLdRmnODB_c7hBrK2-+wI8+c!J)G$vE6g!nS$a zzRMk5e{#6005M7a>zRq98m%Yh3q5+rAQ^dYgdbi-HyOiKO%m8?oTj6nEM*K)NOZu6 zXC5kzYD}}F$ithX^kmIm^7x2Cysi}7FowR-FaSu+QtABwr91mR_ghiA6m$lfnT*(% z7&Bq7NSEbc%-sh zC7&IV{n1U#$;>$N&c;hF$;ZY(5X>n4+whvr7#oj=a+u~75*xa{jKeQj2v>KdU%I!i>aI=X{aB)I+ zKnOEcMf2I0lNg4?#T3H46C%oJv3&GPbE}JVgJNXyrUdy<8es~JCe1#=!5bWZ%U7aX zqR7+_0QZ0=T3@NvPF&lSbI18&m1VhwYj?TMLOGLhNta_#gR&8)d;Jz5{5Q6_r}{(B zZ?bnbR#+s^*3`*W)u8OQ)L8x@2Ntr^-+C_S?ix%ndhg;?E(4bVLnp9;2@`&}?L~@W zgQFv$ID}u28{C_U1j4FWdZ^I?AyV^AOsBL-)N-~mbV1yG(`1r9HYaz?!ieD{3oX{L z?v*GLf451bLhXGmG^E^HT4AUq_vdtG;f<0j*F{n*er3eDEN6}5i@=oRR-b}@1 z&hYdP^CWN>DB_wGpo*;;g8b``i=?IgEkbz`ng`nCdHt#>te zK0!aByWJB*>U0(##An&oNiZdr;IDX=NtTI37SD!g?!lxprWt;{Gh6zANG*VvYO?z0 z=G6Y#($PJ3RKO`46~)#5Au@|mMzPb$o+vBR)0$IEPHvH*b(yQfP8WV>;4x_Hr;^0DL42PSd_H6J~mWqZt5q;+;X%#Fb@Jo^9}@-l;K^PBu^`vz+SX z6x+1}6#N$i`H4p|$l{>9{&F@%go||LlgtQ*cAHHq=f9M?*7#%MsE|O*{5z!lzTDvo zz&k9d(L#B+o)Px1m(OT5C>6%q9GAClQ?$3WM5eSLd2sodW|TA_!uBP__cxr{>nt>t zBOcoBxy}lR+Z6FfXTEGO!UCZ&@q>rEJ~LG7N|yZK4-vlgQTF~hDqa4J481lM%I~Cl z6j#i#@-OKBn?8oFY91-X0s;B01^P|VbAs4dxS1I1+t?YKSnHcwSerO87~3;42#F}t zDLR@k{Fgqq`Q!Y}9sjYWH?cJ{PDw!l`JWdY2=RYSpdi>Fe=zv|OC0}Cd7-=JxF#9v zl@3QVQ%2VWx9u9BvzCV&fYduuo41kZ=+YQg>37U@j?7p2B!i1A{jZ8GUCO1SH; zX-EId5nwYVn}&kLPxJ@bjv*$&srgg~6FTEq1l$ASl1%rW-uQQ7%x&EIhZOqEbK`%g z<6EquUt`xpVaroZ_8C@&H18PiX#C9|_fs)>RRS;qaGiB85d3e|wZQP;poxiu&xKE? z>vV)FtjRn0*51qhnwcb2_g^$WUjgA;xivDF^eH_&&s*?WEuFWcy<^90>_kxdZH|ZV zW)|-Le^&-RU6PEJG*Om3VEY?2zV>v@c0zMl4HXbOnO)Yo9yeVQGa1e&6`R|y1r&f! zO&E>iB~m)ZeO4W3o~$7z*;Uy7EHyB<`ae9#-Pkea1W~6NT7|4nh z#3Yt=P53D`I-suMP3ye#P}$*m4Tys9vR7;D(%cC;(lL^jzXEL` z(xJy{tIN=lv#=6ctqdqRFkomw&MhD=0grJx_Uw=&vm8+jHhV`<$%{G}IU`&&}bu>kBplU_-7o)!Z_$riTc?j zF3+Lk$#QiQ|C<`e>tn`LV636MV4&!{IPCu0RXRkkB`k+s$aO5tSxx>U?stYHAviP( zcdVNY{$ifwO8P>>WtMJ<{Tg36v?9xr^bCQ@u+`}&preo{I5(O7)p$}48B7Wq9M|T4 z6gh?bm!-`;HO@%a7;BJ6&n+;juSK zvK=(!&Twu6nEOB^A;|{n1Vxng_Ma(y=kw7R4k{AGPep(Iw<)a%a@Zq?{L0mp1y=dxSGSJKX<7!!8E6q9pdXgz84o=Sx`f(B2cify7|q5y6nvzte4u(1oNLZ zg5DHtD#XJO=t*wvj@|NCtt3mD?c7;Gbo3n|n{>kYXqUi07y5Cf+=Db9(90o@v*3O;kYo*H zEb49SN&xz)s^ItQM zi$}2SPmAVU*A}p;QRKO9UWusQ3(gxC6DAq|q!iJ5jyA@^i>7~i&U_paB8P? z3yK&Qlv$sImlX7n#k7x8FnS*K%eod@*k;ZC{RIgt~}}YaRBS z8)TW2;_yP4lceM64V;PyQeuKhwIL$|_*C2?>3@Fxa;jG!p~_8vAO(14lx0w|RcA9Rx!vWOpef+APk>gZMEqklM-c++c{1&}#|eoTr2AAk&(! z&&p5x_l6$ZSWtM~}wwU64U3$iwvM9>CA-7P;vxc5f7T_=OVRM7Ja= zn3U#{8~%Q{v?;T8%NKE3VDmyan6514uW5DO`jA<-0^jKfth2;17-N)MrzJoZ1}}{K zyd2NKsR^mm0`tvH8+3^;5FT8FZ}rwxkug@YnKoP_vH0bS?}_(o_qAi9sFLLhA?{#e znO!kAl5MC$Ahn-)TKzoL%@8#?pr0t6 zh4F-nF}j$FCu6P2@9<}FHKf%8zWS^btyp!@9k!wh!h5o>>y)nZ32-xAVN_m@LD6V! zdfRs?sMfFd#QScgcy_r`(!tQ|3Rm#7O8u`fG`r#_r!7VgZl6|JuZ13>P+Wd5L2|E- z5F?C1d4vY_0VpL-58~siFL`-F-lFo6IX}^Erj;%eq7C1cPsjXtudk5eg4$WEh2(;u z5ou4Dd1#AiHd8F8?EnaJd#^DuwY?$EzeM4dkV~1ic za8c*@uLZ?qP~&23oMvVo_b^wVX>mHaT?z$Ac-vg0##sa=g=i`785 zL)PW|^b}?og6$`5$r7A761k94+7j$`vN=S69Yz6i9~8*;69}@~QA>X&APVyL3R)TN z{CxF+VuduL^b<33hodKbRCg&qHp1(NltOgG2n1Y@sBX7$DV%5)n(9yE+~=D%_G(-w zuevad$XRcV*;76!JQNMpvjT8CQGT`9#obBB|`DnYXqztNTCi7(TC1Tq50K z2V2k&Q`5tq!nZiB$OiAJ#8SI03ekif%lcon3oc3OAcOkkbrwRD&mAUQ^VQb_pKL)= zM0!F*Zc;CG6wSn-+GQq-5PY-`rwKh}3w)Jay z)$FcmJVuhD|2?j9(qjDAYl8aY1F#>V|F1>w?4BxM_HI9CBAK$& z$)oKX#ctCVZJ{NHPO5p=v0;IoFnyLm@OV~G;&OG=DN5NZ_vhH+6-Q82-2|(0stkJIOL|xVQXW;mOn+8VQknC*f~_ip?FJ&p7tFr(?SS2Y?2Y75mtjEp-tG!fo*)bigQYAjy53UdHuX$tNI!(OAarqEWke2=Vo zph{&HR^)^NX*s9GjZWg}!5YyEC;~hfwuA;{x#CX^O3SK6m)Zolqk!IUvEb9sGqKTE zOcZ0|$YLE0k^Aa6OI;@Ik!Q`FE+eejvd$EJ#}D*>QKJiq`0;0J&Ya<=EZ0IT`Din9 z^j7_{+*hFSMS2;%?CWTHTV)D6Dp|31c2k)w^Tw@@Jo$h!cB&#FN`%S}# zh_#xPjV_D=uA>ZvfhecgAfpfp|BB^>U>uX!B(U>CE%{9N<2?H+c|mpQg8HmYa5HkC zMpST~poA4>O@tEOM6rW6Lb5Hyr;<^?3>ki4+gVDWv}k$L79RiY_7d38-->j~zc)I` znPhy7%5q%)g#)z`0E^!`({nv_5MU?r%`?bZ$^3BvpiZ2V7kC5Ux0wF=GOZ!qp5YPC z`Jf@C!{F&csc2Z0Zp(RC<7O;jb?1nfI)~63D*j7u%JiIiCh2&CgH^@r>@DQ??vnHS z+9!j{sCrm>6ny-2eI!BZ=>US%8eJ9ghlV*$6nx=mJ-h5&arf$lubU)_2gym!JqTRwcgh%o2`=6hPY+B4DciPJv42OsW^6zIr zg;NOZ8>92!votVJd6h4i=jT5(z2PF1mFF&HU*1XLBCzPsSSdbj_NXQ4Pz1J8AT=iL zzfy;cR@z74pC1fAsG=pmU#m85{Al6l0UZbzSi4dmeprE39R03kFM#(td#NUSF84*l z2lGip29N6q44zdjBl;77PG_9W7G!qc ztG67yQ$tU7E`YJ$(jr-lZ*|^zVO(^VhyXA)Y1H#h-)Mr!F(xgMYA?~D0Tjp|)JRyT z+_K#U%?v^ztq^f`JsuBI^9xNB@RRTgx%BPRGi@&62@P6><3q47B4`WI%LK<|*Vb`# zKXz+ECc-q*J5Qj@?hZy+*2P#D*630gn zw>@wV(OcDNU6sxP3-QA-ue=3Lye^0oY0K&DdeTaUfkl96&$yz|q+)LG4U32~zmiZ+ zYrDaR7L_SuaPV;K&F4-CXXr7>I3)4Ae+Ji>6`pI9l>~>yS2$QJtK$R^e3QffVpjqh+_VI{ ztHc1eNH=pQGD(CN5Q0s7cZ9C6dh*`Y_rYeY%XC*zOR8dQmq_-f_Fkx^BVu_qJFl3| zER+$fhxbb)3#TK6emmUA^LM}?A5z`RB~0|NX7XzF++|e&(rd4p@=I^(zEGFC3g(~s zO)NHXq|RS-NAh$OrNz(Cr>s;(tG=W}2*(xhmOM7lKw0I}AR`2GWrrI2}jJlu-U!DLys z5zz27F{1Pbqv-rJwd{^mD;gX=x6qccD_mYw__^xzUxXe7T_rNi6IE2iUmgFp!h@7g zB&ef>=nGQv;|zfOisI*Jq7e9KOf@;>!-lz>h_kBkLb!Svg+4_H739&U8hsbY0@=y$wf2ezh{ot`+}m| z8q!SqqK@}XDiWnr7!HZQ31%ypJGP?z8t}X9S7iH*Et^o8O%1Nu{iB4&;9nbaj0gAN z8I%iKl=J%ooR{-8e#c4Z@esnq7YU^uOHfg%F>|-L{`6ZjMR$GgaDOK4aes6O<-@&H z70!`RNwSq1b?8y1^lYu#beQ6|MdP|gtY>n?)1al!9W8aiwzjh zd?qCK+1LL_HUB-|q3eSP0^(x`0z&t{#tP)bL?r*ezyZBE+y53Qz=-4jZ=m3R$_pJU zYaI!UPCSYMDSUgv{T1@0dK8h2XfrD~^|W8qPm6{*AzBot+OJz0*{JzN);CI?*! zcvj@p&QiFZ#>Z1w%qFca?+yw)5^1&ChPx>^mXhuE#{^!S!uY-9N(0B%HzmCxj+?T8 z(1#@gV7FO+%D<~W`0EFit?8>lnGaSyv9t=349nr_HrjV7X1CL-__Yvb!?FlOpky%- zr0x-9+=yy7Vc14$#D2{eJtM(lFy6*Kb7Va?ZHvI|!0cp%dL#4ZgM?k$Nm!ah=D45{J^`ah|g$e7zz1iyJg0br(i+5#+ zr6;E{>Tph1QW1@CGENUqqNkfn2l!dcbRTtNW?k71!djy_24L~ zu^7&j<8Z8aVb(;`bOan?YEM!zrN3fBL7kLZ`x!7ew5KaMMVGe~>()-QiW%mtZE9ne zyLL+4FMY#=5NH?a?4ljgC>eeV=nU`jGfkJc&>>pw67a8R-DiLMVC=c!YHZ@$M7Q8j z4tznaAj%}NvXHHkrkSw};i7x+G2?FDnXn10SvMl2DF%{#sD%L1Fm4VdUA1`=89CCR z;qc&)aR(*%GLMduD{o)C3ew#8)B(Ih_uHQbPB+OGVyW74WgDl}h8u3qhNHgfg7^5_z|+`C>VNA#H=Tw-M|?U-{@A zzoC9RhDHX3swP@m6;i)OGXQymtst-h(}O}V;IO#BMt($p#2eJhZZKM3*7gBCr)c;) zj_3i$=<_iTaS@FX{maKg#R}T1yUYi)Qn(^x=?A0FMtOq~pC%^A->^m7Q07O%Ze+XaMrm;Vs& zHE$}v%*D7F$z6)%8xx5%Qd(M5icO7q8j6WpZ}`A~H;Ey4TRDX2*wHZ;zg;7yEzP=K zbKf)X!W~yrg=9syZK+wy*L;m+eOZO>_GRd{F@oh@6&(Z3uLOn0dox6>T*XHU8DCn+ zTJ&Kh;{Pb7pBrmfA-`9ns@ zuHZ(bX@X_+fV-Ck=KaCs&FV>29Y@ijm6Y+IZ5Q_to+ zOspdFIxfb4elQ^8=c{RZtv<2<_MMlYhV*4K>f6?2EJ5A;i+u73C z)uuvVC0164SRl<^3f4LdPB_BQyejbNrIE-i8lV4s3Eu=7h08KoU@CeqbSJQcR~o6r z@H9IRK_?K;O`0vd`-PVOZ+Zy6DuTLb;5#V$xEUAE^-KO7$q%4wxvxIZ^~A0~EMThN z4seE{zVu>A{h}cn*!2$bQZ7e;D48Cp0}aO-@E+2iD@yxh+? z29V(Vl)=2f&+(b;q8$?F@)5c-03I~IITsZTEqIuB*$bGJ@RmmywSH_`P2Igz&W&*e zVM)IEf4rWo@-gcP$@)GA13Q=4hfKPOb=xo9_zW39QCniI6cA8|5ox3IsFN8uf!RZ2 z5AJK5IfBSzB6?qthDzOBcALD+1gfND6!wY2Mx&j3Q_PbBC>Y3}$9{*h#|rq$!daHy z`^&F(G|>6H*vStIgh+~j?we2gqwdL$Mv~doDbAoI-b}|;GFOxvlrLj|i{ZdP#}&Q+ zSN^YTcf7CB3<=we)n{wPD)oa)l8(>A7w<0JmHCltcHpJL6-TS>d4!z`fe9~rd#ON- z($vR^+bM>pbe9A=FzO}?0ST$I*64X>@6i+I>m)3#{OEHrT}hz%5&1w{jbQc&gBPpg zW$5+Gi>?4@*qVXg`f?tl@9Nz}5x@_?66_j`e`S(d68GX2`BHIHI#uA~U%Z}+V8WaF zVWsz~Yp6Un{XF$md#BYyf(IPSI`e*c6(JC@Yx;QHusTb%ejZ!v^7_~xYYY6V-)Y}) zfQ3Y0+3EaBl%fA6ef{BUM*wfbYu@KQy~g5p_!Q*FMT4bh!F3hx?Y!g>QDedOLWWoyfii+}NX8M~x+)iA{JcXt5m6L>mfu-W5{p~H7HPt9jmi6e069%*)VEMNpEdBd#>EC)#o3*9MK2!5r4s*-c@SS~9j&#d6J>Q1V+B%k9 z(}v*QHkRGd7Vcu7R6~Bryf~ygsMRv2!QqNybxd!>w_#FFXYKiDbsTR$!to}yFBiKv!N$DJcJmO{F3V&%025625&7JOXKH@ z?~M8g{5Y-n+RA>R@VHkx+VWOEx>{(71HqFYos%m;Ru|(I?X|MxqaE*^13qc<_v}KSSStDlf1MadYU{=b*Scm@Yr;1^#kDd;_rDJ(wAGZ zRI>-HhK89E$6zO(z-m|+p%Xp0JD5qH4B$;v|qGS@$^7e!v+#EoL5*nR-bmy6p4!a_0X5K*S6y6(aM0{am;#mQg3YqQM2QH+vi ziCf}r3-B7ecwWUd{Yr1{21$^3EOk$0$zugpRbIGZ=_@9CCU-Wx4t(8aV#|R6A-`Vq zSLFB_J>?sDQnm;>r;@JSJ5xEbIA&F|=cMX0VEKcP2diA{heoQ&Q?!Ekqg=M%Jm0O> zzBIz5mPDGqh5&pT1&L?OKh8kc)~g<(pNK5MD;!cnPw^6m{l7_ceazddIo9e ze+OQ??F9OItnGwK#))x=o&e3TADUT4O`v=^7;q~wINH+=5S<3c>_^KuKAu`+8=@>r z>)y=enL4NZ7M^0Ho||GlUGCb#qHKT%UI~{Tz}bc7&J8+?8R@5wwP0U!A) z*=JCcs3(~z`?Ia!o416o!$^)_cHQ0|Cb!L-_ZMYW`4aNB`XL^Yb^lx!_%qGAl6JWHE>`I=yD)s+N=2`BUgT*%CG#6ZOKA7QW07;irxTc^|x6kxkF$ zTvBGf>;!D9SOGx&ge2frGRbKTFncR$%pd5ZSf&5!%j1pJTCjEWta5Aethh)&iXt-! zTd()jKl&0-&KkxSV`{P`q3v0-@eRx=^NS8`ltFn*Bjkax&wXO6&+=W>p(gENg-TPe^f~lV(8RGXP4lrw$zE@E)_#>j5Vd!`&=klrL}qLlkhMOi*Yn$-F!!S~q)4W*@L#-c169;&xm$W%3> zki9X}Ask`0b_YP0Te*SPn*xTZ?ZY&1-GWu^5dfIpd;fa^zy3xuT_;)!n`?l3ImPKw z*qvUY=fh^IqMStlI@W^j?=l)2VA2&1X<`2d;ztKVLe6YzDB~7T)?1)u>+K&pDD;=G zOBM4bj$KsKJ#)<5M%8Uc5Gyc$y5PA2*YZ*lsrgEMmtN-e(`RiWi7>plB}$fht3M6* z3XaI#Wz>CI=j%h@|4tX13q}$^Kn4MU{%(B#zYx&O+RpHgHN$@qpt7bigOHPxiH)JP ziLu;&^2!*#P4s_^Z0!CwNVq2`_+Lo)KP4zM^7A#se^bl^L7=~-hlhoom)Cy{|LOLT zKtS9;8?@k6)KoF~1&UwrQWemp1jWQ|FrM>wp@rn;=4JaNLjJX@kP?QPQ+M8Knun$| z4&qNZkEYIqv&}s#YjVY{8qsFVhm1?%>1yt&?3r_Kxqh`V;Q1G7Rv?|dU3DILnq7H4 zt{km9T^Y(!7)|0BA%Tk6G|x9s;6;_du^)nlkPphT-W>9?tcHW5O{lQIvz3q!<)=uI z4~(<25Klqy%u5` z^?Xnr!ul2p&;1rEK;PQgse4uCvgZ16Q8urY>+tp}i|c>mbfwduEYCW#5Hk z4wXh?3Lz{o5-xNMolB3}<;O_oYLNVUaO!dnMg1mS9rK2}Hu5U-!71$u=UsCKt*WZ< z*7eL+d+YQ~Yuhua;ATJJMYHNa;H3J~XoLO0)_JyF+I!X1v}!qq3y^2K$U|^l=go_M#5}nTCkD^OLRFE= z_Xnjuo(QxKH?V8(dy8wWtELQNISxH9TV`XGwQ0=+7?5<@nSv;LVY3GYs$grjcc2q?^< zK@WMluWLJurpU*7oPA5p*YOhuokO(&xQ^IHu4jfB!Y!SB55L>ZE7hAbNaYQ3!J5v- zUFWEy1@KP?BPS=mDzirqvw>lXv=+pp*Jc}sq3y{5P%*L0tIi9i>bVi$Os1txz+>Wl zHF}c;#A2e~ABH2-atxVFkuC;p<*PHH%{FneO4*f_?e?|xLJd%O&J(H3WF$zS!cx|D zh?}YCmqXv;M~@AzpNUx{#l_{Df?cOoj+xn!yC3_x^kYB2J1O966S}Qc?nl8HZXY|@ z%30f?8-K|e_r}ipt&uHF9hqM5>Vg4^H74Lz8j1hvwSL>8$)b=}xL(?zsvJ*dZQ?0i z8_-~58|v-dWD)6pGd8pEHk|R~rFf2GZ?m;Sv(@ntx>m19n?-(-aHWgZOz~OZ=jYlc zXMk9Kwn*v7>+(~Y-8nQ^bBCP{Lxwif>!v?n^B3V`d&eKWK07}F5f$x)?${N6&nxvc z28fEARyh=ngcwz4`xfYIc9KhR`Z_LYi)_`ROOrKp%AF^7Li$axP%@_4@2O@L z51v<>19Whw1YgDdHnvs1F1@%$=}(QQLGJub)Rx6-^`J7jmfEohw}e}q0CV8!X@u>M zT#dC0TG>`6Q^}@3Qk%*rDN#v<1M<#kiY7P74cy`Y@x(^2_U#zh&8Y7K21srmxa-!* zWoytX7Gkzhua<&ds}SB68X%f1$~4Tx(-uyyj@%-}BlOsTyc2w?Pd>*CREFVaWxvnros!kwAsyCv|DA5a5aqR!oEMn#t-AO#q?`k`nduq zwZtigfzWbe0I`-BZ6WXNg2<2AO{-mI-QW6ZkJiqBx7;)h32(g5>xfW~v({@x_CjNY zq7rz1g%?yc*Hg=n8NLl|`Eo*4g@Q^#0~?u+&zof;(=V7Z3XNSl(XwHLjF#ugOo_c# z)0S&dw!_vB=US=Rv9^}yth^_>>!CX)I62TZuQu(Aa&y*FGSa`O)lK*nsxzyV*>!2m146|-0O>nlf*M@B^Q@$o6p^8B;I#*|V` zznXvC^KN%#n<}!>H7`+DOKDZR=G7PD?eg-+34_|?^f0tc=XlCfbkXe3DK7OaeI1l7 z+xEP()%4!lqR0X&%qf9S-^;v{wpao+v8%C>6*>5X0iK>!Ha^P{a5Ff9t1Zq{7WQiE zRKpF(#oT{B9BS63_04TJY?Z~nB_5kSs@*l z>c`KjwKn}uOKoz>wA{)uU5z_39!H$zcTP*?pN1Csh6BDBjGw~&AvOu+Are`9_ovec zb|&q+J=DnO>di$SWMxx1USIsc8p#?cp9QZNGSCNsC`{*qBcFb$5_%Fed? zgHgAD_@}h{6*2stfWhE;jGidyXws`?<&n@XPF(eT}h#E*G!20p!3y2deOapLvx!H ze7+7v{e(t=CDNp`bjkf*!_+ShK`|;__;`z2@KE^O*m^)=v|(aK_P#)1KUjBkm&Jq& z>t?+bvv_3Dc|I&N%SdKWvMnrOawwjb0&dVIMpxe}(wMe<$%(E=H}Vf+Hw{;6l~Lu< z?=vc;zb=IIiVwGe`%$e3g4QRVivao}p<8z9&i=;MEM|%Fq~_n5ex2X%OxB$0nAI*j za+|m>obf0zd3gT^oS6SB{@J{Zn>>oTZ9qEl4rS{_?Hf+fzKC$)Nf!G2e1knWc&9pw zV!E9#%q#+V9al;t93gY8C*bgVRsd2J{`J)+aEyJbaRP{c0=+a! zt@?;pMs;Gqiq=@b`~h&v+fo48?K-Ex4_nk|ZflW_mify*#_+Pn5|4-=c=u@HHrf6W^zSV}q%S{Tw^)6y=tS-E0N$GYeuOlrqs z9=cDrjBG48db+=s>lwpB1`=KJcmN-2hBK#LvzQY{tI$-B)Hm^)3l~AdiDYbEeoeVL zI(Lq6z(lGa1rplXw5Z_U?xsAyaSSj89klm2oP0=MWjVGQzCU#4cqKAW?3=f(61_l) zL{9Qe#JG~b77kU~SP<>&rZ~`ok{-DbT7IlnPQHj8Ta9{INgriS0$$L%lNprXSMSg8 z_7N$8>#Tv>_$vBv;ULw6_kx_=)sx4GGV?%!G=UCNoc*F=Ra?Lhenasw zwzLJU2Q}|`)u>?m&xGGjBH2vS2#nzox;hS&$IK z*SnB(bKqmDK+&Uo*pNkYRo)sM(vZ$6&|;~d12v4&YMfHJQ^JO##~eewNNU(pyP_~5 z5%*!A8a17eU{d3tB){Q5Vuv~TnYMMU=2YUQqv>&I5BMnsWM2K_^TS~> z&O8?rNz`#JgcFF78F+Dgv|n0ShU z+-v_1OEc-*zXlv8h(FN*qF@y1tCG&FGk@6y2&1X1S$qosbfAa6$> zXGg!TMldx$LgAzBk&v?YgA)1>;44873+D#95hE4nmi(gj7ZoVZ5fJ>sm&+iA4}nMx zg_LxbM2!yU4{Y-h%?>S`4DBC;@cC0Le3~oC>ck;vqdG1|jV6HwY0t4wNs!eljG4vR zYVITY*Isht+riunJaNrvy|X&0yrsf_tgH_{w5gojmWA;61tNwDBn~R`vOjq^Nh3ui z@%h=}hLMm$e$9|VCDjSmitI}I_Zu)blPZ<{R~>NyC9U-nG2DcqLSj}9`p+#8QlmLB zWC_srK!W=5(a@Z*{fNIjMa9~rGDYL-ADh5$8fPQ_9NPcvZY@5;I(@z z2>CQRZ}Z-|{vZO`JEl3OH$e2L0-5z$^No3)@+Wx~2!MEx6kQKmxF&+1(V+gVq5OUk zVSE*)|2i(bfe#(_JjER;@l%*yWN?@fq}T5l9hRqWqL|rD&2$w3OFit0_3=(8s&T!x zL5m(^H&9_#QxKF9dKkhKyaz-E+(&_l|K{c19OAlU>?2D-FB2u%b^`PgZhR_HkcJq> z98nQVWD^PoRM?j>n{FD(9N8Z{_SY9p`20k#{b%f_rucjm9|nu!!(Cx+Qr&WKM&ALP zDU62ORJ1f_${YdcCGz?@H@GfHrE{g5ZN>(ut-CDdCB-^+9;mHV2dJ&|x>Iw3{ZMh{ z|6%VfVw^w#-RrKJP4_d0t$HtUBi5d)uZx<3(qmVhX*=hj^P;<@Sz1Ev)|9YW|VtL^Rg zqGvWG2Nz3yEKwuAWCnDlJ&z~YF=46Dj~PdtjCs*_o@~nu`l;0Fa*hkj*?;Tqz>fqE z?fON^236@)pnM2mRhsOjhfk1v#l9t6`kKNHU4?Wy{MGx(V399j$j$D38Te&eB&L>i zf3eI9iI?u52^F&p5LKsGpWT*U{>bVp!&81z_P^A+|8sdRmG>Kkgyz$yV|3{McjdXg zjj`eXt~{4R7Wvom{NL~AOCGF=7h9jM4eE?1^pNwIL#c=ZW5b4%l~z1SjhB#=;SH&! zQ;jEp3}_?S6_Ss26!9*!D`Q6bn}JT7Paa!O@4ny7v@>A!nU@XVW%H>=T=j*P zZ^9S5-!!*K>|E&l#iv!7y=jb+=i#a->n-b}tBGN_$?EEYJIeda|NIH+_j3EjWCI^q zV2@s}`xkq@+adUfd&t#Bwx;nrrC<6#)MAQWcjM|!h`!eCRV$PAc!)Nr6{yw0VOe28 zSjp;3Fjl69Z|%}2{%L)FU0WmS^IiXt3M+snw<@bAENK!(hMTa}ESgu{ZqZ(7x;VVp z0eO|7m63(ds&<cd~?TOs(Q5MyY>$%TYEXAPoMu~Jtsh*`+>5;NHSPi zYmO>R_v9L*DCbiTe|1V04Y?nlS|(M)*f_m;3e=6MtH zHz+Xv={zeWq}ic+XLkGObqU)^LwEbOM7b#SWI|nTV)VRhV&Sj}dgG7BmWvkY6lCbP zZJ}12f~B`jw37+umUGBmG<+MyWM_;}bpS!q7KGoPqnXG@Zv^D~%$uQn$~>M+?9avHZQH^Q7Zj7F@X0>{3h{TEJs}J|PcB8%;eI^a z?t6xpnK5N;(@52~*Wj||+_HGUP-#7tMIVd3d)&yLXX_ns<`OJ1xo0N=hi(f~%se@V z_fL8mBWsaaM(0hunar-CcFDGU7Uc*V7M|Vg1v=&rm>Yp&>l!cbd1Wu7B)-uhwRIeY zE~wmyoe4wr{UXl@jA*FxSn%}FQZJD64?tB%GT^lH<>GGpnx?%;=n1=@NX)pUr2q1~yt4L?2TV`8~*E;865%SX@92 zA@8)vh7VP(E9mvnRk@8hrIivFj*4kE`=oVa?HC5-Yh2MmntseOi++?Q-w=z{br2 zIbOk=dVvjo`YysDik++R!7ZKXFT?~BPdQXn{AEir@|{ys#qFcc!;m@sAj(mlm+-1X zc`YA@vNr`>pA5a9yfVyd@A<}Adka&o@Ny_(Q?w=73SM4yG_9e!dka0^6X@}yZQ=Zk z71l5Two9RPHO%FSjGhLVcyDDOp|_h^#gpXYU`7z34q_7t&uEb_n~TVE+{uD;7`q+4 zDy)`F_S77z+yWUMLzaSb89(pnk@wB~NL-xfkh3*Vw&tM_YeuEEKJ9QLhH~}$op3gW zNw{AqEs>n0Y`GW3nTHcX5&_0A;kVQuC-ZpaOSu*?Jd95)tdzu8XX`UF$IbMcxNe7# zbiQ!%P|x48;!52TA9`+fc(>@0P>1wBWO&eWh3FK$tohs;f18}-yi^3vmAetmq!;T^ zxShk)yL&9$NOX<07#g-Krddz&OL`hO4DAmD7rIFWAVcEa(Xw?y1?y0P&IY(-xz8Z| z+uGZm+UC0YlOStewDEzikakZ+4O@lJSh+;`s+lZC;ck>V@zVq6doM}>j*F}bPMZT~ z&d=BP0o1D_Y3SC1Z_i3#o1HxiJ-Y*TU)En(sExPecgBv(=NZ}gR9@W2W9-jE<(w+n zb%;k8Q^oc=S8m)@!d)Fz(ddaV*t!-4!xPW(?1q$#Kn~~YQ_8maTQRX3(P9U2U9;oR zm9m%SRHu+>hR$B|$rpEw=o!vz>bUdcTXm~b>*AWK1oJ{i!uXL*1{}q{6Ixl(?ZNLeZlsm`r2J88@kG<075QN7R z_)}Jb%{G3(sPtt+16x{<_yhqiyI%{BkYH4wr|gc1+H?QI^D283jB!6tkPJ5m3HkWU z5dlm9im;Kx6?{7p!kbO7z?y_6pWG-RL9_!wV1Ph^8$; zSzhO)GedVpHEM15_IPFHY=1ywf)VI>n0z68{1>%iL#Ol7Q~u`OCJ64x5}@2wyq&aB z?Mq?vplm1st_|wKhbYC$@}cFqyW7?dWOYo`H&`cQ6rVmAUFu$nDUtA1YpXN4w>6ft z5hPYGRidd6$u!oDF!|~<5qMxbO0A8+NIn%b?W8K1eV1#g{$oG1`7+!x4v4nxeu4lv zeyLl=N!F`k`Dt$)IVM%>RA+R2CaXT7#{ zhs`JCN{6>if*7>P8bkSN9M0=af2v2g0N_xcp}1**i;sVh$^?syX>5l=*|ouv+!Sm5 zc9auFV28&KQX9KybYJ+rs3iGO(LaN;6Eo23H}ZVbJ?r>>^Fe)Sx}PT&v=R>+58Zf` zWVpy{uS0A0lEx6PSC)^cu~S0onTw|;X7;q%3QN~HnRlgXFhW!iW9cQivtp5$TD*E& zpLuao?n56Rdg4b!|NI8SFy1}IxEB6*-`h(PubM%fgmBi0k{}EV2w&jJ9QzhIvz&>G z@+KxTD0cQ{r4KzVSxMDfpZV8MJ<~wx2zQAKo4{OACxhDS8u9U*p4}wobJEB1JDqx; zwT8tbh9ax<+xRQCQS!kujFxmO$O{{LgrY(5d`|=vsbIQ1Wtk`G{JZhOiifr;4F?7%BUuKkl z!*IgybG>oq(Q6c&_L(lF7>~Mxn8jv&O$T{hkLJVDQZUcI3$$YeMJKj0%^qDZCB`z! zWst{N3u8o;f&fdbzF(Ogxv?IH%dMl>O!EwBey}xIZf%@k{sZk&reHVHQ#-g<;S-mS%LGs?ASh)3Jy&_?S5JK<*^={0Ob>X9Mi1^YwLYSPv;{W zEf?n?k0y)oPDHosDPv9}N@>>b5uIF82nDkq*N`0Leo;)FNd(Lz;a1--UP!`=aEGEs zH3?&GgB652pCy;)0zU-EL6!ardfyjKrk9IxPndeRUN(~Uw-f_01v7n-@@po`C6Ddi z%AJo#d!+KxDQ|R{xw>9c8htawpuI*=*ZcwGdGS@6#A-f_;&|ajnO_`uQ}KzBwW-QW z2=Kxs*~;JpUAAXNuSwKT<+X+%z;&{ltJ}3ipcSzh${@pEGU5y#OvQ@Ai9LM%7s<09N9WJ)ddOKIR@K7fF=izR&!1^L8E>=PHjS{Y93XGJS{qTbbU)$P)l&sE{5@dXc zeZuAhjGSgXy3zlP4~E4|W1y;-)-HYV&Km7*eXOTS>KT%JdxCpW-01YpWcLG9 zv%1SZqp4iCf1Pqsn7X+TA^hkg>SSf9CTg-=jC&fZ%SFrdNPaRJLP4%ngg0sMY18-0 zhbXqhf?Z>?WafT*=(v=((#UySTJKxglW$FG=6SN3^_UN#tr#a}F>+2pIw4gw zdWZDjXZ*1a`nXQ2)z@%%6Ku7zo>i4R!JlznkSg3TbUh#iDct95@rQIA$6c}nBnGE( zq=akrffwEP=*jFWrH@yY8CE8rfw%|;(+4^K( z7(_`#WmPCKLa51tQYfTMnv}|eyb(GLH<;RPZBj`ZCo`PPSC>IG5`VsuQXAvLk&4A) z_cZH-JN0()au1wxc&|oW;#%T5^5gPz^5Klx+5YD{#LrLv^V$X{bbpJk#KrlrKCWH^ z^ksJq!TZVUAU}I$|4HW_slBT%4gJ}f7GLC8pZdV=$IIDxCEHlB5VR`i>lZc$=&#Dd^JIuS689R;KeNg8!*jHwJ#Uv z58t2<@jbLX7Blwu@kgt!E-{2?{fy@)XQOuT)BDy`*XwIcc%R|Fb&5Xy2E+cA7MK#h z#6i(_>SDBsx^`pUsPPNA{XM6aXZEOiHP+hTq)tdLB+hL+r`Jb=QRO>2qS*9ifG0Xp zAC3$I^pVro>=wWAEWdBK0rDG6jC+@6sgZH8x^=kIrq+G*$+7OjW+<6T_e>h6!c(ix zEOgzkOzv7_HT4hh2WV8+fplV6zqyY_?e)r)0vsomd)w!DuUKE{nG^B2$@4>>VDU0i zAn%Hm^>`3@DHHfjA{y@Ki?n8ryw9R6M1mSTFs{-m4#GeDJ85Fs@XO% zpgm*T-ldzEO*k7#b+&5u@M1{}A?3SsQTTROEum#s*Rk94Q{$9BgAZ!}&PejAGw4Cs zWRn>dQ&c9lCU&C*_n4Ega2Z1}>zV-%#kgwev^u<$tLiQZ95VSabB{Eg?;M*fqPlua z2IuWbyYF&6w+n*8Jy#4QNGKIAI`~%v9`I?W`U*jV!yen$OlVnD&MLsvXDP@^Y^1E+GbVAPQ z__#OAwPO!3$Pj4XmLKp>pR$souZBvSITi3vXDU!e^TkKDrNEo6yEh^kyQninbs!Z) z?`v3V>cZPYu#&Y%&(&gH+W2lAR1@yN;QFhdMx%s|j5^+HxpoOMEQBoKL?9cwxSS>$ zsx$QXaWVdsJg-Dk835Bl+F##PU91RLs@vSKNZw?|bGj%P6NOuxxKMVp)A`ne+Zr^! zIF?9jI3jX(=6=;-C^`uzEB7motpH!IZdX)k{|uRW2Hgo$y&d0%qP~A?{IEvXjP`}0 z!>uQ9I7DMyDJV6ge(~HUv=Cj^=<&T-!<)ml4&$T|%UHip)L;nGA^yh!1iYOW%H0b7 zonk0egVm|qsQ-hL+y!k!1f}iWxt114=&_&IrSMn+A;!c_b&cefVi68zkj!f_inY`8OXyyqY zT6;hpW)mXmOOrNzdepn3B~u;&In`br&V>ZKAw&jtjhtTPEUo=y*S)#@Y43Q^7(b zM$FaGtu~IjyS-Mh*M5Lo*t70tOC5>$PQ_{zpLo_nLFXg#aLxbmL#55PS zJo=i1i>b6nfNp^5QBEbQ3Q`oX001oJgU{ZS)e&7FIWGyPfF z<$bx8jK}nHS#hGVfVP4$AJ*;iCMk|z5PfsiY1>;tQ}%8MS1GWgkm#U{Yv%a9Kj?}k zy!auIu8*b7K3$wv7sW}E3Iq=r#EI0x^sVRdCfJg&Mgs4s4Z*2HrXq8<`XePr7c{w%FBXuX4HsKOs2>29Kl6S>kFE z-)%>`gt+^Qu-g?9?-*LQQC({_8XaaEi^?)6vOl+VcgeBmy&Siy2cRczq$;w8h<)3h zf9ATml6*#UyrfBw?xuU;-4%x}b@56QnAt7r>*nNNm2TlDarHYD!n}@|W>I1AvcD3H z)0tkOw9on2Eu*Q@ly}Octkxgt-ia-%;6m`qS6{WsBRKs&B`?IB$PY}bOIeAOL=$s^ za}w@+l+g^dPd>vd@?bz$^%(6LqH)R1DalnTFS?U}J1Pau_Zt}`HeSDtGbrM?&RiAI zr?xW607}5)kGVZ6#m4<&4*IDyOG3LG4d*rPojNZ2$i4QmKYw060+bVRKq{L89ZEFZ zO^p{?v1Xa3+*dVDcpJS71|j9N*whnrC9zo8=(&74J`uMcFDi1eePFs^v_&|vVZOO--)rGnqzs+0AM}#}K z6-W5HZ_H6l6f#jsG#d|*ySF!hacpJgN9(J|7-(m0RjW|+_X-|67IRY!Z(SzKaCxfe zTqZ_RvtJgvD)?M-3AQUzRkdQg0>#wYlUeecW4fSCiryUJG0782k5^6uE4R==C7{18A-!SMwXC1h(k*)X3dc z9#i$)Cz--Fi^-gmgClp%t33!$pt@B;-+ez`yhw)>P^f1|G^i+Gq+=H!0MzAHoZ0^P z9qH_y6dN!etK>pmV1+4?tG^OY`t3ZABnTxN&!+4&4E#asoB1^9?RU}hWurlO$FL{Z zXhHfL40e&2VTtn4maBG`uvHO^tkOl!UVVpz(2WBno5 z6Hxvwo~ECDP8=i7iT!)+pCsuH7Mv^$jgMK|nO;%+-<=qD!Tmzlp)j)22M&RWHAN|{ z&eZ-Uc!Tq=I~~&_M23DXT&2_byPGUYi$#|GY4n%R+Pw6FFTwsqH|37xaO0vZtZG+; zAMbrUaFDv&}?J+mI_}MSsGn&T$(qThYuE$Thvm3nmhjqT!YWD=Y%Kn9YLJep0eO6EJ z>LR8B$FKafTW&OKFG;=C^&&6XpW8#o1lLTKKZ9|JUDb=zpJ8n4JbUJa5g2g--JAx@ zm+r=wYQHtN!D+%bSkvGgXeVZ}U1+(+wm;j7b8WS;2P_Pe^A!(s_Ky#4+7#p5xI||; z2$v2Q$TXQ451Pc|-xiD5(0f<1AY)54k;e{xnlYgj5rR^x@xHitMJY>iqHcHOwH*a~%mghy(Hm{G|p%WRwN&|sKct1lT*@tWVR z8zqA#%-`r7WR>#H_Lz9+<90bA*Fx$e-exOdDuVe6_GG$n$aXL~NPRPFzGGy{vi!NK z2cardAi1+S>)#vOtSA}Z?X`>}xL1gsR9R)-4%%W@bT7^qcx0(nEXOC13O(y1;xmtq zW=#i`d>Q+^gb;>v02yv`EN4q-_~B3)0Luag{Pd^=WS0rRGd5r|ImfS*j|jC{Nd};K ziI+U1{lL?#uS(S$@ewSth$&Gqk=Vq=y34w9#H8pzY1AdSnx?7hDN_PMmk#?H)ZR!8 zi%_x9Oop1R&chD_g9heg*E}K2o%osd(k4CK2fb=nJmysWT3REWoru?%7w2XbwQP5l zNH|IRl0OSmo`iy28m`T=I&$J>=00nzm&o#-qVFMx-sP=z%hkF@ld@cs)_?ve->h-| za_Pyr*>$SZ zx~@}HhrVhp3to0ReV^A+S>3TMr?zwqu0M#u!7dZzN>gjpGi6HT9eR!Z0-;G29@|w5 zQe29^zF^2Fy9*A@T}a)jWs46JE>_1*H)~2UO(82Q&?6Ga3mjk-pe)g#I$@MrIH`W` z6&Lw|1i6p@b{_-9hQ*oVi%W@+S#`0Nf1f=niAFO)|sb)*>GU7UGSQRKSGhd+JXxXx9ZKvIsc3~_a3@4TP=AYz4Y%7PzoTDeh{AAjZI&ZjM93NM=kUrhuX##H&GJ~eMu z(SQ8*qSh7|yG~&p;EXQ&3bpSsFry#1 z%exZCx|qDwKRkKN-Q@4NYEm5zX_&G1<79i>u=#i_fxvvm^6WgL!y9rKKWgjnl^Ai7 z-v?kTA+gYsZW^%SblymJ)W_i^%A->xi}X_OKDPk3J`g{XLY9^rI-5p%qX~ntBqY_$ z6%nQ-j(KmvKm99kfEujV=;rE)!{y~#7{95zT9UbkI=4VHLH8I?X$$EZNfgwPm=JO4PD{X527o*~8O3_M63o znakiOqZ1%z`kUyS7m;Cw4H62ixYmA3TM zJxO#Y3+8+M=*qnSW%3kG}iW9MY5KTxrdBuaWYD2K)kXWC8qtze-%ba!4 z3`Hr3J&lyjZYta~5Y^K{OE9zIkZ5l4WXUy)knZZ(R5COQ^_SOt-I+c9+?e7jUq!e} zu{u}lh7oTtM76T6MkKDhV#~Q&G0ehD$&|I?qBg^ifbp|j5yw7;*@iTux4sG1{3jOaQ*X|bybS_J=udVb19v?YU|LPU|`~7^yML}%}OlhAU;tNd{6oT*>2Dw16t-Y|ly|4$0EC~Vm zqmhw z3$BJRCLK`m6}Zaqd3Ysnq(=wIKViX)0YKwJuN0t|N0R+bfG7DR*ab{NoCDtM^7E}q z5a7W=zL|n|t`m3yU#jnygM4(I@DAj^4`1oem*2NV21ee$vG0>3Fr&nCoC1)b)kChX zn1l#hPTYI~h(WV(ID&_!-f$4-<-l}X^utqjAi7_>Ud)pj>5RaI?co#0_SXHCH`q?z zzb(EFVs}A=!}eQn@CSk1{6sgk;uBcz!7n3xvjNBB;b{Fsd}-^BAZ7Ro(DZht=K%t? zZ$|h%O@O_(Hadgh?uYE%UZ2L=~r+x{jV>c zo<1lhp`@(3+41nO2`wT{7r&I}w8-tTb{)hr7dk~e8|n9FSS!HKH%3AN7^h-X+5UHt z!aKUnFMaBLN5yAdlYNUms{sh2I)8Yp-YV)vAC89u7@l!25Jzp(t?@z~l~)HIgTbfUxAyemVye~JM&%!rBg!^!akl1nbB!|P_Ze}ELt1dAV8WG7rH5e1I^BzGMK=R{`NdS>8}jyt!g*|K)k^rC<=EvT9FE!1_W9aD^| zbj3NJ!HEF2+g3diP#p?7^;`U~Rv4$g>Y;73S3Gea4{|=2VNnRGXjC9XsNF+??d%9gnd^LzI9n)*?ee>lM;#R~?N7!Q7k!^H0Y4~`Yqx)MI~Uo%B1?v6ZtCL0?>m0f ziIg_{+=-FvApmMZ^(U1{ZOyzEx<*h71iW;pG!R{6zm`vS#7f<1>pR-izMcipGL2^DkY)n^<<5tJfSu5zzb9`VG+R3cX_kkV8z&-Yvz3x%BJ zrmd`p!Cta7jf^Pr9`fU5OT8v=uLG^qCNZx}_TjfMY3h7T**(i0lgMyp>@Ew7_cnv6 zDr{O%3OBIo(ppj?ZA@1Gk-S@o%eJ+h&jN@jD;8{Q+aQBJCDWmQl^p(g^J{mzC@aIK z4Tj5m{z10s16m)EJs$j%RI8Qk714u0HGjA*rWtAzppBcHCC_k8RA=spyHMB`uXfCh zGF+4Dar;yGYcqo! zsnqH}d=n0I!=pld$MIXO%lg+~Vfe5R6O!s!3m-MH9&lyw)G(VBn?!3YH0ZGHTZKjI zzjK(WTowVRdwbLHb+3UZId|grpY}wb6S$V5}sG-_!I?DYruu^|I*N&1Y z>+QoAj#@8S$K$Fvu5;dd$2}yC3QO;O#+H5T{-;sR3=bzGrJVVE0M3b=5|I!7IK0X1 zUJRQ99`}%VNBEMdtsN`w0!1i;$6B{AsT#Y*BPjNZs`8ynrvSTT0sc!$M}f_G2L0in z3*Tc~qPKx|rZN2mw^5EJe&3}{uMtU+L4!p}WVMQ9i7lrVdjCvuP9np}=^~N4yOdO> z?>m{QYXne(eN}dexufH!qPv%mcbbE}{pY)?AGa5Du9tYyUJ)fqL9FU@DI8jyC3Qv> z5h-RLjwOg~WPo1wa2eW%@pT+$;Y~wiUZWoD=Mnwwi$__bWACs{)WL(H7sfF3;-sbf zK;MnQ^v7D8V*%cqg;g86q4e7{9-9FA)0hFhg7x2T!}asiOdRz;`khYJ?s@&2nt$%M z7>kd=Vq1*AaIEhUn8GLJ@|!_ZIuC15-MYvrOUX$ETks4OjHX1Z+TeUI_M7(2cyefX z<^(HHPAwNs`iBfrD#~C~=S(Yj%O=d))GJn6klV@a0Ro3-HzCMt-xrrX9FtOA0i7LZgQ zc5I6hLGq%G>7Mjwo!eI36= z+RyM6;=eiZHl?#nEoS}_R6LYx;fq#f#$3c!Nt|~P@1fBe$ndm7e=o5ktHMx~9x@AS`dfoT+ffP6O% zBgt=h4O%d{Eb7TX+#O)SyKUKUk5H}H=NJmXR;AsK_!i^br)l1JGP8->5y3p{tSPKK z@e!-%zSEOAH6v*`QSwbz4=E= zo3||fAEDGU(WL2~Ewya)p4wzf?FtJdtGRFv0j$&W0SX6`==i7_#vp9%Y5Bpto5r>X z4#6YE)l;!RToS)MWUnqOU00ZynB06a_iQgizdz$`s#(92UW?jOoKU1$Q#L={_$>8v zgYd(C*L@a=vP`Zfg1KCMrfPn^Ca-|Xmz!sWK);Z-R@V1wYF}D1=iPU(v5i~vWmfI0 zqwh&{n?7tsvmcHfz&XRVJSo?$?#Xo5(0=%BBD6=aVk*4lbpZoX)JGLylexgD=+ig0 zMqe11ba<*7DC@GDMzh4Y$DBBu_OLp$1+fucsAb8pYgS}GHD~kGTDbxN*n_z^XBAG( zHiJ&MM(A79KQf@TiJC@?yJiJ7T`2XAr0}U|736%5k*Z($BBR=q8e7a_g;cSgR(!_Z zd7Hx?fxY&yWg&iJwyi&tN>zAf!eUSTR@R^beJek1Dl+UX*<{WC~&Eq0D?_Y+Op zFnGT=AWg=Aku}(B0~|?dAdR$N^D+@f6f;Ytxh>R2M06v`82|mN`NH@4U$C4o^Xb?Z zQE*abPXZ3R%dn%@+i&x%3=jFpHqc1A(~2_4NLfObbzTZL()YPOJ@z7+6$<3$>`-Qz z5U%w6bx|!MbNR==V7W3G)rE zv0sk2rQ2eq+c1do6l=0)FK%YnQ2f6W<+Y$JBhgdVQRBsjIk?H!g3B?Q2WE3_t~MVb zHe!B&qVY__do8dkebKbt)SjMX`ln?KQc+}JmnRL<%@mR)G#Uaa@g2uq-f~=xNhgss zSZODfX>+ySxgS4&sGcM7&xsn!HO3zpmz+XrBcu|`Ziyjzg#wCqsRru!3GVu~q z^8AANoX~c<6jiyyt-#4YN~H@;!}D%s@r9Y+k>Z;sta#)XI0^)gPsotfNZ6)xD_`s$B5~&>h~3Yu@LP^BRdz94hAFZfmS6#J8>-2+)2`N zbNv7LsM@KD<2uJW;>dHuUj^OVP6?Ukl-%gcP{j{tkRdUJZnI}y@j7Rdw6=Wvo}b_5 z_={^%sHXIN{&_THL2tQSQ6}iRM{yWAw`LuQxBN>1qthwF`$5TWGfe*g+%HoaXkUMG znMONBU6zEcR0_hdpwQm10?#jTYs9Jf{vt3bu$($UMX~+8d3rHIfOEOc5{M0ZACw9rIRvF`qT>GVj)Dr zLiJ+gU)p8!+BPM-^pv4c!#VLRygv)+O=&6Dm5c+L4&zOBaHnb%`jHOuLdL`1c+c*X<=elsPwA zt=oi(4&J6RuAdIYfI6j+XGe-GF!m%Y)7n=r z&B`HLy+vt-0r=$qybaomo zTVAoD>IH7^)P40^y3m(SGMk~p5Hq!?*Yx`A-v4@Mq4yO-!lp>ai?8^%MwjOi(Qi5) z{>WmMp`$y>Gwb${>!2!_Q%8y$6N#Bxr;Esqu|2UeeVSTS3P#l3MYC7n9YkXIt;nYGUa#n}?PIV%{O&vG zlOrirj;Nufy4vQ;U?gD*Wo(Tjeed2RFdKngMMuyDd519B!IJA{~^ zANAKyo3(wqUz*CQPo?vCYjC@ox^*CPnIM5sMj7gaYKO|2@4Q6O}^AsN+2_$@~D(a!Q+lnSBp zC8h8@u~18^1TZIL_i*O?oq3!W;pa)QbR$DjAumgkM_vtwdS?tJtuWYL;8Dep?IU}9 z9P`^1zva#SWiQ$7o7r!e*7diDM#<03TnW4OxQXe*hEpx4gU<1flJKhnMlMO6d9T32 z4N-Oa&a6_h`CPo#h4e5XQHPvreRdT?z!Fx!rL24!I*1;TV4&R7aWQ){H*0oe&Ph6{ z*J9SrYfYgfgtxu1LZltYuS<~NE+H_u^-F8eBj{F@=w0-(<6^H>$)Z+jLU-PWE|<;| zRe-1KP;$+P`0+lZmS2PKS_^-b>LT1|s$o&*LKljn|4{Nx@;4SLUWW;0$C=As<>vFG zcYa^u=BM?tS#2mKTp=n3zF;8=NV7e1R7cwdNxq2{im@$vYu@QHU4mBljW7 zZ&;0786#A#`7waUA~+N3U0c};k7nHhbQv{k25;@-ZMvv8ms8-M6nHy_-s@YF%6Tbq zN>3O)Ey>9b+|^>4+N7fd;)@AAxye1T(qumD$u_Gauj0!rCcTomrbc`Mta$nIbqL9N zSP>ZY|<#qrEfEQC!avFs$@* z3Mko1GamHTUS^;9`~wEVZp%MqGt-+bo_`r|O?GX;drAkg->vr{JyeeD9e#~+(l@?1 zrFv*5V95`jF=i%J{sG*bAA(L%-@U+mo=R>L5G)+E(YCG!&^vo47(S8IaWovZhCLNl z@U$XS#RfJk4T_8nm=<%r-^nE{@qm0ti^GK9fkvx8sis##*+;B> z4%{Ce*r*P~tz!Vvm5yWoW}-@AWPl~{Z7B0UrBeZ||6nQVafa%4MvZr_SARjj$(*VP z%qk$B-xr)^8cK`fWXYe1=6-!!&*DIlM|X(KxY0FIDKSU&RpRYu8M;a+I3UuhOdHhe zdktA1l1j`tN(k}T2UXlIJn5_K^Gl1<^!@NdQEQZpo_ZWZvH{9j(>L%;Q9ANqG8l&@ zv2qn-VGf*Cc91mq{}Nm^F�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
^UZeZu)>`tOJ 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 literal 0 HcmV?d00001 diff --git a/tests/data/model_with_beams_shells_solids/model_with_beams_shells_solids.acph5 b/tests/data/model_with_beams_shells_solids/model_with_beams_shells_solids.acph5 new file mode 100644 index 0000000000000000000000000000000000000000..93e49db463222428a1b86044f01d321356868d96 GIT binary patch literal 166396 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 + + + + + + + + Epoxy Carbon UD (230 GPa) Prepreg + + Composite + + + - + Temperature + Density + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 1490 + Dependent + Density + + + + - + ACP + Regular + Ply Type + + + - + Orthotropic + Temperature + Orthotropic Elasticity + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 121000000000 + Dependent + Young's Modulus X direction + + + 8600000000 + Dependent + Young's Modulus Y direction + + + 8600000000 + Dependent + Young's Modulus Z direction + + + 0.27 + Dependent + Poisson's Ratio XY + + + 0.4 + Dependent + Poisson's Ratio YZ + + + 0.27 + Dependent + Poisson's Ratio XZ + + + 4700000000 + Dependent + Shear Modulus XY + + + 3100000000 + Dependent + Shear Modulus YZ + + + 4700000000 + Dependent + Shear Modulus XZ + + + + - + Orthotropic + Temperature + Orthotropic Strain Limits + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 0.0167 + Dependent + Tensile X direction + + + 0.0032 + Dependent + Tensile Y direction + + + 0.0032 + Dependent + Tensile Z direction + + + -0.0108 + Dependent + Compressive X direction + + + -0.0192 + Dependent + Compressive Y direction + + + -0.0192 + Dependent + Compressive Z direction + + + 0.012 + Dependent + Shear XY + + + 0.011 + Dependent + Shear YZ + + + 0.012 + Dependent + Shear XZ + + + + - + Orthotropic + Temperature + Orthotropic Stress Limits + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 2231000000 + Dependent + Tensile X direction + + + 29000000 + Dependent + Tensile Y direction + + + 29000000 + Dependent + Tensile Z direction + + + -1082000000 + Dependent + Compressive X direction + + + -100000000 + Dependent + Compressive Y direction + + + -100000000 + Dependent + Compressive Z direction + + + 60000000 + Dependent + Shear XY + + + 32000000 + Dependent + Shear YZ + + + 60000000 + Dependent + Shear XZ + + + + - + Secant + Orthotropic + Temperature + Orthotropic Secant Coefficient of Thermal Expansion + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + -4.7e-07 + Dependent + Coefficient of Thermal Expansion X direction + + + 3e-05 + Dependent + Coefficient of Thermal Expansion Y direction + + + 3e-05 + Dependent + Coefficient of Thermal Expansion Z direction + + + + - + Secant + Orthotropic + Orthotropic Zero-Thermal-Strain Reference Temperature Secant + + 20 + Dependent + Zero-Thermal-Strain Reference Temperature + + + Coefficient of Thermal Expansion + + + + - + Carbon + Temperature + Puck Constants + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 0.3 + Dependent + Compressive Inclination XZ + + + 0.25 + Dependent + Compressive Inclination YZ + + + 0.35 + Dependent + Tensile Inclination XZ + + + 0.25 + Dependent + Tensile Inclination YZ + + + + - + Additional Puck Constants + + 0.8 + Dependent + Interface Weakening Factor + + + 0.5 + Dependent + Degradation Parameter s + + + 0.5 + Dependent + Degradation Parameter M + + + + - + Tsai-Wu Constants + + -1 + Dependent + Coupling Coefficient XY + + + -1 + Dependent + Coupling Coefficient YZ + + + -1 + Dependent + Coupling Coefficient XZ + + + 7.88860905221012e-31 + Independent + Temperature + + + + - + e236c55c-e4b2-423c-8262-2cbd5ec4377b + Material Unique Id + False + + + - + Color + + 222 + Dependent + Red + + + 222 + Dependent + Green + + + 222 + Dependent + Blue + + + Appearance + + + + + + + Epoxy Carbon Woven (230 GPa) Wet + + Composite + + + - + Temperature + Density + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 1451 + Dependent + Density + + + + - + ACP + Woven + Ply Type + + + - + Orthotropic + Temperature + Orthotropic Elasticity + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 59160000000 + Dependent + Young's Modulus X direction + + + 59160000000 + Dependent + Young's Modulus Y direction + + + 7500000000 + Dependent + Young's Modulus Z direction + + + 0.04 + Dependent + Poisson's Ratio XY + + + 0.3 + Dependent + Poisson's Ratio YZ + + + 0.3 + Dependent + Poisson's Ratio XZ + + + 3300000000 + Dependent + Shear Modulus XY + + + 2700000000 + Dependent + Shear Modulus YZ + + + 2700000000 + Dependent + Shear Modulus XZ + + + + - + Orthotropic + Temperature + Orthotropic Strain Limits + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 0.0092 + Dependent + Tensile X direction + + + 0.0092 + Dependent + Tensile Y direction + + + 0.0078 + Dependent + Tensile Z direction + + + -0.0084 + Dependent + Compressive X direction + + + -0.0084 + Dependent + Compressive Y direction + + + -0.011 + Dependent + Compressive Z direction + + + 0.02 + Dependent + Shear XY + + + 0.015 + Dependent + Shear YZ + + + 0.015 + Dependent + Shear XZ + + + + - + Orthotropic + Temperature + Orthotropic Stress Limits + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 513000000 + Dependent + Tensile X direction + + + 513000000 + Dependent + Tensile Y direction + + + 50000000 + Dependent + Tensile Z direction + + + -437000000 + Dependent + Compressive X direction + + + -437000000 + Dependent + Compressive Y direction + + + -150000000 + Dependent + Compressive Z direction + + + 120000000 + Dependent + Shear XY + + + 55000000 + Dependent + Shear YZ + + + 55000000 + Dependent + Shear XZ + + + + - + Secant + Orthotropic + Temperature + Orthotropic Secant Coefficient of Thermal Expansion + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 2.2e-06 + Dependent + Coefficient of Thermal Expansion X direction + + + 2.2e-06 + Dependent + Coefficient of Thermal Expansion Y direction + + + 1e-05 + Dependent + Coefficient of Thermal Expansion Z direction + + + + - + Secant + Orthotropic + Orthotropic Zero-Thermal-Strain Reference Temperature Secant + + 20 + Dependent + Zero-Thermal-Strain Reference Temperature + + + Coefficient of Thermal Expansion + + + + - + Tsai-Wu Constants + + -1 + Dependent + Coupling Coefficient XY + + + -1 + Dependent + Coupling Coefficient YZ + + + -1 + Dependent + Coupling Coefficient XZ + + + 7.88860905221012e-31 + Independent + Temperature + + + + - + 7ab9c060-4547-4561-aab3-d3fd3c4952ed + Material Unique Id + False + + + - + Color + + 170 + Dependent + Red + + + 170 + Dependent + Green + + + 170 + Dependent + Blue + + + Appearance + + + + + + + PVC Foam (60 kg m^-3) + + Composite + + + - + Temperature + Density + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 60 + Dependent + Density + + + + - + ACP + Isotropic Homogeneous Core + Ply Type + + + - + Isotropic + Young's Modulus and Poisson's Ratio + Temperature + Isotropic Elasticity + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 70000000 + Dependent + Young's Modulus + + + 0.3 + Dependent + Poisson's Ratio + + + 58333333.3333333 + Dependent + Bulk Modulus + + + 26923076.9230769 + Dependent + Shear Modulus + + + + - + Orthotropic + Temperature + Orthotropic Stress Limits + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 1500000 + Dependent + Tensile X direction + + + 1500000 + Dependent + Tensile Y direction + + + 950000 + Dependent + Tensile Z direction + + + -1500000 + Dependent + Compressive X direction + + + -1500000 + Dependent + Compressive Y direction + + + -950000 + Dependent + Compressive Z direction + + + 930000 + Dependent + Shear XY + + + 930000 + Dependent + Shear YZ + + + 930000 + Dependent + Shear XZ + + + + - + b903150d-c398-47d3-879e-d50a1391f683 + Material Unique Id + False + + + - + Color + + 182 + Dependent + Red + + + 229 + Dependent + Green + + + 228 + Dependent + Blue + + + Appearance + + + + + + + Resin Epoxy + + Composite + + + - + Temperature + Density + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 1160 + Dependent + Density + + + + - + ACP + Isotropic + Ply Type + + + - + Isotropic + Young's Modulus and Poisson's Ratio + Temperature + Isotropic Elasticity + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 3780000000 + Dependent + Young's Modulus + + + 0.35 + Dependent + Poisson's Ratio + + + 4200000000 + Dependent + Bulk Modulus + + + 1400000000 + Dependent + Shear Modulus + + + + - + Tensile Yield Strength + + 54600000 + Dependent + Tensile Yield Strength + + + + - + c99988b7-2dbb-450c-aef4-ecfe41eeb382 + Material Unique Id + False + + + - + Color + + 155 + Dependent + Red + + + 244 + Dependent + Green + + + 255 + Dependent + Blue + + + Appearance + + + + + + + Structural Steel + Fatigue Data at zero mean stress comes from 1998 ASME BPV Code, Section 8, Div 2, Table 5-110.1 + + Alloy + + + - + Color + + 132 + Dependent + Red + + + 139 + Dependent + Green + + + 179 + Dependent + Blue + + + Appearance + + + + - + Compressive Ultimate Strength + + 0 + Dependent + Compressive Ultimate Strength + + + + - + Compressive Yield Strength + + 250000000 + Dependent + Compressive Yield Strength + + + + - + Temperature + Density + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 7850 + Dependent + Density + + + 7.88860905221012e-31 + Independent + Temperature + Temperature + 22 + 31.5 + 10.5 + + + + - + Tensile Yield Strength + + 250000000 + Dependent + Tensile Yield Strength + + + + - + Tensile Ultimate Strength + + 460000000 + Dependent + Tensile Ultimate Strength + + + + - + Secant + Isotropic + Temperature + Isotropic Secant Coefficient of Thermal Expansion + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 1.2e-05 + Dependent + Coefficient of Thermal Expansion + + + 7.88860905221012e-31 + Independent + Temperature + Temperature + 22 + 31.5 + 10.5 + + + + - + Secant + Isotropic + Isotropic Zero-Thermal-Strain Reference Temperature Secant + + 22 + Dependent + Zero-Thermal-Strain Reference Temperature + + + Coefficient of Thermal Expansion + + + + - + Constant Pressure + Temperature + Cᵨ + Specific Heat Constant Pressure + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 434 + Dependent + Specific Heat + + + 7.88860905221012e-31 + Independent + Temperature + Temperature + 22 + 31.5 + 10.5 + + + + - + Isotropic + Temperature + Isotropic Thermal Conductivity + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 60.5 + Dependent + Thermal Conductivity + + + 21 + Independent + Temperature + Temperature + 22 + 31.5 + 10.5 + + + + - + Log-Log + Mean Stress + S-N Curve + + 3999000000,2827000000,1896000000,1413000000,1069000000,441000000,262000000,214000000,138000000,114000000,86200000 + Dependent,Dependent,Dependent,Dependent,Dependent,Dependent,Dependent,Dependent,Dependent,Dependent,Dependent + Alternating Stress + + + 10,20,50,100,200,2000,10000,20000,100000,200000,1000000 + Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent + Cycles + + + 0,0,0,0,0,0,0,0,0,0,0 + Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent + Mean Stress + Mean Stress + 0 + 0.5 + -0.5 + + + + - + Strain-Life + Strain-Life Parameters + + 920000000 + Dependent + Strength Coefficient + + + -0.106 + Dependent + Strength Exponent + + + 0.213 + Dependent + Ductility Coefficient + + + -0.47 + Dependent + Ductility Exponent + + + 1000000000 + Dependent + Cyclic Strength Coefficient + + + 0.2 + Dependent + Cyclic Strain Hardening Exponent + + + + - + Isotropic + Isotropic Resistivity + + 1.7e-07 + Dependent + Resistivity + + + 7.88860905221012e-31 + Independent + Temperature + + + + - + Isotropic + Young's Modulus and Poisson's Ratio + Temperature + Isotropic Elasticity + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + Interpolation Options + + + 200000000000 + Dependent + Young's Modulus + + + 0.3 + Dependent + Poisson's Ratio + + + 166666666666.667 + Dependent + Bulk Modulus + + + 76923076923.0769 + Dependent + Shear Modulus + + + 7.88860905221012e-31 + Independent + Temperature + Temperature + 22 + 31.5 + 10.5 + + + + - + Isotropic + Isotropic Relative Permeability + + 10000 + Dependent + Relative Permeability + + + + - + 59002a79-71c2-428e-906b-55d7dbee100e + Material Unique Id + False + + + - + Temperature:TEMP + Mean Stress: + Field Variable + + + + + + Options Variable + + + + Density + + + kg + + + m + + + + + Young's Modulus X direction + + + Pa + + + + + Young's Modulus Y direction + + + Pa + + + + + Young's Modulus Z direction + + + Pa + + + + + Tensile X direction + + + + Tensile Y direction + + + + Tensile Z direction + + + + Compressive X direction + + + + Compressive Y direction + + + + Compressive Z direction + + + + Shear XY + + + + Shear YZ + + + + Shear XZ + + + + Compressive X direction + + + Pa + + + + + Compressive Y direction + + + Pa + + + + + Compressive Z direction + + + Pa + + + + + Shear XY + + + Pa + + + + + Shear YZ + + + Pa + + + + + Shear XZ + + + Pa + + + + + Coefficient of Thermal Expansion X direction + + + C + + + + + Coefficient of Thermal Expansion Y direction + + + C + + + + + Coefficient of Thermal Expansion Z direction + + + C + + + + + Zero-Thermal-Strain Reference Temperature + + + C + + + + + Compressive Inclination XZ + + + + Compressive Inclination YZ + + + + Tensile Inclination XZ + + + + Tensile Inclination YZ + + + + Interface Weakening Factor + + + + Degradation Parameter s + + + + Degradation Parameter M + + + + Coupling Coefficient XY + + + + Coupling Coefficient YZ + + + + Coupling Coefficient XZ + + + + Temperature + + + C + + + + + Poisson's Ratio XY + + + + Poisson's Ratio YZ + + + + Poisson's Ratio XZ + + + + Shear Modulus XY + + + Pa + + + + + Shear Modulus YZ + + + Pa + + + + + Shear Modulus XZ + + + Pa + + + + + Young's Modulus + + + Pa + + + + + Poisson's Ratio + + + + Bulk Modulus + + + Pa + + + + + Shear Modulus + + + Pa + + + + + Tensile X direction + + + Pa + + + + + Tensile Y direction + + + Pa + + + + + Tensile Z direction + + + Pa + + + + + Tensile Yield Strength + + + Pa + + + + + Red + + + + Green + + + + Blue + + + + Material Property + + + + Compressive Ultimate Strength + + + Pa + + + + + Compressive Yield Strength + + + Pa + + + + + Tensile Ultimate Strength + + + Pa + + + + + Coefficient of Thermal Expansion + + + C + + + + + Specific Heat + + + J + + + kg + + + C + + + + + Thermal Conductivity + + + W + + + m + + + C + + + + + Alternating Stress + + + Pa + + + + + Cycles + + + + Mean Stress + + + Pa + + + + + Strength Coefficient + + + Pa + + + + + Strength Exponent + + + + Ductility Coefficient + + + + Ductility Exponent + + + + Cyclic Strength Coefficient + + + Pa + + + + + Cyclic Strain Hardening Exponent + + + + Resistivity + + + kg + + + m + + + A + + + s + + + + + Relative Permeability + + + + + Density + + + + Ply Type + + + + Elasticity + + + + Tensile Yield Strength + + + + Material Unique Id + + + + Color + + + + Strain Limits + + + + Stress Limits + + + + Coefficient of Thermal Expansion + + + + Zero-Thermal-Strain Reference Temperature + + + + Puck Constants + + + + Additional Puck Constants + + + + Tsai-Wu Constants + + + + Compressive Ultimate Strength + + + + Compressive Yield Strength + + + + Tensile Ultimate Strength + + + + Specific Heat + + + + Thermal Conductivity + + + + S-N Curve + + + + Strain-Life Parameters + + + + Resistivity + + + + Relative Permeability + + + + Field Variable + + + + + + + + Epoxy Carbon UD (230 GPa) Prepreg + 4071b21d-bcd5-41c7-a83b-6c1a45126ae7 + + + + + Epoxy Carbon Woven (230 GPa) Wet + a96bd450-9f36-4392-ab16-aea62e27caa4 + + + + + PVC Foam (60 kg m^-3) + 44eb9ad8-c8a7-4076-a072-ced2e017cb77 + + + + + Resin Epoxy + 3075f879-a533-437d-a464-2c165b5811d5 + + + + + Structural Steel + 9ab15e88-1de0-42e9-8748-59468fdbd525 + + + + + + \ No newline at end of file diff --git a/tests/data/model_with_beams_shells_solids/model_with_beams_shells_solids.h5 b/tests/data/model_with_beams_shells_solids/model_with_beams_shells_solids.h5 new file mode 100644 index 0000000000000000000000000000000000000000..cec47db07b26f40a1c00e734bab49428f4956774 GIT binary patch literal 48264 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 literal 0 HcmV?d00001 diff --git a/tests/data/model_with_beams_shells_solids/model_with_beams_shells_solids.rst b/tests/data/model_with_beams_shells_solids/model_with_beams_shells_solids.rst new file mode 100644 index 0000000000000000000000000000000000000000..418af83885f5546b698a99589c8c0705b1009f74 GIT binary patch literal 458752 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�>+PT62qyxnH1dIzCCV)-sdTF_ag`iv2@u^Ze)A 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 literal 0 HcmV?d00001 diff --git a/tests/data/shell_mixed_acp_rst_model/ReadMe.txt b/tests/data/shell_mixed_acp_rst_model/ReadMe.txt new file mode 100644 index 000000000..6ae24ad6b --- /dev/null +++ b/tests/data/shell_mixed_acp_rst_model/ReadMe.txt @@ -0,0 +1,3 @@ +This is a model with 3 elements. Element 1 has a section definition from ACP, element 2 has a standard section from RST, and +element 3 has a section definition from RST with 1 layer where the material has to be parsed from the EBLOCK. +This model can be used to verify that the lay-up provider handles all cases and that the ElementInfoProvider supports it as well. \ No newline at end of file diff --git a/tests/data/shell_mixed_acp_rst_model/linear_shell_with_MAPDL_sections.cdb b/tests/data/shell_mixed_acp_rst_model/linear_shell_with_MAPDL_sections.cdb new file mode 100644 index 000000000..fc3987723 --- /dev/null +++ b/tests/data/shell_mixed_acp_rst_model/linear_shell_with_MAPDL_sections.cdb @@ -0,0 +1,379 @@ +/COM,ANSYS RELEASE 2024 R1 BUILD 24.1BETA UP20231030 11:59:12 +/PREP7 +/NOPR +/TITLE, +ANTYPE, 0 +*IF,_CDRDOFF,EQ,1,THEN !if solid model was read in +_CDRDOFF= !reset flag, numoffs already performed +*ELSE !offset database for the following FE model +NUMOFF,NODE, 6 +NUMOFF,ELEM, 3 +NUMOFF,MAT , 2 +NUMOFF,SECN, 2 +NUMOFF,TYPE, 181 +NUMOFF,CSYS, 11 +*ENDIF +*SET,ACP_MATERIAL_NAME_1,'Epoxy Carbon UD (230 GPa) Wet ' +*SET,ACP_MATERIAL_NAME_2,'Epoxy Carbon Woven (230 GPa) Pre' +*SET,_BUTTON , 0.000000000000 +*SET,_RETURN , 0.000000000000 +*SET,_STATUS , 1.000000000000 +*SET,_UIQR , 1.000000000000 +DOF,DELETE +ET, 181,181 +KEYOP, 181, 8, 2 +TYPE, 181 +LOCAL,UNBL,LOC, 11, 0, 0.500000000 , 0.500000000 , 0.00000000 +LOCAL,UNBL,ANG, 11, 0, 0.00000000 , 0.00000000 , 0.00000000 +LOCAL,UNBL,PRM, 11, 0, 1.00000000 , 1.00000000 +CSCIR, 11, 0, 0 +CSYS, 0 +TYPE, 181 +SECN, 2 +NBLOCK,6,SOLID, 6, 6 +(3i9,6e21.13e3) + 1 0 0 0.0000000000000E+000 + 2 0 0 1.0000000000000E+000 + 3 0 0 1.0000000000000E+000 1.0000000000000E+000 + 4 0 0 0.0000000000000E+000 1.0000000000000E+000 + 5 0 0 2.0000000000000E+000 5.0000000000000E-001 + 6 0 0 5.0000000000000E-001-5.0000000000000E-001 +N,UNBL,LOC, -1, +LOCAL,R5.0,LOC,12,0,0.5,0.5,0 +LOCAL,R5.0,ANG,12,0,-0,0,-0 +LOCAL,R5.0,PRM,12,0,1.0,1.0 +CSCIR,12,0,0 +CSYS,0 +EBLOCK,19,SOLID, 3, 3 +(19i10) + 1 181 1 3 12 0 0 0 4 0 1 1 2 3 4 + 1 181 1 1 11 0 0 0 4 0 2 2 5 3 3 + 1 181 1 2 11 0 0 0 4 0 3 1 2 6 6 + -1 +CMBLOCK,ALL_ELEMENTS,ELEM, 2 ! users element component definition +(8i10) + 1 2 +CMBLOCK,Element_1,ELEM, 1 ! users element component definition +(8i10) + 1 +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,EX , 1, 1, 123340.000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,EY , 1, 1, 7780.00000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,EZ , 1, 1, 7780.00000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,NUXY, 1, 1, 1.703097130E-02, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,NUYZ, 1, 1, 0.420000000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,NUXZ, 1, 1, 1.703097130E-02, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,GXY , 1, 1, 5000.00000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,GYZ , 1, 1, 3080.00000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,GXZ , 1, 1, 5000.00000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,ALPX, 1, 1,-4.500000000E-07, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,ALPY, 1, 1, 3.000000000E-05, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,ALPZ, 1, 1, 3.000000000E-05, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,DENS, 1, 1, 1.518000000E-09, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,PRXY, 1, 1, 0.270000000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,PRYZ, 1, 1, 0.420000000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,PRXZ, 1, 1, 0.270000000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,REFT, 1, 1, 20.0000000 , +MPTEMP,UNBL,16, 1, 1.00000000 , 2.00000000 , 3.00000000 +MPTEMP,UNBL,16, 4, 4.00000000 , 5.00000000 , 6.00000000 +MPTEMP,UNBL,16, 7, 7.00000000 , 8.00000000 , 9.00000000 +MPTEMP,UNBL,16,10, 10.0000000 , 11.0000000 , 12.0000000 +MPTEMP,UNBL,16,13, 13.0000000 , 14.0000000 , 15.0000000 +MPTEMP,UNBL,16,16, 16.0000000 , +MPDATA,UNBL,16,UVID, 1, 1, 1701208368. , 1630626659. , 758657587.0 +MPDATA,UNBL,16,UVID, 1, 4, 1647129649. , 962669881.0 , 892417837.0 +MPDATA,UNBL,16,UVID, 1, 7, 1714577762. , 828455225.0 , 825700710.0 +MPDATA,UNBL,16,UVID, 1,10, 538976288.0 , 538976288.0 , 538976288.0 +MPDATA,UNBL,16,UVID, 1,13, 538976288.0 , 538976288.0 , 538976288.0 +MPDATA,UNBL,16,UVID, 1,16, 538976288.0 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,EX , 2, 1, 61340.0000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,EY , 2, 1, 61340.0000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,EZ , 2, 1, 6900.00000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,NUXY, 2, 1, 4.000000000E-02, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,NUYZ, 2, 1, 3.374633192E-02, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,NUXZ, 2, 1, 3.374633192E-02, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,GXY , 2, 1, 3300.00000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,GYZ , 2, 1, 2700.00000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,GXZ , 2, 1, 2700.00000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,ALPX, 2, 1, 2.200000000E-06, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,ALPY, 2, 1, 2.200000000E-06, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,ALPZ, 2, 1, 1.000000000E-05, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,DENS, 2, 1, 1.420000000E-09, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,PRXY, 2, 1, 4.000000000E-02, +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,PRYZ, 2, 1, 0.300000000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,PRXZ, 2, 1, 0.300000000 , +MPTEMP,UNBL, 1, 1, 0.00000000 , +MPDATA,UNBL, 1,REFT, 2, 1, 20.0000000 , +MPTEMP,UNBL,16, 1, 1.00000000 , 2.00000000 , 3.00000000 +MPTEMP,UNBL,16, 4, 4.00000000 , 5.00000000 , 6.00000000 +MPTEMP,UNBL,16, 7, 7.00000000 , 8.00000000 , 9.00000000 +MPTEMP,UNBL,16,10, 10.0000000 , 11.0000000 , 12.0000000 +MPTEMP,UNBL,16,13, 13.0000000 , 14.0000000 , 15.0000000 +MPTEMP,UNBL,16,16, 16.0000000 , +MPDATA,UNBL,16,UVID, 2, 1, 962738532.0 , 859125816.0 , 761345380.0 +MPDATA,UNBL,16,UVID, 2, 4, 925709369.0 , 875703608.0 , 912352813.0 +MPDATA,UNBL,16,UVID, 2, 7, 809055539.0 , 879126118.0 , 1681274418. +MPDATA,UNBL,16,UVID, 2,10, 538976288.0 , 538976288.0 , 538976288.0 +MPDATA,UNBL,16,UVID, 2,13, 538976288.0 , 538976288.0 , 538976288.0 +MPDATA,UNBL,16,UVID, 2,16, 538976288.0 , +FC, 1,TEMP, , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,XTEN, 1632.0 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,XCMP, -704.00 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,YTEN, 34.000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,YCMP, -68.000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,ZTEN, 34.000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,ZCMP, -68.000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,XY , 80.000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,YZ , 55.000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,XZ , 80.000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,XYCP, -1.0000 , -1.0000 , -1.0000 , -1.0000 , -1.0000 , -1.0000 +FC, 1,S,YZCP, -1.0000 , -1.0000 , -1.0000 , -1.0000 , -1.0000 , -1.0000 +FC, 1,S,XZCP, -1.0000 , -1.0000 , -1.0000 , -1.0000 , -1.0000 , -1.0000 +FC, 1,S,XZIT, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,XZIC, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,YZIT, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,YZIC, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,G , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,ETAL, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,ETAT, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,S,ALP0, 53.000 , 53.000 , 53.000 , 53.000 , 53.000 , 53.000 +FC, 1,EPEL,XTEN, 1.43000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,EPEL,XCMP,-6.00000E-03, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,EPEL,YTEN, 2.60000E-03, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,EPEL,YCMP,-1.46000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,EPEL,ZTEN, 2.60000E-03, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,EPEL,ZCMP,-1.46000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,EPEL,XY , 1.60000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,EPEL,YZ , 1.20000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 1,EPEL,XZ , 1.60000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,TEMP, , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,XTEN, 805.00 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,XCMP, -509.00 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,YTEN, 805.00 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,YCMP, -509.00 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,ZTEN, 50.000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,ZCMP, -170.00 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,XY , 125.00 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,YZ , 65.000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,XZ , 65.000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,XYCP, -1.0000 , -1.0000 , -1.0000 , -1.0000 , -1.0000 , -1.0000 +FC, 2,S,YZCP, -1.0000 , -1.0000 , -1.0000 , -1.0000 , -1.0000 , -1.0000 +FC, 2,S,XZCP, -1.0000 , -1.0000 , -1.0000 , -1.0000 , -1.0000 , -1.0000 +FC, 2,S,XZIT, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,XZIC, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,YZIT, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,YZIC, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,G , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,ETAL, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,ETAT, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,S,ALP0, 53.000 , 53.000 , 53.000 , 53.000 , 53.000 , 53.000 +FC, 2,EPEL,XTEN, 1.26000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,EPEL,XCMP,-1.02000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,EPEL,YTEN, 1.26000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,EPEL,YCMP,-1.02000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,EPEL,ZTEN, 8.00000E-03, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,EPEL,ZCMP,-1.20000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,EPEL,XY , 2.20000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,EPEL,YZ , 1.90000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +FC, 2,EPEL,XZ , 1.90000E-02, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 0.0000 +acp_material_name_3 = 'Epoxy Carbon UD (230 GPa) Wet' +MP,UVID,3,efa0a1cc-823b-419a-9517-f2ab1a99171f +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,EX ,3,1,123340 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,EY ,3,1,7780 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,EZ ,3,1,7780 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,GXY ,3,1,5000 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,GYZ ,3,1,3080 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,GXZ ,3,1,5000 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,DENS,3,1,1.518e-09 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,PRXY,3,1,0.27 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,PRYZ,3,1,0.42 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,PRXZ,3,1,0.27 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,ALPX,3,1,-4.5e-07 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,ALPY,3,1,3e-05 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,ALPZ,3,1,3e-05 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,REFT,3,1,20 +FC,3,TEMP,,0 +FC,3,S,XTEN,1632 +FC,3,S,XCMP,-704 +FC,3,S,YTEN,34 +FC,3,S,YCMP,-68 +FC,3,S,ZTEN,34 +FC,3,S,ZCMP,-68 +FC,3,S,XY,80 +FC,3,S,XZ,80 +FC,3,S,YZ,55 +FC,3,S,XYCP,-1 +FC,3,S,YZCP,-1 +FC,3,S,XZCP,-1 +FC,3,TEMP,,0 +FC,3,EPEL,XTEN,0.0143 +FC,3,EPEL,XCMP,-0.006 +FC,3,EPEL,YTEN,0.0026 +FC,3,EPEL,YCMP,-0.0146 +FC,3,EPEL,ZTEN,0.0026 +FC,3,EPEL,ZCMP,-0.0146 +FC,3,EPEL,XY,0.016 +FC,3,EPEL,XZ,0.016 +FC,3,EPEL,YZ,0.012 +acp_material_name_4 = 'Epoxy Carbon Woven (230 GPa) Prepreg' +MP,UVID,4,9b9d3588-a5d7-4942-86af-09534fffd662 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,EX ,4,1,61340 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,EY ,4,1,61340 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,EZ ,4,1,6900 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,GXY ,4,1,3300 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,GYZ ,4,1,2700 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,GXZ ,4,1,2700 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,DENS,4,1,1.42e-09 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,PRXY,4,1,0.04 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,PRYZ,4,1,0.3 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,PRXZ,4,1,0.3 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,ALPX,4,1,2.2e-06 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,ALPY,4,1,2.2e-06 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,ALPZ,4,1,1e-05 +MPTEMP,R5.0,1,1,0 +MPDATA,R5.0,1,REFT,4,1,20 +FC,4,TEMP,,0 +FC,4,S,XTEN,805 +FC,4,S,XCMP,-509 +FC,4,S,YTEN,805 +FC,4,S,YCMP,-509 +FC,4,S,ZTEN,50 +FC,4,S,ZCMP,-170 +FC,4,S,XY,125 +FC,4,S,XZ,65 +FC,4,S,YZ,65 +FC,4,S,XYCP,-1 +FC,4,S,YZCP,-1 +FC,4,S,XZCP,-1 +FC,4,TEMP,,0 +FC,4,EPEL,XTEN,0.0126 +FC,4,EPEL,XCMP,-0.0102 +FC,4,EPEL,YTEN,0.0126 +FC,4,EPEL,YCMP,-0.0102 +FC,4,EPEL,ZTEN,0.008 +FC,4,EPEL,ZCMP,-0.012 +FC,4,EPEL,XY,0.022 +FC,4,EPEL,XZ,0.019 +FC,4,EPEL,YZ,0.019 +SECTYPE, 1,SHELL, , +SECOFFSET,BOT +SECBLOCK, 3 + 0.150000, 2, 45.000000, 3 + 0.100000, 1, 0.000000, 3 + 0.150000, 2, 90.000000, 3 +SECCONTROL, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 1.0000 , 1.0000 , 1.0000 , 1.0000 ,,,, 0.0000 +SECTYPE, 2,SHELL, , +SECOFFSET,MID +SECBLOCK, 1 + 0.200000, 0, 25.000000, 3 +SECCONTROL, 0.0000 , 0.0000 , 0.0000 , 0.0000 , 1.0000 , 1.0000 , 1.0000 , 1.0000 ,,,, 0.0000 +SECTYPE,3,SHELL +SECOFFSET,BOT +SECBLOCK,6 +0.2,3,30,3 +0.2,3,60,3 +0.25,4,0,3 +0.25,4,0,3 +0.2,3,-60,3 +0.2,3,30,3 +EXTOPT,ATTR, 0, 0, 0 +EXTOPT,ESIZE, 0, 0.0000 +EXTOPT,ACLEAR, 0 +TREF, 0.00000000 +IRLF, 0 +BFUNIF,TEMP,_TINY +ACEL, 0.00000000 , 0.00000000 , 0.00000000 +OMEGA, 0.00000000 , 0.00000000 , 0.00000000 +DOMEGA, 0.00000000 , 0.00000000 , 0.00000000 +CGLOC, 0.00000000 , 0.00000000 , 0.00000000 +CGOMEGA, 0.00000000 , 0.00000000 , 0.00000000 +DCGOMG, 0.00000000 , 0.00000000 , 0.00000000 + +KUSE, 0 +TIME, 0.00000000 +ALPHAD, 0.00000000 +BETAD, 0.00000000 +DMPRAT, 0.00000000 +DMPSTR, 0.00000000 + +CRPLIM, 0.100000000 , 0 +CRPLIM, 0.00000000 , 1 +NCNV, 1, 0.00000000 , 0, 0.00000000 , 0.00000000 +NEQIT, 0 + +ERESX,NO +D, 1,UX , 0.00000000 , 0.00000000 +D, 1,UY , 0.00000000 , 0.00000000 +D, 1,UZ , 0.00000000 , 0.00000000 +D, 1,ROTX, 0.00000000 , 0.00000000 +D, 1,ROTY, 0.00000000 , 0.00000000 +D, 1,ROTZ, 0.00000000 , 0.00000000 +D, 4,UX , 0.00000000 , 0.00000000 +D, 4,UY , 0.00000000 , 0.00000000 +D, 4,UZ , 0.00000000 , 0.00000000 +D, 4,ROTX, 0.00000000 , 0.00000000 +D, 4,ROTY, 0.00000000 , 0.00000000 +D, 4,ROTZ, 0.00000000 , 0.00000000 +D, 5,UX , 1.000000000E-02, 0.00000000 +D, 5,UY , 5.000000000E-03, 0.00000000 +/GO +FINISH diff --git a/tests/data/shell_mixed_acp_rst_model/linear_shell_with_MAPDL_sections.h5 b/tests/data/shell_mixed_acp_rst_model/linear_shell_with_MAPDL_sections.h5 new file mode 100644 index 0000000000000000000000000000000000000000..d2a0418cfd0ae81258cf5ea6c34edae6e9c44eb1 GIT binary patch literal 47272 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 literal 0 HcmV?d00001 diff --git a/tests/data/shell_mixed_acp_rst_model/linear_shell_with_MAPDL_sections.rst b/tests/data/shell_mixed_acp_rst_model/linear_shell_with_MAPDL_sections.rst new file mode 100644 index 0000000000000000000000000000000000000000..2f2627f41540b0a887e2cd011c23d5cdfa8f6e7e GIT binary patch literal 327680 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 G5Bv{?cs@=5 literal 0 HcmV?d00001 diff --git a/tests/data/shell_mixed_acp_rst_model/material.engd b/tests/data/shell_mixed_acp_rst_model/material.engd new file mode 100644 index 000000000..30894e87d --- /dev/null +++ b/tests/data/shell_mixed_acp_rst_model/material.engd @@ -0,0 +1,1577 @@ + + + + + + + + + Structural Steel + Fatigue Data at zero mean stress comes from 1998 ASME BPV Code, Section 8, Div 2, Table 5-110.1 + + Alloy + + + - + Color + + 132 + Dependent + Red + + + 139 + Dependent + Green + + + 179 + Dependent + Blue + + + Appearance + + + + - + Compressive Ultimate Strength + + 0 + Dependent + Compressive Ultimate Strength + + + + - + Compressive Yield Strength + + 250000000 + Dependent + Compressive Yield Strength + + + + - + Temperature + Density + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 7850 + Dependent + Density + + + 7.88860905221012e-31 + Independent + Temperature + Temperature + 22 + 31.5 + 10.5 + + + + - + Tensile Yield Strength + + 250000000 + Dependent + Tensile Yield Strength + + + + - + Tensile Ultimate Strength + + 460000000 + Dependent + Tensile Ultimate Strength + + + + - + Secant + Isotropic + Temperature + Isotropic Secant Coefficient of Thermal Expansion + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 1.2e-05 + Dependent + Coefficient of Thermal Expansion + + + 7.88860905221012e-31 + Independent + Temperature + Temperature + 22 + 31.5 + 10.5 + + + + - + Secant + Isotropic + [Isotropic Zero-Thermal-Strain Reference Temperature Secant] + + 22 + Dependent + Zero-Thermal-Strain Reference Temperature + + + Coefficient of Thermal Expansion + + + + - + Constant Pressure + Temperature + Cᵨ + Specific Heat Constant Pressure + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 434 + Dependent + Specific Heat + + + 7.88860905221012e-31 + Independent + Temperature + Temperature + 22 + 31.5 + 10.5 + + + + - + Isotropic + Temperature + Isotropic Thermal Conductivity + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 60.5 + Dependent + Thermal Conductivity + + + 21 + Independent + Temperature + Temperature + 22 + 31.5 + 10.5 + + + + - + Log-Log + Mean Stress + S-N Curve + + 3999000000,2827000000,1896000000,1413000000,1069000000,441000000,262000000,214000000,138000000,114000000,86200000 + Dependent,Dependent,Dependent,Dependent,Dependent,Dependent,Dependent,Dependent,Dependent,Dependent,Dependent + Alternating Stress + + + 10,20,50,100,200,2000,10000,20000,100000,200000,1000000 + Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent + Cycles + + + 0,0,0,0,0,0,0,0,0,0,0 + Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent,Independent + Mean Stress + Mean Stress + 0 + 0.5 + -0.5 + + + + - + Strain-Life + Strain-Life Parameters + + 920000000 + Dependent + Strength Coefficient + + + -0.106 + Dependent + Strength Exponent + + + 0.213 + Dependent + Ductility Coefficient + + + -0.47 + Dependent + Ductility Exponent + + + 1000000000 + Dependent + Cyclic Strength Coefficient + + + 0.2 + Dependent + Cyclic Strain Hardening Exponent + + + + - + Isotropic + Isotropic Resistivity + + 1.7e-07 + Dependent + Resistivity + + + 7.88860905221012e-31 + Independent + Temperature + + + + - + Isotropic + Young's Modulus and Poisson's Ratio + Temperature + Isotropic Elasticity + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 200000000000 + Dependent + Young's Modulus + + + 0.3 + Dependent + Poisson's Ratio + + + 166666666666.667 + Dependent + Bulk Modulus + + + 76923076923.0769 + Dependent + Shear Modulus + + + 7.88860905221012e-31 + Independent + Temperature + Temperature + 22 + 31.5 + 10.5 + + + + - + Isotropic + Isotropic Relative Permeability + + 10000 + Dependent + Relative Permeability + + + + - + 59002a79-71c2-428e-906b-55d7dbee100e + [Material Unique Id] + False + + + - + Temperature:TEMP + Mean Stress: + Field Variable + + + + + + Epoxy Carbon UD (230 GPa) Wet + + - + ACP + Regular + Ply Type + + + - + Temperature + Density + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 1518 + Dependent + Density + + + + - + Orthotropic + Temperature + Orthotropic Elasticity + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 123340000000 + Dependent + Young's Modulus X direction + + + 7780000000 + Dependent + Young's Modulus Y direction + + + 7780000000 + Dependent + Young's Modulus Z direction + + + 0.27 + Dependent + Poisson's Ratio XY + + + 0.42 + Dependent + Poisson's Ratio YZ + + + 0.27 + Dependent + Poisson's Ratio XZ + + + 5000000000 + Dependent + Shear Modulus XY + + + 3080000000 + Dependent + Shear Modulus YZ + + + 5000000000 + Dependent + Shear Modulus XZ + + + + - + Orthotropic + Temperature + Orthotropic Stress Limits + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 1632000000 + Dependent + Tensile X direction + + + 34000000 + Dependent + Tensile Y direction + + + 34000000 + Dependent + Tensile Z direction + + + -704000000 + Dependent + Compressive X direction + + + -68000000 + Dependent + Compressive Y direction + + + -68000000 + Dependent + Compressive Z direction + + + 80000000 + Dependent + Shear XY + + + 55000000 + Dependent + Shear YZ + + + 80000000 + Dependent + Shear XZ + + + + - + Orthotropic + Temperature + Orthotropic Strain Limits + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 0.0143 + Dependent + Tensile X direction + + + 0.0026 + Dependent + Tensile Y direction + + + 0.0026 + Dependent + Tensile Z direction + + + -0.006 + Dependent + Compressive X direction + + + -0.0146 + Dependent + Compressive Y direction + + + -0.0146 + Dependent + Compressive Z direction + + + 0.016 + Dependent + Shear XY + + + 0.012 + Dependent + Shear YZ + + + 0.016 + Dependent + Shear XZ + + + + - + Carbon + Temperature + Puck Constants + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 0.3 + Dependent + Compressive Inclination XZ + + + 0.25 + Dependent + Compressive Inclination YZ + + + 0.35 + Dependent + Tensile Inclination XZ + + + 0.25 + Dependent + Tensile Inclination YZ + + + + - + Additional Puck Constants + + 0.8 + Dependent + Interface Weakening Factor + + + 0.5 + Dependent + Degradation Parameter s + + + 0.5 + Dependent + Degradation Parameter M + + + + - + Secant + Orthotropic + Temperature + Orthotropic Secant Coefficient of Thermal Expansion + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + -4.5e-07 + Dependent + Coefficient of Thermal Expansion X direction + + + 3e-05 + Dependent + Coefficient of Thermal Expansion Y direction + + + 3e-05 + Dependent + Coefficient of Thermal Expansion Z direction + + + + - + Secant + Orthotropic + [Orthotropic Zero-Thermal-Strain Reference Temperature Secant] + + 20 + Dependent + Zero-Thermal-Strain Reference Temperature + + + Coefficient of Thermal Expansion + + + + - + Tsai-Wu Constants + + -1 + Dependent + Coupling Coefficient XY + + + -1 + Dependent + Coupling Coefficient YZ + + + -1 + Dependent + Coupling Coefficient XZ + + + 7.88860905221012e-31 + Independent + Temperature + + + + - + LaRc03/04 Constants + + 0.35 + Dependent + Fracture Toughness Ratio + + + 0.28 + Dependent + Longitudinal Friction Coefficient + + + 0.79 + Dependent + Transverse Friction Coefficient + + + 53 + Dependent + Fracture Angle Under Compression + + + 7.88860905221012e-31 + Independent + Temperature + + + + - + Color + + 181 + Dependent + Red + + + 194 + Dependent + Green + + + 156 + Dependent + Blue + + + Appearance + + + + + + + Epoxy Carbon Woven (230 GPa) Prepreg + + - + ACP + Woven + Ply Type + + + - + Temperature + Density + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 1420 + Dependent + Density + + + + - + Orthotropic + Temperature + Orthotropic Elasticity + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 61340000000 + Dependent + Young's Modulus X direction + + + 61340000000 + Dependent + Young's Modulus Y direction + + + 6900000000 + Dependent + Young's Modulus Z direction + + + 0.04 + Dependent + Poisson's Ratio XY + + + 0.3 + Dependent + Poisson's Ratio YZ + + + 0.3 + Dependent + Poisson's Ratio XZ + + + 3300000000 + Dependent + Shear Modulus XY + + + 2700000000 + Dependent + Shear Modulus YZ + + + 2700000000 + Dependent + Shear Modulus XZ + + + + - + Orthotropic + Temperature + Orthotropic Stress Limits + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 805000000 + Dependent + Tensile X direction + + + 805000000 + Dependent + Tensile Y direction + + + 50000000 + Dependent + Tensile Z direction + + + -509000000 + Dependent + Compressive X direction + + + -509000000 + Dependent + Compressive Y direction + + + -170000000 + Dependent + Compressive Z direction + + + 125000000 + Dependent + Shear XY + + + 65000000 + Dependent + Shear YZ + + + 65000000 + Dependent + Shear XZ + + + + - + Orthotropic + Temperature + Orthotropic Strain Limits + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 0.0126 + Dependent + Tensile X direction + + + 0.0126 + Dependent + Tensile Y direction + + + 0.008 + Dependent + Tensile Z direction + + + -0.0102 + Dependent + Compressive X direction + + + -0.0102 + Dependent + Compressive Y direction + + + -0.012 + Dependent + Compressive Z direction + + + 0.022 + Dependent + Shear XY + + + 0.019 + Dependent + Shear YZ + + + 0.019 + Dependent + Shear XZ + + + + - + Secant + Orthotropic + Temperature + Orthotropic Secant Coefficient of Thermal Expansion + + Interpolation Options + Linear Multivariate + True + True + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + [Interpolation Options] + + + 2.2e-06 + Dependent + Coefficient of Thermal Expansion X direction + + + 2.2e-06 + Dependent + Coefficient of Thermal Expansion Y direction + + + 1e-05 + Dependent + Coefficient of Thermal Expansion Z direction + + + + - + Secant + Orthotropic + [Orthotropic Zero-Thermal-Strain Reference Temperature Secant] + + 20 + Dependent + Zero-Thermal-Strain Reference Temperature + + + Coefficient of Thermal Expansion + + + + - + Tsai-Wu Constants + + -1 + Dependent + Coupling Coefficient XY + + + -1 + Dependent + Coupling Coefficient YZ + + + -1 + Dependent + Coupling Coefficient XZ + + + 7.88860905221012e-31 + Independent + Temperature + + + + - + Color + + 103 + Dependent + Red + + + 192 + Dependent + Green + + + 205 + Dependent + Blue + + + Appearance + + + + + + + Red + + + + Green + + + + Blue + + + + Material Property + + + + Compressive Ultimate Strength + + + Pa + + + + + Compressive Yield Strength + + + Pa + + + + + Density + + + kg + + + m + + + + + Temperature + + + C + + + + + Tensile Yield Strength + + + Pa + + + + + Tensile Ultimate Strength + + + Pa + + + + + Coefficient of Thermal Expansion + + + C + + + + + Zero-Thermal-Strain Reference Temperature + + + C + + + + + Specific Heat + + + J + + + kg + + + C + + + + + Thermal Conductivity + + + W + + + m + + + C + + + + + Alternating Stress + + + Pa + + + + + Cycles + + + + Mean Stress + + + Pa + + + + + Strength Coefficient + + + Pa + + + + + Strength Exponent + + + + Ductility Coefficient + + + + Ductility Exponent + + + + Cyclic Strength Coefficient + + + Pa + + + + + Cyclic Strain Hardening Exponent + + + + Resistivity + + + kg + + + m + + + A + + + s + + + + + Young's Modulus + + + Pa + + + + + Poisson's Ratio + + + + Bulk Modulus + + + Pa + + + + + Shear Modulus + + + Pa + + + + + Relative Permeability + + + + Options Variable + + + + Density + + + kg + + + m + + + + + Young's Modulus X direction + + + Pa + + + + + Young's Modulus Y direction + + + Pa + + + + + Young's Modulus Z direction + + + Pa + + + + + Poisson's Ratio XY + + + + Poisson's Ratio YZ + + + + Poisson's Ratio XZ + + + + Shear Modulus XY + + + Pa + + + + + Shear Modulus YZ + + + Pa + + + + + Shear Modulus XZ + + + Pa + + + + + Tensile X direction + + + Pa + + + + + Tensile Y direction + + + Pa + + + + + Tensile Z direction + + + Pa + + + + + Compressive X direction + + + Pa + + + + + Compressive Y direction + + + Pa + + + + + Compressive Z direction + + + Pa + + + + + Shear XY + + + Pa + + + + + Shear YZ + + + Pa + + + + + Shear XZ + + + Pa + + + + + Compressive Inclination XZ + + + + Compressive Inclination YZ + + + + Tensile Inclination XZ + + + + Tensile Inclination YZ + + + + Interface Weakening Factor + + + + Degradation Parameter s + + + + Degradation Parameter M + + + + Coefficient of Thermal Expansion X direction + + + C + + + + + Coefficient of Thermal Expansion Y direction + + + C + + + + + Coefficient of Thermal Expansion Z direction + + + C + + + + + Coupling Coefficient XY + + + + Coupling Coefficient YZ + + + + Coupling Coefficient XZ + + + + Fracture Toughness Ratio + + + + Longitudinal Friction Coefficient + + + + Transverse Friction Coefficient + + + + Fracture Angle Under Compression + + + + + Color + + + + Compressive Ultimate Strength + + + + Ply Type + + + + Density + + + + Compressive Yield Strength + + + + Elasticity + + + + Stress Limits + + + + Strain Limits + + + + Tensile Yield Strength + + + + Tensile Ultimate Strength + + + + Coefficient of Thermal Expansion + + + + Puck Constants + + + + Additional Puck Constants + + + + Zero-Thermal-Strain Reference Temperature + + + + Tsai-Wu Constants + + + + LaRc03/04 Constants + + + + Specific Heat + + + + Thermal Conductivity + + + + S-N Curve + + + + Strain-Life Parameters + + + + Resistivity + + + + Relative Permeability + + + + Material Unique Id + + + + Field Variable + + + + + + + + Structural Steel + d06590a3-3139-4791-ba8a-1ac5b93812e8 + + + + + Epoxy Carbon UD (230 GPa) Wet + efa0a1cc-823b-419a-9517-f2ab1a99171f + + + + + Epoxy Carbon Woven (230 GPa) Prepreg + 9b9d3588-a5d7-4942-86af-09534fffd662 + + + + + + \ No newline at end of file diff --git a/tests/data/workflow_example/multiple_time_steps/MatML.xml b/tests/data/workflow_example/multiple_time_steps/MatML.xml new file mode 100644 index 000000000..7af008ea0 --- /dev/null +++ b/tests/data/workflow_example/multiple_time_steps/MatML.xml @@ -0,0 +1,1320 @@ + + + + + + + + + Epoxy Carbon Woven (230 GPa) Wet + + Composite + + + - + Temperature + Density + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 1451 + Dependent + Density + + + + - + ACP + Woven + Ply Type + + + - + Orthotropic + Temperature + Orthotropic Elasticity + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 59160000000 + Dependent + Young's Modulus X direction + + + 59160000000 + Dependent + Young's Modulus Y direction + + + 7500000000 + Dependent + Young's Modulus Z direction + + + 0.04 + Dependent + Poisson's Ratio XY + + + 0.3 + Dependent + Poisson's Ratio YZ + + + 0.3 + Dependent + Poisson's Ratio XZ + + + 3300000000 + Dependent + Shear Modulus XY + + + 2700000000 + Dependent + Shear Modulus YZ + + + 2700000000 + Dependent + Shear Modulus XZ + + + + - + Orthotropic + Temperature + Orthotropic Strain Limits + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 0.0092 + Dependent + Tensile X direction + + + 0.0092 + Dependent + Tensile Y direction + + + 0.0078 + Dependent + Tensile Z direction + + + -0.0084 + Dependent + Compressive X direction + + + -0.0084 + Dependent + Compressive Y direction + + + -0.011 + Dependent + Compressive Z direction + + + 0.02 + Dependent + Shear XY + + + 0.015 + Dependent + Shear YZ + + + 0.015 + Dependent + Shear XZ + + + + - + Orthotropic + Temperature + Orthotropic Stress Limits + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 513000000 + Dependent + Tensile X direction + + + 513000000 + Dependent + Tensile Y direction + + + 50000000 + Dependent + Tensile Z direction + + + -437000000 + Dependent + Compressive X direction + + + -437000000 + Dependent + Compressive Y direction + + + -150000000 + Dependent + Compressive Z direction + + + 120000000 + Dependent + Shear XY + + + 55000000 + Dependent + Shear YZ + + + 55000000 + Dependent + Shear XZ + + + + - + Secant + Orthotropic + Temperature + Orthotropic Secant Coefficient of Thermal Expansion + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 2.2e-06 + Dependent + Coefficient of Thermal Expansion X direction + + + 2.2e-06 + Dependent + Coefficient of Thermal Expansion Y direction + + + 1e-05 + Dependent + Coefficient of Thermal Expansion Z direction + + + + - + Secant + Orthotropic + Orthotropic Zero-Thermal-Strain Reference Temperature Secant + + 20 + Dependent + Zero-Thermal-Strain Reference Temperature + + + Coefficient of Thermal Expansion + + + + - + Tsai-Wu Constants + + -1 + Dependent + Coupling Coefficient XY + + + -1 + Dependent + Coupling Coefficient YZ + + + -1 + Dependent + Coupling Coefficient XZ + + + 7.88860905221012e-31 + Independent + Temperature + + + + - + 7ab9c060-4547-4561-aab3-d3fd3c4952ed + Material Unique Id + False + + + - + Color + + 170 + Dependent + Red + + + 170 + Dependent + Green + + + 170 + Dependent + Blue + + + Appearance + + + + - + Isotropic + Temperature + Isotropic Thermal Conductivity + + Interpolation Options + Linear Multivariate + True + True + Projection to the Bounding Box + Interpolation Options + + + 2 + Dependent + Thermal Conductivity + + + 7.88860905221012e-31 + Independent + Temperature + Temperature + 22 + Program Controlled + Program Controlled + C + + + + + + + Honeycomb + + Composite + + + - + Temperature + Density + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 80 + Dependent + Density + + + + - + ACP + Honeycomb Core + Ply Type + + + - + Orthotropic + Temperature + Orthotropic Elasticity + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 1000000 + Dependent + Young's Modulus X direction + + + 1000000 + Dependent + Young's Modulus Y direction + + + 255000000 + Dependent + Young's Modulus Z direction + + + 0.49 + Dependent + Poisson's Ratio XY + + + 0.001 + Dependent + Poisson's Ratio YZ + + + 0.001 + Dependent + Poisson's Ratio XZ + + + 1 + Dependent + Shear Modulus XY + + + 37000000 + Dependent + Shear Modulus YZ + + + 70000000 + Dependent + Shear Modulus XZ + + + + - + Orthotropic + Temperature + Orthotropic Stress Limits + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 0 + Dependent + Tensile X direction + + + 0 + Dependent + Tensile Y direction + + + 5310000 + Dependent + Tensile Z direction + + + 0 + Dependent + Compressive X direction + + + 0 + Dependent + Compressive Y direction + + + -5310000 + Dependent + Compressive Z direction + + + 0 + Dependent + Shear XY + + + 1210000 + Dependent + Shear YZ + + + 2240000 + Dependent + Shear XZ + + + + - + 7c43386c-d57e-4169-bf28-1674ece809c5 + Material Unique Id + False + + + - + Color + + 103 + Dependent + Red + + + 192 + Dependent + Green + + + 205 + Dependent + Blue + + + Appearance + + + + - + Isotropic + Temperature + Isotropic Thermal Conductivity + + Interpolation Options + Linear Multivariate + True + True + Projection to the Bounding Box + Interpolation Options + + + 2 + Dependent + Thermal Conductivity + + + 7.88860905221012e-31 + Independent + Temperature + Temperature + 22 + Program Controlled + Program Controlled + C + + + + + + + Epoxy Carbon UD (230 GPa) Prepreg + + Composite + + + - + Temperature + Density + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 1490 + Dependent + Density + + + + - + ACP + Regular + Ply Type + + + - + Orthotropic + Temperature + Orthotropic Elasticity + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 121000000000 + Dependent + Young's Modulus X direction + + + 8600000000 + Dependent + Young's Modulus Y direction + + + 8600000000 + Dependent + Young's Modulus Z direction + + + 0.27 + Dependent + Poisson's Ratio XY + + + 0.4 + Dependent + Poisson's Ratio YZ + + + 0.27 + Dependent + Poisson's Ratio XZ + + + 4700000000 + Dependent + Shear Modulus XY + + + 3100000000 + Dependent + Shear Modulus YZ + + + 4700000000 + Dependent + Shear Modulus XZ + + + + - + Orthotropic + Temperature + Orthotropic Strain Limits + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 0.0167 + Dependent + Tensile X direction + + + 0.0032 + Dependent + Tensile Y direction + + + 0.0032 + Dependent + Tensile Z direction + + + -0.0108 + Dependent + Compressive X direction + + + -0.0192 + Dependent + Compressive Y direction + + + -0.0192 + Dependent + Compressive Z direction + + + 0.012 + Dependent + Shear XY + + + 0.011 + Dependent + Shear YZ + + + 0.012 + Dependent + Shear XZ + + + + - + Orthotropic + Temperature + Orthotropic Stress Limits + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 2231000000 + Dependent + Tensile X direction + + + 29000000 + Dependent + Tensile Y direction + + + 29000000 + Dependent + Tensile Z direction + + + -1082000000 + Dependent + Compressive X direction + + + -100000000 + Dependent + Compressive Y direction + + + -100000000 + Dependent + Compressive Z direction + + + 60000000 + Dependent + Shear XY + + + 32000000 + Dependent + Shear YZ + + + 60000000 + Dependent + Shear XZ + + + + - + Secant + Orthotropic + Temperature + Orthotropic Secant Coefficient of Thermal Expansion + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + -4.7e-07 + Dependent + Coefficient of Thermal Expansion X direction + + + 3e-05 + Dependent + Coefficient of Thermal Expansion Y direction + + + 3e-05 + Dependent + Coefficient of Thermal Expansion Z direction + + + + - + Secant + Orthotropic + Orthotropic Zero-Thermal-Strain Reference Temperature Secant + + 20 + Dependent + Zero-Thermal-Strain Reference Temperature + + + Coefficient of Thermal Expansion + + + + - + Carbon + Temperature + Puck Constants + + Interpolation Options + Linear Multivariate (Qhull) + True + True + Projection to the Bounding Box + AlgorithmType$$Linear Multivariate (CGAL)$$EngineeringData.CGAL + Interpolation Options + + + 0.3 + Dependent + Compressive Inclination XZ + + + 0.25 + Dependent + Compressive Inclination YZ + + + 0.35 + Dependent + Tensile Inclination XZ + + + 0.25 + Dependent + Tensile Inclination YZ + + + + - + Additional Puck Constants + + 0.8 + Dependent + Interface Weakening Factor + + + 0.5 + Dependent + Degradation Parameter s + + + 0.5 + Dependent + Degradation Parameter M + + + + - + Tsai-Wu Constants + + -1 + Dependent + Coupling Coefficient XY + + + -1 + Dependent + Coupling Coefficient YZ + + + -1 + Dependent + Coupling Coefficient XZ + + + 7.88860905221012e-31 + Independent + Temperature + + + + - + e236c55c-e4b2-423c-8262-2cbd5ec4377b + Material Unique Id + False + + + - + Color + + 222 + Dependent + Red + + + 222 + Dependent + Green + + + 222 + Dependent + Blue + + + Appearance + + + + - + Isotropic + Temperature + Isotropic Thermal Conductivity + + Interpolation Options + Linear Multivariate + True + True + Projection to the Bounding Box + Interpolation Options + + + 2 + Dependent + Thermal Conductivity + + + 7.88860905221012e-31 + Independent + Temperature + Temperature + 22 + Program Controlled + Program Controlled + C + + + + + + + Options Variable + + + + Density + + + kg + + + m + + + + + Young's Modulus X direction + + + Pa + + + + + Young's Modulus Y direction + + + Pa + + + + + Young's Modulus Z direction + + + Pa + + + + + Poisson's Ratio XY + + + + Poisson's Ratio YZ + + + + Poisson's Ratio XZ + + + + Shear Modulus XY + + + Pa + + + + + Shear Modulus YZ + + + Pa + + + + + Shear Modulus XZ + + + Pa + + + + + Tensile X direction + + + + Tensile Y direction + + + + Tensile Z direction + + + + Compressive X direction + + + + Compressive Y direction + + + + Compressive Z direction + + + + Shear XY + + + + Shear YZ + + + + Shear XZ + + + + Tensile X direction + + + Pa + + + + + Tensile Y direction + + + Pa + + + + + Tensile Z direction + + + Pa + + + + + Compressive X direction + + + Pa + + + + + Compressive Y direction + + + Pa + + + + + Compressive Z direction + + + Pa + + + + + Shear XY + + + Pa + + + + + Shear YZ + + + Pa + + + + + Shear XZ + + + Pa + + + + + Coefficient of Thermal Expansion X direction + + + C + + + + + Coefficient of Thermal Expansion Y direction + + + C + + + + + Coefficient of Thermal Expansion Z direction + + + C + + + + + Zero-Thermal-Strain Reference Temperature + + + C + + + + + Coupling Coefficient XY + + + + Coupling Coefficient YZ + + + + Coupling Coefficient XZ + + + + Temperature + + + C + + + + + Red + + + + Green + + + + Blue + + + + Material Property + + + + Thermal Conductivity + + + W + + + m + + + C + + + + + Compressive Inclination XZ + + + + Compressive Inclination YZ + + + + Tensile Inclination XZ + + + + Tensile Inclination YZ + + + + Interface Weakening Factor + + + + Degradation Parameter s + + + + Degradation Parameter M + + + + + Density + + + + Ply Type + + + + Elasticity + + + + Strain Limits + + + + Stress Limits + + + + Coefficient of Thermal Expansion + + + + Material Unique Id + + + + Color + + + + Thermal Conductivity + + + + Zero-Thermal-Strain Reference Temperature + + + + Tsai-Wu Constants + + + + Puck Constants + + + + Additional Puck Constants + + + + + + + + Epoxy Carbon Woven (230 GPa) Wet + 14c6ac6f-4e65-4269-9e3a-335446a83ea5 + + + + + Honeycomb + 21084963-4dd6-484f-abe2-d1fe8fef3da3 + + + + + Epoxy Carbon UD (230 GPa) Prepreg + a1f2e775-77fe-4ad6-a822-54d353e0ea0e + + + + + + \ No newline at end of file diff --git a/tests/data/workflow_example/multiple_time_steps/Setup/ACPCompositeDefinitions.h5 b/tests/data/workflow_example/multiple_time_steps/Setup/ACPCompositeDefinitions.h5 new file mode 100644 index 0000000000000000000000000000000000000000..efc2cb71059488079c910d4aaf461f5c90b27857 GIT binary patch literal 46176 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 a&*v)q$A3P5_~PN2!-d1aM-Q?Y<^3OD2Gel> literal 0 HcmV?d00001 diff --git a/tests/data/workflow_example/multiple_time_steps/file.rst b/tests/data/workflow_example/multiple_time_steps/file.rst new file mode 100644 index 0000000000000000000000000000000000000000..9847237f6caa3b41f789feeb3130b8104e9b0c16 GIT binary patch literal 393216 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 qX`r;wse{r^X{b{_rAg8zr!Gm$q-jn)lLkr) zojNG(l!iL>Q<@}ga_W+_Oq%A@Giji-(5ZvcPHCu9Kh4j;`AO@1zQy_1KL=(1y}A-0 zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0{=(g?(w?rpT2&d=bO*V{<>Y?=jug(009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ;4cL}03L>z AYybcN literal 0 HcmV?d00001 diff --git a/tests/element_info_output_all_element_types_test.py b/tests/element_info_output_all_element_types_test.py index 0c7422a9d..dc9cdf336 100644 --- a/tests/element_info_output_all_element_types_test.py +++ b/tests/element_info_output_all_element_types_test.py @@ -1,6 +1,28 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from collections.abc import Collection from dataclasses import dataclass import pathlib -from typing import Collection, Dict import ansys.dpf.core as dpf from ansys.dpf.core import Field, MeshedRegion, PropertyField @@ -12,6 +34,7 @@ get_selected_indices, get_selected_indices_by_dpf_material_ids, ) +from ansys.dpf.composites.server_helpers import upload_file_to_unique_tmp_folder @dataclass(frozen=True) @@ -72,7 +95,7 @@ def test_all_element_types(dpf_server): def get_expected_output( with_mid: bool, only_top_bot_of_stack: bool - ) -> Dict[int, ExpectedOutput]: + ) -> dict[int, ExpectedOutput]: if with_mid: n_spots_shell = 3 else: @@ -112,7 +135,7 @@ def get_expected_output( def check_output(rst_file, expected_output): rst_path = TEST_DATA_ROOT_DIR / "all_element_types" / rst_file if not dpf_server.local_server: - rst_path = dpf.upload_file_in_tmp_folder(rst_path, server=dpf_server) + rst_path = upload_file_to_unique_tmp_folder(rst_path, server=dpf_server) rst_data_source = dpf.DataSources(rst_path) @@ -189,7 +212,7 @@ def get_layup_info_for_rst(rst_file): rst_path = TEST_DATA_ROOT_DIR / "all_element_types" / rst_file if not dpf_server.local_server: - rst_path = dpf.upload_file_in_tmp_folder(rst_path, server=dpf_server) + rst_path = upload_file_to_unique_tmp_folder(rst_path, server=dpf_server) rst_data_source = dpf.DataSources(rst_path) diff --git a/tests/element_info_test.py b/tests/element_info_test.py new file mode 100644 index 000000000..2406cfafe --- /dev/null +++ b/tests/element_info_test.py @@ -0,0 +1,145 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os +import pathlib + +from ansys.dpf.core import unit_systems +import numpy as np +import pytest + +from ansys.dpf.composites.composite_model import CompositeModel, CompositeScope +from ansys.dpf.composites.data_sources import ( + CompositeDefinitionFiles, + ContinuousFiberCompositesFiles, +) +from ansys.dpf.composites.failure_criteria import CombinedFailureCriterion, MaxStressCriterion +from ansys.dpf.composites.result_definition import FailureMeasureEnum +from ansys.dpf.composites.server_helpers import version_older_than + +SEPARATOR = "::" + + +def test_section_definitions_from_multiple_sources(dpf_server): + """ + This model has sections from the RST, ACP lay-up definition are supported. + + Element 1: lay-up from ACP + Element 2: section from MAPDL / RST + Element 3: section from MAPDL with one layer which has material 0. So + the material ID from the EBLOCK must be used. The test ensures that + the element provider handles this correctly. + """ + if version_older_than(dpf_server, "8.0"): + pytest.xfail("Section data from RST is supported since server version 8.0 (2024 R2).") + + TEST_DATA_ROOT_DIR = pathlib.Path(__file__).parent / "data" / "shell_mixed_acp_rst_model" + + files = ContinuousFiberCompositesFiles( + rst=os.path.join(TEST_DATA_ROOT_DIR, "linear_shell_with_MAPDL_sections.rst"), + composite={ + "shell": CompositeDefinitionFiles( + definition=os.path.join(TEST_DATA_ROOT_DIR, "linear_shell_with_MAPDL_sections.h5"), + mapping=None, + ) + }, + engineering_data=os.path.join(TEST_DATA_ROOT_DIR, "material.engd"), + files_are_local=True, + ) + + composite_model = CompositeModel( + files, server=dpf_server, default_unit_system=unit_systems.solver_nmm + ) + + ud_mat_id = composite_model.material_names["Epoxy Carbon UD (230 GPa) Wet"] + woven_mat_id = composite_model.material_names["Epoxy Carbon Woven (230 GPa) Prepreg"] + element_1 = composite_model.get_element_info(1) + assert element_1.is_layered + assert all( + element_1.dpf_material_ids + == np.array([ud_mat_id, ud_mat_id, woven_mat_id, woven_mat_id, ud_mat_id, ud_mat_id]) + ) + element_2 = composite_model.get_element_info(2) + assert element_2.is_layered + assert all(element_2.dpf_material_ids == np.array([woven_mat_id, ud_mat_id, woven_mat_id])) + element_3 = composite_model.get_element_info(3) + assert element_3.is_layered + assert all(element_3.dpf_material_ids == np.array([ud_mat_id])) + + combined_failure_criterion = CombinedFailureCriterion( + "max stress", failure_criteria=[MaxStressCriterion()] + ) + + for v in FailureMeasureEnum: + failure_output = composite_model.evaluate_failure_criteria( + combined_criterion=combined_failure_criterion, + composite_scope=CompositeScope(), + measure=v, + ) + + +def test_element_info_for_homogeneous_solids_and_beams(dpf_server): + """ + This model has beam elements, layered shells with ACP composite definitions and + homogeneous solids (without sections). + + Element 1 to 8: homogeneous solids + Element 33 - 57: layered shells + Element 58 - 61: beams + """ + if version_older_than(dpf_server, "8.0"): + pytest.xfail("Section data from RST is supported since server version 8.0 (2024 R2).") + + TEST_DATA_ROOT_DIR = pathlib.Path(__file__).parent / "data" / "model_with_beams_shells_solids" + model_name = "model_with_beams_shells_solids" + files = ContinuousFiberCompositesFiles( + rst=os.path.join(TEST_DATA_ROOT_DIR, f"{model_name}.rst"), + composite={ + "shell": CompositeDefinitionFiles( + definition=os.path.join(TEST_DATA_ROOT_DIR, f"{model_name}.h5"), mapping=None + ) + }, + engineering_data=os.path.join(TEST_DATA_ROOT_DIR, f"{model_name}.engd"), + files_are_local=True, + ) + + model = CompositeModel(files, server=dpf_server) + + # homogeneous solid + solid = model.get_element_info(3) + assert solid.is_layered == False + assert all(solid.dpf_material_ids == np.array([1])) + assert solid.n_layers == 1 + assert solid.n_spots == 0 + assert solid.element_type == 185 + + # layered shell + shell = model.get_element_info(34) + assert shell.is_layered + assert all(shell.dpf_material_ids == np.array([4, 4, 2, 4, 4])) + assert shell.n_layers == 5 + assert shell.n_spots == 3 + assert shell.element_type == 181 + + # beam + beam = model.get_element_info(59) + assert beam is None diff --git a/tests/failure_criteria/combined_failure_criterion_test.py b/tests/failure_criteria/combined_failure_criterion_test.py index 8d7ee1ca2..08ed4d663 100644 --- a/tests/failure_criteria/combined_failure_criterion_test.py +++ b/tests/failure_criteria/combined_failure_criterion_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._combined_failure_criterion import ( CombinedFailureCriterion, ) diff --git a/tests/failure_criteria/core_failure_test.py b/tests/failure_criteria/core_failure_test.py index d98df5c40..731735199 100644 --- a/tests/failure_criteria/core_failure_test.py +++ b/tests/failure_criteria/core_failure_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._core_failure import ( ATTRS_CORE_FAILURE, CoreFailureCriterion, diff --git a/tests/failure_criteria/cuntze_test.py b/tests/failure_criteria/cuntze_test.py index 7f3564260..df2b09728 100644 --- a/tests/failure_criteria/cuntze_test.py +++ b/tests/failure_criteria/cuntze_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + import pytest from ansys.dpf.composites.failure_criteria._cuntze import ATTRS_CUNTZE, CuntzeCriterion diff --git a/tests/failure_criteria/face_sheet_wrinkling_test.py b/tests/failure_criteria/face_sheet_wrinkling_test.py index 518b44b08..7b19fdf3f 100644 --- a/tests/failure_criteria/face_sheet_wrinkling_test.py +++ b/tests/failure_criteria/face_sheet_wrinkling_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._face_sheet_wrinkling import ( ATTRS_WRINKLING, FaceSheetWrinklingCriterion, diff --git a/tests/failure_criteria/hashin_test.py b/tests/failure_criteria/hashin_test.py index 55536b537..79f29142e 100644 --- a/tests/failure_criteria/hashin_test.py +++ b/tests/failure_criteria/hashin_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._hashin import ATTRS_HASHIN, HashinCriterion defaults = dict(zip(ATTRS_HASHIN, [True, True, False, 2, 1.0, 1.0, 1])) diff --git a/tests/failure_criteria/hoffman_test.py b/tests/failure_criteria/hoffman_test.py index b1b18c0e4..d4b1e5adc 100644 --- a/tests/failure_criteria/hoffman_test.py +++ b/tests/failure_criteria/hoffman_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._hoffman import HoffmanCriterion defaults = {"wf": 1.0, "dim": 2} diff --git a/tests/failure_criteria/larc_test.py b/tests/failure_criteria/larc_test.py index 14e9fc7b5..7dc13d059 100644 --- a/tests/failure_criteria/larc_test.py +++ b/tests/failure_criteria/larc_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._larc import ATTRS_LARC, LaRCCriterion defaults = dict(zip(ATTRS_LARC, [True, True, True, True, 2, 1.0, 1.0, 1.0, 1.0])) diff --git a/tests/failure_criteria/max_strain_criterion_test.py b/tests/failure_criteria/max_strain_criterion_test.py index cd638e705..8e06c406c 100644 --- a/tests/failure_criteria/max_strain_criterion_test.py +++ b/tests/failure_criteria/max_strain_criterion_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._max_strain import ATTRS_MAX_STRAIN, MaxStrainCriterion defaults = dict( diff --git a/tests/failure_criteria/max_stress_criterion_test.py b/tests/failure_criteria/max_stress_criterion_test.py index 83b8ce1c4..0824583b4 100644 --- a/tests/failure_criteria/max_stress_criterion_test.py +++ b/tests/failure_criteria/max_stress_criterion_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._max_stress import ATTRS_MAX_STRESS, MaxStressCriterion defaults = dict( diff --git a/tests/failure_criteria/puck_test.py b/tests/failure_criteria/puck_test.py index 2ce67d35a..8e93588cc 100644 --- a/tests/failure_criteria/puck_test.py +++ b/tests/failure_criteria/puck_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._puck import ATTRS_PUCK, PuckCriterion defaults = dict( diff --git a/tests/failure_criteria/shear_crimping_test.py b/tests/failure_criteria/shear_crimping_test.py index b7b2918aa..bec0a8902 100644 --- a/tests/failure_criteria/shear_crimping_test.py +++ b/tests/failure_criteria/shear_crimping_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._shear_crimping import ( ATTRS_SHEAR_CRIMPING, ShearCrimpingCriterion, diff --git a/tests/failure_criteria/tsai_hill_test.py b/tests/failure_criteria/tsai_hill_test.py index b0296992b..21f171d8f 100644 --- a/tests/failure_criteria/tsai_hill_test.py +++ b/tests/failure_criteria/tsai_hill_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._tsai_hill import TsaiHillCriterion defaults = {"wf": 1.0, "dim": 2} diff --git a/tests/failure_criteria/tsai_wu_test.py b/tests/failure_criteria/tsai_wu_test.py index df6fdec38..014ec0077 100644 --- a/tests/failure_criteria/tsai_wu_test.py +++ b/tests/failure_criteria/tsai_wu_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._tsai_wu import TsaiWuCriterion defaults = {"wf": 1.0, "dim": 2} diff --git a/tests/failure_criteria/von_mises_test.py b/tests/failure_criteria/von_mises_test.py index 1d875d18e..18574beb9 100644 --- a/tests/failure_criteria/von_mises_test.py +++ b/tests/failure_criteria/von_mises_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria._von_mises import ATTRS_VON_MISES, VonMisesCriterion defaults = dict(zip(ATTRS_VON_MISES, [True, True, 1.0, 1.0, False])) diff --git a/tests/filter_layered_data_test.py b/tests/filter_layered_data_test.py index e67955307..3c621fede 100644 --- a/tests/filter_layered_data_test.py +++ b/tests/filter_layered_data_test.py @@ -1,4 +1,26 @@ -from typing import List, Optional +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from typing import Optional import ansys.dpf.core as dpf from ansys.dpf.core import Field @@ -23,10 +45,10 @@ def get_result_field( element_info_provider: ElementInfoProvider, input_field: Field, - layers: Optional[List[int]] = None, - corner_nodes: Optional[List[int]] = None, - spots: Optional[List[Spot]] = None, - element_ids: Optional[List[int]] = None, + layers: Optional[list[int]] = None, + corner_nodes: Optional[list[int]] = None, + spots: Optional[list[Spot]] = None, + element_ids: Optional[list[int]] = None, dpf_material_id: Optional[np.int64] = None, ): """ @@ -55,8 +77,11 @@ def get_result_field( element_info, layers=layers, nodes=corner_nodes, spots=spots ) - value = strain_data[selected_indices][:, component] - local_result_field.append(value, element_id) + values = strain_data[selected_indices][:, component] + # Conversion to a list is a temporary workaround + # because the append method does currently not work + # reliably for slices of numpy arrays + local_result_field.append(list(values), element_id) else: local_result_field.append(strain_data[selected_indices, component], element_id) return result_field diff --git a/tests/getting_started_test.py b/tests/getting_started_test.py index 543fc3b91..85470af44 100644 --- a/tests/getting_started_test.py +++ b/tests/getting_started_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + import pathlib import ansys.dpf.core as dpf diff --git a/tests/helper.py b/tests/helper.py index 7339dcba1..5bc15cba3 100644 --- a/tests/helper.py +++ b/tests/helper.py @@ -1,8 +1,30 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from dataclasses import dataclass import os import pathlib import time -from typing import List, Union +from typing import Union import ansys.dpf.core as dpf from ansys.dpf.core import DataSources, Field, MeshedRegion, Operator @@ -123,7 +145,7 @@ def get_dummy_data_files(distributed: bool = False): TEST_DATA_ROOT_DIR = pathlib.Path(__file__).parent / "data" / "shell" if distributed: - rst_path: Union[_PATH, List[_PATH]] = [ + rst_path: Union[_PATH, list[_PATH]] = [ os.path.join(TEST_DATA_ROOT_DIR, f"distributed_shell{i}.rst") for i in range(2) ] else: diff --git a/tests/layup_properties_test.py b/tests/layup_properties_test.py index 3511a3715..02633c9f3 100644 --- a/tests/layup_properties_test.py +++ b/tests/layup_properties_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.core import Operator import pytest diff --git a/tests/material_properties_test.py b/tests/material_properties_test.py index aa3b1896e..58204e29f 100644 --- a/tests/material_properties_test.py +++ b/tests/material_properties_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + import ansys.dpf.core as dpf import numpy as np import pytest @@ -7,7 +29,7 @@ AnalysisPlyInfoProvider, get_all_analysis_ply_names, get_analysis_ply_index_to_name_map, - get_dpf_material_id_by_analyis_ply_map, + get_dpf_material_id_by_analysis_ply_map, get_element_info_provider, ) from ansys.dpf.composites.layup_info.material_operators import get_material_operators @@ -26,7 +48,7 @@ def test_get_analysis_ply_material_id_map(dpf_server): files = get_basic_shell_files() setup_result = setup_operators(dpf_server, files) - material_map = get_dpf_material_id_by_analyis_ply_map( + material_map = get_dpf_material_id_by_analysis_ply_map( setup_result.mesh, setup_result.streams_provider ) diff --git a/tests/performance_test.py b/tests/performance_test.py index 5248e1166..bd53b06a6 100644 --- a/tests/performance_test.py +++ b/tests/performance_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + import os import pathlib diff --git a/tests/ply_wise_data_test.py b/tests/ply_wise_data_test.py new file mode 100644 index 000000000..d1469d362 --- /dev/null +++ b/tests/ply_wise_data_test.py @@ -0,0 +1,166 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from collections.abc import Sequence + +from ansys.dpf.gate.common import locations +import numpy as np + +from ansys.dpf.composites.composite_model import CompositeModel +from ansys.dpf.composites.constants import Sym3x3TensorComponent +from ansys.dpf.composites.ply_wise_data import SpotReductionStrategy, get_ply_wise_data +from ansys.dpf.composites.server_helpers import version_equal_or_later + +from .helper import get_basic_shell_files + + +def get_reduced_value(all_spot_values: Sequence[float], reduction_strategy: SpotReductionStrategy): + if reduction_strategy == SpotReductionStrategy.AVG: + return sum(all_spot_values) / len(all_spot_values) + if reduction_strategy == SpotReductionStrategy.MIN: + return min(all_spot_values) + if reduction_strategy == SpotReductionStrategy.MAX: + return max(all_spot_values) + if reduction_strategy == SpotReductionStrategy.BOT: + return all_spot_values[0] + if reduction_strategy == SpotReductionStrategy.MID: + return all_spot_values[2] + if reduction_strategy == SpotReductionStrategy.TOP: + return all_spot_values[1] + raise ValueError(f"Unknown reduction strategy: {reduction_strategy}") + + +ALL_REDUCTION_STRATEGIES = [ + SpotReductionStrategy.AVG, + SpotReductionStrategy.MIN, + SpotReductionStrategy.MAX, + SpotReductionStrategy.BOT, + SpotReductionStrategy.MID, + SpotReductionStrategy.TOP, +] + +ALL_TENSOR_COMPONENTS = [ + Sym3x3TensorComponent.TENSOR11, + Sym3x3TensorComponent.TENSOR22, + Sym3x3TensorComponent.TENSOR22, + Sym3x3TensorComponent.TENSOR21, + Sym3x3TensorComponent.TENSOR31, + Sym3x3TensorComponent.TENSOR32, +] + + +def get_all_spot_values_first_element_first_node(stress_field, component=0): + all_spot_values = [] + entity_data = stress_field.get_entity_data_by_id(1)[:, component] + number_of_nodes = 4 + for spot_index in range(3): + all_spot_values.append(entity_data[spot_index * number_of_nodes]) + return all_spot_values + + +def test_get_ply_wise_data(dpf_server): + if not version_equal_or_later(dpf_server, "8.0"): + return + files = get_basic_shell_files() + + composite_model = CompositeModel(files, server=dpf_server) + + stress_result_op = composite_model.core_model.results.stress() + stress_result_op.inputs.bool_rotate_to_global(False) + stress_field = stress_result_op.outputs.fields_container()[0] + + first_ply = "P1L1__woven_45" + + element_id = 1 + first_node_index = 0 + + for component in ALL_TENSOR_COMPONENTS: + for reduction_strategy in ALL_REDUCTION_STRATEGIES: + all_spot_values = get_all_spot_values_first_element_first_node( + stress_field, component=component.value + ) + + elemental_nodal_data = get_ply_wise_data( + stress_field, + first_ply, + composite_model.get_mesh(), + component=component, + spot_reduction_strategy=reduction_strategy, + ) + + assert len(elemental_nodal_data.scoping.ids) == 4 + assert len(elemental_nodal_data.get_entity_data_by_id(element_id)) == 4 + assert elemental_nodal_data.location == locations.elemental_nodal + + assert np.allclose( + elemental_nodal_data.get_entity_data_by_id(element_id)[first_node_index], + get_reduced_value(all_spot_values, reduction_strategy), + ) + + elemental_data = get_ply_wise_data( + stress_field, + first_ply, + composite_model.get_mesh(), + component=component, + spot_reduction_strategy=reduction_strategy, + requested_location=locations.elemental, + ) + assert len(elemental_data.scoping.ids) == 4 + assert len(elemental_data.get_entity_data_by_id(element_id)) == 1 + assert elemental_data.location == locations.elemental + + assert np.allclose( + elemental_data.get_entity_data_by_id(element_id)[first_node_index], + sum(elemental_nodal_data.get_entity_data_by_id(element_id)) / 4, + ) + + nodal_data = get_ply_wise_data( + stress_field, + first_ply, + composite_model.get_mesh(), + component=component, + spot_reduction_strategy=reduction_strategy, + requested_location=locations.nodal, + ) + assert len(nodal_data.scoping.ids) == 9 + assert len(nodal_data.get_entity_data_by_id(element_id)) == 1 + assert nodal_data.location == locations.nodal + + # Select node that only belongs to element 1 + # no averaging needed + node_index_with_no_neighbours = 1 + first_node_index_of_element_1 = ( + composite_model.get_mesh().elements.connectivities_field.get_entity_data_by_id( + element_id + )[node_index_with_no_neighbours] + ) + node_id_to_index = composite_model.get_mesh().nodes.mapping_id_to_index + node_id = list(node_id_to_index.keys())[ + list(node_id_to_index.values()).index(first_node_index_of_element_1) + ] + + assert np.allclose( + nodal_data.get_entity_data_by_id(node_id)[0], + elemental_nodal_data.get_entity_data_by_id(element_id)[ + node_index_with_no_neighbours + ], + ) diff --git a/tests/result_definition_test.py b/tests/result_definition_test.py index c6072142c..56e988c91 100644 --- a/tests/result_definition_test.py +++ b/tests/result_definition_test.py @@ -1,4 +1,26 @@ -from typing import Any, Dict +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from typing import Any from ansys.dpf.composites.failure_criteria._combined_failure_criterion import ( CombinedFailureCriterion, @@ -12,7 +34,7 @@ ResultDefinitionScope, ) -defaults: Dict[str, Any] = { +defaults: dict[str, Any] = { "expression": "composite_failure", "measure": "inverse_reserve_factor", "stress_strain_eval_mode": "rst_file", diff --git a/tests/rst_only_workflow_test.py b/tests/rst_only_workflow_test.py new file mode 100644 index 000000000..b5056ec30 --- /dev/null +++ b/tests/rst_only_workflow_test.py @@ -0,0 +1,141 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import numpy.testing +import pytest + +from ansys.dpf.composites.composite_model import CompositeModel, CompositeScope +from ansys.dpf.composites.constants import FailureOutput +from ansys.dpf.composites.failure_criteria import ( + CombinedFailureCriterion, + CoreFailureCriterion, + FaceSheetWrinklingCriterion, + HashinCriterion, + MaxStressCriterion, + ShearCrimpingCriterion, +) +from ansys.dpf.composites.layup_info import ( + LayerProperty, + LayupModelContextType, + get_analysis_ply_index_to_name_map, +) +from ansys.dpf.composites.layup_info.material_properties import MaterialProperty +from ansys.dpf.composites.server_helpers import version_equal_or_later, version_older_than + +from .helper import Timer + +SEPARATOR = "::" + + +def test_composite_model_with_rst_only(dpf_server, data_files, distributed_rst): + """Test features of the composite model with section data from the RST file only.""" + if distributed_rst: + # TODO: remove once backend issue #856638 is resolved + pytest.xfail("The mesh property provider operator does not yet support distributed RST.") + + if version_older_than(dpf_server, "8.0"): + pytest.xfail("Section data from RST is supported since server version 8.0 (2024 R2).") + + timer = Timer() + + # remove composite definitions from ContinuousFiberCompositesFiles so that the section + # data is loaded from the RST + data_files.composite = {} + + composite_model = CompositeModel(data_files, server=dpf_server) + assert composite_model.layup_model_type == LayupModelContextType.RST + + timer.add("After Setup model") + + combined_failure_criterion = CombinedFailureCriterion( + "max stress", + failure_criteria=[ + MaxStressCriterion(), + HashinCriterion(hd=True, dim=3), + CoreFailureCriterion(), + FaceSheetWrinklingCriterion(), + ShearCrimpingCriterion(), + ], + ) + + failure_output = composite_model.evaluate_failure_criteria( + combined_criterion=combined_failure_criterion, + composite_scope=CompositeScope(), + ) + irf_field = failure_output.get_field({"failure_label": FailureOutput.FAILURE_VALUE}) + fm_field = failure_output.get_field({"failure_label": FailureOutput.FAILURE_MODE}) + + property_dict = composite_model.get_constant_property_dict([MaterialProperty.Stress_Limits_Xt]) + + timer.add("After get property dict") + + element_infos = [ + composite_model.get_element_info(element_id) + for element_id in composite_model.get_mesh().elements.scoping.ids + ] + get_analysis_ply_index_to_name_map(composite_model.get_mesh()) + + timer.add("After getting element_info") + + expected_values = { + LayerProperty.ANGLES: [45, 0, 0, 0, 0, 45], + LayerProperty.THICKNESSES: [0.00025, 0.0002, 0.0002, 0.005, 0.0002, 0.00025], + } + element_id = 1 + for layer_property, value in expected_values.items(): + numpy.testing.assert_allclose( + composite_model.get_property_for_all_layers(layer_property, element_id), value + ) + + # shear angles, analysis plies and offset are not available in the RST file + assert ( + composite_model.get_property_for_all_layers(LayerProperty.SHEAR_ANGLES, element_id) is None + ) + assert composite_model.get_element_laminate_offset(element_id) is None + assert composite_model.get_analysis_plies(element_id) is None + + assert composite_model.core_model is not None + assert composite_model.get_mesh() is not None + assert composite_model.data_sources is not None + sampling_point = composite_model.get_sampling_point( + combined_criterion=combined_failure_criterion, element_id=1 + ) + + assert [ply["thickness"] for ply in sampling_point.analysis_plies] == expected_values[ + LayerProperty.THICKNESSES + ] + + if version_equal_or_later(dpf_server, "7.1"): + ref_material_names = [ + "Epoxy Carbon UD (230 GPa) Prepreg", + "Epoxy Carbon Woven (230 GPa) Wet", + "Honeycomb", + "Structural Steel", + ] + mat_names = composite_model.material_names + assert len(mat_names) == len(ref_material_names) + for mat_name in ref_material_names: + assert mat_name in mat_names.keys() + + timer.add("After getting properties") + + timer.summary() diff --git a/tests/sampling_point_test.py b/tests/sampling_point_test.py index 7d24806c9..874496c89 100644 --- a/tests/sampling_point_test.py +++ b/tests/sampling_point_test.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + import os import pathlib diff --git a/tests/test_data_sources.py b/tests/test_data_sources.py index 1cdaa860f..8757ac085 100644 --- a/tests/test_data_sources.py +++ b/tests/test_data_sources.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + import pathlib from ansys.dpf.composites.data_sources import ( @@ -57,3 +79,7 @@ def test_get_files_from_result_folder_harmonic(dpf_server): assert files.rst == [WORKFLOW_EXAMPLE_ROOT_HARMONIC / "file.rst"] assert files.engineering_data == WORKFLOW_EXAMPLE_ROOT_HARMONIC / "MatML.xml" + + # ensure that the setter of RST converts the input into a list + files.rst = WORKFLOW_EXAMPLE_ROOT_HARMONIC / "file.rst" + assert files.rst == [WORKFLOW_EXAMPLE_ROOT_HARMONIC / "file.rst"] diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 7e951b725..e225d0d41 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites import __version__ diff --git a/tests/utils.py b/tests/utils.py index 159be716f..1376d7dfb 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,3 +1,25 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from ansys.dpf.composites.failure_criteria import ( CombinedFailureCriterion, CoreFailureCriterion, diff --git a/tox.ini b/tox.ini index 89d98c0c3..dbcafdf0b 100644 --- a/tox.ini +++ b/tox.ini @@ -1,25 +1,25 @@ [tox] description = Default tox environments list envlist = - style,{py3.8,py3.9,py3.10,py3.11}{,-coverage},doc-{windows,linux} + style,{py3.9,py3.10,py3.11,py3.12}{,-coverage},doc-{windows,linux} skip_missing_interpreters = false isolated_build = true [gh-actions] description = The tox environment to be executed in gh-actions for a given python version python = - 3.8: py3.8-coverage 3.9: py3.9-coverage 3.10: py3.10-coverage 3.11: py3.11-coverage + 3.12: py3.12-coverage [testenv] description = Checks for project unit tests and coverage (if desired) basepython = - py3.8: python3.8 py3.9: python3.9 py3.10: python3.10 py3.11: python3.11 + py3.12: python3.12 py: python3{style,reformat,doc}: python3 skip_install = true allowlist_externals = @@ -31,21 +31,27 @@ setenv = PYTEST_COV_APPEND_ARG = --cov-append commands = poetry install -E test - poetry run pytest --reruns 1 --license-server={env:LICENSE_SERVER:} --image-tag=latest {env:PYTEST_MARKERS:} {env:PYTEST_EXTRA_ARGS:} {posargs:-vv} + poetry run pytest --reruns 1 --license-server={env:LICENSE_SERVER:} --image-tag=latest {env:PYTEST_MARKERS:} {env:PYTEST_EXTRA_ARGS:} {env:PYTEST_COV_APPEND_ARG:} {posargs:-vv} + poetry run pytest --reruns 1 --license-server={env:LICENSE_SERVER:} --image-tag=2024r2_pre0 {env:PYTEST_MARKERS:} {env:PYTEST_EXTRA_ARGS:} {env:PYTEST_COV_APPEND_ARG:} {posargs:-vv} + poetry run pytest --reruns 1 --license-server={env:LICENSE_SERVER:} --image-tag=2024r1 {env:PYTEST_MARKERS:} {env:PYTEST_EXTRA_ARGS:} {env:PYTEST_COV_APPEND_ARG:} {posargs:-vv} + poetry run pytest --reruns 1 --license-server={env:LICENSE_SERVER:} --image-tag=2024r1_pre0 {env:PYTEST_MARKERS:} {env:PYTEST_EXTRA_ARGS:} {env:PYTEST_COV_APPEND_ARG:} {posargs:-vv} poetry run pytest --reruns 1 --license-server={env:LICENSE_SERVER:} --image-tag=2023r2_pre1 {env:PYTEST_MARKERS:} {env:PYTEST_EXTRA_ARGS:} {env:PYTEST_COV_APPEND_ARG:} {posargs:-vv} [testenv:test-minimal] description = Checks for project unit tests with minimal package versions basepython = - python3.8 + python3.9 skip_install = true allowlist_externals = poetry setenv = PYTHONUNBUFFERED = yes +; uninstalling ansys-dpf-core explicitly is needed because downgrading to 0.8.0 +; directly fails, see https://github.com/ansys/pydpf-core/issues/1306 commands = poetry install -E test - poetry run python -m pip install -r minimum_requirements.txt + poetry run python -m pip uninstall -y ansys-dpf-core + poetry run python -m pip install -r .ci/minimum_requirements.txt poetry run pytest --reruns 1 --license-server={env:LICENSE_SERVER:} {env:PYTEST_MARKERS:} {posargs:-vv} [testenv:style]