├── .gitignore ├── .readthedocs.yaml ├── README.md ├── poetry.lock ├── pyproject.toml ├── requirements.txt ├── selenium_async ├── __init__.py ├── _scripts.py ├── _selenium.py ├── core.py ├── functional.py ├── options.py ├── pool.py └── vendor │ ├── __init__.py │ └── firefox.py ├── source ├── conf.py └── index.rst └── tests ├── __init__.py ├── integration ├── __init__.py └── test_pool.py └── test_selenium_async.py /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | .DS_Store 3 | .venv/ 4 | *.pyc 5 | build/ 6 | dist/ 7 | geckodriver.log -------------------------------------------------------------------------------- /.readthedocs.yaml: -------------------------------------------------------------------------------- 1 | version: 2 2 | build: 3 | os: ubuntu-20.04 4 | tools: 5 | python: "3.10" 6 | sphinx: 7 | configuration: source/conf.py 8 | python: 9 | install: 10 | - requirements: requirements.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # selenium-async 2 | 3 | Make Selenium easy to by managing a browser pool, and `asyncio` compatibility! 4 | 5 | - Source: [https://github.com/munro/python-selenium-async](https://github.com/munro/python-selenium-async) 6 | - Documentation: [https://selenium-async.readthedocs.io/en/latest/](https://selenium-async.readthedocs.io/en/latest/) 7 | 8 | ## install 9 | 10 | ```bash 11 | poetry add selenium-async 12 | ``` 13 | 14 | ## usage 15 | 16 | ```python 17 | import selenium_async 18 | 19 | 20 | def get_title(driver: selenium_async.WebDriver): 21 | driver.get("https://www.python.org/") 22 | return driver.title 23 | 24 | print(await selenium_async.run_sync(get_title)) 25 | 26 | # prints: Welcome to Python.org 27 | ``` 28 | 29 | ## license 30 | 31 | MIT 32 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "alabaster" 3 | version = "0.7.12" 4 | description = "A configurable sidebar-enabled Sphinx theme" 5 | category = "dev" 6 | optional = false 7 | python-versions = "*" 8 | 9 | [[package]] 10 | name = "appnope" 11 | version = "0.1.3" 12 | description = "Disable App Nap on macOS >= 10.9" 13 | category = "dev" 14 | optional = false 15 | python-versions = "*" 16 | 17 | [[package]] 18 | name = "astroid" 19 | version = "2.11.2" 20 | description = "An abstract syntax tree for Python with inference support." 21 | category = "dev" 22 | optional = false 23 | python-versions = ">=3.6.2" 24 | 25 | [package.dependencies] 26 | lazy-object-proxy = ">=1.4.0" 27 | typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} 28 | wrapt = ">=1.11,<2" 29 | 30 | [[package]] 31 | name = "asttokens" 32 | version = "2.0.5" 33 | description = "Annotate AST trees with source code positions" 34 | category = "dev" 35 | optional = false 36 | python-versions = "*" 37 | 38 | [package.dependencies] 39 | six = "*" 40 | 41 | [package.extras] 42 | test = ["astroid", "pytest"] 43 | 44 | [[package]] 45 | name = "async-generator" 46 | version = "1.10" 47 | description = "Async generators and context managers for Python 3.5+" 48 | category = "main" 49 | optional = false 50 | python-versions = ">=3.5" 51 | 52 | [[package]] 53 | name = "atomicwrites" 54 | version = "1.4.0" 55 | description = "Atomic file writes." 56 | category = "dev" 57 | optional = false 58 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 59 | 60 | [[package]] 61 | name = "attrs" 62 | version = "21.4.0" 63 | description = "Classes Without Boilerplate" 64 | category = "main" 65 | optional = false 66 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 67 | 68 | [package.extras] 69 | 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"] 70 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] 71 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] 72 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] 73 | 74 | [[package]] 75 | name = "autoflake" 76 | version = "1.4" 77 | description = "Removes unused imports and unused variables" 78 | category = "dev" 79 | optional = false 80 | python-versions = "*" 81 | 82 | [package.dependencies] 83 | pyflakes = ">=1.1.0" 84 | 85 | [[package]] 86 | name = "babel" 87 | version = "2.9.1" 88 | description = "Internationalization utilities" 89 | category = "dev" 90 | optional = false 91 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 92 | 93 | [package.dependencies] 94 | pytz = ">=2015.7" 95 | 96 | [[package]] 97 | name = "backcall" 98 | version = "0.2.0" 99 | description = "Specifications for callback functions passed in to an API" 100 | category = "dev" 101 | optional = false 102 | python-versions = "*" 103 | 104 | [[package]] 105 | name = "black" 106 | version = "22.3.0" 107 | description = "The uncompromising code formatter." 108 | category = "dev" 109 | optional = false 110 | python-versions = ">=3.6.2" 111 | 112 | [package.dependencies] 113 | click = ">=8.0.0" 114 | mypy-extensions = ">=0.4.3" 115 | pathspec = ">=0.9.0" 116 | platformdirs = ">=2" 117 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 118 | typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} 119 | 120 | [package.extras] 121 | colorama = ["colorama (>=0.4.3)"] 122 | d = ["aiohttp (>=3.7.4)"] 123 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 124 | uvloop = ["uvloop (>=0.15.2)"] 125 | 126 | [[package]] 127 | name = "certifi" 128 | version = "2021.10.8" 129 | description = "Python package for providing Mozilla's CA Bundle." 130 | category = "main" 131 | optional = false 132 | python-versions = "*" 133 | 134 | [[package]] 135 | name = "cffi" 136 | version = "1.15.0" 137 | description = "Foreign Function Interface for Python calling C code." 138 | category = "main" 139 | optional = false 140 | python-versions = "*" 141 | 142 | [package.dependencies] 143 | pycparser = "*" 144 | 145 | [[package]] 146 | name = "charset-normalizer" 147 | version = "2.0.12" 148 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 149 | category = "dev" 150 | optional = false 151 | python-versions = ">=3.5.0" 152 | 153 | [package.extras] 154 | unicode_backport = ["unicodedata2"] 155 | 156 | [[package]] 157 | name = "click" 158 | version = "8.1.2" 159 | description = "Composable command line interface toolkit" 160 | category = "dev" 161 | optional = false 162 | python-versions = ">=3.7" 163 | 164 | [package.dependencies] 165 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 166 | 167 | [[package]] 168 | name = "colorama" 169 | version = "0.4.4" 170 | description = "Cross-platform colored terminal text." 171 | category = "dev" 172 | optional = false 173 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 174 | 175 | [[package]] 176 | name = "cryptography" 177 | version = "36.0.2" 178 | description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." 179 | category = "main" 180 | optional = false 181 | python-versions = ">=3.6" 182 | 183 | [package.dependencies] 184 | cffi = ">=1.12" 185 | 186 | [package.extras] 187 | docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] 188 | docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] 189 | pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] 190 | sdist = ["setuptools_rust (>=0.11.4)"] 191 | ssh = ["bcrypt (>=3.1.5)"] 192 | test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] 193 | 194 | [[package]] 195 | name = "decorator" 196 | version = "5.1.1" 197 | description = "Decorators for Humans" 198 | category = "dev" 199 | optional = false 200 | python-versions = ">=3.5" 201 | 202 | [[package]] 203 | name = "dill" 204 | version = "0.3.4" 205 | description = "serialize all of python" 206 | category = "dev" 207 | optional = false 208 | python-versions = ">=2.7, !=3.0.*" 209 | 210 | [package.extras] 211 | graph = ["objgraph (>=1.7.2)"] 212 | 213 | [[package]] 214 | name = "docutils" 215 | version = "0.17.1" 216 | description = "Docutils -- Python Documentation Utilities" 217 | category = "dev" 218 | optional = false 219 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 220 | 221 | [[package]] 222 | name = "executing" 223 | version = "0.8.3" 224 | description = "Get the currently executing AST node of a frame, and other information" 225 | category = "dev" 226 | optional = false 227 | python-versions = "*" 228 | 229 | [[package]] 230 | name = "h11" 231 | version = "0.13.0" 232 | description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 233 | category = "main" 234 | optional = false 235 | python-versions = ">=3.6" 236 | 237 | [[package]] 238 | name = "html2text" 239 | version = "2020.1.16" 240 | description = "Turn HTML into equivalent Markdown-structured text." 241 | category = "dev" 242 | optional = false 243 | python-versions = ">=3.5" 244 | 245 | [[package]] 246 | name = "idna" 247 | version = "3.3" 248 | description = "Internationalized Domain Names in Applications (IDNA)" 249 | category = "main" 250 | optional = false 251 | python-versions = ">=3.5" 252 | 253 | [[package]] 254 | name = "imagesize" 255 | version = "1.3.0" 256 | description = "Getting image size from png/jpeg/jpeg2000/gif file" 257 | category = "dev" 258 | optional = false 259 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 260 | 261 | [[package]] 262 | name = "importlib-metadata" 263 | version = "4.11.3" 264 | description = "Read metadata from Python packages" 265 | category = "dev" 266 | optional = false 267 | python-versions = ">=3.7" 268 | 269 | [package.dependencies] 270 | zipp = ">=0.5" 271 | 272 | [package.extras] 273 | docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] 274 | perf = ["ipython"] 275 | testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] 276 | 277 | [[package]] 278 | name = "iniconfig" 279 | version = "1.1.1" 280 | description = "iniconfig: brain-dead simple config-ini parsing" 281 | category = "dev" 282 | optional = false 283 | python-versions = "*" 284 | 285 | [[package]] 286 | name = "ipython" 287 | version = "8.2.0" 288 | description = "IPython: Productive Interactive Computing" 289 | category = "dev" 290 | optional = false 291 | python-versions = ">=3.8" 292 | 293 | [package.dependencies] 294 | appnope = {version = "*", markers = "sys_platform == \"darwin\""} 295 | backcall = "*" 296 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 297 | decorator = "*" 298 | jedi = ">=0.16" 299 | matplotlib-inline = "*" 300 | pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} 301 | pickleshare = "*" 302 | prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" 303 | pygments = ">=2.4.0" 304 | stack-data = "*" 305 | traitlets = ">=5" 306 | 307 | [package.extras] 308 | all = ["black", "Sphinx (>=1.3)", "ipykernel", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.19)", "pandas", "trio"] 309 | black = ["black"] 310 | doc = ["Sphinx (>=1.3)"] 311 | kernel = ["ipykernel"] 312 | nbconvert = ["nbconvert"] 313 | nbformat = ["nbformat"] 314 | notebook = ["ipywidgets", "notebook"] 315 | parallel = ["ipyparallel"] 316 | qtconsole = ["qtconsole"] 317 | test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] 318 | test_extra = ["pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.19)", "pandas", "trio"] 319 | 320 | [[package]] 321 | name = "isort" 322 | version = "5.10.1" 323 | description = "A Python utility / library to sort Python imports." 324 | category = "dev" 325 | optional = false 326 | python-versions = ">=3.6.1,<4.0" 327 | 328 | [package.extras] 329 | pipfile_deprecated_finder = ["pipreqs", "requirementslib"] 330 | requirements_deprecated_finder = ["pipreqs", "pip-api"] 331 | colors = ["colorama (>=0.4.3,<0.5.0)"] 332 | plugins = ["setuptools"] 333 | 334 | [[package]] 335 | name = "jedi" 336 | version = "0.18.1" 337 | description = "An autocompletion tool for Python that can be used for text editors." 338 | category = "dev" 339 | optional = false 340 | python-versions = ">=3.6" 341 | 342 | [package.dependencies] 343 | parso = ">=0.8.0,<0.9.0" 344 | 345 | [package.extras] 346 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 347 | testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] 348 | 349 | [[package]] 350 | name = "jinja2" 351 | version = "3.1.1" 352 | description = "A very fast and expressive template engine." 353 | category = "dev" 354 | optional = false 355 | python-versions = ">=3.7" 356 | 357 | [package.dependencies] 358 | MarkupSafe = ">=2.0" 359 | 360 | [package.extras] 361 | i18n = ["Babel (>=2.7)"] 362 | 363 | [[package]] 364 | name = "lazy-object-proxy" 365 | version = "1.7.1" 366 | description = "A fast and thorough lazy object proxy." 367 | category = "dev" 368 | optional = false 369 | python-versions = ">=3.6" 370 | 371 | [[package]] 372 | name = "markdown-it-py" 373 | version = "2.0.1" 374 | description = "Python port of markdown-it. Markdown parsing, done right!" 375 | category = "dev" 376 | optional = false 377 | python-versions = "~=3.6" 378 | 379 | [package.dependencies] 380 | attrs = ">=19,<22" 381 | mdurl = ">=0.1,<1.0" 382 | 383 | [package.extras] 384 | benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] 385 | code_style = ["pre-commit (==2.6)"] 386 | compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] 387 | linkify = ["linkify-it-py (>=1.0,<2.0)"] 388 | plugins = ["mdit-py-plugins"] 389 | rtd = ["myst-nb (==0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] 390 | testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] 391 | 392 | [[package]] 393 | name = "markupsafe" 394 | version = "2.1.1" 395 | description = "Safely add untrusted strings to HTML/XML markup." 396 | category = "dev" 397 | optional = false 398 | python-versions = ">=3.7" 399 | 400 | [[package]] 401 | name = "matplotlib-inline" 402 | version = "0.1.3" 403 | description = "Inline Matplotlib backend for Jupyter" 404 | category = "dev" 405 | optional = false 406 | python-versions = ">=3.5" 407 | 408 | [package.dependencies] 409 | traitlets = "*" 410 | 411 | [[package]] 412 | name = "mccabe" 413 | version = "0.7.0" 414 | description = "McCabe checker, plugin for flake8" 415 | category = "dev" 416 | optional = false 417 | python-versions = ">=3.6" 418 | 419 | [[package]] 420 | name = "mdit-py-plugins" 421 | version = "0.3.0" 422 | description = "Collection of plugins for markdown-it-py" 423 | category = "dev" 424 | optional = false 425 | python-versions = "~=3.6" 426 | 427 | [package.dependencies] 428 | markdown-it-py = ">=1.0.0,<3.0.0" 429 | 430 | [package.extras] 431 | code_style = ["pre-commit (==2.6)"] 432 | rtd = ["myst-parser (>=0.14.0,<0.15.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] 433 | testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] 434 | 435 | [[package]] 436 | name = "mdurl" 437 | version = "0.1.0" 438 | description = "Markdown URL utilities" 439 | category = "dev" 440 | optional = false 441 | python-versions = ">=3.6" 442 | 443 | [[package]] 444 | name = "mypy-extensions" 445 | version = "0.4.3" 446 | description = "Experimental type system extensions for programs checked with the mypy typechecker." 447 | category = "dev" 448 | optional = false 449 | python-versions = "*" 450 | 451 | [[package]] 452 | name = "myst-parser" 453 | version = "0.17.0" 454 | description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." 455 | category = "dev" 456 | optional = false 457 | python-versions = ">=3.7" 458 | 459 | [package.dependencies] 460 | docutils = ">=0.15,<0.18" 461 | jinja2 = "*" 462 | markdown-it-py = ">=1.0.0,<3.0.0" 463 | mdit-py-plugins = ">=0.3.0,<0.4.0" 464 | pyyaml = "*" 465 | sphinx = ">=3.1,<5" 466 | typing-extensions = "*" 467 | 468 | [package.extras] 469 | code_style = ["pre-commit (>=2.12,<3.0)"] 470 | linkify = ["linkify-it-py (>=1.0,<2.0)"] 471 | rtd = ["ipython", "sphinx-book-theme (>=0.1.0,<0.2.0)", "sphinx-panels (>=0.5.2,<0.6.0)", "sphinxcontrib-bibtex (>=2.1,<3.0)", "sphinxext-rediraffe (>=0.2,<1.0)", "sphinxcontrib.mermaid (>=0.6.3,<0.7.0)", "sphinxext-opengraph (>=0.4.2,<0.5.0)"] 472 | testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=6,<7)", "pytest-cov", "pytest-regressions", "pytest-param-files (>=0.3.4,<0.4.0)"] 473 | 474 | [[package]] 475 | name = "outcome" 476 | version = "1.1.0" 477 | description = "Capture the outcome of Python function calls." 478 | category = "main" 479 | optional = false 480 | python-versions = ">=3.6" 481 | 482 | [package.dependencies] 483 | attrs = ">=19.2.0" 484 | 485 | [[package]] 486 | name = "packaging" 487 | version = "21.3" 488 | description = "Core utilities for Python packages" 489 | category = "dev" 490 | optional = false 491 | python-versions = ">=3.6" 492 | 493 | [package.dependencies] 494 | pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" 495 | 496 | [[package]] 497 | name = "parso" 498 | version = "0.8.3" 499 | description = "A Python Parser" 500 | category = "dev" 501 | optional = false 502 | python-versions = ">=3.6" 503 | 504 | [package.extras] 505 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 506 | testing = ["docopt", "pytest (<6.0.0)"] 507 | 508 | [[package]] 509 | name = "pathspec" 510 | version = "0.9.0" 511 | description = "Utility library for gitignore style pattern matching of file paths." 512 | category = "dev" 513 | optional = false 514 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 515 | 516 | [[package]] 517 | name = "pexpect" 518 | version = "4.8.0" 519 | description = "Pexpect allows easy control of interactive console applications." 520 | category = "dev" 521 | optional = false 522 | python-versions = "*" 523 | 524 | [package.dependencies] 525 | ptyprocess = ">=0.5" 526 | 527 | [[package]] 528 | name = "pickleshare" 529 | version = "0.7.5" 530 | description = "Tiny 'shelve'-like database with concurrency support" 531 | category = "dev" 532 | optional = false 533 | python-versions = "*" 534 | 535 | [[package]] 536 | name = "platformdirs" 537 | version = "2.5.1" 538 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 539 | category = "dev" 540 | optional = false 541 | python-versions = ">=3.7" 542 | 543 | [package.extras] 544 | docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] 545 | test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] 546 | 547 | [[package]] 548 | name = "pluggy" 549 | version = "1.0.0" 550 | description = "plugin and hook calling mechanisms for python" 551 | category = "dev" 552 | optional = false 553 | python-versions = ">=3.6" 554 | 555 | [package.extras] 556 | dev = ["pre-commit", "tox"] 557 | testing = ["pytest", "pytest-benchmark"] 558 | 559 | [[package]] 560 | name = "pockets" 561 | version = "0.9.1" 562 | description = "A collection of helpful Python tools!" 563 | category = "dev" 564 | optional = false 565 | python-versions = "*" 566 | 567 | [package.dependencies] 568 | six = ">=1.5.2" 569 | 570 | [[package]] 571 | name = "prompt-toolkit" 572 | version = "3.0.29" 573 | description = "Library for building powerful interactive command lines in Python" 574 | category = "dev" 575 | optional = false 576 | python-versions = ">=3.6.2" 577 | 578 | [package.dependencies] 579 | wcwidth = "*" 580 | 581 | [[package]] 582 | name = "ptyprocess" 583 | version = "0.7.0" 584 | description = "Run a subprocess in a pseudo terminal" 585 | category = "dev" 586 | optional = false 587 | python-versions = "*" 588 | 589 | [[package]] 590 | name = "pure-eval" 591 | version = "0.2.2" 592 | description = "Safely evaluate AST nodes without side effects" 593 | category = "dev" 594 | optional = false 595 | python-versions = "*" 596 | 597 | [package.extras] 598 | tests = ["pytest"] 599 | 600 | [[package]] 601 | name = "py" 602 | version = "1.11.0" 603 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 604 | category = "dev" 605 | optional = false 606 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 607 | 608 | [[package]] 609 | name = "pycparser" 610 | version = "2.21" 611 | description = "C parser in Python" 612 | category = "main" 613 | optional = false 614 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 615 | 616 | [[package]] 617 | name = "pydash" 618 | version = "5.1.0" 619 | description = "The kitchen sink of Python utility libraries for doing \"stuff\" in a functional way. Based on the Lo-Dash Javascript library." 620 | category = "dev" 621 | optional = false 622 | python-versions = ">=3.6" 623 | 624 | [package.extras] 625 | dev = ["black", "coverage", "docformatter", "flake8", "flake8-black", "flake8-bugbear", "flake8-isort", "invoke", "isort", "pylint", "pytest", "pytest-cov", "pytest-flake8", "pytest-pylint", "sphinx", "sphinx-rtd-theme", "tox", "twine", "wheel"] 626 | 627 | [[package]] 628 | name = "pyflakes" 629 | version = "2.4.0" 630 | description = "passive checker of Python programs" 631 | category = "dev" 632 | optional = false 633 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 634 | 635 | [[package]] 636 | name = "pygments" 637 | version = "2.11.2" 638 | description = "Pygments is a syntax highlighting package written in Python." 639 | category = "dev" 640 | optional = false 641 | python-versions = ">=3.5" 642 | 643 | [[package]] 644 | name = "pylint" 645 | version = "2.13.5" 646 | description = "python code static checker" 647 | category = "dev" 648 | optional = false 649 | python-versions = ">=3.6.2" 650 | 651 | [package.dependencies] 652 | astroid = ">=2.11.2,<=2.12.0-dev0" 653 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 654 | dill = ">=0.2" 655 | isort = ">=4.2.5,<6" 656 | mccabe = ">=0.6,<0.8" 657 | platformdirs = ">=2.2.0" 658 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 659 | typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} 660 | 661 | [package.extras] 662 | testutil = ["gitpython (>3)"] 663 | 664 | [[package]] 665 | name = "pyopenssl" 666 | version = "22.0.0" 667 | description = "Python wrapper module around the OpenSSL library" 668 | category = "main" 669 | optional = false 670 | python-versions = ">=3.6" 671 | 672 | [package.dependencies] 673 | cryptography = ">=35.0" 674 | 675 | [package.extras] 676 | docs = ["sphinx", "sphinx-rtd-theme"] 677 | test = ["flaky", "pretend", "pytest (>=3.0.1)"] 678 | 679 | [[package]] 680 | name = "pyparsing" 681 | version = "3.0.7" 682 | description = "Python parsing module" 683 | category = "dev" 684 | optional = false 685 | python-versions = ">=3.6" 686 | 687 | [package.extras] 688 | diagrams = ["jinja2", "railroad-diagrams"] 689 | 690 | [[package]] 691 | name = "pysocks" 692 | version = "1.7.1" 693 | description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." 694 | category = "main" 695 | optional = false 696 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 697 | 698 | [[package]] 699 | name = "pytest" 700 | version = "7.1.1" 701 | description = "pytest: simple powerful testing with Python" 702 | category = "dev" 703 | optional = false 704 | python-versions = ">=3.7" 705 | 706 | [package.dependencies] 707 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 708 | attrs = ">=19.2.0" 709 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 710 | iniconfig = "*" 711 | packaging = "*" 712 | pluggy = ">=0.12,<2.0" 713 | py = ">=1.8.2" 714 | tomli = ">=1.0.0" 715 | 716 | [package.extras] 717 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] 718 | 719 | [[package]] 720 | name = "pytest-asyncio" 721 | version = "0.18.3" 722 | description = "Pytest support for asyncio" 723 | category = "dev" 724 | optional = false 725 | python-versions = ">=3.7" 726 | 727 | [package.dependencies] 728 | pytest = ">=6.1.0" 729 | 730 | [package.extras] 731 | testing = ["coverage (==6.2)", "hypothesis (>=5.7.1)", "flaky (>=3.5.0)", "mypy (==0.931)", "pytest-trio (>=0.7.0)"] 732 | 733 | [[package]] 734 | name = "pytz" 735 | version = "2022.1" 736 | description = "World timezone definitions, modern and historical" 737 | category = "dev" 738 | optional = false 739 | python-versions = "*" 740 | 741 | [[package]] 742 | name = "pyyaml" 743 | version = "6.0" 744 | description = "YAML parser and emitter for Python" 745 | category = "dev" 746 | optional = false 747 | python-versions = ">=3.6" 748 | 749 | [[package]] 750 | name = "requests" 751 | version = "2.27.1" 752 | description = "Python HTTP for Humans." 753 | category = "dev" 754 | optional = false 755 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 756 | 757 | [package.dependencies] 758 | certifi = ">=2017.4.17" 759 | charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} 760 | idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} 761 | urllib3 = ">=1.21.1,<1.27" 762 | 763 | [package.extras] 764 | socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] 765 | use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] 766 | 767 | [[package]] 768 | name = "selenium" 769 | version = "4.1.3" 770 | description = "" 771 | category = "main" 772 | optional = false 773 | python-versions = "~=3.7" 774 | 775 | [package.dependencies] 776 | trio = ">=0.17,<1.0" 777 | trio-websocket = ">=0.9,<1.0" 778 | urllib3 = {version = ">=1.26,<2.0", extras = ["secure", "socks"]} 779 | 780 | [[package]] 781 | name = "six" 782 | version = "1.16.0" 783 | description = "Python 2 and 3 compatibility utilities" 784 | category = "dev" 785 | optional = false 786 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 787 | 788 | [[package]] 789 | name = "sniffio" 790 | version = "1.2.0" 791 | description = "Sniff out which async library your code is running under" 792 | category = "main" 793 | optional = false 794 | python-versions = ">=3.5" 795 | 796 | [[package]] 797 | name = "snowballstemmer" 798 | version = "2.2.0" 799 | description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." 800 | category = "dev" 801 | optional = false 802 | python-versions = "*" 803 | 804 | [[package]] 805 | name = "sortedcontainers" 806 | version = "2.4.0" 807 | description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" 808 | category = "main" 809 | optional = false 810 | python-versions = "*" 811 | 812 | [[package]] 813 | name = "sphinx" 814 | version = "4.5.0" 815 | description = "Python documentation generator" 816 | category = "dev" 817 | optional = false 818 | python-versions = ">=3.6" 819 | 820 | [package.dependencies] 821 | alabaster = ">=0.7,<0.8" 822 | babel = ">=1.3" 823 | colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} 824 | docutils = ">=0.14,<0.18" 825 | imagesize = "*" 826 | importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} 827 | Jinja2 = ">=2.3" 828 | packaging = "*" 829 | Pygments = ">=2.0" 830 | requests = ">=2.5.0" 831 | snowballstemmer = ">=1.1" 832 | sphinxcontrib-applehelp = "*" 833 | sphinxcontrib-devhelp = "*" 834 | sphinxcontrib-htmlhelp = ">=2.0.0" 835 | sphinxcontrib-jsmath = "*" 836 | sphinxcontrib-qthelp = "*" 837 | sphinxcontrib-serializinghtml = ">=1.1.5" 838 | 839 | [package.extras] 840 | docs = ["sphinxcontrib-websupport"] 841 | lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] 842 | test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] 843 | 844 | [[package]] 845 | name = "sphinx-markdown-builder" 846 | version = "0.5.5" 847 | description = "sphinx builder that outputs markdown files" 848 | category = "dev" 849 | optional = false 850 | python-versions = "*" 851 | 852 | [package.dependencies] 853 | html2text = "*" 854 | pydash = "*" 855 | sphinx = "*" 856 | unify = "*" 857 | yapf = "*" 858 | 859 | [[package]] 860 | name = "sphinx-rtd-theme" 861 | version = "1.0.0" 862 | description = "Read the Docs theme for Sphinx" 863 | category = "dev" 864 | optional = false 865 | python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" 866 | 867 | [package.dependencies] 868 | docutils = "<0.18" 869 | sphinx = ">=1.6" 870 | 871 | [package.extras] 872 | dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] 873 | 874 | [[package]] 875 | name = "sphinxcontrib-applehelp" 876 | version = "1.0.2" 877 | description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" 878 | category = "dev" 879 | optional = false 880 | python-versions = ">=3.5" 881 | 882 | [package.extras] 883 | lint = ["flake8", "mypy", "docutils-stubs"] 884 | test = ["pytest"] 885 | 886 | [[package]] 887 | name = "sphinxcontrib-devhelp" 888 | version = "1.0.2" 889 | description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." 890 | category = "dev" 891 | optional = false 892 | python-versions = ">=3.5" 893 | 894 | [package.extras] 895 | lint = ["flake8", "mypy", "docutils-stubs"] 896 | test = ["pytest"] 897 | 898 | [[package]] 899 | name = "sphinxcontrib-htmlhelp" 900 | version = "2.0.0" 901 | description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" 902 | category = "dev" 903 | optional = false 904 | python-versions = ">=3.6" 905 | 906 | [package.extras] 907 | lint = ["flake8", "mypy", "docutils-stubs"] 908 | test = ["pytest", "html5lib"] 909 | 910 | [[package]] 911 | name = "sphinxcontrib-jsmath" 912 | version = "1.0.1" 913 | description = "A sphinx extension which renders display math in HTML via JavaScript" 914 | category = "dev" 915 | optional = false 916 | python-versions = ">=3.5" 917 | 918 | [package.extras] 919 | test = ["pytest", "flake8", "mypy"] 920 | 921 | [[package]] 922 | name = "sphinxcontrib-napoleon" 923 | version = "0.7" 924 | description = "Sphinx \"napoleon\" extension." 925 | category = "dev" 926 | optional = false 927 | python-versions = "*" 928 | 929 | [package.dependencies] 930 | pockets = ">=0.3" 931 | six = ">=1.5.2" 932 | 933 | [[package]] 934 | name = "sphinxcontrib-qthelp" 935 | version = "1.0.3" 936 | description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." 937 | category = "dev" 938 | optional = false 939 | python-versions = ">=3.5" 940 | 941 | [package.extras] 942 | lint = ["flake8", "mypy", "docutils-stubs"] 943 | test = ["pytest"] 944 | 945 | [[package]] 946 | name = "sphinxcontrib-serializinghtml" 947 | version = "1.1.5" 948 | description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." 949 | category = "dev" 950 | optional = false 951 | python-versions = ">=3.5" 952 | 953 | [package.extras] 954 | lint = ["flake8", "mypy", "docutils-stubs"] 955 | test = ["pytest"] 956 | 957 | [[package]] 958 | name = "stack-data" 959 | version = "0.2.0" 960 | description = "Extract data from python stack frames and tracebacks for informative displays" 961 | category = "dev" 962 | optional = false 963 | python-versions = "*" 964 | 965 | [package.dependencies] 966 | asttokens = "*" 967 | executing = "*" 968 | pure-eval = "*" 969 | 970 | [package.extras] 971 | tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] 972 | 973 | [[package]] 974 | name = "tomli" 975 | version = "2.0.1" 976 | description = "A lil' TOML parser" 977 | category = "dev" 978 | optional = false 979 | python-versions = ">=3.7" 980 | 981 | [[package]] 982 | name = "traitlets" 983 | version = "5.1.1" 984 | description = "Traitlets Python configuration system" 985 | category = "dev" 986 | optional = false 987 | python-versions = ">=3.7" 988 | 989 | [package.extras] 990 | test = ["pytest"] 991 | 992 | [[package]] 993 | name = "trio" 994 | version = "0.20.0" 995 | description = "A friendly Python library for async concurrency and I/O" 996 | category = "main" 997 | optional = false 998 | python-versions = ">=3.7" 999 | 1000 | [package.dependencies] 1001 | async-generator = ">=1.9" 1002 | attrs = ">=19.2.0" 1003 | cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} 1004 | idna = "*" 1005 | outcome = "*" 1006 | sniffio = "*" 1007 | sortedcontainers = "*" 1008 | 1009 | [[package]] 1010 | name = "trio-websocket" 1011 | version = "0.9.2" 1012 | description = "WebSocket library for Trio" 1013 | category = "main" 1014 | optional = false 1015 | python-versions = ">=3.5" 1016 | 1017 | [package.dependencies] 1018 | async-generator = ">=1.10" 1019 | trio = ">=0.11" 1020 | wsproto = ">=0.14" 1021 | 1022 | [[package]] 1023 | name = "typing-extensions" 1024 | version = "4.1.1" 1025 | description = "Backported and Experimental Type Hints for Python 3.6+" 1026 | category = "dev" 1027 | optional = false 1028 | python-versions = ">=3.6" 1029 | 1030 | [[package]] 1031 | name = "unify" 1032 | version = "0.5" 1033 | description = "Modifies strings to all use the same (single/double) quote where possible." 1034 | category = "dev" 1035 | optional = false 1036 | python-versions = "*" 1037 | 1038 | [package.dependencies] 1039 | untokenize = "*" 1040 | 1041 | [[package]] 1042 | name = "untokenize" 1043 | version = "0.1.1" 1044 | description = "Transforms tokens into original source code (while preserving whitespace)." 1045 | category = "dev" 1046 | optional = false 1047 | python-versions = "*" 1048 | 1049 | [[package]] 1050 | name = "urllib3" 1051 | version = "1.26.9" 1052 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1053 | category = "main" 1054 | optional = false 1055 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 1056 | 1057 | [package.dependencies] 1058 | certifi = {version = "*", optional = true, markers = "extra == \"secure\""} 1059 | cryptography = {version = ">=1.3.4", optional = true, markers = "extra == \"secure\""} 1060 | idna = {version = ">=2.0.0", optional = true, markers = "extra == \"secure\""} 1061 | pyOpenSSL = {version = ">=0.14", optional = true, markers = "extra == \"secure\""} 1062 | PySocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} 1063 | 1064 | [package.extras] 1065 | brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] 1066 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] 1067 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 1068 | 1069 | [[package]] 1070 | name = "wcwidth" 1071 | version = "0.2.5" 1072 | description = "Measures the displayed width of unicode strings in a terminal" 1073 | category = "dev" 1074 | optional = false 1075 | python-versions = "*" 1076 | 1077 | [[package]] 1078 | name = "wrapt" 1079 | version = "1.14.0" 1080 | description = "Module for decorators, wrappers and monkey patching." 1081 | category = "dev" 1082 | optional = false 1083 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 1084 | 1085 | [[package]] 1086 | name = "wsproto" 1087 | version = "1.1.0" 1088 | description = "WebSockets state-machine based protocol implementation" 1089 | category = "main" 1090 | optional = false 1091 | python-versions = ">=3.7.0" 1092 | 1093 | [package.dependencies] 1094 | h11 = ">=0.9.0,<1" 1095 | 1096 | [[package]] 1097 | name = "yapf" 1098 | version = "0.32.0" 1099 | description = "A formatter for Python code." 1100 | category = "dev" 1101 | optional = false 1102 | python-versions = "*" 1103 | 1104 | [[package]] 1105 | name = "zipp" 1106 | version = "3.8.0" 1107 | description = "Backport of pathlib-compatible object wrapper for zip files" 1108 | category = "dev" 1109 | optional = false 1110 | python-versions = ">=3.7" 1111 | 1112 | [package.extras] 1113 | docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] 1114 | 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 (>=0.9.1)"] 1115 | 1116 | [metadata] 1117 | lock-version = "1.1" 1118 | python-versions = "^3.9" 1119 | content-hash = "7962ea3b91352e495f1f3bc9109e0ab43eecce0c2c9f3a3686c71c45e5075d71" 1120 | 1121 | [metadata.files] 1122 | alabaster = [ 1123 | {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, 1124 | {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, 1125 | ] 1126 | appnope = [ 1127 | {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, 1128 | {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, 1129 | ] 1130 | astroid = [ 1131 | {file = "astroid-2.11.2-py3-none-any.whl", hash = "sha256:cc8cc0d2d916c42d0a7c476c57550a4557a083081976bf42a73414322a6411d9"}, 1132 | {file = "astroid-2.11.2.tar.gz", hash = "sha256:8d0a30fe6481ce919f56690076eafbb2fb649142a89dc874f1ec0e7a011492d0"}, 1133 | ] 1134 | asttokens = [ 1135 | {file = "asttokens-2.0.5-py2.py3-none-any.whl", hash = "sha256:0844691e88552595a6f4a4281a9f7f79b8dd45ca4ccea82e5e05b4bbdb76705c"}, 1136 | {file = "asttokens-2.0.5.tar.gz", hash = "sha256:9a54c114f02c7a9480d56550932546a3f1fe71d8a02f1bc7ccd0ee3ee35cf4d5"}, 1137 | ] 1138 | async-generator = [ 1139 | {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"}, 1140 | {file = "async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144"}, 1141 | ] 1142 | atomicwrites = [ 1143 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 1144 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 1145 | ] 1146 | attrs = [ 1147 | {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, 1148 | {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, 1149 | ] 1150 | autoflake = [ 1151 | {file = "autoflake-1.4.tar.gz", hash = "sha256:61a353012cff6ab94ca062823d1fb2f692c4acda51c76ff83a8d77915fba51ea"}, 1152 | ] 1153 | babel = [ 1154 | {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, 1155 | {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, 1156 | ] 1157 | backcall = [ 1158 | {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, 1159 | {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, 1160 | ] 1161 | black = [ 1162 | {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, 1163 | {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, 1164 | {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, 1165 | {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, 1166 | {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, 1167 | {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, 1168 | {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, 1169 | {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, 1170 | {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, 1171 | {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, 1172 | {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, 1173 | {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, 1174 | {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, 1175 | {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, 1176 | {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, 1177 | {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, 1178 | {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, 1179 | {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, 1180 | {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, 1181 | {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, 1182 | {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, 1183 | {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, 1184 | {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, 1185 | ] 1186 | certifi = [ 1187 | {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, 1188 | {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, 1189 | ] 1190 | cffi = [ 1191 | {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, 1192 | {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, 1193 | {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, 1194 | {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, 1195 | {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, 1196 | {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, 1197 | {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, 1198 | {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, 1199 | {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, 1200 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, 1201 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, 1202 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, 1203 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, 1204 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, 1205 | {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, 1206 | {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, 1207 | {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, 1208 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, 1209 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, 1210 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, 1211 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, 1212 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, 1213 | {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, 1214 | {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, 1215 | {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, 1216 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, 1217 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, 1218 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, 1219 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, 1220 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, 1221 | {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, 1222 | {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, 1223 | {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, 1224 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, 1225 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, 1226 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, 1227 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, 1228 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, 1229 | {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, 1230 | {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, 1231 | {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, 1232 | {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, 1233 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, 1234 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, 1235 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, 1236 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, 1237 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, 1238 | {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, 1239 | {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, 1240 | {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, 1241 | ] 1242 | charset-normalizer = [ 1243 | {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, 1244 | {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, 1245 | ] 1246 | click = [ 1247 | {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"}, 1248 | {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"}, 1249 | ] 1250 | colorama = [ 1251 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 1252 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 1253 | ] 1254 | cryptography = [ 1255 | {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6"}, 1256 | {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d"}, 1257 | {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84"}, 1258 | {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815"}, 1259 | {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf"}, 1260 | {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf"}, 1261 | {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86"}, 1262 | {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2"}, 1263 | {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb"}, 1264 | {file = "cryptography-36.0.2-cp36-abi3-win32.whl", hash = "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"}, 1265 | {file = "cryptography-36.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29"}, 1266 | {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7"}, 1267 | {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e"}, 1268 | {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0"}, 1269 | {file = "cryptography-36.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b"}, 1270 | {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77"}, 1271 | {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85"}, 1272 | {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51"}, 1273 | {file = "cryptography-36.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3"}, 1274 | {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"}, 1275 | ] 1276 | decorator = [ 1277 | {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, 1278 | {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, 1279 | ] 1280 | dill = [ 1281 | {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"}, 1282 | {file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"}, 1283 | ] 1284 | docutils = [ 1285 | {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, 1286 | {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, 1287 | ] 1288 | executing = [ 1289 | {file = "executing-0.8.3-py2.py3-none-any.whl", hash = "sha256:d1eef132db1b83649a3905ca6dd8897f71ac6f8cac79a7e58a1a09cf137546c9"}, 1290 | {file = "executing-0.8.3.tar.gz", hash = "sha256:c6554e21c6b060590a6d3be4b82fb78f8f0194d809de5ea7df1c093763311501"}, 1291 | ] 1292 | h11 = [ 1293 | {file = "h11-0.13.0-py3-none-any.whl", hash = "sha256:8ddd78563b633ca55346c8cd41ec0af27d3c79931828beffb46ce70a379e7442"}, 1294 | {file = "h11-0.13.0.tar.gz", hash = "sha256:70813c1135087a248a4d38cc0e1a0181ffab2188141a93eaf567940c3957ff06"}, 1295 | ] 1296 | html2text = [ 1297 | {file = "html2text-2020.1.16-py3-none-any.whl", hash = "sha256:c7c629882da0cf377d66f073329ccf34a12ed2adf0169b9285ae4e63ef54c82b"}, 1298 | {file = "html2text-2020.1.16.tar.gz", hash = "sha256:e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb"}, 1299 | ] 1300 | idna = [ 1301 | {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, 1302 | {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, 1303 | ] 1304 | imagesize = [ 1305 | {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, 1306 | {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, 1307 | ] 1308 | importlib-metadata = [ 1309 | {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, 1310 | {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, 1311 | ] 1312 | iniconfig = [ 1313 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 1314 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 1315 | ] 1316 | ipython = [ 1317 | {file = "ipython-8.2.0-py3-none-any.whl", hash = "sha256:1b672bfd7a48d87ab203d9af8727a3b0174a4566b4091e9447c22fb63ea32857"}, 1318 | {file = "ipython-8.2.0.tar.gz", hash = "sha256:70e5eb132cac594a34b5f799bd252589009905f05104728aea6a403ec2519dc1"}, 1319 | ] 1320 | isort = [ 1321 | {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, 1322 | {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, 1323 | ] 1324 | jedi = [ 1325 | {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"}, 1326 | {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"}, 1327 | ] 1328 | jinja2 = [ 1329 | {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, 1330 | {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, 1331 | ] 1332 | lazy-object-proxy = [ 1333 | {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"}, 1334 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"}, 1335 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"}, 1336 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"}, 1337 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"}, 1338 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"}, 1339 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"}, 1340 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"}, 1341 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"}, 1342 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"}, 1343 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"}, 1344 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"}, 1345 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"}, 1346 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"}, 1347 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"}, 1348 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"}, 1349 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"}, 1350 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"}, 1351 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"}, 1352 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"}, 1353 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"}, 1354 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"}, 1355 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"}, 1356 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"}, 1357 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"}, 1358 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"}, 1359 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"}, 1360 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"}, 1361 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"}, 1362 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"}, 1363 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"}, 1364 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"}, 1365 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"}, 1366 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"}, 1367 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"}, 1368 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"}, 1369 | {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"}, 1370 | ] 1371 | markdown-it-py = [ 1372 | {file = "markdown-it-py-2.0.1.tar.gz", hash = "sha256:7b5c153ae1ab2cde00a33938bce68f3ad5d68fbe363f946de7d28555bed4e08a"}, 1373 | {file = "markdown_it_py-2.0.1-py3-none-any.whl", hash = "sha256:31974138ca8cafbcb62213f4974b29571b940e78364584729233f59b8dfdb8bd"}, 1374 | ] 1375 | markupsafe = [ 1376 | {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, 1377 | {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, 1378 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, 1379 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, 1380 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, 1381 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, 1382 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, 1383 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, 1384 | {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, 1385 | {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, 1386 | {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, 1387 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, 1388 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, 1389 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, 1390 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, 1391 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, 1392 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, 1393 | {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, 1394 | {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, 1395 | {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, 1396 | {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, 1397 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, 1398 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, 1399 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, 1400 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, 1401 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, 1402 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, 1403 | {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, 1404 | {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, 1405 | {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, 1406 | {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, 1407 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, 1408 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, 1409 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, 1410 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, 1411 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, 1412 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, 1413 | {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, 1414 | {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, 1415 | {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, 1416 | ] 1417 | matplotlib-inline = [ 1418 | {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, 1419 | {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, 1420 | ] 1421 | mccabe = [ 1422 | {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, 1423 | {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, 1424 | ] 1425 | mdit-py-plugins = [ 1426 | {file = "mdit-py-plugins-0.3.0.tar.gz", hash = "sha256:ecc24f51eeec6ab7eecc2f9724e8272c2fb191c2e93cf98109120c2cace69750"}, 1427 | {file = "mdit_py_plugins-0.3.0-py3-none-any.whl", hash = "sha256:b1279701cee2dbf50e188d3da5f51fee8d78d038cdf99be57c6b9d1aa93b4073"}, 1428 | ] 1429 | mdurl = [ 1430 | {file = "mdurl-0.1.0-py3-none-any.whl", hash = "sha256:40654d6dcb8d21501ed13c21cc0bd6fc42ff07ceb8be30029e5ae63ebc2ecfda"}, 1431 | {file = "mdurl-0.1.0.tar.gz", hash = "sha256:94873a969008ee48880fb21bad7de0349fef529f3be178969af5817239e9b990"}, 1432 | ] 1433 | mypy-extensions = [ 1434 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, 1435 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, 1436 | ] 1437 | myst-parser = [ 1438 | {file = "myst-parser-0.17.0.tar.gz", hash = "sha256:d412347a5cacb77ebc03d7f7ffef050cd61957d46f234313d350e84e24972260"}, 1439 | {file = "myst_parser-0.17.0-py3-none-any.whl", hash = "sha256:555ec2950aba5ae5dac5c162c7e9a43ad4a7291cfac644d8f5f84da8efa6f356"}, 1440 | ] 1441 | outcome = [ 1442 | {file = "outcome-1.1.0-py2.py3-none-any.whl", hash = "sha256:c7dd9375cfd3c12db9801d080a3b63d4b0a261aa996c4c13152380587288d958"}, 1443 | {file = "outcome-1.1.0.tar.gz", hash = "sha256:e862f01d4e626e63e8f92c38d1f8d5546d3f9cce989263c521b2e7990d186967"}, 1444 | ] 1445 | packaging = [ 1446 | {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, 1447 | {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, 1448 | ] 1449 | parso = [ 1450 | {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, 1451 | {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, 1452 | ] 1453 | pathspec = [ 1454 | {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, 1455 | {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, 1456 | ] 1457 | pexpect = [ 1458 | {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, 1459 | {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, 1460 | ] 1461 | pickleshare = [ 1462 | {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, 1463 | {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, 1464 | ] 1465 | platformdirs = [ 1466 | {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, 1467 | {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, 1468 | ] 1469 | pluggy = [ 1470 | {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, 1471 | {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, 1472 | ] 1473 | pockets = [ 1474 | {file = "pockets-0.9.1-py2.py3-none-any.whl", hash = "sha256:68597934193c08a08eb2bf6a1d85593f627c22f9b065cc727a4f03f669d96d86"}, 1475 | {file = "pockets-0.9.1.tar.gz", hash = "sha256:9320f1a3c6f7a9133fe3b571f283bcf3353cd70249025ae8d618e40e9f7e92b3"}, 1476 | ] 1477 | prompt-toolkit = [ 1478 | {file = "prompt_toolkit-3.0.29-py3-none-any.whl", hash = "sha256:62291dad495e665fca0bda814e342c69952086afb0f4094d0893d357e5c78752"}, 1479 | {file = "prompt_toolkit-3.0.29.tar.gz", hash = "sha256:bd640f60e8cecd74f0dc249713d433ace2ddc62b65ee07f96d358e0b152b6ea7"}, 1480 | ] 1481 | ptyprocess = [ 1482 | {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, 1483 | {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, 1484 | ] 1485 | pure-eval = [ 1486 | {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, 1487 | {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, 1488 | ] 1489 | py = [ 1490 | {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, 1491 | {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, 1492 | ] 1493 | pycparser = [ 1494 | {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, 1495 | {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, 1496 | ] 1497 | pydash = [ 1498 | {file = "pydash-5.1.0-py3-none-any.whl", hash = "sha256:ced4fedb163eb07fbee376e474bca74029eb9fab215614449fe13164f71dd9e3"}, 1499 | {file = "pydash-5.1.0.tar.gz", hash = "sha256:1b2b050ac1bae049cd07f5920b14fabbe52638f485d9ada1eb115a9eebff6835"}, 1500 | ] 1501 | pyflakes = [ 1502 | {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, 1503 | {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, 1504 | ] 1505 | pygments = [ 1506 | {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, 1507 | {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, 1508 | ] 1509 | pylint = [ 1510 | {file = "pylint-2.13.5-py3-none-any.whl", hash = "sha256:c149694cfdeaee1aa2465e6eaab84c87a881a7d55e6e93e09466be7164764d1e"}, 1511 | {file = "pylint-2.13.5.tar.gz", hash = "sha256:dab221658368c7a05242e673c275c488670144123f4bd262b2777249c1c0de9b"}, 1512 | ] 1513 | pyopenssl = [ 1514 | {file = "pyOpenSSL-22.0.0-py2.py3-none-any.whl", hash = "sha256:ea252b38c87425b64116f808355e8da644ef9b07e429398bfece610f893ee2e0"}, 1515 | {file = "pyOpenSSL-22.0.0.tar.gz", hash = "sha256:660b1b1425aac4a1bea1d94168a85d99f0b3144c869dd4390d27629d0087f1bf"}, 1516 | ] 1517 | pyparsing = [ 1518 | {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, 1519 | {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, 1520 | ] 1521 | pysocks = [ 1522 | {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, 1523 | {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, 1524 | {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, 1525 | ] 1526 | pytest = [ 1527 | {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, 1528 | {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, 1529 | ] 1530 | pytest-asyncio = [ 1531 | {file = "pytest-asyncio-0.18.3.tar.gz", hash = "sha256:7659bdb0a9eb9c6e3ef992eef11a2b3e69697800ad02fb06374a210d85b29f91"}, 1532 | {file = "pytest_asyncio-0.18.3-1-py3-none-any.whl", hash = "sha256:16cf40bdf2b4fb7fc8e4b82bd05ce3fbcd454cbf7b92afc445fe299dabb88213"}, 1533 | {file = "pytest_asyncio-0.18.3-py3-none-any.whl", hash = "sha256:8fafa6c52161addfd41ee7ab35f11836c5a16ec208f93ee388f752bea3493a84"}, 1534 | ] 1535 | pytz = [ 1536 | {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, 1537 | {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, 1538 | ] 1539 | pyyaml = [ 1540 | {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, 1541 | {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, 1542 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, 1543 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, 1544 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, 1545 | {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, 1546 | {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, 1547 | {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, 1548 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, 1549 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, 1550 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, 1551 | {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, 1552 | {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, 1553 | {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, 1554 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, 1555 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, 1556 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, 1557 | {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, 1558 | {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, 1559 | {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, 1560 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, 1561 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, 1562 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, 1563 | {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, 1564 | {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, 1565 | {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, 1566 | {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, 1567 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, 1568 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, 1569 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, 1570 | {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, 1571 | {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, 1572 | {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, 1573 | ] 1574 | requests = [ 1575 | {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, 1576 | {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, 1577 | ] 1578 | selenium = [ 1579 | {file = "selenium-4.1.3-py3-none-any.whl", hash = "sha256:14d28a628c831c105d38305c881c9c7847199bfd728ec84240c5e86fa1c9bd5a"}, 1580 | ] 1581 | six = [ 1582 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1583 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1584 | ] 1585 | sniffio = [ 1586 | {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, 1587 | {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, 1588 | ] 1589 | snowballstemmer = [ 1590 | {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, 1591 | {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, 1592 | ] 1593 | sortedcontainers = [ 1594 | {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, 1595 | {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, 1596 | ] 1597 | sphinx = [ 1598 | {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, 1599 | {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, 1600 | ] 1601 | sphinx-markdown-builder = [ 1602 | {file = "sphinx-markdown-builder-0.5.5.tar.gz", hash = "sha256:6ead53c08d8835329e32418dcdbac4db710a1c4e5e8db687d23b9e88882d9d16"}, 1603 | {file = "sphinx_markdown_builder-0.5.5-py2.py3-none-any.whl", hash = "sha256:3c8909579dfa83ce5a8fb48e2d01dc257fc0676931170cb92cd528f9fceee76f"}, 1604 | ] 1605 | sphinx-rtd-theme = [ 1606 | {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, 1607 | {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, 1608 | ] 1609 | sphinxcontrib-applehelp = [ 1610 | {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, 1611 | {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, 1612 | ] 1613 | sphinxcontrib-devhelp = [ 1614 | {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, 1615 | {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, 1616 | ] 1617 | sphinxcontrib-htmlhelp = [ 1618 | {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, 1619 | {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, 1620 | ] 1621 | sphinxcontrib-jsmath = [ 1622 | {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, 1623 | {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, 1624 | ] 1625 | sphinxcontrib-napoleon = [ 1626 | {file = "sphinxcontrib-napoleon-0.7.tar.gz", hash = "sha256:407382beed396e9f2d7f3043fad6afda95719204a1e1a231ac865f40abcbfcf8"}, 1627 | {file = "sphinxcontrib_napoleon-0.7-py2.py3-none-any.whl", hash = "sha256:711e41a3974bdf110a484aec4c1a556799eb0b3f3b897521a018ad7e2db13fef"}, 1628 | ] 1629 | sphinxcontrib-qthelp = [ 1630 | {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, 1631 | {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, 1632 | ] 1633 | sphinxcontrib-serializinghtml = [ 1634 | {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, 1635 | {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, 1636 | ] 1637 | stack-data = [ 1638 | {file = "stack_data-0.2.0-py3-none-any.whl", hash = "sha256:999762f9c3132308789affa03e9271bbbe947bf78311851f4d485d8402ed858e"}, 1639 | {file = "stack_data-0.2.0.tar.gz", hash = "sha256:45692d41bd633a9503a5195552df22b583caf16f0b27c4e58c98d88c8b648e12"}, 1640 | ] 1641 | tomli = [ 1642 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 1643 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 1644 | ] 1645 | traitlets = [ 1646 | {file = "traitlets-5.1.1-py3-none-any.whl", hash = "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"}, 1647 | {file = "traitlets-5.1.1.tar.gz", hash = "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7"}, 1648 | ] 1649 | trio = [ 1650 | {file = "trio-0.20.0-py3-none-any.whl", hash = "sha256:fb2d48e4eab0dfb786a472cd514aaadc71e3445b203bc300bad93daa75d77c1a"}, 1651 | {file = "trio-0.20.0.tar.gz", hash = "sha256:670a52d3115d0e879e1ac838a4eb999af32f858163e3a704fe4839de2a676070"}, 1652 | ] 1653 | trio-websocket = [ 1654 | {file = "trio-websocket-0.9.2.tar.gz", hash = "sha256:a3d34de8fac26023eee701ed1e7bf4da9a8326b61a62934ec9e53b64970fd8fe"}, 1655 | {file = "trio_websocket-0.9.2-py3-none-any.whl", hash = "sha256:5b558f6e83cc20a37c3b61202476c5295d1addf57bd65543364e0337e37ed2bc"}, 1656 | ] 1657 | typing-extensions = [ 1658 | {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, 1659 | {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, 1660 | ] 1661 | unify = [ 1662 | {file = "unify-0.5.tar.gz", hash = "sha256:8ddce812b2457212b7598fe574c9e6eb3ad69710f445391338270c7f8a71723c"}, 1663 | ] 1664 | untokenize = [ 1665 | {file = "untokenize-0.1.1.tar.gz", hash = "sha256:3865dbbbb8efb4bb5eaa72f1be7f3e0be00ea8b7f125c69cbd1f5fda926f37a2"}, 1666 | ] 1667 | urllib3 = [ 1668 | {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, 1669 | {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, 1670 | ] 1671 | wcwidth = [ 1672 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, 1673 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, 1674 | ] 1675 | wrapt = [ 1676 | {file = "wrapt-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:5a9a1889cc01ed2ed5f34574c90745fab1dd06ec2eee663e8ebeefe363e8efd7"}, 1677 | {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:9a3ff5fb015f6feb78340143584d9f8a0b91b6293d6b5cf4295b3e95d179b88c"}, 1678 | {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4b847029e2d5e11fd536c9ac3136ddc3f54bc9488a75ef7d040a3900406a91eb"}, 1679 | {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:9a5a544861b21e0e7575b6023adebe7a8c6321127bb1d238eb40d99803a0e8bd"}, 1680 | {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:88236b90dda77f0394f878324cfbae05ae6fde8a84d548cfe73a75278d760291"}, 1681 | {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f0408e2dbad9e82b4c960274214af533f856a199c9274bd4aff55d4634dedc33"}, 1682 | {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9d8c68c4145041b4eeae96239802cfdfd9ef927754a5be3f50505f09f309d8c6"}, 1683 | {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:22626dca56fd7f55a0733e604f1027277eb0f4f3d95ff28f15d27ac25a45f71b"}, 1684 | {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:65bf3eb34721bf18b5a021a1ad7aa05947a1767d1aa272b725728014475ea7d5"}, 1685 | {file = "wrapt-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09d16ae7a13cff43660155383a2372b4aa09109c7127aa3f24c3cf99b891c330"}, 1686 | {file = "wrapt-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:debaf04f813ada978d7d16c7dfa16f3c9c2ec9adf4656efdc4defdf841fc2f0c"}, 1687 | {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748df39ed634851350efa87690c2237a678ed794fe9ede3f0d79f071ee042561"}, 1688 | {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1807054aa7b61ad8d8103b3b30c9764de2e9d0c0978e9d3fc337e4e74bf25faa"}, 1689 | {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763a73ab377390e2af26042f685a26787c402390f682443727b847e9496e4a2a"}, 1690 | {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8529b07b49b2d89d6917cfa157d3ea1dfb4d319d51e23030664a827fe5fd2131"}, 1691 | {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:68aeefac31c1f73949662ba8affaf9950b9938b712fb9d428fa2a07e40ee57f8"}, 1692 | {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59d7d92cee84a547d91267f0fea381c363121d70fe90b12cd88241bd9b0e1763"}, 1693 | {file = "wrapt-1.14.0-cp310-cp310-win32.whl", hash = "sha256:3a88254881e8a8c4784ecc9cb2249ff757fd94b911d5df9a5984961b96113fff"}, 1694 | {file = "wrapt-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:9a242871b3d8eecc56d350e5e03ea1854de47b17f040446da0e47dc3e0b9ad4d"}, 1695 | {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a65bffd24409454b889af33b6c49d0d9bcd1a219b972fba975ac935f17bdf627"}, 1696 | {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9d9fcd06c952efa4b6b95f3d788a819b7f33d11bea377be6b8980c95e7d10775"}, 1697 | {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:db6a0ddc1282ceb9032e41853e659c9b638789be38e5b8ad7498caac00231c23"}, 1698 | {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:14e7e2c5f5fca67e9a6d5f753d21f138398cad2b1159913ec9e9a67745f09ba3"}, 1699 | {file = "wrapt-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:6d9810d4f697d58fd66039ab959e6d37e63ab377008ef1d63904df25956c7db0"}, 1700 | {file = "wrapt-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:d808a5a5411982a09fef6b49aac62986274ab050e9d3e9817ad65b2791ed1425"}, 1701 | {file = "wrapt-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b77159d9862374da213f741af0c361720200ab7ad21b9f12556e0eb95912cd48"}, 1702 | {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36a76a7527df8583112b24adc01748cd51a2d14e905b337a6fefa8b96fc708fb"}, 1703 | {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0057b5435a65b933cbf5d859cd4956624df37b8bf0917c71756e4b3d9958b9e"}, 1704 | {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0a4ca02752ced5f37498827e49c414d694ad7cf451ee850e3ff160f2bee9d3"}, 1705 | {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8c6be72eac3c14baa473620e04f74186c5d8f45d80f8f2b4eda6e1d18af808e8"}, 1706 | {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:21b1106bff6ece8cb203ef45b4f5778d7226c941c83aaaa1e1f0f4f32cc148cd"}, 1707 | {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:493da1f8b1bb8a623c16552fb4a1e164c0200447eb83d3f68b44315ead3f9036"}, 1708 | {file = "wrapt-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:89ba3d548ee1e6291a20f3c7380c92f71e358ce8b9e48161401e087e0bc740f8"}, 1709 | {file = "wrapt-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:729d5e96566f44fccac6c4447ec2332636b4fe273f03da128fff8d5559782b06"}, 1710 | {file = "wrapt-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:891c353e95bb11abb548ca95c8b98050f3620a7378332eb90d6acdef35b401d4"}, 1711 | {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23f96134a3aa24cc50614920cc087e22f87439053d886e474638c68c8d15dc80"}, 1712 | {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6807bcee549a8cb2f38f73f469703a1d8d5d990815c3004f21ddb68a567385ce"}, 1713 | {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6915682f9a9bc4cf2908e83caf5895a685da1fbd20b6d485dafb8e218a338279"}, 1714 | {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f2f3bc7cd9c9fcd39143f11342eb5963317bd54ecc98e3650ca22704b69d9653"}, 1715 | {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3a71dbd792cc7a3d772ef8cd08d3048593f13d6f40a11f3427c000cf0a5b36a0"}, 1716 | {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5a0898a640559dec00f3614ffb11d97a2666ee9a2a6bad1259c9facd01a1d4d9"}, 1717 | {file = "wrapt-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:167e4793dc987f77fd476862d32fa404d42b71f6a85d3b38cbce711dba5e6b68"}, 1718 | {file = "wrapt-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d066ffc5ed0be00cd0352c95800a519cf9e4b5dd34a028d301bdc7177c72daf3"}, 1719 | {file = "wrapt-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9bdfa74d369256e4218000a629978590fd7cb6cf6893251dad13d051090436d"}, 1720 | {file = "wrapt-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2498762814dd7dd2a1d0248eda2afbc3dd9c11537bc8200a4b21789b6df6cd38"}, 1721 | {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f24ca7953f2643d59a9c87d6e272d8adddd4a53bb62b9208f36db408d7aafc7"}, 1722 | {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b835b86bd5a1bdbe257d610eecab07bf685b1af2a7563093e0e69180c1d4af1"}, 1723 | {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b21650fa6907e523869e0396c5bd591cc326e5c1dd594dcdccac089561cacfb8"}, 1724 | {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:354d9fc6b1e44750e2a67b4b108841f5f5ea08853453ecbf44c81fdc2e0d50bd"}, 1725 | {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1f83e9c21cd5275991076b2ba1cd35418af3504667affb4745b48937e214bafe"}, 1726 | {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61e1a064906ccba038aa3c4a5a82f6199749efbbb3cef0804ae5c37f550eded0"}, 1727 | {file = "wrapt-1.14.0-cp38-cp38-win32.whl", hash = "sha256:28c659878f684365d53cf59dc9a1929ea2eecd7ac65da762be8b1ba193f7e84f"}, 1728 | {file = "wrapt-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:b0ed6ad6c9640671689c2dbe6244680fe8b897c08fd1fab2228429b66c518e5e"}, 1729 | {file = "wrapt-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3f7e671fb19734c872566e57ce7fc235fa953d7c181bb4ef138e17d607dc8a1"}, 1730 | {file = "wrapt-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87fa943e8bbe40c8c1ba4086971a6fefbf75e9991217c55ed1bcb2f1985bd3d4"}, 1731 | {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4775a574e9d84e0212f5b18886cace049a42e13e12009bb0491562a48bb2b758"}, 1732 | {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d57677238a0c5411c76097b8b93bdebb02eb845814c90f0b01727527a179e4d"}, 1733 | {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00108411e0f34c52ce16f81f1d308a571df7784932cc7491d1e94be2ee93374b"}, 1734 | {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d332eecf307fca852d02b63f35a7872de32d5ba8b4ec32da82f45df986b39ff6"}, 1735 | {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:01f799def9b96a8ec1ef6b9c1bbaf2bbc859b87545efbecc4a78faea13d0e3a0"}, 1736 | {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47045ed35481e857918ae78b54891fac0c1d197f22c95778e66302668309336c"}, 1737 | {file = "wrapt-1.14.0-cp39-cp39-win32.whl", hash = "sha256:2eca15d6b947cfff51ed76b2d60fd172c6ecd418ddab1c5126032d27f74bc350"}, 1738 | {file = "wrapt-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb36fbb48b22985d13a6b496ea5fb9bb2a076fea943831643836c9f6febbcfdc"}, 1739 | {file = "wrapt-1.14.0.tar.gz", hash = "sha256:8323a43bd9c91f62bb7d4be74cc9ff10090e7ef820e27bfe8815c57e68261311"}, 1740 | ] 1741 | wsproto = [ 1742 | {file = "wsproto-1.1.0-py3-none-any.whl", hash = "sha256:2218cb57952d90b9fca325c0dcfb08c3bda93e8fd8070b0a17f048e2e47a521b"}, 1743 | {file = "wsproto-1.1.0.tar.gz", hash = "sha256:a2e56bfd5c7cd83c1369d83b5feccd6d37798b74872866e62616e0ecf111bda8"}, 1744 | ] 1745 | yapf = [ 1746 | {file = "yapf-0.32.0-py2.py3-none-any.whl", hash = "sha256:8fea849025584e486fd06d6ba2bed717f396080fd3cc236ba10cb97c4c51cf32"}, 1747 | {file = "yapf-0.32.0.tar.gz", hash = "sha256:a3f5085d37ef7e3e004c4ba9f9b3e40c54ff1901cd111f05145ae313a7c67d1b"}, 1748 | ] 1749 | zipp = [ 1750 | {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, 1751 | {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, 1752 | ] 1753 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | authors = ["Ryan Munro <500774+munro@users.noreply.github.com>"] 3 | description = "Wrapper for Selenium to make it easy, with asyncio support!" 4 | documentation = "https://selenium-async.readthedocs.io/en/latest/" 5 | homepage = "https://github.com/munro/python-selenium-async" 6 | license = "MIT" 7 | name = "selenium-async" 8 | readme = "README.md" 9 | repository = "https://github.com/munro/python-selenium-async" 10 | version = "0.1.0" 11 | 12 | [tool.poetry.dependencies] 13 | python = "^3.9" 14 | selenium = "^4.1.3" 15 | 16 | [tool.poetry.dev-dependencies] 17 | Sphinx = "^4.5.0" 18 | autoflake = "^1.4" 19 | black = "^22.3.0" 20 | ipython = "^8.2.0" 21 | isort = "^5.10.1" 22 | myst-parser = "^0.17.0" 23 | pylint = "^2.13.5" 24 | pytest = "^7.1.1" 25 | pytest-asyncio = "^0.18.3" 26 | sphinx-markdown-builder = "^0.5.5" 27 | sphinx-rtd-theme = "^1.0.0" 28 | sphinxcontrib-napoleon = "^0.7" 29 | 30 | [tool.poetry.scripts] 31 | doc = 'selenium_async._scripts:doc' 32 | format = 'selenium_async._scripts:format' 33 | test = 'selenium_async._scripts:test' 34 | test-integration = 'selenium_async._scripts:test_integration' 35 | 36 | [tool.pytest.ini_options] 37 | asyncio_mode = "auto" 38 | 39 | [build-system] 40 | build-backend = "poetry.core.masonry.api" 41 | requires = ["poetry-core>=1.0.0"] 42 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | selenium 2 | 3 | pytest 4 | pytest-asyncio 5 | 6 | myst-parser 7 | sphinx-markdown-builder 8 | sphinx-rtd-theme 9 | sphinxcontrib-napoleon 10 | -------------------------------------------------------------------------------- /selenium_async/__init__.py: -------------------------------------------------------------------------------- 1 | from selenium_async._selenium import ( 2 | EC, 3 | By, 4 | Firefox, 5 | FirefoxBase, 6 | FirefoxOptions, 7 | Keys, 8 | TimeoutException, 9 | WebDriver, 10 | WebDriverWait, 11 | ) 12 | from selenium_async.core import launch, launch_sync, run_sync, use_browser 13 | from selenium_async.options import BrowserType, Options 14 | from selenium_async.pool import Pool, default_pool 15 | 16 | __version__ = "0.1.0" 17 | 18 | run_sync, use_browser, launch, launch_sync = run_sync, use_browser, launch, launch_sync 19 | BrowserType, Options = BrowserType, Options 20 | Pool, default_pool = Pool, default_pool 21 | ( 22 | EC, 23 | By, 24 | Firefox, 25 | FirefoxBase, 26 | FirefoxOptions, 27 | Keys, 28 | TimeoutException, 29 | WebDriver, 30 | WebDriverWait, 31 | ) = ( 32 | EC, 33 | By, 34 | Firefox, 35 | FirefoxBase, 36 | FirefoxOptions, 37 | Keys, 38 | TimeoutException, 39 | WebDriver, 40 | WebDriverWait, 41 | ) 42 | -------------------------------------------------------------------------------- /selenium_async/_scripts.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | 4 | def test(): 5 | os.system("pytest -m 'not integration'") 6 | 7 | 8 | def test_integration(): 9 | os.system("pytest -m 'integration'") 10 | 11 | 12 | def doc(): 13 | os.system("sphinx-build source build") 14 | 15 | 16 | def format(): 17 | os.system("isort .") 18 | os.system("autoflake -i --remove-all-unused-imports **/*.py") 19 | os.system("black .") 20 | 21 | 22 | def push_read_the_docs(): 23 | os.system( 24 | "poetry export -f requirements.txt --without-hashes --output requirements.txt" 25 | ) 26 | 27 | 28 | def doc_markdown(): 29 | # @TODO this doesn't format correctly... 30 | os.system("sphinx-build -b markdown source build") 31 | -------------------------------------------------------------------------------- /selenium_async/_selenium.py: -------------------------------------------------------------------------------- 1 | import atexit 2 | import warnings 3 | import weakref 4 | 5 | from selenium.common.exceptions import TimeoutException 6 | from selenium.webdriver.common.by import By 7 | from selenium.webdriver.common.keys import Keys 8 | from selenium.webdriver.firefox.options import Options as FirefoxOptions 9 | from selenium.webdriver.firefox.webdriver import WebDriver as FirefoxBase 10 | from selenium.webdriver.remote.webdriver import WebDriver as WebDriverBase 11 | from selenium.webdriver.support import expected_conditions as EC 12 | from selenium.webdriver.support.wait import WebDriverWait 13 | 14 | # don't tell me what to do! 15 | warnings.filterwarnings( 16 | "ignore", 17 | message="find_element_by_css_selector is deprecated. Please use find_element(by=By.CSS_SELECTOR, value=css_selector) instead", 18 | ) 19 | 20 | 21 | class WebDriver(WebDriverBase): 22 | running: bool 23 | 24 | def get_blank(self): 25 | raise NotImplementedError 26 | 27 | 28 | class WebdriverMixin(WebDriver, object): 29 | running: bool 30 | 31 | def __init__(self, *args, **kwargs): 32 | super().__init__(*args, **kwargs) 33 | 34 | def _atexit(): 35 | self.quit() 36 | 37 | def _finalizer(_driver: WebDriver): 38 | # @TODO this isn't working, ugh! 39 | _driver.quit() 40 | 41 | self.running = True 42 | self.__atexit__ = atexit.register(_atexit) 43 | self._finalizer = weakref.finalize(self, _finalizer, self) 44 | 45 | def close(self): 46 | try: 47 | super().close() 48 | except: 49 | pass 50 | 51 | def quit(self): 52 | try: 53 | atexit.unregister(self.__atexit__) 54 | except: 55 | pass 56 | try: 57 | self.close() 58 | except: 59 | pass 60 | try: 61 | super().close() 62 | except: 63 | pass 64 | self.running = False 65 | 66 | 67 | class Firefox(WebdriverMixin, WebDriver, FirefoxBase): 68 | def __init__(self, *args, **kwargs): 69 | super().__init__(*args, **kwargs) 70 | 71 | def get_blank(self): 72 | self.get("about:blank") 73 | 74 | 75 | (TimeoutException, By, Keys, FirefoxOptions, FirefoxBase, EC, WebDriverWait,) = ( 76 | TimeoutException, 77 | By, 78 | Keys, 79 | FirefoxOptions, 80 | FirefoxBase, 81 | EC, 82 | WebDriverWait, 83 | ) 84 | -------------------------------------------------------------------------------- /selenium_async/core.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import random 3 | from asyncio import AbstractEventLoop 4 | from contextlib import asynccontextmanager 5 | from typing import Callable, Optional, TypeVar 6 | 7 | from selenium_async._selenium import Firefox, FirefoxOptions, WebDriver 8 | from selenium_async.options import BrowserType, Options 9 | from selenium_async.pool import Pool, default_pool 10 | 11 | T = TypeVar("T") 12 | 13 | 14 | async def run_sync( 15 | func: Callable[[WebDriver], T], 16 | *, 17 | browser: BrowserType = "firefox", 18 | headless: bool = True, 19 | loop: Optional[AbstractEventLoop] = None, 20 | pool: Optional[Pool] = None, 21 | ) -> T: 22 | if loop is None: 23 | loop = asyncio.get_event_loop() 24 | if pool is None: 25 | pool = default_pool() 26 | 27 | options = Options(browser=browser, headless=headless) 28 | 29 | async with use_browser(options=options, pool=pool) as driver: 30 | return await asyncio.to_thread(func, driver) 31 | 32 | 33 | @asynccontextmanager 34 | async def use_browser( 35 | options: Optional[Options] = None, 36 | *, 37 | pool: Optional[Pool] = None, 38 | ): 39 | if pool is None: 40 | pool = default_pool() 41 | if options is None: 42 | options = Options() 43 | 44 | await pool.semaphore.acquire() 45 | try: 46 | if options in pool.resources: 47 | driver = pool.resources[options].pop() 48 | if len(pool.resources[options]) == 0: 49 | del pool.resources[options] 50 | else: 51 | # close webdrivers if there are too many in the pool that 52 | # don't match our desired options 53 | too_many = len(pool) - (pool.max_size - 1) 54 | if too_many > 0: 55 | weighted_keys = [ 56 | k for k, v in pool.resources.items() for _ in range(len(v)) 57 | ] 58 | random.shuffle(weighted_keys) 59 | remove_keys = weighted_keys[0:too_many] 60 | drivers: list[WebDriver] = [] 61 | for key in remove_keys: 62 | drivers.append(pool.resources[key].pop()) 63 | if len(pool.resources[key]) == 0: 64 | del pool.resources[key] 65 | 66 | def _close_drivers(): 67 | for driver in drivers: 68 | driver.quit() 69 | 70 | await asyncio.to_thread(_close_drivers) 71 | 72 | # create new driver 73 | driver = await launch(options) 74 | 75 | try: 76 | yield driver 77 | if pool.blank_page_after_use: 78 | driver.get_blank() 79 | 80 | # if successfully finishes, add driver back to pool 81 | if options not in pool.resources: 82 | pool.resources[options] = [] 83 | pool.resources[options].append(driver) 84 | except: 85 | # if error, don't return driver back to pool 86 | try: 87 | driver.quit() 88 | except: 89 | pass 90 | raise 91 | finally: 92 | pool.semaphore.release() 93 | 94 | 95 | async def launch(options: Optional[Options] = None) -> WebDriver: 96 | return await asyncio.to_thread(lambda: launch_sync(options)) 97 | 98 | 99 | def launch_sync(options: Optional[Options] = None) -> WebDriver: 100 | if options is None: 101 | options = Options() 102 | if options.browser == "firefox": 103 | firefox_options = FirefoxOptions() 104 | if options.headless: 105 | firefox_options.headless = True 106 | 107 | return Firefox(options=firefox_options) 108 | if options.browser == "chrome": 109 | raise NotImplementedError(f"@TODO Implement browser {repr(options.browser)}") 110 | 111 | raise NotImplementedError(f"Not sure how to open browser {repr(options.browser)}") 112 | -------------------------------------------------------------------------------- /selenium_async/functional.py: -------------------------------------------------------------------------------- 1 | from functools import wraps 2 | 3 | 4 | def ignore_errors(func): 5 | @wraps(func) 6 | def wrapper(*args, **kwargs): 7 | try: 8 | return func(*args, **kwargs) 9 | except: 10 | return None 11 | 12 | return wrapper 13 | -------------------------------------------------------------------------------- /selenium_async/options.py: -------------------------------------------------------------------------------- 1 | from dataclasses import KW_ONLY, dataclass 2 | from typing import Literal 3 | 4 | BrowserType = Literal["firefox", "chrome"] 5 | 6 | 7 | @dataclass(frozen=True, eq=True, order=True) 8 | class Options: 9 | _: KW_ONLY 10 | browser: BrowserType = "firefox" 11 | headless: bool = True 12 | -------------------------------------------------------------------------------- /selenium_async/pool.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | from dataclasses import KW_ONLY, dataclass, field 3 | from functools import lru_cache 4 | from typing import Dict 5 | 6 | from selenium_async._selenium import WebDriver 7 | from selenium_async.options import Options 8 | 9 | 10 | @dataclass(init=False) 11 | class Pool: 12 | _: KW_ONLY 13 | max_size: int 14 | blank_page_after_use: bool 15 | resources: Dict[Options, list[WebDriver]] = field(repr=False) 16 | semaphore: asyncio.Semaphore = field(repr=False) 17 | 18 | def __init__( 19 | self, 20 | *, 21 | max_size: int = 4, 22 | blank_page_after_use: bool = True, 23 | ) -> None: 24 | self.max_size = max_size 25 | self.blank_page_after_use = blank_page_after_use 26 | self.resources = {} 27 | self.semaphore = asyncio.Semaphore(max_size) 28 | 29 | def __len__(self): 30 | return sum(len(x) for x in self.resources.values()) 31 | 32 | 33 | @lru_cache() 34 | def default_pool(): 35 | return Pool() 36 | -------------------------------------------------------------------------------- /selenium_async/vendor/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/munro/python-selenium-async/968f3a63c07d58d510a3eb172d06d96c44ee3ab3/selenium_async/vendor/__init__.py -------------------------------------------------------------------------------- /selenium_async/vendor/firefox.py: -------------------------------------------------------------------------------- 1 | from selenium_async._selenium import Firefox 2 | 3 | 4 | def firefox_get_browser_pid(driver: Firefox) -> int: 5 | if driver.service is not None and driver.service.process is not None: 6 | print(driver.service.process.pid) 7 | print(driver.service.__dict__) 8 | print(driver.service.process.__dict__) 9 | raise NotImplementedError("@TODO get pid so we can kill it if geckodriver dies") 10 | -------------------------------------------------------------------------------- /source/conf.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from datetime import date 4 | 5 | sys.path.insert(0, os.path.abspath("..")) 6 | 7 | project = "selenium_async" 8 | copyright_year = "-".join(str(x) for x in {2022, date.today().year}) 9 | copyright = f"{copyright_year}, Ryan Munro" 10 | author = "Ryan Munro" 11 | release = "0.1.0" 12 | extensions = [ 13 | "myst_parser", 14 | "sphinx.ext.autodoc", 15 | "sphinx.ext.autosummary", 16 | "sphinx.ext.doctest", 17 | "sphinx.ext.napoleon", 18 | "sphinx.ext.viewcode", 19 | ] 20 | templates_path = [] 21 | exclude_patterns = [] 22 | html_theme = "sphinx_rtd_theme" 23 | html_static_path = [] 24 | -------------------------------------------------------------------------------- /source/index.rst: -------------------------------------------------------------------------------- 1 | Welcome to selenium-async's documentation! 2 | ========================================== 3 | 4 | Summary 5 | ======= 6 | 7 | .. autosummary:: 8 | selenium_async.run_sync 9 | selenium_async.use_browser 10 | 11 | selenium_async.Pool 12 | selenium_async.default_pool 13 | 14 | selenium_async.launch 15 | selenium_async.launch_sync 16 | 17 | selenium_async.BrowserType 18 | selenium_async.Options 19 | 20 | Re-exported from selenium package 21 | ================================= 22 | 23 | .. autosummary:: 24 | selenium_async.EC 25 | selenium_async.By 26 | selenium_async.Firefox 27 | selenium_async.FirefoxBase 28 | selenium_async.FirefoxOptions 29 | selenium_async.Keys 30 | selenium_async.TimeoutException 31 | selenium_async.WebDriver 32 | selenium_async.WebDriverWait 33 | 34 | Using the WebDriver pool 35 | ======================== 36 | 37 | .. autofunction:: 38 | selenium_async.run_sync 39 | 40 | .. autofunction:: 41 | selenium_async.use_browser 42 | 43 | Creating Webdriver Pools 44 | ======================== 45 | 46 | .. autofunction:: 47 | selenium_async.Pool 48 | 49 | .. autofunction:: 50 | selenium_async.default_pool 51 | 52 | Launching browsers without a pool 53 | ================================= 54 | 55 | .. autofunction:: 56 | selenium_async.launch 57 | 58 | .. autofunction:: 59 | selenium_async.launch_sync 60 | 61 | .. autofunction:: 62 | selenium_async.Options 63 | 64 | .. autofunction:: 65 | selenium_async.BrowserType 66 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/munro/python-selenium-async/968f3a63c07d58d510a3eb172d06d96c44ee3ab3/tests/__init__.py -------------------------------------------------------------------------------- /tests/integration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/munro/python-selenium-async/968f3a63c07d58d510a3eb172d06d96c44ee3ab3/tests/integration/__init__.py -------------------------------------------------------------------------------- /tests/integration/test_pool.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | from timeit import default_timer 3 | 4 | import pytest 5 | 6 | import selenium_async 7 | 8 | 9 | @pytest.mark.integration 10 | async def test_pool(): 11 | cool_urls = [ 12 | "http://python.com", 13 | "https://news.ycombinator.com/", 14 | "https://www.reddit.com/", 15 | "https://www.yahoo.com/", 16 | "https://www.google.com/", 17 | "https://www.forbes.com/", 18 | "https://twitter.com/", 19 | ] 20 | 21 | def cool(driver: selenium_async.WebDriver): 22 | 23 | import random 24 | 25 | start = default_timer() 26 | 27 | url = random.choice(cool_urls) 28 | 29 | driver.get(url) 30 | finish = default_timer() 31 | driver.get_blank() 32 | 33 | duration = finish - start 34 | return start, duration, url, driver.title 35 | 36 | async def _main(): 37 | driver = selenium_async.launch_sync(selenium_async.Options(headless=False)) 38 | driver.get("http://python.org") 39 | 40 | begin = default_timer() 41 | 42 | results = await asyncio.gather( 43 | *(selenium_async.run_sync(cool, headless=False) for _ in range(10)) 44 | ) 45 | 46 | for i, (start, duration, url, title) in enumerate(results): 47 | time_offset = start - begin 48 | print( 49 | f"[INDEX {i}] [OFFSET {time_offset:6.3f}] [DURATION {duration:6.3f}] {url} -- {title}" 50 | ) 51 | 52 | await _main() 53 | -------------------------------------------------------------------------------- /tests/test_selenium_async.py: -------------------------------------------------------------------------------- 1 | import selenium_async 2 | 3 | 4 | def test_version(): 5 | assert selenium_async.__version__ == "0.1.0" 6 | --------------------------------------------------------------------------------