├── .flake8 ├── .github └── workflows │ ├── publish.yml │ └── tests.yml ├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── images └── demo.gif ├── mypy.ini ├── poetry.lock ├── poetry.toml ├── pyproject.toml ├── streamlit_sync ├── __init__.py ├── exceptions.py ├── rooms.py ├── st_hack.py ├── synced_state.py ├── ui.py └── utils.py ├── streamlit_sync_tests ├── __init__.py ├── test_st_hack.py └── test_utils.py └── toy_example.py /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | exclude = 3 | .git, 4 | __pycache__, 5 | .venv 6 | ignore=E203, W503, G200 # incompatible with black 7 | per-file-ignores = 8 | streamlit_sync/__init__.py:F401 9 | streamlit_sync/st_hack.py:F401 10 | max-line-length = 88 -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | # Taken from https://github.com/whitphx/streamlit-server-state/blob/main/.github/workflows/publish.yml 2 | name: Upload Python Package 3 | 4 | on: 5 | release: 6 | types: [published] 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v2.4.0 14 | 15 | - name: Set up Python 16 | uses: actions/setup-python@v2.3.1 17 | with: 18 | python-version: "3.10" 19 | 20 | - name: Install Poetry 21 | uses: snok/install-poetry@v1 22 | 23 | - name: Install Python dependencies 24 | run: poetry install 25 | 26 | - name: Build and publish 27 | env: 28 | PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} 29 | run: | 30 | poetry publish --build -u __token__ -p ${PYPI_TOKEN} 31 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | # Taken from https://github.com/whitphx/streamlit-server-state/blob/main/.github/workflows/tests.yml 2 | name: Tests 3 | 4 | on: 5 | push: 6 | branches: [main] 7 | pull_request: 8 | branches: [main] 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | strategy: 14 | matrix: 15 | python-version: [3.7, 3.8, 3.9] 16 | streamlit-version: [null] 17 | include: 18 | - python-version: 3.9 19 | streamlit-version: 1.0.0 20 | - python-version: 3.9 21 | streamlit-version: 1.7.0 22 | - python-version: 3.9 23 | streamlit-version: 1.8.0 24 | 25 | steps: 26 | - uses: actions/checkout@v2 27 | 28 | - name: Set up Python ${{ matrix.python-version }} 29 | uses: actions/setup-python@v2 30 | with: 31 | python-version: ${{ matrix.python-version }} 32 | 33 | - name: Install Poetry 34 | uses: snok/install-poetry@v1 35 | 36 | # Ref: https://github.com/python-poetry/poetry/blob/de0b32c245c72568cf546090600d4626917cd3a4/.github/workflows/main.yml#L46-L60 37 | - name: Configure poetry 38 | run: poetry config virtualenvs.in-project true 39 | - name: Set up cache 40 | uses: actions/cache@v2.1.7 41 | id: cache 42 | with: 43 | path: .venv 44 | key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} 45 | - name: Ensure cache is healthy 46 | if: steps.cache.outputs.cache-hit == 'true' 47 | shell: bash 48 | run: timeout 10s poetry run pip --version || rm -rf .venv 49 | 50 | - name: Install a specific version of Streamlit 51 | if: ${{ matrix.streamlit-version }} 52 | run: poetry add -D streamlit=="${STREAMLIT_VERSION}" 53 | env: 54 | STREAMLIT_VERSION: ${{ matrix.streamlit-version }} 55 | 56 | - name: Install dependencies 57 | run: poetry install 58 | 59 | - name: Lint with black, isort, and flake8 60 | run: | 61 | poetry run black . --check 62 | poetry run isort . --check 63 | poetry run flake8 64 | 65 | # Mypy checks currently not working on all versions of streamlit 66 | # - name: Type checking with mypy 67 | # run: | 68 | # poetry run mypy streamlit_sync 69 | 70 | - name: Test with pytest 71 | run: | 72 | poetry run pytest streamlit_sync_tests 73 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .venv 106 | env/ 107 | venv/ 108 | ENV/ 109 | env.bak/ 110 | venv.bak/ 111 | 112 | # Spyder project settings 113 | .spyderproject 114 | .spyproject 115 | 116 | # Rope project settings 117 | .ropeproject 118 | 119 | # mkdocs documentation 120 | /site 121 | 122 | # mypy 123 | .mypy_cache/ 124 | .dmypy.json 125 | dmypy.json 126 | 127 | # Pyre type checker 128 | .pyre/ 129 | 130 | 131 | # Created by https://www.toptal.com/developers/gitignore/api/macos 132 | # Edit at https://www.toptal.com/developers/gitignore?templates=macos 133 | 134 | ### macOS ### 135 | # General 136 | .DS_Store 137 | .AppleDouble 138 | .LSOverride 139 | 140 | # Icon must end with two \r 141 | Icon 142 | 143 | 144 | # Thumbnails 145 | ._* 146 | 147 | # Files that might appear in the root of a volume 148 | .DocumentRevisions-V100 149 | .fseventsd 150 | .Spotlight-V100 151 | .TemporaryItems 152 | .Trashes 153 | .VolumeIcon.icns 154 | .com.apple.timemachine.donotpresent 155 | 156 | # Directories potentially created on remote AFP share 157 | .AppleDB 158 | .AppleDesktop 159 | Network Trash Folder 160 | Temporary Items 161 | .apdisk 162 | 163 | # End of https://www.toptal.com/developers/gitignore/api/macos 164 | 165 | 166 | # Cache dir 167 | .st_sync_cache -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "editor.rulers": [ 4 | 88 5 | ], 6 | "python.formatting.provider": "black", 7 | "python.linting.enabled": true, 8 | "python.linting.flake8Enabled": true, 9 | "python.linting.mypyEnabled": true, 10 | "python.linting.pylintEnabled": false, 11 | "python.pythonPath": ".venv/bin/python", 12 | "[python]": { 13 | "editor.codeActionsOnSave": { 14 | "source.organizeImports": true 15 | } 16 | }, 17 | "python.testing.unittestEnabled": false, 18 | "python.testing.nosetestsEnabled": false, 19 | "python.testing.pytestEnabled": true, 20 | "cSpell.words": [ 21 | "streamlit" 22 | ], 23 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2022 Wauplin 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 14 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 15 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 16 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 17 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 18 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 19 | OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # streamlit-sync 2 | 3 | A library to easily synchronize sessions between themselves or on local drive for later reuse. 4 | 5 | [![tests](https://github.com/Wauplin/streamlit-sync/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/Wauplin/streamlit-sync/actions/workflows/tests.yml?query=branch%3Amain) 6 | [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) 7 | 8 | [![PyPI](https://img.shields.io/pypi/v/streamlit-sync)](https://pypi.org/project/streamlit-sync/) 9 | [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/streamlit-sync)](https://pypi.org/project/streamlit-sync/) 10 | [![PyPI - License](https://img.shields.io/pypi/l/streamlit-sync)](https://pypi.org/project/streamlit-sync/) 11 | 12 | 13 | Link to [initial topic](https://discuss.streamlit.io/t/new-library-streamlit-sync-another-way-to-sync-states-across-sessions/23763) on Streamlit forum. 14 | 15 | ```py 16 | import streamlit as st 17 | 18 | import streamlit_sync 19 | 20 | CACHE_DIR = "./.st_sync_cache" 21 | 22 | room_name = streamlit_sync.select_room_widget(CACHE_DIR) 23 | 24 | with streamlit_sync.sync(room_name, cache_dir=CACHE_DIR): 25 | y = st.slider("Select a value") 26 | st.write(y, "squared is", y * y) 27 | ``` 28 | 29 | A more complete example app can be found in [./toy_example.py](./toy_example.py). [![Open in Streamlit](https://static.streamlit.io/badges/streamlit_badge_black_white.svg)](https://share.streamlit.io/wauplin/streamlit-sync/main/toy_example.py) 30 | 31 | ![](images/demo.gif) 32 | 33 | # Why ? 34 | 35 | The initial goal was to be able to share a dashboard on which anyone can interact. Each user sees the effects of other users on their dashboard. 36 | 37 | Potential use cases are: 38 | - It can be a way to "save" locally a streamlit session. Caching is done using [DiskCache library](https://grantjenks.com/docs/diskcache/). 39 | - In a meeting/presentation, it can be a solution to avoid having 1 user sharing its screen to others and making all the manipulations. 40 | - Small games or chats can be implemented this way. 41 | - etc. 42 | 43 | # Install 44 | 45 | ``` 46 | pip install streamlit-sync 47 | ``` 48 | 49 | # Disclaimers 50 | 51 | ## Use it at your own risk 52 | 53 | - `streamlit-sync` is using internal APIs of Streamlit that are not meant to be public. It is not guaranteed that it will work on future versions. All calls to internal APIs are grouped in [./streamlit_sync/st_hack.py](./streamlit_sync/st_hack.py). 54 | - `streamlit-sync` is not designed to be particularly efficient. A synced version of your dashboard is an even better incentive to use streamlit caching. 55 | - Robustness of this library is not guaranteed when used with a lot of concurrent sessions. 56 | - `streamlit-sync` is not well covered by tests. It would require to have end-to-end tests with several sessions but that's not done. 57 | 58 | ## Related work 59 | 60 | ([streamlit-server-state](https://github.com/whitphx/streamlit-server-state)) is another library doing a similar job. It is used to have server-side state. The idea of `streamlit-sync` is to sync the widgets as well. 61 | 62 | # Features 63 | 64 | ## Thread-safety 65 | 66 | Each room uses its own lock (from python `threading` lib). Only 1 session per room can read/write the values of the room at a time. I don't know how this would impact the usability if a large amount of sessions are connected to the same room. 67 | 68 | Each room keeps in memory the latest snapshot of values with a timestamp. A session can only update a value if it already had the latest data. This means if 2 different sessions make an action on the dashboard at the same time, 1 action will most likely be lost. 69 | 70 | ## Persistence 71 | 72 | Sessions can be persisted on disk. To do so, use the optional `cache_dir` argument. By default, sessions are synced only in memory. 73 | 74 | ```py 75 | import streamlit as st 76 | 77 | import streamlit_sync 78 | 79 | with streamlit_sync.sync("room", cache_dir=".st_sync_cache"): 80 | app() 81 | ``` 82 | 83 | Persistence uses [DiskCache library](https://grantjenks.com/docs/diskcache/), a mature pure-Python library. Any pickle-able data can be persisted. 84 | 85 | 86 | ## How to handle rooms ? 87 | 88 | In order to sync data, you need to enter a room. The easiest way of doing it is to use the same room for every session. 89 | 90 | ```py 91 | import streamlit as st 92 | 93 | import streamlit_sync 94 | 95 | with streamlit_sync.sync("default_room"): 96 | app() 97 | ``` 98 | 99 | ### Select room from the UI 100 | 101 | #### With the default UI 102 | 103 | An alternative is to select the room to enter directly from the UI using the `streamlit_sync.select_room_widget()` method. It will create a simple form on the sidebar in which you can choose an existing room from the list or create a new one. Once in a room, you can exit from it. Values of the room are still kept on the server but removed from the session. 104 | 105 | ```py 106 | import streamlit as st 107 | 108 | import streamlit_sync 109 | 110 | room_name = streamlit_sync.select_room_widget() 111 | 112 | with streamlit_sync.sync(room_name): 113 | app() 114 | ``` 115 | 116 | **Note:** the number of active sessions per room is indicative must not always exact. If a session closes, the server will notice it only when another session with trigger a sync in this room. 117 | 118 | #### Build your own UI 119 | 120 | Instead of using the default UI with `select_room_widget`, you can build your own using `streamlit_sync.rooms.enter_room(room_name)` and `streamlit_sync.rooms.exit_room()`. 121 | 122 | ## How to sync only specific widgets/values ? 123 | 124 | By default, all widgets and values are synced. It is possible to restrain some widget as "private" by defining its own not-synced key: 125 | 126 | ```py 127 | x = st.slider("Select a value", key=streamlit_sync.get_not_synced_key("key")) 128 | ``` 129 | 130 | The same is also possible for state values: 131 | ```py 132 | synced_key = "my_custom_key" 133 | username = streamlit_sync.get_not_synced_key("username") 134 | 135 | st.session_state[synced_key] = 42 # All sessions will be synced with this value 136 | st.session_state[username] = "Adrien Treuille" # Each session can store its own username 137 | ``` 138 | 139 | ## Action widgets 140 | 141 | Some widgets are processed a bit differently by streamlit-sync, in particular buttons and form. 142 | 143 | ### Buttons 144 | 145 | To avoid duplicate actions, buttons are never synced with the room. In order to sync a button, you will need to set a state value. 146 | 147 | 148 | In this example, balloons with be send only on the session that clicked the button. 149 | ```py 150 | # Action is not shared ! 151 | if st.button(label="Send balloons"): 152 | st.balloons() 153 | ``` 154 | 155 | Here is an example that syncs the result of the action. 156 | ```py 157 | # Nb of clicks is synced, not the action. ! 158 | if st.session_state.get("NB_CLICKS") is None: 159 | st.session_state["NB_CLICKS"] = 0 160 | 161 | if st.button(label="click"): 162 | st.session_state["NB_CLICKS"] += 1 163 | 164 | st.write("Clicked **" + str(st.session_state["NB_CLICKS"]) + "** times !") 165 | ``` 166 | 167 | ### Forms 168 | 169 | Form data is synced only when the submit button is clicked, which is the intended use of forms. Same as for the buttons, the "submit action" is not synced, only the data. 170 | 171 | **Note: there is currently a bug in how the forms are synced. The fields are cleared only in the session that submitted the data.** 172 | # Future improvements 173 | 174 | - Test the library and especially the UI. At the moment, the sync between 2 sessions is only manually tested. 175 | - Make an option to sync/not sync values by default. At the moment, all values are synced by default except if explicitly mentioned as "not synced". If would be good to be able to optionally set all values as private except if explicitly synced. 176 | - Have a read-write/read-only mechanism with which some "admin" sessions could interacts with the widgets and some "normal users" could just see the current dashboard. 177 | - Any other ideas are welcome :) 178 | -------------------------------------------------------------------------------- /images/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wauplin/streamlit-sync/71fac318795e10eb70a24768efe0bc4dc705f745/images/demo.gif -------------------------------------------------------------------------------- /mypy.ini: -------------------------------------------------------------------------------- 1 | [mypy] 2 | exclude = .venv 3 | disallow_untyped_defs=True 4 | ignore_missing_imports=True 5 | python_version = 3.8 6 | warn_unused_configs = True -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "altair" 3 | version = "4.2.0" 4 | description = "Altair: A declarative statistical visualization library for Python." 5 | category = "main" 6 | optional = false 7 | python-versions = ">=3.7" 8 | 9 | [package.dependencies] 10 | entrypoints = "*" 11 | jinja2 = "*" 12 | jsonschema = ">=3.0" 13 | numpy = "*" 14 | pandas = ">=0.18" 15 | toolz = "*" 16 | 17 | [package.extras] 18 | dev = ["black", "docutils", "ipython", "flake8", "pytest", "sphinx", "mistune (<2.0.0)", "m2r", "vega-datasets", "recommonmark"] 19 | 20 | [[package]] 21 | name = "appnope" 22 | version = "0.1.2" 23 | description = "Disable App Nap on macOS >= 10.9" 24 | category = "main" 25 | optional = false 26 | python-versions = "*" 27 | 28 | [[package]] 29 | name = "argon2-cffi" 30 | version = "21.3.0" 31 | description = "The secure Argon2 password hashing algorithm." 32 | category = "main" 33 | optional = false 34 | python-versions = ">=3.6" 35 | 36 | [package.dependencies] 37 | argon2-cffi-bindings = "*" 38 | typing-extensions = {version = "*", markers = "python_version < \"3.8\""} 39 | 40 | [package.extras] 41 | dev = ["pre-commit", "cogapp", "tomli", "coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "sphinx-notfound-page", "furo"] 42 | docs = ["sphinx", "sphinx-notfound-page", "furo"] 43 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] 44 | 45 | [[package]] 46 | name = "argon2-cffi-bindings" 47 | version = "21.2.0" 48 | description = "Low-level CFFI bindings for Argon2" 49 | category = "main" 50 | optional = false 51 | python-versions = ">=3.6" 52 | 53 | [package.dependencies] 54 | cffi = ">=1.0.1" 55 | 56 | [package.extras] 57 | dev = ["pytest", "cogapp", "pre-commit", "wheel"] 58 | tests = ["pytest"] 59 | 60 | [[package]] 61 | name = "atomicwrites" 62 | version = "1.4.0" 63 | description = "Atomic file writes." 64 | category = "dev" 65 | optional = false 66 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 67 | 68 | [[package]] 69 | name = "attrs" 70 | version = "21.4.0" 71 | description = "Classes Without Boilerplate" 72 | category = "main" 73 | optional = false 74 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 75 | 76 | [package.extras] 77 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] 78 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] 79 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] 80 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] 81 | 82 | [[package]] 83 | name = "backcall" 84 | version = "0.2.0" 85 | description = "Specifications for callback functions passed in to an API" 86 | category = "main" 87 | optional = false 88 | python-versions = "*" 89 | 90 | [[package]] 91 | name = "backports.zoneinfo" 92 | version = "0.2.1" 93 | description = "Backport of the standard library zoneinfo module" 94 | category = "main" 95 | optional = false 96 | python-versions = ">=3.6" 97 | 98 | [package.extras] 99 | tzdata = ["tzdata"] 100 | 101 | [[package]] 102 | name = "beautifulsoup4" 103 | version = "4.10.0" 104 | description = "Screen-scraping library" 105 | category = "main" 106 | optional = false 107 | python-versions = ">3.0.0" 108 | 109 | [package.dependencies] 110 | soupsieve = ">1.2" 111 | 112 | [package.extras] 113 | html5lib = ["html5lib"] 114 | lxml = ["lxml"] 115 | 116 | [[package]] 117 | name = "black" 118 | version = "21.12b0" 119 | description = "The uncompromising code formatter." 120 | category = "dev" 121 | optional = false 122 | python-versions = ">=3.6.2" 123 | 124 | [package.dependencies] 125 | click = ">=7.1.2" 126 | mypy-extensions = ">=0.4.3" 127 | pathspec = ">=0.9.0,<1" 128 | platformdirs = ">=2" 129 | tomli = ">=0.2.6,<2.0.0" 130 | typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} 131 | typing-extensions = [ 132 | {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, 133 | {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, 134 | ] 135 | 136 | [package.extras] 137 | colorama = ["colorama (>=0.4.3)"] 138 | d = ["aiohttp (>=3.7.4)"] 139 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 140 | python2 = ["typed-ast (>=1.4.3)"] 141 | uvloop = ["uvloop (>=0.15.2)"] 142 | 143 | [[package]] 144 | name = "bleach" 145 | version = "4.1.0" 146 | description = "An easy safelist-based HTML-sanitizing tool." 147 | category = "main" 148 | optional = false 149 | python-versions = ">=3.6" 150 | 151 | [package.dependencies] 152 | packaging = "*" 153 | six = ">=1.9.0" 154 | webencodings = "*" 155 | 156 | [[package]] 157 | name = "blinker" 158 | version = "1.4" 159 | description = "Fast, simple object-to-object and broadcast signaling" 160 | category = "main" 161 | optional = false 162 | python-versions = "*" 163 | 164 | [[package]] 165 | name = "cachetools" 166 | version = "5.0.0" 167 | description = "Extensible memoizing collections and decorators" 168 | category = "main" 169 | optional = false 170 | python-versions = "~=3.7" 171 | 172 | [[package]] 173 | name = "certifi" 174 | version = "2021.10.8" 175 | description = "Python package for providing Mozilla's CA Bundle." 176 | category = "main" 177 | optional = false 178 | python-versions = "*" 179 | 180 | [[package]] 181 | name = "cffi" 182 | version = "1.15.0" 183 | description = "Foreign Function Interface for Python calling C code." 184 | category = "main" 185 | optional = false 186 | python-versions = "*" 187 | 188 | [package.dependencies] 189 | pycparser = "*" 190 | 191 | [[package]] 192 | name = "charset-normalizer" 193 | version = "2.0.12" 194 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 195 | category = "main" 196 | optional = false 197 | python-versions = ">=3.5.0" 198 | 199 | [package.extras] 200 | unicode_backport = ["unicodedata2"] 201 | 202 | [[package]] 203 | name = "click" 204 | version = "8.0.4" 205 | description = "Composable command line interface toolkit" 206 | category = "main" 207 | optional = false 208 | python-versions = ">=3.6" 209 | 210 | [package.dependencies] 211 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 212 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 213 | 214 | [[package]] 215 | name = "colorama" 216 | version = "0.4.4" 217 | description = "Cross-platform colored terminal text." 218 | category = "main" 219 | optional = false 220 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 221 | 222 | [[package]] 223 | name = "debugpy" 224 | version = "1.6.0" 225 | description = "An implementation of the Debug Adapter Protocol for Python" 226 | category = "main" 227 | optional = false 228 | python-versions = ">=3.7" 229 | 230 | [[package]] 231 | name = "decorator" 232 | version = "5.1.1" 233 | description = "Decorators for Humans" 234 | category = "main" 235 | optional = false 236 | python-versions = ">=3.5" 237 | 238 | [[package]] 239 | name = "defusedxml" 240 | version = "0.7.1" 241 | description = "XML bomb protection for Python stdlib modules" 242 | category = "main" 243 | optional = false 244 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 245 | 246 | [[package]] 247 | name = "diskcache" 248 | version = "5.4.0" 249 | description = "Disk Cache -- Disk and file backed persistent cache." 250 | category = "main" 251 | optional = false 252 | python-versions = ">=3" 253 | 254 | [[package]] 255 | name = "entrypoints" 256 | version = "0.4" 257 | description = "Discover and load entry points from installed packages." 258 | category = "main" 259 | optional = false 260 | python-versions = ">=3.6" 261 | 262 | [[package]] 263 | name = "flake8" 264 | version = "4.0.1" 265 | description = "the modular source code checker: pep8 pyflakes and co" 266 | category = "dev" 267 | optional = false 268 | python-versions = ">=3.6" 269 | 270 | [package.dependencies] 271 | importlib-metadata = {version = "<4.3", markers = "python_version < \"3.8\""} 272 | mccabe = ">=0.6.0,<0.7.0" 273 | pycodestyle = ">=2.8.0,<2.9.0" 274 | pyflakes = ">=2.4.0,<2.5.0" 275 | 276 | [[package]] 277 | name = "flake8-bugbear" 278 | version = "22.3.23" 279 | description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." 280 | category = "dev" 281 | optional = false 282 | python-versions = ">=3.6" 283 | 284 | [package.dependencies] 285 | attrs = ">=19.2.0" 286 | flake8 = ">=3.0.0" 287 | 288 | [package.extras] 289 | dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit"] 290 | 291 | [[package]] 292 | name = "gitdb" 293 | version = "4.0.9" 294 | description = "Git Object Database" 295 | category = "main" 296 | optional = false 297 | python-versions = ">=3.6" 298 | 299 | [package.dependencies] 300 | smmap = ">=3.0.1,<6" 301 | 302 | [[package]] 303 | name = "gitpython" 304 | version = "3.1.27" 305 | description = "GitPython is a python library used to interact with Git repositories" 306 | category = "main" 307 | optional = false 308 | python-versions = ">=3.7" 309 | 310 | [package.dependencies] 311 | gitdb = ">=4.0.1,<5" 312 | typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""} 313 | 314 | [[package]] 315 | name = "idna" 316 | version = "3.3" 317 | description = "Internationalized Domain Names in Applications (IDNA)" 318 | category = "main" 319 | optional = false 320 | python-versions = ">=3.5" 321 | 322 | [[package]] 323 | name = "importlib-metadata" 324 | version = "4.2.0" 325 | description = "Read metadata from Python packages" 326 | category = "main" 327 | optional = false 328 | python-versions = ">=3.6" 329 | 330 | [package.dependencies] 331 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} 332 | zipp = ">=0.5" 333 | 334 | [package.extras] 335 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 336 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] 337 | 338 | [[package]] 339 | name = "importlib-resources" 340 | version = "5.6.0" 341 | description = "Read resources from Python packages" 342 | category = "main" 343 | optional = false 344 | python-versions = ">=3.7" 345 | 346 | [package.dependencies] 347 | zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} 348 | 349 | [package.extras] 350 | docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] 351 | testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] 352 | 353 | [[package]] 354 | name = "iniconfig" 355 | version = "1.1.1" 356 | description = "iniconfig: brain-dead simple config-ini parsing" 357 | category = "dev" 358 | optional = false 359 | python-versions = "*" 360 | 361 | [[package]] 362 | name = "ipykernel" 363 | version = "6.11.0" 364 | description = "IPython Kernel for Jupyter" 365 | category = "main" 366 | optional = false 367 | python-versions = ">=3.7" 368 | 369 | [package.dependencies] 370 | appnope = {version = "*", markers = "platform_system == \"Darwin\""} 371 | debugpy = ">=1.0" 372 | ipython = ">=7.23.1" 373 | jupyter-client = ">=6.1.12" 374 | matplotlib-inline = ">=0.1" 375 | nest-asyncio = "*" 376 | psutil = "*" 377 | tornado = ">=6.1" 378 | traitlets = ">=5.1.0" 379 | 380 | [package.extras] 381 | test = ["pytest (>=6.0)", "pytest-cov", "flaky", "ipyparallel", "pre-commit", "pytest-timeout"] 382 | 383 | [[package]] 384 | name = "ipython" 385 | version = "7.32.0" 386 | description = "IPython: Productive Interactive Computing" 387 | category = "main" 388 | optional = false 389 | python-versions = ">=3.7" 390 | 391 | [package.dependencies] 392 | appnope = {version = "*", markers = "sys_platform == \"darwin\""} 393 | backcall = "*" 394 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 395 | decorator = "*" 396 | jedi = ">=0.16" 397 | matplotlib-inline = "*" 398 | pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} 399 | pickleshare = "*" 400 | prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" 401 | pygments = "*" 402 | traitlets = ">=4.2" 403 | 404 | [package.extras] 405 | all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"] 406 | doc = ["Sphinx (>=1.3)"] 407 | kernel = ["ipykernel"] 408 | nbconvert = ["nbconvert"] 409 | nbformat = ["nbformat"] 410 | notebook = ["notebook", "ipywidgets"] 411 | parallel = ["ipyparallel"] 412 | qtconsole = ["qtconsole"] 413 | test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"] 414 | 415 | [[package]] 416 | name = "ipython-genutils" 417 | version = "0.2.0" 418 | description = "Vestigial utilities from IPython" 419 | category = "main" 420 | optional = false 421 | python-versions = "*" 422 | 423 | [[package]] 424 | name = "ipywidgets" 425 | version = "7.7.0" 426 | description = "IPython HTML widgets for Jupyter" 427 | category = "main" 428 | optional = false 429 | python-versions = "*" 430 | 431 | [package.dependencies] 432 | ipykernel = ">=4.5.1" 433 | ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} 434 | ipython-genutils = ">=0.2.0,<0.3.0" 435 | jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""} 436 | nbformat = ">=4.2.0" 437 | traitlets = ">=4.3.1" 438 | widgetsnbextension = ">=3.6.0,<3.7.0" 439 | 440 | [package.extras] 441 | test = ["pytest (>=3.6.0)", "pytest-cov", "mock"] 442 | 443 | [[package]] 444 | name = "isort" 445 | version = "5.10.1" 446 | description = "A Python utility / library to sort Python imports." 447 | category = "dev" 448 | optional = false 449 | python-versions = ">=3.6.1,<4.0" 450 | 451 | [package.extras] 452 | pipfile_deprecated_finder = ["pipreqs", "requirementslib"] 453 | requirements_deprecated_finder = ["pipreqs", "pip-api"] 454 | colors = ["colorama (>=0.4.3,<0.5.0)"] 455 | plugins = ["setuptools"] 456 | 457 | [[package]] 458 | name = "jedi" 459 | version = "0.18.1" 460 | description = "An autocompletion tool for Python that can be used for text editors." 461 | category = "main" 462 | optional = false 463 | python-versions = ">=3.6" 464 | 465 | [package.dependencies] 466 | parso = ">=0.8.0,<0.9.0" 467 | 468 | [package.extras] 469 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 470 | testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] 471 | 472 | [[package]] 473 | name = "jinja2" 474 | version = "3.1.1" 475 | description = "A very fast and expressive template engine." 476 | category = "main" 477 | optional = false 478 | python-versions = ">=3.7" 479 | 480 | [package.dependencies] 481 | MarkupSafe = ">=2.0" 482 | 483 | [package.extras] 484 | i18n = ["Babel (>=2.7)"] 485 | 486 | [[package]] 487 | name = "jsonschema" 488 | version = "4.4.0" 489 | description = "An implementation of JSON Schema validation for Python" 490 | category = "main" 491 | optional = false 492 | python-versions = ">=3.7" 493 | 494 | [package.dependencies] 495 | attrs = ">=17.4.0" 496 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 497 | importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} 498 | pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" 499 | typing-extensions = {version = "*", markers = "python_version < \"3.8\""} 500 | 501 | [package.extras] 502 | format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] 503 | format_nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] 504 | 505 | [[package]] 506 | name = "jupyter-client" 507 | version = "7.2.1" 508 | description = "Jupyter protocol implementation and client libraries" 509 | category = "main" 510 | optional = false 511 | python-versions = ">=3.7" 512 | 513 | [package.dependencies] 514 | entrypoints = "*" 515 | jupyter-core = ">=4.9.2" 516 | nest-asyncio = ">=1.5.4" 517 | python-dateutil = ">=2.8.2" 518 | pyzmq = ">=22.3" 519 | tornado = ">=6.0" 520 | traitlets = "*" 521 | 522 | [package.extras] 523 | doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] 524 | test = ["codecov", "coverage", "ipykernel (>=6.5)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] 525 | 526 | [[package]] 527 | name = "jupyter-core" 528 | version = "4.9.2" 529 | description = "Jupyter core package. A base package on which Jupyter projects rely." 530 | category = "main" 531 | optional = false 532 | python-versions = ">=3.6" 533 | 534 | [package.dependencies] 535 | pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} 536 | traitlets = "*" 537 | 538 | [[package]] 539 | name = "jupyterlab-pygments" 540 | version = "0.1.2" 541 | description = "Pygments theme using JupyterLab CSS variables" 542 | category = "main" 543 | optional = false 544 | python-versions = "*" 545 | 546 | [package.dependencies] 547 | pygments = ">=2.4.1,<3" 548 | 549 | [[package]] 550 | name = "jupyterlab-widgets" 551 | version = "1.1.0" 552 | description = "A JupyterLab extension." 553 | category = "main" 554 | optional = false 555 | python-versions = ">=3.6" 556 | 557 | [[package]] 558 | name = "markupsafe" 559 | version = "2.1.1" 560 | description = "Safely add untrusted strings to HTML/XML markup." 561 | category = "main" 562 | optional = false 563 | python-versions = ">=3.7" 564 | 565 | [[package]] 566 | name = "matplotlib-inline" 567 | version = "0.1.3" 568 | description = "Inline Matplotlib backend for Jupyter" 569 | category = "main" 570 | optional = false 571 | python-versions = ">=3.5" 572 | 573 | [package.dependencies] 574 | traitlets = "*" 575 | 576 | [[package]] 577 | name = "mccabe" 578 | version = "0.6.1" 579 | description = "McCabe checker, plugin for flake8" 580 | category = "dev" 581 | optional = false 582 | python-versions = "*" 583 | 584 | [[package]] 585 | name = "mistune" 586 | version = "0.8.4" 587 | description = "The fastest markdown parser in pure Python" 588 | category = "main" 589 | optional = false 590 | python-versions = "*" 591 | 592 | [[package]] 593 | name = "mypy" 594 | version = "0.931" 595 | description = "Optional static typing for Python" 596 | category = "dev" 597 | optional = false 598 | python-versions = ">=3.6" 599 | 600 | [package.dependencies] 601 | mypy-extensions = ">=0.4.3" 602 | tomli = ">=1.1.0" 603 | typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} 604 | typing-extensions = ">=3.10" 605 | 606 | [package.extras] 607 | dmypy = ["psutil (>=4.0)"] 608 | python2 = ["typed-ast (>=1.4.0,<2)"] 609 | 610 | [[package]] 611 | name = "mypy-extensions" 612 | version = "0.4.3" 613 | description = "Experimental type system extensions for programs checked with the mypy typechecker." 614 | category = "dev" 615 | optional = false 616 | python-versions = "*" 617 | 618 | [[package]] 619 | name = "nbclient" 620 | version = "0.5.13" 621 | description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." 622 | category = "main" 623 | optional = false 624 | python-versions = ">=3.7.0" 625 | 626 | [package.dependencies] 627 | jupyter-client = ">=6.1.5" 628 | nbformat = ">=5.0" 629 | nest-asyncio = "*" 630 | traitlets = ">=5.0.0" 631 | 632 | [package.extras] 633 | sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] 634 | test = ["ipython (<8.0.0)", "ipykernel", "ipywidgets (<8.0.0)", "pytest (>=4.1)", "pytest-asyncio", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "xmltodict", "black", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)"] 635 | 636 | [[package]] 637 | name = "nbconvert" 638 | version = "6.4.5" 639 | description = "Converting Jupyter Notebooks" 640 | category = "main" 641 | optional = false 642 | python-versions = ">=3.7" 643 | 644 | [package.dependencies] 645 | beautifulsoup4 = "*" 646 | bleach = "*" 647 | defusedxml = "*" 648 | entrypoints = ">=0.2.2" 649 | jinja2 = ">=2.4" 650 | jupyter-core = "*" 651 | jupyterlab-pygments = "*" 652 | MarkupSafe = ">=2.0" 653 | mistune = ">=0.8.1,<2" 654 | nbclient = ">=0.5.0,<0.6.0" 655 | nbformat = ">=4.4" 656 | pandocfilters = ">=1.4.1" 657 | pygments = ">=2.4.1" 658 | testpath = "*" 659 | traitlets = ">=5.0" 660 | 661 | [package.extras] 662 | all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (>=1,<1.1)", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] 663 | docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] 664 | serve = ["tornado (>=4.0)"] 665 | test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (>=1,<1.1)"] 666 | webpdf = ["pyppeteer (>=1,<1.1)"] 667 | 668 | [[package]] 669 | name = "nbformat" 670 | version = "5.2.0" 671 | description = "The Jupyter Notebook format" 672 | category = "main" 673 | optional = false 674 | python-versions = ">=3.7" 675 | 676 | [package.dependencies] 677 | jsonschema = ">=2.4,<2.5.0 || >2.5.0" 678 | jupyter-core = "*" 679 | traitlets = ">=4.1" 680 | 681 | [package.extras] 682 | fast = ["fastjsonschema"] 683 | test = ["check-manifest", "fastjsonschema", "testpath", "pytest"] 684 | 685 | [[package]] 686 | name = "nest-asyncio" 687 | version = "1.5.4" 688 | description = "Patch asyncio to allow nested event loops" 689 | category = "main" 690 | optional = false 691 | python-versions = ">=3.5" 692 | 693 | [[package]] 694 | name = "notebook" 695 | version = "6.4.10" 696 | description = "A web-based notebook environment for interactive computing" 697 | category = "main" 698 | optional = false 699 | python-versions = ">=3.6" 700 | 701 | [package.dependencies] 702 | argon2-cffi = "*" 703 | ipykernel = "*" 704 | ipython-genutils = "*" 705 | jinja2 = "*" 706 | jupyter-client = ">=5.3.4" 707 | jupyter-core = ">=4.6.1" 708 | nbconvert = ">=5" 709 | nbformat = "*" 710 | nest-asyncio = ">=1.5" 711 | prometheus-client = "*" 712 | pyzmq = ">=17" 713 | Send2Trash = ">=1.8.0" 714 | terminado = ">=0.8.3" 715 | tornado = ">=6.1" 716 | traitlets = ">=4.2.1" 717 | 718 | [package.extras] 719 | docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] 720 | json-logging = ["json-logging"] 721 | test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] 722 | 723 | [[package]] 724 | name = "numpy" 725 | version = "1.21.1" 726 | description = "NumPy is the fundamental package for array computing with Python." 727 | category = "main" 728 | optional = false 729 | python-versions = ">=3.7" 730 | 731 | [[package]] 732 | name = "packaging" 733 | version = "21.3" 734 | description = "Core utilities for Python packages" 735 | category = "main" 736 | optional = false 737 | python-versions = ">=3.6" 738 | 739 | [package.dependencies] 740 | pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" 741 | 742 | [[package]] 743 | name = "pandas" 744 | version = "1.1.5" 745 | description = "Powerful data structures for data analysis, time series, and statistics" 746 | category = "main" 747 | optional = false 748 | python-versions = ">=3.6.1" 749 | 750 | [package.dependencies] 751 | numpy = ">=1.15.4" 752 | python-dateutil = ">=2.7.3" 753 | pytz = ">=2017.2" 754 | 755 | [package.extras] 756 | test = ["pytest (>=4.0.2)", "pytest-xdist", "hypothesis (>=3.58)"] 757 | 758 | [[package]] 759 | name = "pandocfilters" 760 | version = "1.5.0" 761 | description = "Utilities for writing pandoc filters in python" 762 | category = "main" 763 | optional = false 764 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 765 | 766 | [[package]] 767 | name = "parso" 768 | version = "0.8.3" 769 | description = "A Python Parser" 770 | category = "main" 771 | optional = false 772 | python-versions = ">=3.6" 773 | 774 | [package.extras] 775 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 776 | testing = ["docopt", "pytest (<6.0.0)"] 777 | 778 | [[package]] 779 | name = "pathspec" 780 | version = "0.9.0" 781 | description = "Utility library for gitignore style pattern matching of file paths." 782 | category = "dev" 783 | optional = false 784 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 785 | 786 | [[package]] 787 | name = "pexpect" 788 | version = "4.8.0" 789 | description = "Pexpect allows easy control of interactive console applications." 790 | category = "main" 791 | optional = false 792 | python-versions = "*" 793 | 794 | [package.dependencies] 795 | ptyprocess = ">=0.5" 796 | 797 | [[package]] 798 | name = "pickleshare" 799 | version = "0.7.5" 800 | description = "Tiny 'shelve'-like database with concurrency support" 801 | category = "main" 802 | optional = false 803 | python-versions = "*" 804 | 805 | [[package]] 806 | name = "pillow" 807 | version = "9.0.1" 808 | description = "Python Imaging Library (Fork)" 809 | category = "main" 810 | optional = false 811 | python-versions = ">=3.7" 812 | 813 | [[package]] 814 | name = "platformdirs" 815 | version = "2.5.1" 816 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 817 | category = "dev" 818 | optional = false 819 | python-versions = ">=3.7" 820 | 821 | [package.extras] 822 | docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] 823 | test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] 824 | 825 | [[package]] 826 | name = "pluggy" 827 | version = "1.0.0" 828 | description = "plugin and hook calling mechanisms for python" 829 | category = "dev" 830 | optional = false 831 | python-versions = ">=3.6" 832 | 833 | [package.dependencies] 834 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 835 | 836 | [package.extras] 837 | dev = ["pre-commit", "tox"] 838 | testing = ["pytest", "pytest-benchmark"] 839 | 840 | [[package]] 841 | name = "prometheus-client" 842 | version = "0.13.1" 843 | description = "Python client for the Prometheus monitoring system." 844 | category = "main" 845 | optional = false 846 | python-versions = ">=3.6" 847 | 848 | [package.extras] 849 | twisted = ["twisted"] 850 | 851 | [[package]] 852 | name = "prompt-toolkit" 853 | version = "3.0.28" 854 | description = "Library for building powerful interactive command lines in Python" 855 | category = "main" 856 | optional = false 857 | python-versions = ">=3.6.2" 858 | 859 | [package.dependencies] 860 | wcwidth = "*" 861 | 862 | [[package]] 863 | name = "protobuf" 864 | version = "3.19.4" 865 | description = "Protocol Buffers" 866 | category = "main" 867 | optional = false 868 | python-versions = ">=3.5" 869 | 870 | [[package]] 871 | name = "psutil" 872 | version = "5.9.0" 873 | description = "Cross-platform lib for process and system monitoring in Python." 874 | category = "main" 875 | optional = false 876 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 877 | 878 | [package.extras] 879 | test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] 880 | 881 | [[package]] 882 | name = "ptyprocess" 883 | version = "0.7.0" 884 | description = "Run a subprocess in a pseudo terminal" 885 | category = "main" 886 | optional = false 887 | python-versions = "*" 888 | 889 | [[package]] 890 | name = "py" 891 | version = "1.11.0" 892 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 893 | category = "main" 894 | optional = false 895 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 896 | 897 | [[package]] 898 | name = "pyarrow" 899 | version = "7.0.0" 900 | description = "Python library for Apache Arrow" 901 | category = "main" 902 | optional = false 903 | python-versions = ">=3.7" 904 | 905 | [package.dependencies] 906 | numpy = ">=1.16.6" 907 | 908 | [[package]] 909 | name = "pycodestyle" 910 | version = "2.8.0" 911 | description = "Python style guide checker" 912 | category = "dev" 913 | optional = false 914 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 915 | 916 | [[package]] 917 | name = "pycparser" 918 | version = "2.21" 919 | description = "C parser in Python" 920 | category = "main" 921 | optional = false 922 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 923 | 924 | [[package]] 925 | name = "pydeck" 926 | version = "0.7.1" 927 | description = "Widget for deck.gl maps" 928 | category = "main" 929 | optional = false 930 | python-versions = ">=3.7" 931 | 932 | [package.dependencies] 933 | ipykernel = {version = ">=5.1.2", markers = "python_version >= \"3.4\""} 934 | ipywidgets = ">=7.0.0" 935 | jinja2 = ">=2.10.1" 936 | numpy = ">=1.16.4" 937 | traitlets = ">=4.3.2" 938 | 939 | [package.extras] 940 | testing = ["pytest"] 941 | 942 | [[package]] 943 | name = "pyflakes" 944 | version = "2.4.0" 945 | description = "passive checker of Python programs" 946 | category = "dev" 947 | optional = false 948 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 949 | 950 | [[package]] 951 | name = "pygments" 952 | version = "2.11.2" 953 | description = "Pygments is a syntax highlighting package written in Python." 954 | category = "main" 955 | optional = false 956 | python-versions = ">=3.5" 957 | 958 | [[package]] 959 | name = "pympler" 960 | version = "1.0.1" 961 | description = "A development tool to measure, monitor and analyze the memory behavior of Python objects." 962 | category = "main" 963 | optional = false 964 | python-versions = ">=3.6" 965 | 966 | [[package]] 967 | name = "pyparsing" 968 | version = "3.0.7" 969 | description = "Python parsing module" 970 | category = "main" 971 | optional = false 972 | python-versions = ">=3.6" 973 | 974 | [package.extras] 975 | diagrams = ["jinja2", "railroad-diagrams"] 976 | 977 | [[package]] 978 | name = "pyrsistent" 979 | version = "0.18.1" 980 | description = "Persistent/Functional/Immutable data structures" 981 | category = "main" 982 | optional = false 983 | python-versions = ">=3.7" 984 | 985 | [[package]] 986 | name = "pytest" 987 | version = "6.2.5" 988 | description = "pytest: simple powerful testing with Python" 989 | category = "dev" 990 | optional = false 991 | python-versions = ">=3.6" 992 | 993 | [package.dependencies] 994 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 995 | attrs = ">=19.2.0" 996 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 997 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 998 | iniconfig = "*" 999 | packaging = "*" 1000 | pluggy = ">=0.12,<2.0" 1001 | py = ">=1.8.2" 1002 | toml = "*" 1003 | 1004 | [package.extras] 1005 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] 1006 | 1007 | [[package]] 1008 | name = "python-dateutil" 1009 | version = "2.8.2" 1010 | description = "Extensions to the standard Python datetime module" 1011 | category = "main" 1012 | optional = false 1013 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 1014 | 1015 | [package.dependencies] 1016 | six = ">=1.5" 1017 | 1018 | [[package]] 1019 | name = "pytz" 1020 | version = "2022.1" 1021 | description = "World timezone definitions, modern and historical" 1022 | category = "main" 1023 | optional = false 1024 | python-versions = "*" 1025 | 1026 | [[package]] 1027 | name = "pytz-deprecation-shim" 1028 | version = "0.1.0.post0" 1029 | description = "Shims to make deprecation of pytz easier" 1030 | category = "main" 1031 | optional = false 1032 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" 1033 | 1034 | [package.dependencies] 1035 | "backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""} 1036 | tzdata = {version = "*", markers = "python_version >= \"3.6\""} 1037 | 1038 | [[package]] 1039 | name = "pywin32" 1040 | version = "303" 1041 | description = "Python for Window Extensions" 1042 | category = "main" 1043 | optional = false 1044 | python-versions = "*" 1045 | 1046 | [[package]] 1047 | name = "pywinpty" 1048 | version = "2.0.5" 1049 | description = "Pseudo terminal support for Windows from Python." 1050 | category = "main" 1051 | optional = false 1052 | python-versions = ">=3.7" 1053 | 1054 | [[package]] 1055 | name = "pyzmq" 1056 | version = "22.3.0" 1057 | description = "Python bindings for 0MQ" 1058 | category = "main" 1059 | optional = false 1060 | python-versions = ">=3.6" 1061 | 1062 | [package.dependencies] 1063 | cffi = {version = "*", markers = "implementation_name == \"pypy\""} 1064 | py = {version = "*", markers = "implementation_name == \"pypy\""} 1065 | 1066 | [[package]] 1067 | name = "requests" 1068 | version = "2.27.1" 1069 | description = "Python HTTP for Humans." 1070 | category = "main" 1071 | optional = false 1072 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 1073 | 1074 | [package.dependencies] 1075 | certifi = ">=2017.4.17" 1076 | charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} 1077 | idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} 1078 | urllib3 = ">=1.21.1,<1.27" 1079 | 1080 | [package.extras] 1081 | socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] 1082 | use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] 1083 | 1084 | [[package]] 1085 | name = "semver" 1086 | version = "2.13.0" 1087 | description = "Python helper for Semantic Versioning (http://semver.org/)" 1088 | category = "main" 1089 | optional = false 1090 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1091 | 1092 | [[package]] 1093 | name = "send2trash" 1094 | version = "1.8.0" 1095 | description = "Send file to trash natively under Mac OS X, Windows and Linux." 1096 | category = "main" 1097 | optional = false 1098 | python-versions = "*" 1099 | 1100 | [package.extras] 1101 | nativelib = ["pyobjc-framework-cocoa", "pywin32"] 1102 | objc = ["pyobjc-framework-cocoa"] 1103 | win32 = ["pywin32"] 1104 | 1105 | [[package]] 1106 | name = "six" 1107 | version = "1.16.0" 1108 | description = "Python 2 and 3 compatibility utilities" 1109 | category = "main" 1110 | optional = false 1111 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 1112 | 1113 | [[package]] 1114 | name = "smmap" 1115 | version = "5.0.0" 1116 | description = "A pure Python implementation of a sliding window memory map manager" 1117 | category = "main" 1118 | optional = false 1119 | python-versions = ">=3.6" 1120 | 1121 | [[package]] 1122 | name = "soupsieve" 1123 | version = "2.3.1" 1124 | description = "A modern CSS selector implementation for Beautiful Soup." 1125 | category = "main" 1126 | optional = false 1127 | python-versions = ">=3.6" 1128 | 1129 | [[package]] 1130 | name = "streamlit" 1131 | version = "1.8.1" 1132 | description = "The fastest way to build data apps in Python" 1133 | category = "main" 1134 | optional = false 1135 | python-versions = ">=3.6" 1136 | 1137 | [package.dependencies] 1138 | altair = ">=3.2.0" 1139 | attrs = "*" 1140 | blinker = "*" 1141 | cachetools = ">=4.0" 1142 | click = ">=7.0,<8.1" 1143 | gitpython = "!=3.1.19" 1144 | importlib-metadata = ">=1.4" 1145 | numpy = "*" 1146 | packaging = "*" 1147 | pandas = ">=0.21.0" 1148 | pillow = ">=6.2.0" 1149 | protobuf = ">=3.6.0,<3.11 || >3.11" 1150 | pyarrow = "*" 1151 | pydeck = ">=0.1.dev5" 1152 | pympler = ">=0.9" 1153 | python-dateutil = "*" 1154 | requests = "*" 1155 | semver = "*" 1156 | toml = "*" 1157 | tornado = ">=5.0" 1158 | typing-extensions = {version = "*", markers = "python_version < \"3.8\""} 1159 | tzlocal = "*" 1160 | validators = "*" 1161 | watchdog = {version = "*", markers = "platform_system != \"Darwin\""} 1162 | 1163 | [[package]] 1164 | name = "terminado" 1165 | version = "0.13.3" 1166 | description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." 1167 | category = "main" 1168 | optional = false 1169 | python-versions = ">=3.7" 1170 | 1171 | [package.dependencies] 1172 | ptyprocess = {version = "*", markers = "os_name != \"nt\""} 1173 | pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} 1174 | tornado = ">=4" 1175 | 1176 | [package.extras] 1177 | test = ["pytest"] 1178 | 1179 | [[package]] 1180 | name = "testpath" 1181 | version = "0.6.0" 1182 | description = "Test utilities for code working with files and commands" 1183 | category = "main" 1184 | optional = false 1185 | python-versions = ">= 3.5" 1186 | 1187 | [package.extras] 1188 | test = ["pytest"] 1189 | 1190 | [[package]] 1191 | name = "toml" 1192 | version = "0.10.2" 1193 | description = "Python Library for Tom's Obvious, Minimal Language" 1194 | category = "main" 1195 | optional = false 1196 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 1197 | 1198 | [[package]] 1199 | name = "tomli" 1200 | version = "1.2.3" 1201 | description = "A lil' TOML parser" 1202 | category = "dev" 1203 | optional = false 1204 | python-versions = ">=3.6" 1205 | 1206 | [[package]] 1207 | name = "toolz" 1208 | version = "0.11.2" 1209 | description = "List processing tools and functional utilities" 1210 | category = "main" 1211 | optional = false 1212 | python-versions = ">=3.5" 1213 | 1214 | [[package]] 1215 | name = "tornado" 1216 | version = "6.1" 1217 | description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." 1218 | category = "main" 1219 | optional = false 1220 | python-versions = ">= 3.5" 1221 | 1222 | [[package]] 1223 | name = "traitlets" 1224 | version = "5.1.1" 1225 | description = "Traitlets Python configuration system" 1226 | category = "main" 1227 | optional = false 1228 | python-versions = ">=3.7" 1229 | 1230 | [package.extras] 1231 | test = ["pytest"] 1232 | 1233 | [[package]] 1234 | name = "typed-ast" 1235 | version = "1.5.2" 1236 | description = "a fork of Python 2 and 3 ast modules with type comment support" 1237 | category = "dev" 1238 | optional = false 1239 | python-versions = ">=3.6" 1240 | 1241 | [[package]] 1242 | name = "typing-extensions" 1243 | version = "4.1.1" 1244 | description = "Backported and Experimental Type Hints for Python 3.6+" 1245 | category = "main" 1246 | optional = false 1247 | python-versions = ">=3.6" 1248 | 1249 | [[package]] 1250 | name = "tzdata" 1251 | version = "2022.1" 1252 | description = "Provider of IANA time zone data" 1253 | category = "main" 1254 | optional = false 1255 | python-versions = ">=2" 1256 | 1257 | [[package]] 1258 | name = "tzlocal" 1259 | version = "4.1" 1260 | description = "tzinfo object for the local timezone" 1261 | category = "main" 1262 | optional = false 1263 | python-versions = ">=3.6" 1264 | 1265 | [package.dependencies] 1266 | "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} 1267 | pytz-deprecation-shim = "*" 1268 | tzdata = {version = "*", markers = "platform_system == \"Windows\""} 1269 | 1270 | [package.extras] 1271 | devenv = ["black", "pyroma", "pytest-cov", "zest.releaser"] 1272 | test = ["pytest-mock (>=3.3)", "pytest (>=4.3)"] 1273 | 1274 | [[package]] 1275 | name = "urllib3" 1276 | version = "1.26.9" 1277 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1278 | category = "main" 1279 | optional = false 1280 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 1281 | 1282 | [package.extras] 1283 | brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] 1284 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] 1285 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 1286 | 1287 | [[package]] 1288 | name = "validators" 1289 | version = "0.18.2" 1290 | description = "Python Data Validation for Humans™." 1291 | category = "main" 1292 | optional = false 1293 | python-versions = ">=3.4" 1294 | 1295 | [package.dependencies] 1296 | decorator = ">=3.4.0" 1297 | six = ">=1.4.0" 1298 | 1299 | [package.extras] 1300 | test = ["pytest (>=2.2.3)", "flake8 (>=2.4.0)", "isort (>=4.2.2)"] 1301 | 1302 | [[package]] 1303 | name = "watchdog" 1304 | version = "2.1.7" 1305 | description = "Filesystem events monitoring" 1306 | category = "main" 1307 | optional = false 1308 | python-versions = ">=3.6" 1309 | 1310 | [package.extras] 1311 | watchmedo = ["PyYAML (>=3.10)"] 1312 | 1313 | [[package]] 1314 | name = "wcwidth" 1315 | version = "0.2.5" 1316 | description = "Measures the displayed width of unicode strings in a terminal" 1317 | category = "main" 1318 | optional = false 1319 | python-versions = "*" 1320 | 1321 | [[package]] 1322 | name = "webencodings" 1323 | version = "0.5.1" 1324 | description = "Character encoding aliases for legacy web content" 1325 | category = "main" 1326 | optional = false 1327 | python-versions = "*" 1328 | 1329 | [[package]] 1330 | name = "widgetsnbextension" 1331 | version = "3.6.0" 1332 | description = "IPython HTML widgets for Jupyter" 1333 | category = "main" 1334 | optional = false 1335 | python-versions = "*" 1336 | 1337 | [package.dependencies] 1338 | notebook = ">=4.4.1" 1339 | 1340 | [[package]] 1341 | name = "zipp" 1342 | version = "3.7.0" 1343 | description = "Backport of pathlib-compatible object wrapper for zip files" 1344 | category = "main" 1345 | optional = false 1346 | python-versions = ">=3.7" 1347 | 1348 | [package.extras] 1349 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 1350 | testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] 1351 | 1352 | [metadata] 1353 | lock-version = "1.1" 1354 | python-versions = "^3.7" 1355 | content-hash = "6b49aa0a5f57557876c5fc11512b40f3107e8b12217ab510c8a9658d8f6c3cb7" 1356 | 1357 | [metadata.files] 1358 | altair = [ 1359 | {file = "altair-4.2.0-py3-none-any.whl", hash = "sha256:0c724848ae53410c13fa28be2b3b9a9dcb7b5caa1a70f7f217bd663bb419935a"}, 1360 | {file = "altair-4.2.0.tar.gz", hash = "sha256:d87d9372e63b48cd96b2a6415f0cf9457f50162ab79dc7a31cd7e024dd840026"}, 1361 | ] 1362 | appnope = [ 1363 | {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, 1364 | {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, 1365 | ] 1366 | argon2-cffi = [ 1367 | {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, 1368 | {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, 1369 | ] 1370 | argon2-cffi-bindings = [ 1371 | {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, 1372 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, 1373 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, 1374 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, 1375 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, 1376 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, 1377 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, 1378 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, 1379 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, 1380 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, 1381 | {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, 1382 | {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, 1383 | {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, 1384 | {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, 1385 | {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, 1386 | {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, 1387 | {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, 1388 | {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, 1389 | {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, 1390 | {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, 1391 | {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, 1392 | ] 1393 | atomicwrites = [ 1394 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 1395 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 1396 | ] 1397 | attrs = [ 1398 | {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, 1399 | {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, 1400 | ] 1401 | backcall = [ 1402 | {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, 1403 | {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, 1404 | ] 1405 | "backports.zoneinfo" = [ 1406 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, 1407 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, 1408 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, 1409 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, 1410 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, 1411 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, 1412 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, 1413 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, 1414 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, 1415 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, 1416 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, 1417 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, 1418 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, 1419 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, 1420 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, 1421 | {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, 1422 | ] 1423 | beautifulsoup4 = [ 1424 | {file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"}, 1425 | {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, 1426 | ] 1427 | black = [ 1428 | {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, 1429 | {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, 1430 | ] 1431 | bleach = [ 1432 | {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, 1433 | {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"}, 1434 | ] 1435 | blinker = [ 1436 | {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"}, 1437 | ] 1438 | cachetools = [ 1439 | {file = "cachetools-5.0.0-py3-none-any.whl", hash = "sha256:8fecd4203a38af17928be7b90689d8083603073622229ca7077b72d8e5a976e4"}, 1440 | {file = "cachetools-5.0.0.tar.gz", hash = "sha256:486471dfa8799eb7ec503a8059e263db000cdda20075ce5e48903087f79d5fd6"}, 1441 | ] 1442 | certifi = [ 1443 | {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, 1444 | {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, 1445 | ] 1446 | cffi = [ 1447 | {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, 1448 | {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, 1449 | {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, 1450 | {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, 1451 | {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, 1452 | {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, 1453 | {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, 1454 | {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, 1455 | {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, 1456 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, 1457 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, 1458 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, 1459 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, 1460 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, 1461 | {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, 1462 | {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, 1463 | {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, 1464 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, 1465 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, 1466 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, 1467 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, 1468 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, 1469 | {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, 1470 | {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, 1471 | {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, 1472 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, 1473 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, 1474 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, 1475 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, 1476 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, 1477 | {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, 1478 | {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, 1479 | {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, 1480 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, 1481 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, 1482 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, 1483 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, 1484 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, 1485 | {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, 1486 | {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, 1487 | {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, 1488 | {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, 1489 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, 1490 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, 1491 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, 1492 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, 1493 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, 1494 | {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, 1495 | {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, 1496 | {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, 1497 | ] 1498 | charset-normalizer = [ 1499 | {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, 1500 | {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, 1501 | ] 1502 | click = [ 1503 | {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, 1504 | {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, 1505 | ] 1506 | colorama = [ 1507 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 1508 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 1509 | ] 1510 | debugpy = [ 1511 | {file = "debugpy-1.6.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:eb1946efac0c0c3d411cea0b5ac772fbde744109fd9520fb0c5a51979faf05ad"}, 1512 | {file = "debugpy-1.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e3513399177dd37af4c1332df52da5da1d0c387e5927dc4c0709e26ee7302e8f"}, 1513 | {file = "debugpy-1.6.0-cp310-cp310-win32.whl", hash = "sha256:5c492235d6b68f879df3bdbdb01f25c15be15682665517c2c7d0420e5658d71f"}, 1514 | {file = "debugpy-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:40de9ba137d355538432209d05e0f5fe5d0498dce761c39119ad4b950b51db31"}, 1515 | {file = "debugpy-1.6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:0d383b91efee57dbb923ba20801130cf60450a0eda60bce25bccd937de8e323a"}, 1516 | {file = "debugpy-1.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ff853e60e77e1c16f85a31adb8360bb2d98ca588d7ed645b7f0985b240bdb5e"}, 1517 | {file = "debugpy-1.6.0-cp37-cp37m-win32.whl", hash = "sha256:8e972c717d95f56b6a3a7a29a5ede1ee8f2c3802f6f0e678203b0778eb322bf1"}, 1518 | {file = "debugpy-1.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a8aaeb53e87225141fda7b9081bd87155c1debc13e2f5a532d341112d1983b65"}, 1519 | {file = "debugpy-1.6.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:132defb585b518955358321d0f42f6aa815aa15b432be27db654807707c70b2f"}, 1520 | {file = "debugpy-1.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ee75844242b4537beb5899f3e60a578454d1f136b99e8d57ac424573797b94a"}, 1521 | {file = "debugpy-1.6.0-cp38-cp38-win32.whl", hash = "sha256:a65a2499761d47df3e9ea9567109be6e73d412e00ac3ffcf74839f3ddfcdf028"}, 1522 | {file = "debugpy-1.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:bd980d533d0ddfc451e03a3bb32acb2900049fec39afc3425b944ebf0889be62"}, 1523 | {file = "debugpy-1.6.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:245c7789a012f86210847ec7ee9f38c30a30d4c2223c3e111829a76c9006a5d0"}, 1524 | {file = "debugpy-1.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e3aa2368883e83e7b689ddff3cafb595f7b711f6a065886b46a96a7fef874e7"}, 1525 | {file = "debugpy-1.6.0-cp39-cp39-win32.whl", hash = "sha256:72bcfa97f3afa0064afc77ab811f48ad4a06ac330f290b675082c24437730366"}, 1526 | {file = "debugpy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:30abefefd2ff5a5481162d613cb70e60e2fa80a5eb4c994717c0f008ed25d2e1"}, 1527 | {file = "debugpy-1.6.0-py2.py3-none-any.whl", hash = "sha256:4de7777842da7e08652f2776c552070bbdd758557fdec73a15d7be0e4aab95ce"}, 1528 | {file = "debugpy-1.6.0.zip", hash = "sha256:7b79c40852991f7b6c3ea65845ed0f5f6b731c37f4f9ad9c61e2ab4bd48a9275"}, 1529 | ] 1530 | decorator = [ 1531 | {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, 1532 | {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, 1533 | ] 1534 | defusedxml = [ 1535 | {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, 1536 | {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, 1537 | ] 1538 | diskcache = [ 1539 | {file = "diskcache-5.4.0-py3-none-any.whl", hash = "sha256:af3ec6d7f167bbef7b6c33d9ee22f86d3e8f2dd7131eb7c4703d8d91ccdc0cc4"}, 1540 | {file = "diskcache-5.4.0.tar.gz", hash = "sha256:8879eb8c9b4a2509a5e633d2008634fb2b0b35c2b36192d89655dbde02419644"}, 1541 | ] 1542 | entrypoints = [ 1543 | {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, 1544 | {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, 1545 | ] 1546 | flake8 = [ 1547 | {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, 1548 | {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, 1549 | ] 1550 | flake8-bugbear = [ 1551 | {file = "flake8-bugbear-22.3.23.tar.gz", hash = "sha256:e0dc2a36474490d5b1a2d57f9e4ef570abc09f07cbb712b29802e28a2367ff19"}, 1552 | {file = "flake8_bugbear-22.3.23-py3-none-any.whl", hash = "sha256:ec5ec92195720cee1589315416b844ffa5e82f73a78e65329e8055322df1e939"}, 1553 | ] 1554 | gitdb = [ 1555 | {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, 1556 | {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, 1557 | ] 1558 | gitpython = [ 1559 | {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, 1560 | {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, 1561 | ] 1562 | idna = [ 1563 | {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, 1564 | {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, 1565 | ] 1566 | importlib-metadata = [ 1567 | {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, 1568 | {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, 1569 | ] 1570 | importlib-resources = [ 1571 | {file = "importlib_resources-5.6.0-py3-none-any.whl", hash = "sha256:a9dd72f6cc106aeb50f6e66b86b69b454766dd6e39b69ac68450253058706bcc"}, 1572 | {file = "importlib_resources-5.6.0.tar.gz", hash = "sha256:1b93238cbf23b4cde34240dd8321d99e9bf2eb4bc91c0c99b2886283e7baad85"}, 1573 | ] 1574 | iniconfig = [ 1575 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 1576 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 1577 | ] 1578 | ipykernel = [ 1579 | {file = "ipykernel-6.11.0-py3-none-any.whl", hash = "sha256:62ec17caff6e4fa1dc87ef0a6f9eff5a5d6588bb585ab1e06897e7bec9eb2819"}, 1580 | {file = "ipykernel-6.11.0.tar.gz", hash = "sha256:6712604531c96100f326440c11cb023da26819f2f34ba9d1ca0fb163401834e8"}, 1581 | ] 1582 | ipython = [ 1583 | {file = "ipython-7.32.0-py3-none-any.whl", hash = "sha256:86df2cf291c6c70b5be6a7b608650420e89180c8ec74f376a34e2dc15c3400e7"}, 1584 | {file = "ipython-7.32.0.tar.gz", hash = "sha256:468abefc45c15419e3c8e8c0a6a5c115b2127bafa34d7c641b1d443658793909"}, 1585 | ] 1586 | ipython-genutils = [ 1587 | {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, 1588 | {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, 1589 | ] 1590 | ipywidgets = [ 1591 | {file = "ipywidgets-7.7.0-py2.py3-none-any.whl", hash = "sha256:e58ff58bc94d481e91ecb6e13a5cb96a87b6b8ade135e055603d0ca24593df38"}, 1592 | {file = "ipywidgets-7.7.0.tar.gz", hash = "sha256:ab4a5596855a88b83761921c768707d65e5847068139bc1729ddfe834703542a"}, 1593 | ] 1594 | isort = [ 1595 | {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, 1596 | {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, 1597 | ] 1598 | jedi = [ 1599 | {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"}, 1600 | {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"}, 1601 | ] 1602 | jinja2 = [ 1603 | {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, 1604 | {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, 1605 | ] 1606 | jsonschema = [ 1607 | {file = "jsonschema-4.4.0-py3-none-any.whl", hash = "sha256:77281a1f71684953ee8b3d488371b162419767973789272434bbc3f29d9c8823"}, 1608 | {file = "jsonschema-4.4.0.tar.gz", hash = "sha256:636694eb41b3535ed608fe04129f26542b59ed99808b4f688aa32dcf55317a83"}, 1609 | ] 1610 | jupyter-client = [ 1611 | {file = "jupyter_client-7.2.1-py3-none-any.whl", hash = "sha256:d10e31ac4b8364d1cb30ebcee9e5cc7b7eb5d23b76912be9ef3d4c75167fbc68"}, 1612 | {file = "jupyter_client-7.2.1.tar.gz", hash = "sha256:aa177279e93205d0681ec0e2e210da01b22c5a1464a56abd455adcac64f0de91"}, 1613 | ] 1614 | jupyter-core = [ 1615 | {file = "jupyter_core-4.9.2-py3-none-any.whl", hash = "sha256:f875e4d27e202590311d468fa55f90c575f201490bd0c18acabe4e318db4a46d"}, 1616 | {file = "jupyter_core-4.9.2.tar.gz", hash = "sha256:d69baeb9ffb128b8cd2657fcf2703f89c769d1673c851812119e3a2a0e93ad9a"}, 1617 | ] 1618 | jupyterlab-pygments = [ 1619 | {file = "jupyterlab_pygments-0.1.2-py2.py3-none-any.whl", hash = "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008"}, 1620 | {file = "jupyterlab_pygments-0.1.2.tar.gz", hash = "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146"}, 1621 | ] 1622 | jupyterlab-widgets = [ 1623 | {file = "jupyterlab_widgets-1.1.0-py3-none-any.whl", hash = "sha256:c2a9bd3789f120f64d73268c066ed3b000c56bc1dda217be5cdc43e7b4ebad3f"}, 1624 | {file = "jupyterlab_widgets-1.1.0.tar.gz", hash = "sha256:d5f41bc1713795385f718d44dcba47e1e1473c6289f28a95aa6b2c0782ee372a"}, 1625 | ] 1626 | markupsafe = [ 1627 | {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, 1628 | {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, 1629 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, 1630 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, 1631 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, 1632 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, 1633 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, 1634 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, 1635 | {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, 1636 | {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, 1637 | {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, 1638 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, 1639 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, 1640 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, 1641 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, 1642 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, 1643 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, 1644 | {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, 1645 | {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, 1646 | {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, 1647 | {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, 1648 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, 1649 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, 1650 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, 1651 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, 1652 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, 1653 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, 1654 | {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, 1655 | {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, 1656 | {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, 1657 | {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, 1658 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, 1659 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, 1660 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, 1661 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, 1662 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, 1663 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, 1664 | {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, 1665 | {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, 1666 | {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, 1667 | ] 1668 | matplotlib-inline = [ 1669 | {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, 1670 | {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, 1671 | ] 1672 | mccabe = [ 1673 | {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, 1674 | {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, 1675 | ] 1676 | mistune = [ 1677 | {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, 1678 | {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, 1679 | ] 1680 | mypy = [ 1681 | {file = "mypy-0.931-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c5b42d0815e15518b1f0990cff7a705805961613e701db60387e6fb663fe78a"}, 1682 | {file = "mypy-0.931-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c89702cac5b302f0c5d33b172d2b55b5df2bede3344a2fbed99ff96bddb2cf00"}, 1683 | {file = "mypy-0.931-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:300717a07ad09525401a508ef5d105e6b56646f7942eb92715a1c8d610149714"}, 1684 | {file = "mypy-0.931-cp310-cp310-win_amd64.whl", hash = "sha256:7b3f6f557ba4afc7f2ce6d3215d5db279bcf120b3cfd0add20a5d4f4abdae5bc"}, 1685 | {file = "mypy-0.931-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1bf752559797c897cdd2c65f7b60c2b6969ffe458417b8d947b8340cc9cec08d"}, 1686 | {file = "mypy-0.931-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4365c60266b95a3f216a3047f1d8e3f895da6c7402e9e1ddfab96393122cc58d"}, 1687 | {file = "mypy-0.931-cp36-cp36m-win_amd64.whl", hash = "sha256:1b65714dc296a7991000b6ee59a35b3f550e0073411ac9d3202f6516621ba66c"}, 1688 | {file = "mypy-0.931-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e839191b8da5b4e5d805f940537efcaa13ea5dd98418f06dc585d2891d228cf0"}, 1689 | {file = "mypy-0.931-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:50c7346a46dc76a4ed88f3277d4959de8a2bd0a0fa47fa87a4cde36fe247ac05"}, 1690 | {file = "mypy-0.931-cp37-cp37m-win_amd64.whl", hash = "sha256:d8f1ff62f7a879c9fe5917b3f9eb93a79b78aad47b533911b853a757223f72e7"}, 1691 | {file = "mypy-0.931-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9fe20d0872b26c4bba1c1be02c5340de1019530302cf2dcc85c7f9fc3252ae0"}, 1692 | {file = "mypy-0.931-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1b06268df7eb53a8feea99cbfff77a6e2b205e70bf31743e786678ef87ee8069"}, 1693 | {file = "mypy-0.931-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8c11003aaeaf7cc2d0f1bc101c1cc9454ec4cc9cb825aef3cafff8a5fdf4c799"}, 1694 | {file = "mypy-0.931-cp38-cp38-win_amd64.whl", hash = "sha256:d9d2b84b2007cea426e327d2483238f040c49405a6bf4074f605f0156c91a47a"}, 1695 | {file = "mypy-0.931-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ff3bf387c14c805ab1388185dd22d6b210824e164d4bb324b195ff34e322d166"}, 1696 | {file = "mypy-0.931-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b56154f8c09427bae082b32275a21f500b24d93c88d69a5e82f3978018a0266"}, 1697 | {file = "mypy-0.931-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ca7f8c4b1584d63c9a0f827c37ba7a47226c19a23a753d52e5b5eddb201afcd"}, 1698 | {file = "mypy-0.931-cp39-cp39-win_amd64.whl", hash = "sha256:74f7eccbfd436abe9c352ad9fb65872cc0f1f0a868e9d9c44db0893440f0c697"}, 1699 | {file = "mypy-0.931-py3-none-any.whl", hash = "sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d"}, 1700 | {file = "mypy-0.931.tar.gz", hash = "sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce"}, 1701 | ] 1702 | mypy-extensions = [ 1703 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, 1704 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, 1705 | ] 1706 | nbclient = [ 1707 | {file = "nbclient-0.5.13-py3-none-any.whl", hash = "sha256:47ac905af59379913c1f8f541098d2550153cf8dc58553cbe18c702b181518b0"}, 1708 | {file = "nbclient-0.5.13.tar.gz", hash = "sha256:40c52c9b5e3c31faecaee69f202b3f53e38d7c1c563de0fadde9d7eda0fdafe8"}, 1709 | ] 1710 | nbconvert = [ 1711 | {file = "nbconvert-6.4.5-py3-none-any.whl", hash = "sha256:e01d219f55cc79f9701c834d605e8aa3acf35725345d3942e3983937f368ce14"}, 1712 | {file = "nbconvert-6.4.5.tar.gz", hash = "sha256:21163a8e2073c07109ca8f398836e45efdba2aacea68d6f75a8a545fef070d4e"}, 1713 | ] 1714 | nbformat = [ 1715 | {file = "nbformat-5.2.0-py3-none-any.whl", hash = "sha256:3e30424e8291b2188347f5c3ba5273ed3766f12f8c5137c2e456a0815f36e785"}, 1716 | {file = "nbformat-5.2.0.tar.gz", hash = "sha256:93df0b9c67221d38fb970c48f6d361819a6c388299a0ef3171bbb912edfe1324"}, 1717 | ] 1718 | nest-asyncio = [ 1719 | {file = "nest_asyncio-1.5.4-py3-none-any.whl", hash = "sha256:3fdd0d6061a2bb16f21fe8a9c6a7945be83521d81a0d15cff52e9edee50101d6"}, 1720 | {file = "nest_asyncio-1.5.4.tar.gz", hash = "sha256:f969f6013a16fadb4adcf09d11a68a4f617c6049d7af7ac2c676110169a63abd"}, 1721 | ] 1722 | notebook = [ 1723 | {file = "notebook-6.4.10-py3-none-any.whl", hash = "sha256:49cead814bff0945fcb2ee07579259418672ac175d3dc3d8102a4b0a656ed4df"}, 1724 | {file = "notebook-6.4.10.tar.gz", hash = "sha256:2408a76bc6289283a8eecfca67e298ec83c67db51a4c2e1b713dd180bb39e90e"}, 1725 | ] 1726 | numpy = [ 1727 | {file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"}, 1728 | {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a"}, 1729 | {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062"}, 1730 | {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1"}, 1731 | {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671"}, 1732 | {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e"}, 1733 | {file = "numpy-1.21.1-cp37-cp37m-win32.whl", hash = "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172"}, 1734 | {file = "numpy-1.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8"}, 1735 | {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16"}, 1736 | {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267"}, 1737 | {file = "numpy-1.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6"}, 1738 | {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63"}, 1739 | {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af"}, 1740 | {file = "numpy-1.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5"}, 1741 | {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68"}, 1742 | {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8"}, 1743 | {file = "numpy-1.21.1-cp38-cp38-win32.whl", hash = "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd"}, 1744 | {file = "numpy-1.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214"}, 1745 | {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f"}, 1746 | {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b"}, 1747 | {file = "numpy-1.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac"}, 1748 | {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1"}, 1749 | {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1"}, 1750 | {file = "numpy-1.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a"}, 1751 | {file = "numpy-1.21.1-cp39-cp39-win32.whl", hash = "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2"}, 1752 | {file = "numpy-1.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33"}, 1753 | {file = "numpy-1.21.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4"}, 1754 | {file = "numpy-1.21.1.zip", hash = "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd"}, 1755 | ] 1756 | packaging = [ 1757 | {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, 1758 | {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, 1759 | ] 1760 | pandas = [ 1761 | {file = "pandas-1.1.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bf23a3b54d128b50f4f9d4675b3c1857a688cc6731a32f931837d72effb2698d"}, 1762 | {file = "pandas-1.1.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5a780260afc88268a9d3ac3511d8f494fdcf637eece62fb9eb656a63d53eb7ca"}, 1763 | {file = "pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b61080750d19a0122469ab59b087380721d6b72a4e7d962e4d7e63e0c4504814"}, 1764 | {file = "pandas-1.1.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:0de3ddb414d30798cbf56e642d82cac30a80223ad6fe484d66c0ce01a84d6f2f"}, 1765 | {file = "pandas-1.1.5-cp36-cp36m-win32.whl", hash = "sha256:70865f96bb38fec46f7ebd66d4b5cfd0aa6b842073f298d621385ae3898d28b5"}, 1766 | {file = "pandas-1.1.5-cp36-cp36m-win_amd64.whl", hash = "sha256:19a2148a1d02791352e9fa637899a78e371a3516ac6da5c4edc718f60cbae648"}, 1767 | {file = "pandas-1.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26fa92d3ac743a149a31b21d6f4337b0594b6302ea5575b37af9ca9611e8981a"}, 1768 | {file = "pandas-1.1.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c16d59c15d946111d2716856dd5479221c9e4f2f5c7bc2d617f39d870031e086"}, 1769 | {file = "pandas-1.1.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3be7a7a0ca71a2640e81d9276f526bca63505850add10206d0da2e8a0a325dae"}, 1770 | {file = "pandas-1.1.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:573fba5b05bf2c69271a32e52399c8de599e4a15ab7cec47d3b9c904125ab788"}, 1771 | {file = "pandas-1.1.5-cp37-cp37m-win32.whl", hash = "sha256:21b5a2b033380adbdd36b3116faaf9a4663e375325831dac1b519a44f9e439bb"}, 1772 | {file = "pandas-1.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:24c7f8d4aee71bfa6401faeba367dd654f696a77151a8a28bc2013f7ced4af98"}, 1773 | {file = "pandas-1.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2860a97cbb25444ffc0088b457da0a79dc79f9c601238a3e0644312fcc14bf11"}, 1774 | {file = "pandas-1.1.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5008374ebb990dad9ed48b0f5d0038124c73748f5384cc8c46904dace27082d9"}, 1775 | {file = "pandas-1.1.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2c2f7c670ea4e60318e4b7e474d56447cf0c7d83b3c2a5405a0dbb2600b9c48e"}, 1776 | {file = "pandas-1.1.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0a643bae4283a37732ddfcecab3f62dd082996021b980f580903f4e8e01b3c5b"}, 1777 | {file = "pandas-1.1.5-cp38-cp38-win32.whl", hash = "sha256:5447ea7af4005b0daf695a316a423b96374c9c73ffbd4533209c5ddc369e644b"}, 1778 | {file = "pandas-1.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:4c62e94d5d49db116bef1bd5c2486723a292d79409fc9abd51adf9e05329101d"}, 1779 | {file = "pandas-1.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:731568be71fba1e13cae212c362f3d2ca8932e83cb1b85e3f1b4dd77d019254a"}, 1780 | {file = "pandas-1.1.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c61c043aafb69329d0f961b19faa30b1dab709dd34c9388143fc55680059e55a"}, 1781 | {file = "pandas-1.1.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2b1c6cd28a0dfda75c7b5957363333f01d370936e4c6276b7b8e696dd500582a"}, 1782 | {file = "pandas-1.1.5-cp39-cp39-win32.whl", hash = "sha256:c94ff2780a1fd89f190390130d6d36173ca59fcfb3fe0ff596f9a56518191ccb"}, 1783 | {file = "pandas-1.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:edda9bacc3843dfbeebaf7a701763e68e741b08fccb889c003b0a52f0ee95782"}, 1784 | {file = "pandas-1.1.5.tar.gz", hash = "sha256:f10fc41ee3c75a474d3bdf68d396f10782d013d7f67db99c0efbfd0acb99701b"}, 1785 | ] 1786 | pandocfilters = [ 1787 | {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, 1788 | {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, 1789 | ] 1790 | parso = [ 1791 | {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, 1792 | {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, 1793 | ] 1794 | pathspec = [ 1795 | {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, 1796 | {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, 1797 | ] 1798 | pexpect = [ 1799 | {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, 1800 | {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, 1801 | ] 1802 | pickleshare = [ 1803 | {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, 1804 | {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, 1805 | ] 1806 | pillow = [ 1807 | {file = "Pillow-9.0.1-1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5d24e1d674dd9d72c66ad3ea9131322819ff86250b30dc5821cbafcfa0b96b4"}, 1808 | {file = "Pillow-9.0.1-1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2632d0f846b7c7600edf53c48f8f9f1e13e62f66a6dbc15191029d950bfed976"}, 1809 | {file = "Pillow-9.0.1-1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9618823bd237c0d2575283f2939655f54d51b4527ec3972907a927acbcc5bfc"}, 1810 | {file = "Pillow-9.0.1-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:9bfdb82cdfeccec50aad441afc332faf8606dfa5e8efd18a6692b5d6e79f00fd"}, 1811 | {file = "Pillow-9.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5100b45a4638e3c00e4d2320d3193bdabb2d75e79793af7c3eb139e4f569f16f"}, 1812 | {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:528a2a692c65dd5cafc130de286030af251d2ee0483a5bf50c9348aefe834e8a"}, 1813 | {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f29d831e2151e0b7b39981756d201f7108d3d215896212ffe2e992d06bfe049"}, 1814 | {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:855c583f268edde09474b081e3ddcd5cf3b20c12f26e0d434e1386cc5d318e7a"}, 1815 | {file = "Pillow-9.0.1-cp310-cp310-win32.whl", hash = "sha256:d9d7942b624b04b895cb95af03a23407f17646815495ce4547f0e60e0b06f58e"}, 1816 | {file = "Pillow-9.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81c4b81611e3a3cb30e59b0cf05b888c675f97e3adb2c8672c3154047980726b"}, 1817 | {file = "Pillow-9.0.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:413ce0bbf9fc6278b2d63309dfeefe452835e1c78398efb431bab0672fe9274e"}, 1818 | {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80fe64a6deb6fcfdf7b8386f2cf216d329be6f2781f7d90304351811fb591360"}, 1819 | {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cef9c85ccbe9bee00909758936ea841ef12035296c748aaceee535969e27d31b"}, 1820 | {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d19397351f73a88904ad1aee421e800fe4bbcd1aeee6435fb62d0a05ccd1030"}, 1821 | {file = "Pillow-9.0.1-cp37-cp37m-win32.whl", hash = "sha256:d21237d0cd37acded35154e29aec853e945950321dd2ffd1a7d86fe686814669"}, 1822 | {file = "Pillow-9.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ede5af4a2702444a832a800b8eb7f0a7a1c0eed55b644642e049c98d589e5092"}, 1823 | {file = "Pillow-9.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:b5b3f092fe345c03bca1e0b687dfbb39364b21ebb8ba90e3fa707374b7915204"}, 1824 | {file = "Pillow-9.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:335ace1a22325395c4ea88e00ba3dc89ca029bd66bd5a3c382d53e44f0ccd77e"}, 1825 | {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db6d9fac65bd08cea7f3540b899977c6dee9edad959fa4eaf305940d9cbd861c"}, 1826 | {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f154d173286a5d1863637a7dcd8c3437bb557520b01bddb0be0258dcb72696b5"}, 1827 | {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d4b1341ac07ae07eb2cc682f459bec932a380c3b122f5540432d8977e64eae"}, 1828 | {file = "Pillow-9.0.1-cp38-cp38-win32.whl", hash = "sha256:effb7749713d5317478bb3acb3f81d9d7c7f86726d41c1facca068a04cf5bb4c"}, 1829 | {file = "Pillow-9.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:7f7609a718b177bf171ac93cea9fd2ddc0e03e84d8fa4e887bdfc39671d46b00"}, 1830 | {file = "Pillow-9.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:80ca33961ced9c63358056bd08403ff866512038883e74f3a4bf88ad3eb66838"}, 1831 | {file = "Pillow-9.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c3c33ac69cf059bbb9d1a71eeaba76781b450bc307e2291f8a4764d779a6b28"}, 1832 | {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12875d118f21cf35604176872447cdb57b07126750a33748bac15e77f90f1f9c"}, 1833 | {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:514ceac913076feefbeaf89771fd6febde78b0c4c1b23aaeab082c41c694e81b"}, 1834 | {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3c5c79ab7dfce6d88f1ba639b77e77a17ea33a01b07b99840d6ed08031cb2a7"}, 1835 | {file = "Pillow-9.0.1-cp39-cp39-win32.whl", hash = "sha256:718856856ba31f14f13ba885ff13874be7fefc53984d2832458f12c38205f7f7"}, 1836 | {file = "Pillow-9.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:f25ed6e28ddf50de7e7ea99d7a976d6a9c415f03adcaac9c41ff6ff41b6d86ac"}, 1837 | {file = "Pillow-9.0.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:011233e0c42a4a7836498e98c1acf5e744c96a67dd5032a6f666cc1fb97eab97"}, 1838 | {file = "Pillow-9.0.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253e8a302a96df6927310a9d44e6103055e8fb96a6822f8b7f514bb7ef77de56"}, 1839 | {file = "Pillow-9.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6295f6763749b89c994fcb6d8a7f7ce03c3992e695f89f00b741b4580b199b7e"}, 1840 | {file = "Pillow-9.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a9f44cd7e162ac6191491d7249cceb02b8116b0f7e847ee33f739d7cb1ea1f70"}, 1841 | {file = "Pillow-9.0.1.tar.gz", hash = "sha256:6c8bc8238a7dfdaf7a75f5ec5a663f4173f8c367e5a39f87e720495e1eed75fa"}, 1842 | ] 1843 | platformdirs = [ 1844 | {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, 1845 | {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, 1846 | ] 1847 | pluggy = [ 1848 | {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, 1849 | {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, 1850 | ] 1851 | prometheus-client = [ 1852 | {file = "prometheus_client-0.13.1-py3-none-any.whl", hash = "sha256:357a447fd2359b0a1d2e9b311a0c5778c330cfbe186d880ad5a6b39884652316"}, 1853 | {file = "prometheus_client-0.13.1.tar.gz", hash = "sha256:ada41b891b79fca5638bd5cfe149efa86512eaa55987893becd2c6d8d0a5dfc5"}, 1854 | ] 1855 | prompt-toolkit = [ 1856 | {file = "prompt_toolkit-3.0.28-py3-none-any.whl", hash = "sha256:30129d870dcb0b3b6a53efdc9d0a83ea96162ffd28ffe077e94215b233dc670c"}, 1857 | {file = "prompt_toolkit-3.0.28.tar.gz", hash = "sha256:9f1cd16b1e86c2968f2519d7fb31dd9d669916f515612c269d14e9ed52b51650"}, 1858 | ] 1859 | protobuf = [ 1860 | {file = "protobuf-3.19.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f51d5a9f137f7a2cec2d326a74b6e3fc79d635d69ffe1b036d39fc7d75430d37"}, 1861 | {file = "protobuf-3.19.4-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09297b7972da685ce269ec52af761743714996b4381c085205914c41fcab59fb"}, 1862 | {file = "protobuf-3.19.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072fbc78d705d3edc7ccac58a62c4c8e0cec856987da7df8aca86e647be4e35c"}, 1863 | {file = "protobuf-3.19.4-cp310-cp310-win32.whl", hash = "sha256:7bb03bc2873a2842e5ebb4801f5c7ff1bfbdf426f85d0172f7644fcda0671ae0"}, 1864 | {file = "protobuf-3.19.4-cp310-cp310-win_amd64.whl", hash = "sha256:f358aa33e03b7a84e0d91270a4d4d8f5df6921abe99a377828839e8ed0c04e07"}, 1865 | {file = "protobuf-3.19.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1c91ef4110fdd2c590effb5dca8fdbdcb3bf563eece99287019c4204f53d81a4"}, 1866 | {file = "protobuf-3.19.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c438268eebb8cf039552897d78f402d734a404f1360592fef55297285f7f953f"}, 1867 | {file = "protobuf-3.19.4-cp36-cp36m-win32.whl", hash = "sha256:835a9c949dc193953c319603b2961c5c8f4327957fe23d914ca80d982665e8ee"}, 1868 | {file = "protobuf-3.19.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4276cdec4447bd5015453e41bdc0c0c1234eda08420b7c9a18b8d647add51e4b"}, 1869 | {file = "protobuf-3.19.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6cbc312be5e71869d9d5ea25147cdf652a6781cf4d906497ca7690b7b9b5df13"}, 1870 | {file = "protobuf-3.19.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:54a1473077f3b616779ce31f477351a45b4fef8c9fd7892d6d87e287a38df368"}, 1871 | {file = "protobuf-3.19.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:435bb78b37fc386f9275a7035fe4fb1364484e38980d0dd91bc834a02c5ec909"}, 1872 | {file = "protobuf-3.19.4-cp37-cp37m-win32.whl", hash = "sha256:16f519de1313f1b7139ad70772e7db515b1420d208cb16c6d7858ea989fc64a9"}, 1873 | {file = "protobuf-3.19.4-cp37-cp37m-win_amd64.whl", hash = "sha256:cdc076c03381f5c1d9bb1abdcc5503d9ca8b53cf0a9d31a9f6754ec9e6c8af0f"}, 1874 | {file = "protobuf-3.19.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69da7d39e39942bd52848438462674c463e23963a1fdaa84d88df7fbd7e749b2"}, 1875 | {file = "protobuf-3.19.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:48ed3877fa43e22bcacc852ca76d4775741f9709dd9575881a373bd3e85e54b2"}, 1876 | {file = "protobuf-3.19.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd95d1dfb9c4f4563e6093a9aa19d9c186bf98fa54da5252531cc0d3a07977e7"}, 1877 | {file = "protobuf-3.19.4-cp38-cp38-win32.whl", hash = "sha256:b38057450a0c566cbd04890a40edf916db890f2818e8682221611d78dc32ae26"}, 1878 | {file = "protobuf-3.19.4-cp38-cp38-win_amd64.whl", hash = "sha256:7ca7da9c339ca8890d66958f5462beabd611eca6c958691a8fe6eccbd1eb0c6e"}, 1879 | {file = "protobuf-3.19.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:36cecbabbda242915529b8ff364f2263cd4de7c46bbe361418b5ed859677ba58"}, 1880 | {file = "protobuf-3.19.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c1068287025f8ea025103e37d62ffd63fec8e9e636246b89c341aeda8a67c934"}, 1881 | {file = "protobuf-3.19.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96bd766831596d6014ca88d86dc8fe0fb2e428c0b02432fd9db3943202bf8c5e"}, 1882 | {file = "protobuf-3.19.4-cp39-cp39-win32.whl", hash = "sha256:84123274d982b9e248a143dadd1b9815049f4477dc783bf84efe6250eb4b836a"}, 1883 | {file = "protobuf-3.19.4-cp39-cp39-win_amd64.whl", hash = "sha256:3112b58aac3bac9c8be2b60a9daf6b558ca3f7681c130dcdd788ade7c9ffbdca"}, 1884 | {file = "protobuf-3.19.4-py2.py3-none-any.whl", hash = "sha256:8961c3a78ebfcd000920c9060a262f082f29838682b1f7201889300c1fbe0616"}, 1885 | {file = "protobuf-3.19.4.tar.gz", hash = "sha256:9df0c10adf3e83015ced42a9a7bd64e13d06c4cf45c340d2c63020ea04499d0a"}, 1886 | ] 1887 | psutil = [ 1888 | {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b"}, 1889 | {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618"}, 1890 | {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2"}, 1891 | {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd"}, 1892 | {file = "psutil-5.9.0-cp27-none-win32.whl", hash = "sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3"}, 1893 | {file = "psutil-5.9.0-cp27-none-win_amd64.whl", hash = "sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c"}, 1894 | {file = "psutil-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492"}, 1895 | {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3"}, 1896 | {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2"}, 1897 | {file = "psutil-5.9.0-cp310-cp310-win32.whl", hash = "sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d"}, 1898 | {file = "psutil-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b"}, 1899 | {file = "psutil-5.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56"}, 1900 | {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203"}, 1901 | {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d"}, 1902 | {file = "psutil-5.9.0-cp36-cp36m-win32.whl", hash = "sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64"}, 1903 | {file = "psutil-5.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94"}, 1904 | {file = "psutil-5.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0"}, 1905 | {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce"}, 1906 | {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5"}, 1907 | {file = "psutil-5.9.0-cp37-cp37m-win32.whl", hash = "sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9"}, 1908 | {file = "psutil-5.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4"}, 1909 | {file = "psutil-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2"}, 1910 | {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d"}, 1911 | {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a"}, 1912 | {file = "psutil-5.9.0-cp38-cp38-win32.whl", hash = "sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666"}, 1913 | {file = "psutil-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841"}, 1914 | {file = "psutil-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf"}, 1915 | {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07"}, 1916 | {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d"}, 1917 | {file = "psutil-5.9.0-cp39-cp39-win32.whl", hash = "sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845"}, 1918 | {file = "psutil-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3"}, 1919 | {file = "psutil-5.9.0.tar.gz", hash = "sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25"}, 1920 | ] 1921 | ptyprocess = [ 1922 | {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, 1923 | {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, 1924 | ] 1925 | py = [ 1926 | {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, 1927 | {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, 1928 | ] 1929 | pyarrow = [ 1930 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:0f15213f380539c9640cb2413dc677b55e70f04c9e98cfc2e1d8b36c770e1036"}, 1931 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:29c4e3b3be0b94d07ff4921a5e410fc690a3a066a850a302fc504de5fc638495"}, 1932 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8a9bfc8a016bcb8f9a8536d2fa14a890b340bc7a236275cd60fd4fb8b93ff405"}, 1933 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:49d431ed644a3e8f53ae2bbf4b514743570b495b5829548db51610534b6eeee7"}, 1934 | {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa6442a321c1e49480b3d436f7d631c895048a16df572cf71c23c6b53c45ed66"}, 1935 | {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b01a23cb401750092c6f7c4dcae67cd8fd6b99ae710e26f654f23508f25f25"}, 1936 | {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f10928745c6ff66e121552731409803bed86c66ac79c64c90438b053b5242c5"}, 1937 | {file = "pyarrow-7.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:759090caa1474cafb5e68c93a9bd6cb45d8bb8e4f2cad2f1a0cc9439bae8ae88"}, 1938 | {file = "pyarrow-7.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:e3fe34bcfc28d9c4a747adc3926d2307a04c5c50b89155946739515ccfe5eab0"}, 1939 | {file = "pyarrow-7.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:040dce5345603e4e621bcf4f3b21f18d557852e7b15307e559bb14c8951c8714"}, 1940 | {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed4b647c3345ae3463d341a9d28d0260cd302fb92ecf4e2e3e0f1656d6e0e55c"}, 1941 | {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7fecd5d5604f47e003f50887a42aee06cb8b7bf8e8bf7dc543a22331d9ba832"}, 1942 | {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f2d00b892fe865e43346acb78761ba268f8bb1cbdba588816590abcb780ee3d"}, 1943 | {file = "pyarrow-7.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f439f7d77201681fd31391d189aa6b1322d27c9311a8f2fce7d23972471b02b6"}, 1944 | {file = "pyarrow-7.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:3e06b0e29ce1e32f219c670c6b31c33d25a5b8e29c7828f873373aab78bf30a5"}, 1945 | {file = "pyarrow-7.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:13dc05bcf79dbc1bd2de1b05d26eb64824b85883d019d81ca3c2eca9b68b5a44"}, 1946 | {file = "pyarrow-7.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:06183a7ff2b0c030ec0413fc4dc98abad8cf336c78c280a0b7f4bcbebb78d125"}, 1947 | {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:702c5a9f960b56d03569eaaca2c1a05e8728f05ea1a2138ef64234aa53cd5884"}, 1948 | {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7313038203df77ec4092d6363dbc0945071caa72635f365f2b1ae0dd7469865"}, 1949 | {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e87d1f7dc7a0b2ecaeb0c7a883a85710f5b5626d4134454f905571c04bc73d5a"}, 1950 | {file = "pyarrow-7.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ba69488ae25c7fde1a2ae9ea29daf04d676de8960ffd6f82e1e13ca945bb5861"}, 1951 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:11a591f11d2697c751261c9d57e6e5b0d38fdc7f0cc57f4fd6edc657da7737df"}, 1952 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:6183c700877852dc0f8a76d4c0c2ffd803ba459e2b4a452e355c2d58d48cf39f"}, 1953 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1748154714b543e6ae8452a68d4af85caf5298296a7e5d4d00f1b3021838ac6"}, 1954 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcc8f934c7847a88f13ec35feecffb61fe63bb7a3078bd98dd353762e969ce60"}, 1955 | {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:759f59ac77b84878dbd54d06cf6df74ff781b8e7cf9313eeffbb5ec97b94385c"}, 1956 | {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d3e3f93ac2993df9c5e1922eab7bdea047b9da918a74e52145399bc1f0099a3"}, 1957 | {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:306120af554e7e137895254a3b4741fad682875a5f6403509cd276de3fe5b844"}, 1958 | {file = "pyarrow-7.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:087769dac6e567d58d59b94c4f866b3356c00d3db5b261387ece47e7324c2150"}, 1959 | {file = "pyarrow-7.0.0.tar.gz", hash = "sha256:da656cad3c23a2ebb6a307ab01d35fce22f7850059cffafcb90d12590f8f4f38"}, 1960 | ] 1961 | pycodestyle = [ 1962 | {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, 1963 | {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, 1964 | ] 1965 | pycparser = [ 1966 | {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, 1967 | {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, 1968 | ] 1969 | pydeck = [ 1970 | {file = "pydeck-0.7.1-py2.py3-none-any.whl", hash = "sha256:7fc49b00840608068b930f9269169c7c9f3198b8b4635c934ba6d887c4e54503"}, 1971 | {file = "pydeck-0.7.1.tar.gz", hash = "sha256:907601c99f7510e16d27d7cb62bfa145216d166a2b5c9c50cfe2b65b032ebd2e"}, 1972 | ] 1973 | pyflakes = [ 1974 | {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, 1975 | {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, 1976 | ] 1977 | pygments = [ 1978 | {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, 1979 | {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, 1980 | ] 1981 | pympler = [ 1982 | {file = "Pympler-1.0.1-py3-none-any.whl", hash = "sha256:d260dda9ae781e1eab6ea15bacb84015849833ba5555f141d2d9b7b7473b307d"}, 1983 | {file = "Pympler-1.0.1.tar.gz", hash = "sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa"}, 1984 | ] 1985 | pyparsing = [ 1986 | {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, 1987 | {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, 1988 | ] 1989 | pyrsistent = [ 1990 | {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"}, 1991 | {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26"}, 1992 | {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e"}, 1993 | {file = "pyrsistent-0.18.1-cp310-cp310-win32.whl", hash = "sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6"}, 1994 | {file = "pyrsistent-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec"}, 1995 | {file = "pyrsistent-0.18.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b"}, 1996 | {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc"}, 1997 | {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22"}, 1998 | {file = "pyrsistent-0.18.1-cp37-cp37m-win32.whl", hash = "sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8"}, 1999 | {file = "pyrsistent-0.18.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286"}, 2000 | {file = "pyrsistent-0.18.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6"}, 2001 | {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec"}, 2002 | {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c"}, 2003 | {file = "pyrsistent-0.18.1-cp38-cp38-win32.whl", hash = "sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca"}, 2004 | {file = "pyrsistent-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a"}, 2005 | {file = "pyrsistent-0.18.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5"}, 2006 | {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045"}, 2007 | {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c"}, 2008 | {file = "pyrsistent-0.18.1-cp39-cp39-win32.whl", hash = "sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc"}, 2009 | {file = "pyrsistent-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07"}, 2010 | {file = "pyrsistent-0.18.1.tar.gz", hash = "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96"}, 2011 | ] 2012 | pytest = [ 2013 | {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, 2014 | {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, 2015 | ] 2016 | python-dateutil = [ 2017 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 2018 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 2019 | ] 2020 | pytz = [ 2021 | {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, 2022 | {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, 2023 | ] 2024 | pytz-deprecation-shim = [ 2025 | {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"}, 2026 | {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"}, 2027 | ] 2028 | pywin32 = [ 2029 | {file = "pywin32-303-cp310-cp310-win32.whl", hash = "sha256:6fed4af057039f309263fd3285d7b8042d41507343cd5fa781d98fcc5b90e8bb"}, 2030 | {file = "pywin32-303-cp310-cp310-win_amd64.whl", hash = "sha256:51cb52c5ec6709f96c3f26e7795b0bf169ee0d8395b2c1d7eb2c029a5008ed51"}, 2031 | {file = "pywin32-303-cp311-cp311-win32.whl", hash = "sha256:d9b5d87ca944eb3aa4cd45516203ead4b37ab06b8b777c54aedc35975dec0dee"}, 2032 | {file = "pywin32-303-cp311-cp311-win_amd64.whl", hash = "sha256:fcf44032f5b14fcda86028cdf49b6ebdaea091230eb0a757282aa656e4732439"}, 2033 | {file = "pywin32-303-cp36-cp36m-win32.whl", hash = "sha256:aad484d52ec58008ca36bd4ad14a71d7dd0a99db1a4ca71072213f63bf49c7d9"}, 2034 | {file = "pywin32-303-cp36-cp36m-win_amd64.whl", hash = "sha256:2a09632916b6bb231ba49983fe989f2f625cea237219530e81a69239cd0c4559"}, 2035 | {file = "pywin32-303-cp37-cp37m-win32.whl", hash = "sha256:b1675d82bcf6dbc96363fca747bac8bff6f6e4a447a4287ac652aa4b9adc796e"}, 2036 | {file = "pywin32-303-cp37-cp37m-win_amd64.whl", hash = "sha256:c268040769b48a13367221fced6d4232ed52f044ffafeda247bd9d2c6bdc29ca"}, 2037 | {file = "pywin32-303-cp38-cp38-win32.whl", hash = "sha256:5f9ec054f5a46a0f4dfd72af2ce1372f3d5a6e4052af20b858aa7df2df7d355b"}, 2038 | {file = "pywin32-303-cp38-cp38-win_amd64.whl", hash = "sha256:793bf74fce164bcffd9d57bb13c2c15d56e43c9542a7b9687b4fccf8f8a41aba"}, 2039 | {file = "pywin32-303-cp39-cp39-win32.whl", hash = "sha256:7d3271c98434617a11921c5ccf74615794d97b079e22ed7773790822735cc352"}, 2040 | {file = "pywin32-303-cp39-cp39-win_amd64.whl", hash = "sha256:79cbb862c11b9af19bcb682891c1b91942ec2ff7de8151e2aea2e175899cda34"}, 2041 | ] 2042 | pywinpty = [ 2043 | {file = "pywinpty-2.0.5-cp310-none-win_amd64.whl", hash = "sha256:f86c76e2881c37e69678cbbf178109f8da1fa8584db24d58e1b9369b0276cfcb"}, 2044 | {file = "pywinpty-2.0.5-cp37-none-win_amd64.whl", hash = "sha256:ff9b52f182650cfdf3db1b264a6fe0963eb9d996a7a1fa843ac406c1e32111f8"}, 2045 | {file = "pywinpty-2.0.5-cp38-none-win_amd64.whl", hash = "sha256:651ee1467bd7eb6f64d44dbc954b7ab7d15ab6d8adacc4e13299692c67c5d5d2"}, 2046 | {file = "pywinpty-2.0.5-cp39-none-win_amd64.whl", hash = "sha256:e59a508ae78374febada3e53b5bbc90b5ad07ae68cbfd72a2e965f9793ae04f3"}, 2047 | {file = "pywinpty-2.0.5.tar.gz", hash = "sha256:e125d3f1804d8804952b13e33604ad2ca8b9b2cac92b27b521c005d1604794f8"}, 2048 | ] 2049 | pyzmq = [ 2050 | {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:6b217b8f9dfb6628f74b94bdaf9f7408708cb02167d644edca33f38746ca12dd"}, 2051 | {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2841997a0d85b998cbafecb4183caf51fd19c4357075dfd33eb7efea57e4c149"}, 2052 | {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f89468059ebc519a7acde1ee50b779019535db8dcf9b8c162ef669257fef7a93"}, 2053 | {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea12133df25e3a6918718fbb9a510c6ee5d3fdd5a346320421aac3882f4feeea"}, 2054 | {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c532fd68b93998aab92356be280deec5de8f8fe59cd28763d2cc8a58747b7f"}, 2055 | {file = "pyzmq-22.3.0-cp310-cp310-win32.whl", hash = "sha256:67db33bea0a29d03e6eeec55a8190e033318cee3cbc732ba8fd939617cbf762d"}, 2056 | {file = "pyzmq-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:7661fc1d5cb73481cf710a1418a4e1e301ed7d5d924f91c67ba84b2a1b89defd"}, 2057 | {file = "pyzmq-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79244b9e97948eaf38695f4b8e6fc63b14b78cc37f403c6642ba555517ac1268"}, 2058 | {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab888624ed68930442a3f3b0b921ad7439c51ba122dbc8c386e6487a658e4a4e"}, 2059 | {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18cd854b423fce44951c3a4d3e686bac8f1243d954f579e120a1714096637cc0"}, 2060 | {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:de8df0684398bd74ad160afdc2a118ca28384ac6f5e234eb0508858d8d2d9364"}, 2061 | {file = "pyzmq-22.3.0-cp36-cp36m-win32.whl", hash = "sha256:3c1895c95be92600233e476fe283f042e71cf8f0b938aabf21b7aafa62a8dac9"}, 2062 | {file = "pyzmq-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:851977788b9caa8ed011f5f643d3ee8653af02c5fc723fa350db5125abf2be7b"}, 2063 | {file = "pyzmq-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4ebed0977f92320f6686c96e9e8dd29eed199eb8d066936bac991afc37cbb70"}, 2064 | {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42abddebe2c6a35180ca549fadc7228d23c1e1f76167c5ebc8a936b5804ea2df"}, 2065 | {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1e41b32d6f7f9c26bc731a8b529ff592f31fc8b6ef2be9fa74abd05c8a342d7"}, 2066 | {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:be4e0f229cf3a71f9ecd633566bd6f80d9fa6afaaff5489492be63fe459ef98c"}, 2067 | {file = "pyzmq-22.3.0-cp37-cp37m-win32.whl", hash = "sha256:7c58f598d9fcc52772b89a92d72bf8829c12d09746a6d2c724c5b30076c1f11d"}, 2068 | {file = "pyzmq-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2b97502c16a5ec611cd52410bdfaab264997c627a46b0f98d3f666227fd1ea2d"}, 2069 | {file = "pyzmq-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d728b08448e5ac3e4d886b165385a262883c34b84a7fe1166277fe675e1c197a"}, 2070 | {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:480b9931bfb08bf8b094edd4836271d4d6b44150da051547d8c7113bf947a8b0"}, 2071 | {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc09198e4073e6015d9a8ea093fc348d4e59de49382476940c3dd9ae156fba8"}, 2072 | {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ca6cd58f62a2751728016d40082008d3b3412a7f28ddfb4a2f0d3c130f69e74"}, 2073 | {file = "pyzmq-22.3.0-cp38-cp38-win32.whl", hash = "sha256:c0f84360dcca3481e8674393bdf931f9f10470988f87311b19d23cda869bb6b7"}, 2074 | {file = "pyzmq-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f762442bab706fd874064ca218b33a1d8e40d4938e96c24dafd9b12e28017f45"}, 2075 | {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:954e73c9cd4d6ae319f1c936ad159072b6d356a92dcbbabfd6e6204b9a79d356"}, 2076 | {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f43b4a2e6218371dd4f41e547bd919ceeb6ebf4abf31a7a0669cd11cd91ea973"}, 2077 | {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:acebba1a23fb9d72b42471c3771b6f2f18dcd46df77482612054bd45c07dfa36"}, 2078 | {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cf98fd7a6c8aaa08dbc699ffae33fd71175696d78028281bc7b832b26f00ca57"}, 2079 | {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d072f7dfbdb184f0786d63bda26e8a0882041b1e393fbe98940395f7fab4c5e2"}, 2080 | {file = "pyzmq-22.3.0-cp39-cp39-win32.whl", hash = "sha256:e6a02cf7271ee94674a44f4e62aa061d2d049001c844657740e156596298b70b"}, 2081 | {file = "pyzmq-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d3dcb5548ead4f1123851a5ced467791f6986d68c656bc63bfff1bf9e36671e2"}, 2082 | {file = "pyzmq-22.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a4c9886d61d386b2b493377d980f502186cd71d501fffdba52bd2a0880cef4f"}, 2083 | {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:80e043a89c6cadefd3a0712f8a1322038e819ebe9dbac7eca3bce1721bcb63bf"}, 2084 | {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1621e7a2af72cced1f6ec8ca8ca91d0f76ac236ab2e8828ac8fe909512d566cb"}, 2085 | {file = "pyzmq-22.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d6157793719de168b199194f6b6173f0ccd3bf3499e6870fac17086072e39115"}, 2086 | {file = "pyzmq-22.3.0.tar.gz", hash = "sha256:8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c"}, 2087 | ] 2088 | requests = [ 2089 | {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, 2090 | {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, 2091 | ] 2092 | semver = [ 2093 | {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, 2094 | {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, 2095 | ] 2096 | send2trash = [ 2097 | {file = "Send2Trash-1.8.0-py3-none-any.whl", hash = "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"}, 2098 | {file = "Send2Trash-1.8.0.tar.gz", hash = "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d"}, 2099 | ] 2100 | six = [ 2101 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 2102 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 2103 | ] 2104 | smmap = [ 2105 | {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, 2106 | {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, 2107 | ] 2108 | soupsieve = [ 2109 | {file = "soupsieve-2.3.1-py3-none-any.whl", hash = "sha256:1a3cca2617c6b38c0343ed661b1fa5de5637f257d4fe22bd9f1338010a1efefb"}, 2110 | {file = "soupsieve-2.3.1.tar.gz", hash = "sha256:b8d49b1cd4f037c7082a9683dfa1801aa2597fb11c3a1155b7a5b94829b4f1f9"}, 2111 | ] 2112 | streamlit = [ 2113 | {file = "streamlit-1.8.1-py2.py3-none-any.whl", hash = "sha256:24d19c420d760c88eafc3f9508cbbd77ddab4a99a3a3b4db06f7741531f120a5"}, 2114 | {file = "streamlit-1.8.1.tar.gz", hash = "sha256:507c84439996c6ffed150a2bdd1352b46acc8a476a1012e73241f7cc2fda3056"}, 2115 | ] 2116 | terminado = [ 2117 | {file = "terminado-0.13.3-py3-none-any.whl", hash = "sha256:874d4ea3183536c1782d13c7c91342ef0cf4e5ee1d53633029cbc972c8760bd8"}, 2118 | {file = "terminado-0.13.3.tar.gz", hash = "sha256:94d1cfab63525993f7d5c9b469a50a18d0cdf39435b59785715539dd41e36c0d"}, 2119 | ] 2120 | testpath = [ 2121 | {file = "testpath-0.6.0-py3-none-any.whl", hash = "sha256:8ada9f80a2ac6fb0391aa7cdb1a7d11cfa8429f693eda83f74dde570fe6fa639"}, 2122 | {file = "testpath-0.6.0.tar.gz", hash = "sha256:2f1b97e6442c02681ebe01bd84f531028a7caea1af3825000f52345c30285e0f"}, 2123 | ] 2124 | toml = [ 2125 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 2126 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 2127 | ] 2128 | tomli = [ 2129 | {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, 2130 | {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, 2131 | ] 2132 | toolz = [ 2133 | {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, 2134 | {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, 2135 | ] 2136 | tornado = [ 2137 | {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, 2138 | {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, 2139 | {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, 2140 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, 2141 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, 2142 | {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, 2143 | {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, 2144 | {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, 2145 | {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, 2146 | {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, 2147 | {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, 2148 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, 2149 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, 2150 | {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, 2151 | {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, 2152 | {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, 2153 | {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, 2154 | {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, 2155 | {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, 2156 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, 2157 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, 2158 | {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, 2159 | {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, 2160 | {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, 2161 | {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, 2162 | {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, 2163 | {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, 2164 | {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, 2165 | {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, 2166 | {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, 2167 | {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, 2168 | {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, 2169 | {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, 2170 | {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, 2171 | {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, 2172 | {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, 2173 | {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, 2174 | {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, 2175 | {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, 2176 | {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, 2177 | {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, 2178 | ] 2179 | traitlets = [ 2180 | {file = "traitlets-5.1.1-py3-none-any.whl", hash = "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"}, 2181 | {file = "traitlets-5.1.1.tar.gz", hash = "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7"}, 2182 | ] 2183 | typed-ast = [ 2184 | {file = "typed_ast-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266"}, 2185 | {file = "typed_ast-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596"}, 2186 | {file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc2542e83ac8399752bc16e0b35e038bdb659ba237f4222616b4e83fb9654985"}, 2187 | {file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76"}, 2188 | {file = "typed_ast-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:18fe320f354d6f9ad3147859b6e16649a0781425268c4dde596093177660e71a"}, 2189 | {file = "typed_ast-1.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:31d8c6b2df19a777bc8826770b872a45a1f30cfefcfd729491baa5237faae837"}, 2190 | {file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:963a0ccc9a4188524e6e6d39b12c9ca24cc2d45a71cfdd04a26d883c922b4b78"}, 2191 | {file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0eb77764ea470f14fcbb89d51bc6bbf5e7623446ac4ed06cbd9ca9495b62e36e"}, 2192 | {file = "typed_ast-1.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:294a6903a4d087db805a7656989f613371915fc45c8cc0ddc5c5a0a8ad9bea4d"}, 2193 | {file = "typed_ast-1.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26a432dc219c6b6f38be20a958cbe1abffcc5492821d7e27f08606ef99e0dffd"}, 2194 | {file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7407cfcad702f0b6c0e0f3e7ab876cd1d2c13b14ce770e412c0c4b9728a0f88"}, 2195 | {file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f30ddd110634c2d7534b2d4e0e22967e88366b0d356b24de87419cc4410c41b7"}, 2196 | {file = "typed_ast-1.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30"}, 2197 | {file = "typed_ast-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:90904d889ab8e81a956f2c0935a523cc4e077c7847a836abee832f868d5c26a4"}, 2198 | {file = "typed_ast-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bbebc31bf11762b63bf61aaae232becb41c5bf6b3461b80a4df7e791fabb3aca"}, 2199 | {file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29dd9a3a9d259c9fa19d19738d021632d673f6ed9b35a739f48e5f807f264fb"}, 2200 | {file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:58ae097a325e9bb7a684572d20eb3e1809802c5c9ec7108e85da1eb6c1a3331b"}, 2201 | {file = "typed_ast-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:da0a98d458010bf4fe535f2d1e367a2e2060e105978873c04c04212fb20543f7"}, 2202 | {file = "typed_ast-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:33b4a19ddc9fc551ebabca9765d54d04600c4a50eda13893dadf67ed81d9a098"}, 2203 | {file = "typed_ast-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1098df9a0592dd4c8c0ccfc2e98931278a6c6c53cb3a3e2cf7e9ee3b06153344"}, 2204 | {file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c47c3b43fe3a39ddf8de1d40dbbfca60ac8530a36c9b198ea5b9efac75c09e"}, 2205 | {file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f290617f74a610849bd8f5514e34ae3d09eafd521dceaa6cf68b3f4414266d4e"}, 2206 | {file = "typed_ast-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:df05aa5b241e2e8045f5f4367a9f6187b09c4cdf8578bb219861c4e27c443db5"}, 2207 | {file = "typed_ast-1.5.2.tar.gz", hash = "sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27"}, 2208 | ] 2209 | typing-extensions = [ 2210 | {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, 2211 | {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, 2212 | ] 2213 | tzdata = [ 2214 | {file = "tzdata-2022.1-py2.py3-none-any.whl", hash = "sha256:238e70234214138ed7b4e8a0fab0e5e13872edab3be586ab8198c407620e2ab9"}, 2215 | {file = "tzdata-2022.1.tar.gz", hash = "sha256:8b536a8ec63dc0751342b3984193a3118f8fca2afe25752bb9b7fffd398552d3"}, 2216 | ] 2217 | tzlocal = [ 2218 | {file = "tzlocal-4.1-py3-none-any.whl", hash = "sha256:28ba8d9fcb6c9a782d6e0078b4f6627af1ea26aeaa32b4eab5324abc7df4149f"}, 2219 | {file = "tzlocal-4.1.tar.gz", hash = "sha256:0f28015ac68a5c067210400a9197fc5d36ba9bc3f8eaf1da3cbd59acdfed9e09"}, 2220 | ] 2221 | urllib3 = [ 2222 | {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, 2223 | {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, 2224 | ] 2225 | validators = [ 2226 | {file = "validators-0.18.2-py3-none-any.whl", hash = "sha256:0143dcca8a386498edaf5780cbd5960da1a4c85e0719f3ee5c9b41249c4fefbd"}, 2227 | {file = "validators-0.18.2.tar.gz", hash = "sha256:37cd9a9213278538ad09b5b9f9134266e7c226ab1fede1d500e29e0a8fbb9ea6"}, 2228 | ] 2229 | watchdog = [ 2230 | {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:177bae28ca723bc00846466016d34f8c1d6a621383b6caca86745918d55c7383"}, 2231 | {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d1cf7dfd747dec519486a98ef16097e6c480934ef115b16f18adb341df747a4"}, 2232 | {file = "watchdog-2.1.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f14ce6adea2af1bba495acdde0e510aecaeb13b33f7bd2f6324e551b26688ca"}, 2233 | {file = "watchdog-2.1.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4d0e98ac2e8dd803a56f4e10438b33a2d40390a72750cff4939b4b274e7906fa"}, 2234 | {file = "watchdog-2.1.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:81982c7884aac75017a6ecc72f1a4fedbae04181a8665a34afce9539fc1b3fab"}, 2235 | {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0b4a1fe6201c6e5a1926f5767b8664b45f0fcb429b62564a41f490ff1ce1dc7a"}, 2236 | {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6e6ae29b72977f2e1ee3d0b760d7ee47896cb53e831cbeede3e64485e5633cc8"}, 2237 | {file = "watchdog-2.1.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b9777664848160449e5b4260e0b7bc1ae0f6f4992a8b285db4ec1ef119ffa0e2"}, 2238 | {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:19b36d436578eb437e029c6b838e732ed08054956366f6dd11875434a62d2b99"}, 2239 | {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b61acffaf5cd5d664af555c0850f9747cc5f2baf71e54bbac164c58398d6ca7b"}, 2240 | {file = "watchdog-2.1.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1e877c70245424b06c41ac258023ea4bd0c8e4ff15d7c1368f17cd0ae6e351dd"}, 2241 | {file = "watchdog-2.1.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d802d65262a560278cf1a65ef7cae4e2bc7ecfe19e5451349e4c67e23c9dc420"}, 2242 | {file = "watchdog-2.1.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b3750ee5399e6e9c69eae8b125092b871ee9e2fcbd657a92747aea28f9056a5c"}, 2243 | {file = "watchdog-2.1.7-py3-none-manylinux2014_aarch64.whl", hash = "sha256:ed6d9aad09a2a948572224663ab00f8975fae242aa540509737bb4507133fa2d"}, 2244 | {file = "watchdog-2.1.7-py3-none-manylinux2014_armv7l.whl", hash = "sha256:b26e13e8008dcaea6a909e91d39b629a39635d1a8a7239dd35327c74f4388601"}, 2245 | {file = "watchdog-2.1.7-py3-none-manylinux2014_i686.whl", hash = "sha256:0908bb50f6f7de54d5d31ec3da1654cb7287c6b87bce371954561e6de379d690"}, 2246 | {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64.whl", hash = "sha256:bdcbf75580bf4b960fb659bbccd00123d83119619195f42d721e002c1621602f"}, 2247 | {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:81a5861d0158a7e55fe149335fb2bbfa6f48cbcbd149b52dbe2cd9a544034bbd"}, 2248 | {file = "watchdog-2.1.7-py3-none-manylinux2014_s390x.whl", hash = "sha256:03b43d583df0f18782a0431b6e9e9965c5b3f7cf8ec36a00b930def67942c385"}, 2249 | {file = "watchdog-2.1.7-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ae934e34c11aa8296c18f70bf66ed60e9870fcdb4cc19129a04ca83ab23e7055"}, 2250 | {file = "watchdog-2.1.7-py3-none-win32.whl", hash = "sha256:49639865e3db4be032a96695c98ac09eed39bbb43fe876bb217da8f8101689a6"}, 2251 | {file = "watchdog-2.1.7-py3-none-win_amd64.whl", hash = "sha256:340b875aecf4b0e6672076a6f05cfce6686935559bb6d34cebedee04126a9566"}, 2252 | {file = "watchdog-2.1.7-py3-none-win_ia64.whl", hash = "sha256:351e09b6d9374d5bcb947e6ac47a608ec25b9d70583e9db00b2fcdb97b00b572"}, 2253 | {file = "watchdog-2.1.7.tar.gz", hash = "sha256:3fd47815353be9c44eebc94cc28fe26b2b0c5bd889dafc4a5a7cbdf924143480"}, 2254 | ] 2255 | wcwidth = [ 2256 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, 2257 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, 2258 | ] 2259 | webencodings = [ 2260 | {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, 2261 | {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, 2262 | ] 2263 | widgetsnbextension = [ 2264 | {file = "widgetsnbextension-3.6.0-py2.py3-none-any.whl", hash = "sha256:4fd321cad39fdcf8a8e248a657202d42917ada8e8ed5dd3f60f073e0d54ceabd"}, 2265 | {file = "widgetsnbextension-3.6.0.tar.gz", hash = "sha256:e84a7a9fcb9baf3d57106e184a7389a8f8eb935bf741a5eb9d60aa18cc029a80"}, 2266 | ] 2267 | zipp = [ 2268 | {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, 2269 | {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, 2270 | ] 2271 | -------------------------------------------------------------------------------- /poetry.toml: -------------------------------------------------------------------------------- 1 | [virtualenvs] 2 | in-project = true 3 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "streamlit-sync" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Wauplin "] 6 | license = "MIT" 7 | readme = "README.md" 8 | # repository = "https://github.com/Wauplin" 9 | 10 | [tool.poetry.dependencies] 11 | python = "^3.7" 12 | streamlit = "^1.0.0" 13 | diskcache = "^5.4.0" 14 | 15 | [tool.poetry.dev-dependencies] 16 | black = "^21.12b0" 17 | mypy = "^0.931" 18 | flake8 = "^4.0.1" 19 | isort = "^5.10.1" 20 | flake8-bugbear = "^22.1.11" 21 | pytest = "^6.2.5" 22 | 23 | [build-system] 24 | requires = ["poetry-core>=1.0.0"] 25 | build-backend = "poetry.core.masonry.api" 26 | 27 | [tool.black] 28 | include = '\.pyi?$' 29 | exclude = ''' 30 | /( 31 | \.git 32 | | \.hg 33 | | \.mypy_cache 34 | | \.tox 35 | | \.venv 36 | | _build 37 | | buck-out 38 | | build 39 | | dist 40 | )/ 41 | ''' 42 | 43 | [tool.isort] 44 | include_trailing_comma = true 45 | multi_line_output = 3 46 | line_length = 88 47 | skip = ['.venv'] 48 | -------------------------------------------------------------------------------- /streamlit_sync/__init__.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from typing import Optional, Union 3 | 4 | from .rooms import delete_room, enter_room, exit_room 5 | from .synced_state import get_synced_state as _get_synced_state 6 | from .ui import select_room_widget 7 | from .utils import get_not_synced_key 8 | 9 | 10 | class sync: 11 | """Sync your Streamlit app with other sessions of the room !""" 12 | 13 | def __init__( 14 | self, room_name: str, cache_dir: Optional[Union[str, Path]] = None 15 | ) -> None: 16 | if cache_dir is not None: 17 | # Attach to disk from caching 18 | _get_synced_state(room_name).attach_to_disk(Path(cache_dir)) 19 | 20 | self.room_name = room_name 21 | self._inner_sync() 22 | 23 | def __enter__(self) -> "sync": 24 | return self 25 | 26 | def __exit__(self, type, value, traceback) -> None: # type: ignore 27 | self._inner_sync() 28 | 29 | def _inner_sync(self) -> None: 30 | synced_state = _get_synced_state(self.room_name) 31 | synced_state.register_session() 32 | synced_state.sync() 33 | -------------------------------------------------------------------------------- /streamlit_sync/exceptions.py: -------------------------------------------------------------------------------- 1 | """Define exceptions.""" 2 | 3 | 4 | class StreamlitSyncException(Exception): 5 | """Any exception happening with Streamlit Sync.""" 6 | -------------------------------------------------------------------------------- /streamlit_sync/rooms.py: -------------------------------------------------------------------------------- 1 | """High level API to manage rooms.""" 2 | import streamlit as st 3 | 4 | from . import st_hack 5 | from .exceptions import StreamlitSyncException 6 | from .synced_state import get_synced_state 7 | from .utils import LAST_SYNCED_KEY, ROOM_NAME_KEY 8 | 9 | 10 | def enter_room(room_name: str) -> None: 11 | """Enter a room from current session (register and rerun).""" 12 | st.session_state[ROOM_NAME_KEY] = room_name 13 | st.experimental_rerun() 14 | 15 | 16 | def exit_room() -> None: 17 | """Exit room from current session (unregister, reset values and rerun).""" 18 | # Forget the room 19 | try: 20 | room_name = st.session_state.pop(ROOM_NAME_KEY) 21 | except KeyError: 22 | raise StreamlitSyncException("Cannot exit a room: currently not in a room.") 23 | 24 | del st.session_state[LAST_SYNCED_KEY] 25 | 26 | # Unregister from room 27 | synced_state = get_synced_state(room_name) 28 | synced_state.unregister_session() 29 | 30 | # Reset values set by room 31 | st_hack.del_internal_values(synced_state.state.keys()) 32 | 33 | # Rerun to re-update frontend accordingly 34 | st.experimental_rerun() 35 | 36 | 37 | def delete_room(room_name: str) -> None: 38 | """Delete a room.""" 39 | get_synced_state(room_name).delete() 40 | -------------------------------------------------------------------------------- /streamlit_sync/st_hack.py: -------------------------------------------------------------------------------- 1 | """Module that contains all calls to internal APIs of Streamlit. 2 | 3 | It is most likely that this module will break in future updates of Streamlit. 4 | """ 5 | import re 6 | from typing import Any, Iterable, Mapping, Optional, Tuple 7 | 8 | from streamlit.server.server import Server 9 | from streamlit.state.session_state import ( 10 | GENERATED_WIDGET_KEY_PREFIX, 11 | STREAMLIT_INTERNAL_KEY_PREFIX, 12 | SessionState, 13 | ) 14 | 15 | from .exceptions import StreamlitSyncException 16 | 17 | try: 18 | from streamlit.state.auto_session_state import get_session_state 19 | except ImportError: 20 | # streamlit < 1.7 21 | from streamlit.state.session_state import get_session_state 22 | 23 | try: 24 | from streamlit.scriptrunner import get_script_run_ctx 25 | except ImportError: 26 | try: 27 | # streamlit < 1.7 28 | from streamlit.script_run_context import get_script_run_ctx 29 | except ImportError: 30 | # streamlit < 1.4 31 | from streamlit.report_thread import get_report_ctx as get_script_run_ctx 32 | 33 | 34 | try: 35 | from streamlit.state.session_state import _is_keyed_widget_id 36 | except ImportError: 37 | from streamlit.state.session_state import is_keyed_widget_id as _is_keyed_widget_id 38 | 39 | 40 | _WIDGET_ID_REGEX = re.compile( 41 | re.escape(GENERATED_WIDGET_KEY_PREFIX) + r"-[0-9a-f]{32}-(?P.*)" 42 | ) 43 | 44 | 45 | def widget_id_to_user_key(widget_id: str) -> str: 46 | """Return user key if widget is a keyed-widget, else the widget id itself.""" 47 | if _is_keyed_widget_id(widget_id): 48 | match = _WIDGET_ID_REGEX.match(widget_id) 49 | if match is None: 50 | # If broken, look at implementation in 51 | # - https://github.com/streamlit/streamlit/blob/develop/lib/streamlit/state/widgets.py#L258 # noqa: E501 52 | # - https://github.com/streamlit/streamlit/blob/d07ffac8927e1a35b34684b55222854b3dd5a9a7/lib/streamlit/state/widgets.py#L258 # noqa: E501 53 | raise StreamlitSyncException( 54 | "Broken streamlit-sync library: Streamlit has most likely " 55 | "changed the widget id generation." 56 | ) 57 | return match["user_key"] 58 | return widget_id 59 | 60 | 61 | # Monkeypatch SessionState 62 | if not getattr(SessionState, "_is_patched_by_streamlit_sync", False): 63 | 64 | def _always_set_frontend_value_if_changed( 65 | self: SessionState, widget_id: str, user_key: Optional[str] 66 | ) -> bool: 67 | """Keep `widget_state` and `session_state` in sync when a widget is registered. 68 | 69 | By default if a value has changed, the frontend widget will be updated only if 70 | it's a user-keyed-widget. I guess this is done because user-keyed-widget can 71 | be manually updated from st.session_state but not the "implicitly-keyed" 72 | widgets. 73 | 74 | In our case, we want to update the frontend for any value change. 75 | 76 | See: 77 | - Streamlit >= 1.8 78 | - https://github.com/streamlit/streamlit/blob/develop/lib/streamlit/state/session_state.py#L599 # noqa: E501 79 | - https://github.com/streamlit/streamlit/blob/d07ffac8927e1a35b34684b55222854b3dd5a9a7/lib/streamlit/state/session_state.py#L599 # noqa: E501 80 | 81 | - Streamlit <= 1.7 82 | - https://github.com/streamlit/streamlit/blob/1.7.0/lib/streamlit/state/session_state.py#L596 # noqa: E501 83 | - https://github.com/streamlit/streamlit/blob/a3f1cef8e23a97188710b71c4cf927f4783f58c5/lib/streamlit/state/session_state.py#L596 # noqa: E501 84 | """ 85 | return self.is_new_state_value(user_key or widget_id) 86 | 87 | # For Streamlit >= 1.8 88 | initial_register_widget = getattr(SessionState, "register_widget", None) 89 | if initial_register_widget is not None: 90 | 91 | def _patched_register_widget( 92 | self: Any, metadata: Any, widget_id: str, user_key: Optional[str] 93 | ) -> Tuple[Any, bool]: 94 | assert initial_register_widget is not None 95 | widget_value, _ = initial_register_widget( 96 | self, metadata, widget_id, user_key 97 | ) 98 | return widget_value, _always_set_frontend_value_if_changed( 99 | self, widget_id, user_key 100 | ) 101 | 102 | SessionState.register_widget = _patched_register_widget 103 | 104 | # For streamlit < 1.8 105 | SessionState.should_set_frontend_state_value = _always_set_frontend_value_if_changed 106 | 107 | # Patch only once 108 | SessionState._is_patched_by_streamlit_sync = True 109 | 110 | 111 | def get_session_id() -> str: 112 | """Return current session id.""" 113 | ctx = get_script_run_ctx() 114 | assert ctx is not None # TODO: confirm this is true 115 | return ctx.session_id 116 | 117 | 118 | def is_trigger_value(key: str, internal_session_state: SessionState) -> bool: 119 | """Return True if widget is a of type "trigger_value" (e.g. a button). 120 | 121 | We don't want to propagate the effect of the button to avoid performing twice the 122 | action. 123 | """ 124 | widget_metadata = internal_session_state._new_widget_state.widget_metadata 125 | if key in widget_metadata: 126 | return widget_metadata[key].value_type == "trigger_value" 127 | return False 128 | 129 | 130 | def is_form_submitter_value(key: str) -> bool: 131 | """Check if the widget key refers to a submit button from a form. 132 | 133 | In this case, value is not synced. 134 | 135 | Example: 'FormSubmitter:my_form-Submit' 136 | """ 137 | return "FormSubmitter" in key and "-Submit" in key 138 | 139 | 140 | def set_internal_values(mapping: Mapping[str, Any]) -> None: 141 | """Set values to the streamlit internal session state.""" 142 | internal_state = get_session_state() 143 | for key, value in mapping.items(): 144 | internal_state[widget_id_to_user_key(key)] = value 145 | 146 | 147 | def del_internal_values(keys: Iterable[str]) -> None: 148 | """Delete values from the streamlit internal session state.""" 149 | internal_state = get_session_state() 150 | for key in keys: 151 | del internal_state[widget_id_to_user_key(key)] 152 | -------------------------------------------------------------------------------- /streamlit_sync/synced_state.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from itertools import chain 3 | from pathlib import Path 4 | from threading import Lock 5 | from typing import Any, Dict, Set 6 | 7 | import streamlit as st 8 | from diskcache import Cache, Index 9 | 10 | from . import st_hack 11 | from .exceptions import StreamlitSyncException 12 | from .utils import LAST_SYNCED_KEY, is_synced 13 | 14 | 15 | @st.experimental_singleton 16 | def get_existing_room_names() -> Set[str]: 17 | """Singleton containing all existing room names.""" 18 | return set() 19 | 20 | 21 | @st.experimental_singleton 22 | def get_synced_state(room_name: str) -> "_SyncedState": 23 | """Return the room synced state. 24 | 25 | Each room is a singleton, synced by all connected sessions.""" 26 | return _SyncedState(room_name=room_name) 27 | 28 | 29 | class _SyncedState: 30 | def __init__(self, room_name: str) -> None: 31 | self.room_name: str = room_name 32 | self._lock: Lock = Lock() 33 | self.use_cache = False 34 | 35 | with self._lock: 36 | self.last_updated: datetime = datetime.fromtimestamp(0) 37 | self._registered_sessions: Set[str] = set() 38 | self.state: Dict[str, Any] = {} 39 | 40 | def __repr__(self) -> str: 41 | rep = ( 42 | " int: 53 | """Return estimated number of action sessions. 54 | 55 | Might not be exact if a session has disconnected since last rerun. 56 | """ 57 | return len(self._registered_sessions) 58 | 59 | def attach_to_disk(self, cache_dir: Path) -> None: 60 | """Attach a room to disk for caching.""" 61 | room_cache_dir = cache_dir / self.room_name 62 | if self.use_cache: 63 | assert self.room_cache_dir is not None 64 | if self.room_cache_dir != room_cache_dir: 65 | raise StreamlitSyncException( 66 | f"Cannot attach room {self.room_name}" 67 | f" to cache dir {room_cache_dir}:" 68 | f" already attached to {self.room_cache_dir}" 69 | ) 70 | else: 71 | self.use_cache = True 72 | self.room_cache_dir: Path = room_cache_dir 73 | self._cache = Cache(self.room_cache_dir) 74 | self.state = Index.fromcache(self._cache) 75 | 76 | def delete(self) -> None: 77 | """Reset the room values and discard it from existing room. 78 | 79 | TODO: remove room from existing room names 80 | TODO: remove SyncedState from streamlit singleton 81 | TODO: implement delete when cache is used. 82 | """ 83 | raise NotImplementedError() 84 | 85 | def register_session(self) -> None: 86 | """Register a new session to the room.""" 87 | with self._lock: 88 | self._registered_sessions.add(st_hack.get_session_id()) 89 | get_existing_room_names().add(self.room_name) 90 | 91 | def unregister_session(self) -> None: 92 | """Unregister a session from the room.""" 93 | with self._lock: 94 | self._registered_sessions.discard(st_hack.get_session_id()) 95 | 96 | def sync(self) -> None: 97 | """Synchronize all session state values and widget with other sessions. 98 | 99 | Logic: 100 | 1. If the synced state has been updated since last time, update current 101 | session values and rerun the session. 102 | 103 | 2. Else, check for all values from streamlit (both widgets and session state) 104 | a. If at least 1 value has been updated, update the synced state and rerun 105 | all sessions. 106 | b. Else, do nothing. 107 | """ 108 | with self._lock: 109 | internal_session_state = st_hack.get_session_state() 110 | 111 | if st.session_state.get(LAST_SYNCED_KEY) != self.last_updated: 112 | # Means current SessionState is not synced with SyncedState 113 | # -> update streamlit internal state and reload 114 | st_hack.set_internal_values(self.state) 115 | st.session_state[LAST_SYNCED_KEY] = self.last_updated 116 | st.experimental_rerun() 117 | st.stop() 118 | else: 119 | 120 | internal_session_state._new_widget_state.widget_metadata 121 | 122 | # Check if new data from streamlit frontend 123 | updated_values = {} 124 | for key, value in chain( 125 | internal_session_state._new_session_state.items(), 126 | internal_session_state._new_widget_state.items(), 127 | st.session_state.items(), 128 | ): 129 | if st_hack.is_form_submitter_value(key): 130 | # Form widgets must not be synced 131 | continue 132 | 133 | if st_hack.is_trigger_value(key, internal_session_state): 134 | # Trigger values correspond to buttons 135 | # -> we don't want to propagate the effect of the button 136 | # to avoid performing twice the action 137 | continue 138 | 139 | if not is_synced(key): 140 | # Some keys are not synced 141 | continue 142 | 143 | key = st_hack.widget_id_to_user_key(key) 144 | 145 | if value != self.state.get(key): 146 | updated_values[key] = value 147 | 148 | # Current SessionState has newer values than _SyncedState 149 | # -> update _SyncedState values 150 | # -> trigger rerun for all connected sessions 151 | if len(updated_values) > 0: 152 | self.state.update(updated_values) 153 | self.last_updated = datetime.now() 154 | self._trigger_sessions() 155 | st.session_state[LAST_SYNCED_KEY] = self.last_updated 156 | 157 | def _trigger_sessions(self) -> None: 158 | """Trigger rerun on all active sessions except the session that triggered it. 159 | 160 | If a session is not active anymore, it is removed from the room. Most probably 161 | the user closed the tab. 162 | """ 163 | current_session_id = st_hack.get_session_id() 164 | inactive_sessions = set() 165 | for session_id in self._registered_sessions: 166 | if session_id != current_session_id: 167 | # We need to trigger rerun in other sessions. 168 | # => We can't use st.experimental_rerun() 169 | session = st_hack.Server.get_current().get_session_by_id(session_id) 170 | if session is None: 171 | # It is most likely that this session stopped 172 | inactive_sessions.add(session_id) 173 | continue 174 | st_hack.Server.get_current().get_session_by_id( 175 | session_id 176 | ).request_rerun(None) 177 | 178 | for session_id in inactive_sessions: 179 | self._registered_sessions.discard(session_id) 180 | -------------------------------------------------------------------------------- /streamlit_sync/ui.py: -------------------------------------------------------------------------------- 1 | """Define a sidebar UI to enter and exit rooms. 2 | 3 | The select_room widget is just a simple example of how to use the ./rooms.py API. 4 | """ 5 | 6 | from pathlib import Path 7 | from typing import Optional, Set, Union 8 | 9 | import streamlit as st 10 | 11 | from .rooms import enter_room, exit_room 12 | from .synced_state import get_existing_room_names, get_synced_state 13 | from .utils import ROOM_NAME_KEY, get_not_synced_key 14 | 15 | 16 | def select_room_widget(cache_dir: Optional[Union[str, Path]]) -> str: 17 | if st.session_state.get(ROOM_NAME_KEY) is not None: 18 | # Is already in a room 19 | room_name = st.session_state[ROOM_NAME_KEY] 20 | with st.sidebar.expander( 21 | f'Synced room "{room_name}" ({_get_room_status(room_name)})' 22 | ): 23 | if st.button("Exit room"): 24 | exit_room() 25 | return room_name 26 | 27 | else: 28 | st.sidebar.title("Select a synced room") 29 | 30 | room_name = None 31 | existing_rooms = get_existing_room_names() | _list_from_cache_dir(cache_dir) 32 | options = [None] # None for "create new room" 33 | if existing_rooms: 34 | options += sorted(existing_rooms) 35 | 36 | room_name = st.sidebar.radio( 37 | "Existing rooms", 38 | options, 39 | key=get_not_synced_key("existing_rooms"), 40 | format_func=_radio_format_func, 41 | ) 42 | 43 | # Enter room if not None 44 | if room_name is not None: 45 | enter_room(room_name) 46 | 47 | # Else: create new room 48 | with st.sidebar.form( 49 | key=get_not_synced_key("select_room_form"), clear_on_submit=True 50 | ): 51 | new_room_name = st.text_input("New room name") 52 | submit = st.form_submit_button(label="Create") 53 | 54 | if submit: 55 | enter_room(new_room_name) 56 | 57 | st.stop() 58 | 59 | raise NotImplementedError 60 | 61 | 62 | def _radio_format_func(room_name: Optional[str]) -> Optional[str]: 63 | if room_name is None: 64 | return "Create new room" 65 | return f"{room_name} ({_get_room_status(room_name)})" 66 | 67 | 68 | def _get_room_status(room_name: str) -> str: 69 | nb_sessions = get_synced_state(room_name).nb_active_sessions 70 | if nb_sessions == 0: 71 | return "empty" 72 | elif nb_sessions == 1: 73 | return "1 active session" 74 | else: 75 | return f"{nb_sessions} active sessions" 76 | 77 | 78 | def _list_from_cache_dir(cache_dir: Optional[Union[str, Path]]) -> Set[str]: 79 | """List existing rooms saved in cache dir.""" 80 | if cache_dir is None: 81 | return set() 82 | 83 | cache_dir = Path(cache_dir) 84 | if not cache_dir.exists(): 85 | return set() 86 | 87 | return {path.name for path in cache_dir.iterdir() if path.is_dir()} 88 | -------------------------------------------------------------------------------- /streamlit_sync/utils.py: -------------------------------------------------------------------------------- 1 | """Streamlit-sync specific utils.""" 2 | from . import st_hack 3 | 4 | 5 | def is_synced(widget_id: str) -> bool: 6 | """Check is widget is a synced one or not.""" 7 | return ( 8 | NOT_SYNCED_PREFIX not in widget_id 9 | and st_hack.STREAMLIT_INTERNAL_KEY_PREFIX not in widget_id 10 | ) 11 | 12 | 13 | def get_not_synced_key(user_key: str) -> str: 14 | """Return a widget key that is explicitely not synced.""" 15 | return NOT_SYNCED_PREFIX + "_" + user_key 16 | 17 | 18 | NOT_SYNCED_PREFIX = "$NOT_SYNCED$" 19 | 20 | # Private keys used by streamlit-sync 21 | LAST_SYNCED_KEY = get_not_synced_key("$LAST_SYNCED$") 22 | ROOM_NAME_KEY = get_not_synced_key("$ROOM_NAME$") 23 | -------------------------------------------------------------------------------- /streamlit_sync_tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wauplin/streamlit-sync/71fac318795e10eb70a24768efe0bc4dc705f745/streamlit_sync_tests/__init__.py -------------------------------------------------------------------------------- /streamlit_sync_tests/test_st_hack.py: -------------------------------------------------------------------------------- 1 | from unittest.mock import MagicMock 2 | 3 | import pytest 4 | from pytest import MonkeyPatch 5 | 6 | from streamlit_sync import st_hack 7 | from streamlit_sync.exceptions import StreamlitSyncException 8 | from streamlit_sync.st_hack import ( 9 | is_form_submitter_value, 10 | is_trigger_value, 11 | widget_id_to_user_key, 12 | ) 13 | 14 | 15 | def test_is_form_submitter_value() -> None: 16 | """Test `is_form_submitter_value`.""" 17 | assert is_form_submitter_value("FormSubmitter:my_form-Submit") 18 | assert is_form_submitter_value("FormSubmitter:customkey-Submit") 19 | assert not is_form_submitter_value("customkey") 20 | 21 | 22 | def test_is_trigger_value() -> None: 23 | """Test `is_trigger_value`.""" 24 | mock = MagicMock() 25 | mock._new_widget_state.widget_metadata.__contains__.side_effect = ( 26 | lambda key: key == "customkey" 27 | ) 28 | 29 | # Widget was not updated 30 | assert not is_trigger_value("key", mock) 31 | 32 | # Widget was updated but not a trigger_value 33 | assert not is_trigger_value("customkey", mock) 34 | 35 | # Widget was updated and it's a trigger_value 36 | mock._new_widget_state.widget_metadata.__getitem__().value_type = "trigger_value" 37 | assert is_trigger_value("customkey", mock) 38 | 39 | 40 | def test_widget_id_to_user_key(monkeypatch: MonkeyPatch) -> None: 41 | """Test `widget_id_to_user_key`.""" 42 | monkeypatch.setattr(st_hack, "_is_keyed_widget_id", lambda x: x != "not_keyed") 43 | 44 | assert widget_id_to_user_key("not_keyed") == "not_keyed" 45 | assert ( 46 | widget_id_to_user_key( 47 | "$$GENERATED_WIDGET_KEY-a57f8cd0ef6469c61f435e5eb8097cf7-customkey" 48 | ) 49 | == "customkey" 50 | ) 51 | 52 | with pytest.raises(StreamlitSyncException): 53 | widget_id_to_user_key("auto_generated_widget_id_with_wrong_format") 54 | -------------------------------------------------------------------------------- /streamlit_sync_tests/test_utils.py: -------------------------------------------------------------------------------- 1 | from streamlit_sync.utils import ( 2 | LAST_SYNCED_KEY, 3 | ROOM_NAME_KEY, 4 | get_not_synced_key, 5 | is_synced, 6 | ) 7 | 8 | 9 | def test_is_synced() -> None: 10 | """Test `is_synced`.""" 11 | assert is_synced("custom_user_key") 12 | assert not is_synced("$NOT_SYNCED$_custom_user_key") 13 | 14 | # Keys used internally by streamlit-sync 15 | assert not is_synced(LAST_SYNCED_KEY) 16 | assert not is_synced(ROOM_NAME_KEY) 17 | 18 | 19 | def test_get_not_synced_key() -> None: 20 | """Test `get_not_synced_key`.""" 21 | assert get_not_synced_key("custom_user_key") == "$NOT_SYNCED$_custom_user_key" 22 | -------------------------------------------------------------------------------- /toy_example.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | 3 | import streamlit_sync 4 | 5 | # Cache dir is optional. If None is provided, sessions are synced in memory. 6 | CACHE_DIR = "./.st_sync_cache" 7 | 8 | st.sidebar.write( 9 | "Example app using streamlit-sync library. " 10 | "For more details, please visit https://github.com/Wauplin/streamlit-sync" 11 | ) 12 | 13 | # This step is optional. You can also use a default room name common to all sessions.. 14 | room_name = streamlit_sync.select_room_widget(cache_dir=CACHE_DIR) 15 | 16 | with streamlit_sync.sync(room_name=room_name, cache_dir=CACHE_DIR): 17 | # Sliders 18 | # Toy example from https://github.com/streamlit/streamlit#a-little-example 19 | st.header("Sliders") 20 | 21 | st.info( 22 | 'Sliders, as any other "normal" widgets, can have their value synced with ' 23 | "other sessions. It is also possible to explicitly not sync a widget." 24 | ) 25 | 26 | st.subheader("Synced slider") 27 | y = st.slider("Select a value") 28 | st.write(y, "squared is", y * y) 29 | 30 | st.subheader("Synced slider using custom key widget.") 31 | x = st.slider("Select a value", key="key") 32 | st.write(x, "squared is", x * x) 33 | 34 | st.subheader("Not synced slider") 35 | x = st.slider("Select a value", key=streamlit_sync.get_not_synced_key("key")) 36 | st.write(x, "squared is", x * x) 37 | 38 | # Button 39 | st.header("Buttons") 40 | 41 | st.info( 42 | "Button action is never synced to avoid duplicate actions. " 43 | "However, if a value is updated in the session state, this update is synced " 44 | "with other sessions." 45 | ) 46 | 47 | if st.session_state.get("NB_CLICKS") is None: 48 | st.session_state["NB_CLICKS"] = 0 49 | 50 | if st.button(label="click"): 51 | st.session_state["NB_CLICKS"] += 1 52 | 53 | st.write("Clicked **" + str(st.session_state["NB_CLICKS"]) + "** times !") 54 | 55 | # Form 56 | st.header("Form") 57 | 58 | st.info("Form data is synced only when submit button is clicked.") 59 | 60 | if st.session_state.get("guess") is None: 61 | st.session_state["guess"] = "" 62 | 63 | with st.form(key="my_form", clear_on_submit=True): 64 | answer = st.text_input("Make a guess") 65 | submit = st.form_submit_button(label="Submit") 66 | 67 | if submit: 68 | st.session_state["guess"] = answer 69 | 70 | st.write("Your guess: **" + str(st.session_state["guess"]) + "**") 71 | --------------------------------------------------------------------------------