This is page 38 of 168. Use http://codebase.md/romanshablio/mcp_server?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .DS_Store
├── .venv
│ ├── __pycache__
│ │ └── hello.cpython-312.pyc
│ ├── bin
│ │ ├── activate
│ │ ├── activate.csh
│ │ ├── activate.fish
│ │ ├── Activate.ps1
│ │ ├── flask
│ │ ├── normalizer
│ │ ├── pip
│ │ ├── pip3
│ │ ├── pip3.12
│ │ ├── python
│ │ ├── python3
│ │ └── python3.12
│ ├── hello.py
│ ├── lib
│ │ └── python3.12
│ │ └── site-packages
│ │ ├── beautifulsoup4-4.12.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ ├── AUTHORS
│ │ │ │ └── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── blinker
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _utilities.cpython-312.pyc
│ │ │ │ └── base.cpython-312.pyc
│ │ │ ├── _utilities.py
│ │ │ ├── base.py
│ │ │ └── py.typed
│ │ ├── blinker-1.8.2.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── bs4
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── css.cpython-312.pyc
│ │ │ │ ├── dammit.cpython-312.pyc
│ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ ├── element.cpython-312.pyc
│ │ │ │ └── formatter.cpython-312.pyc
│ │ │ ├── builder
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _html5lib.cpython-312.pyc
│ │ │ │ │ ├── _htmlparser.cpython-312.pyc
│ │ │ │ │ └── _lxml.cpython-312.pyc
│ │ │ │ ├── _html5lib.py
│ │ │ │ ├── _htmlparser.py
│ │ │ │ └── _lxml.py
│ │ │ ├── css.py
│ │ │ ├── dammit.py
│ │ │ ├── diagnose.py
│ │ │ ├── element.py
│ │ │ ├── formatter.py
│ │ │ └── tests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── test_builder_registry.cpython-312.pyc
│ │ │ │ ├── test_builder.cpython-312.pyc
│ │ │ │ ├── test_css.cpython-312.pyc
│ │ │ │ ├── test_dammit.cpython-312.pyc
│ │ │ │ ├── test_docs.cpython-312.pyc
│ │ │ │ ├── test_element.cpython-312.pyc
│ │ │ │ ├── test_formatter.cpython-312.pyc
│ │ │ │ ├── test_fuzz.cpython-312.pyc
│ │ │ │ ├── test_html5lib.cpython-312.pyc
│ │ │ │ ├── test_htmlparser.cpython-312.pyc
│ │ │ │ ├── test_lxml.cpython-312.pyc
│ │ │ │ ├── test_navigablestring.cpython-312.pyc
│ │ │ │ ├── test_pageelement.cpython-312.pyc
│ │ │ │ ├── test_soup.cpython-312.pyc
│ │ │ │ ├── test_tag.cpython-312.pyc
│ │ │ │ └── test_tree.cpython-312.pyc
│ │ │ ├── fuzz
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase
│ │ │ │ ├── crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase
│ │ │ │ └── crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase
│ │ │ ├── test_builder_registry.py
│ │ │ ├── test_builder.py
│ │ │ ├── test_css.py
│ │ │ ├── test_dammit.py
│ │ │ ├── test_docs.py
│ │ │ ├── test_element.py
│ │ │ ├── test_formatter.py
│ │ │ ├── test_fuzz.py
│ │ │ ├── test_html5lib.py
│ │ │ ├── test_htmlparser.py
│ │ │ ├── test_lxml.py
│ │ │ ├── test_navigablestring.py
│ │ │ ├── test_pageelement.py
│ │ │ ├── test_soup.py
│ │ │ ├── test_tag.py
│ │ │ └── test_tree.py
│ │ ├── certifi
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── core.cpython-312.pyc
│ │ │ ├── cacert.pem
│ │ │ ├── core.py
│ │ │ └── py.typed
│ │ ├── certifi-2024.8.30.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── charset_normalizer
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── cd.cpython-312.pyc
│ │ │ │ ├── constant.cpython-312.pyc
│ │ │ │ ├── legacy.cpython-312.pyc
│ │ │ │ ├── md.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── version.cpython-312.pyc
│ │ │ ├── api.py
│ │ │ ├── cd.py
│ │ │ ├── cli
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __main__.py
│ │ │ │ └── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── __main__.cpython-312.pyc
│ │ │ ├── constant.py
│ │ │ ├── legacy.py
│ │ │ ├── md__mypyc.cpython-312-darwin.so
│ │ │ ├── md.cpython-312-darwin.so
│ │ │ ├── md.py
│ │ │ ├── models.py
│ │ │ ├── py.typed
│ │ │ ├── utils.py
│ │ │ └── version.py
│ │ ├── charset_normalizer-3.4.0.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── click
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ ├── _termui_impl.cpython-312.pyc
│ │ │ │ ├── _textwrap.cpython-312.pyc
│ │ │ │ ├── _winconsole.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── decorators.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formatting.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── shell_completion.cpython-312.pyc
│ │ │ │ ├── termui.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── types.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── _compat.py
│ │ │ ├── _termui_impl.py
│ │ │ ├── _textwrap.py
│ │ │ ├── _winconsole.py
│ │ │ ├── core.py
│ │ │ ├── decorators.py
│ │ │ ├── exceptions.py
│ │ │ ├── formatting.py
│ │ │ ├── globals.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── shell_completion.py
│ │ │ ├── termui.py
│ │ │ ├── testing.py
│ │ │ ├── types.py
│ │ │ └── utils.py
│ │ ├── click-8.1.7.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.rst
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── fake_useragent
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ ├── fake.cpython-312.pyc
│ │ │ │ ├── log.cpython-312.pyc
│ │ │ │ ├── settings.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── data
│ │ │ │ └── browsers.json
│ │ │ ├── errors.py
│ │ │ ├── fake.py
│ │ │ ├── log.py
│ │ │ ├── settings.py
│ │ │ └── utils.py
│ │ ├── fake_useragent-1.5.1.dist-info
│ │ │ ├── AUTHORS
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── flask
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ ├── cli.cpython-312.pyc
│ │ │ │ ├── config.cpython-312.pyc
│ │ │ │ ├── ctx.cpython-312.pyc
│ │ │ │ ├── debughelpers.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── helpers.cpython-312.pyc
│ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── signals.cpython-312.pyc
│ │ │ │ ├── templating.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── typing.cpython-312.pyc
│ │ │ │ ├── views.cpython-312.pyc
│ │ │ │ └── wrappers.cpython-312.pyc
│ │ │ ├── app.py
│ │ │ ├── blueprints.py
│ │ │ ├── cli.py
│ │ │ ├── config.py
│ │ │ ├── ctx.py
│ │ │ ├── debughelpers.py
│ │ │ ├── globals.py
│ │ │ ├── helpers.py
│ │ │ ├── json
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ └── tag.cpython-312.pyc
│ │ │ │ ├── provider.py
│ │ │ │ └── tag.py
│ │ │ ├── logging.py
│ │ │ ├── py.typed
│ │ │ ├── sansio
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ │ └── scaffold.cpython-312.pyc
│ │ │ │ ├── app.py
│ │ │ │ ├── blueprints.py
│ │ │ │ ├── README.md
│ │ │ │ └── scaffold.py
│ │ │ ├── sessions.py
│ │ │ ├── signals.py
│ │ │ ├── templating.py
│ │ │ ├── testing.py
│ │ │ ├── typing.py
│ │ │ ├── views.py
│ │ │ └── wrappers.py
│ │ ├── flask-3.0.3.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── idna
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ ├── codec.py
│ │ │ ├── compat.py
│ │ │ ├── core.py
│ │ │ ├── idnadata.py
│ │ │ ├── intranges.py
│ │ │ ├── package_data.py
│ │ │ ├── py.typed
│ │ │ └── uts46data.py
│ │ ├── idna-3.10.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── itsdangerous
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ ├── exc.cpython-312.pyc
│ │ │ │ ├── serializer.cpython-312.pyc
│ │ │ │ ├── signer.cpython-312.pyc
│ │ │ │ ├── timed.cpython-312.pyc
│ │ │ │ └── url_safe.cpython-312.pyc
│ │ │ ├── _json.py
│ │ │ ├── encoding.py
│ │ │ ├── exc.py
│ │ │ ├── py.typed
│ │ │ ├── serializer.py
│ │ │ ├── signer.py
│ │ │ ├── timed.py
│ │ │ └── url_safe.py
│ │ ├── itsdangerous-2.2.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── jinja2
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _identifier.cpython-312.pyc
│ │ │ │ ├── async_utils.cpython-312.pyc
│ │ │ │ ├── bccache.cpython-312.pyc
│ │ │ │ ├── compiler.cpython-312.pyc
│ │ │ │ ├── constants.cpython-312.pyc
│ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ ├── defaults.cpython-312.pyc
│ │ │ │ ├── environment.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ ├── filters.cpython-312.pyc
│ │ │ │ ├── idtracking.cpython-312.pyc
│ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ ├── loaders.cpython-312.pyc
│ │ │ │ ├── meta.cpython-312.pyc
│ │ │ │ ├── nativetypes.cpython-312.pyc
│ │ │ │ ├── nodes.cpython-312.pyc
│ │ │ │ ├── optimizer.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── runtime.cpython-312.pyc
│ │ │ │ ├── sandbox.cpython-312.pyc
│ │ │ │ ├── tests.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── visitor.cpython-312.pyc
│ │ │ ├── _identifier.py
│ │ │ ├── async_utils.py
│ │ │ ├── bccache.py
│ │ │ ├── compiler.py
│ │ │ ├── constants.py
│ │ │ ├── debug.py
│ │ │ ├── defaults.py
│ │ │ ├── environment.py
│ │ │ ├── exceptions.py
│ │ │ ├── ext.py
│ │ │ ├── filters.py
│ │ │ ├── idtracking.py
│ │ │ ├── lexer.py
│ │ │ ├── loaders.py
│ │ │ ├── meta.py
│ │ │ ├── nativetypes.py
│ │ │ ├── nodes.py
│ │ │ ├── optimizer.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── runtime.py
│ │ │ ├── sandbox.py
│ │ │ ├── tests.py
│ │ │ ├── utils.py
│ │ │ └── visitor.py
│ │ ├── jinja2-3.1.4.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── lxml
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _elementpath.cpython-312.pyc
│ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ ├── cssselect.cpython-312.pyc
│ │ │ │ ├── doctestcompare.cpython-312.pyc
│ │ │ │ ├── ElementInclude.cpython-312.pyc
│ │ │ │ ├── pyclasslookup.cpython-312.pyc
│ │ │ │ ├── sax.cpython-312.pyc
│ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ ├── _elementpath.cpython-312-darwin.so
│ │ │ ├── _elementpath.py
│ │ │ ├── apihelpers.pxi
│ │ │ ├── builder.cpython-312-darwin.so
│ │ │ ├── builder.py
│ │ │ ├── classlookup.pxi
│ │ │ ├── cleanup.pxi
│ │ │ ├── cssselect.py
│ │ │ ├── debug.pxi
│ │ │ ├── docloader.pxi
│ │ │ ├── doctestcompare.py
│ │ │ ├── dtd.pxi
│ │ │ ├── ElementInclude.py
│ │ │ ├── etree_api.h
│ │ │ ├── etree.cpython-312-darwin.so
│ │ │ ├── etree.h
│ │ │ ├── etree.pyx
│ │ │ ├── extensions.pxi
│ │ │ ├── html
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _diffcommand.cpython-312.pyc
│ │ │ │ │ ├── _html5builder.cpython-312.pyc
│ │ │ │ │ ├── _setmixin.cpython-312.pyc
│ │ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ │ ├── clean.cpython-312.pyc
│ │ │ │ │ ├── defs.cpython-312.pyc
│ │ │ │ │ ├── diff.cpython-312.pyc
│ │ │ │ │ ├── ElementSoup.cpython-312.pyc
│ │ │ │ │ ├── formfill.cpython-312.pyc
│ │ │ │ │ ├── html5parser.cpython-312.pyc
│ │ │ │ │ ├── soupparser.cpython-312.pyc
│ │ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ │ ├── _diffcommand.py
│ │ │ │ ├── _html5builder.py
│ │ │ │ ├── _setmixin.py
│ │ │ │ ├── builder.py
│ │ │ │ ├── clean.py
│ │ │ │ ├── defs.py
│ │ │ │ ├── diff.cpython-312-darwin.so
│ │ │ │ ├── diff.py
│ │ │ │ ├── ElementSoup.py
│ │ │ │ ├── formfill.py
│ │ │ │ ├── html5parser.py
│ │ │ │ ├── soupparser.py
│ │ │ │ └── usedoctest.py
│ │ │ ├── includes
│ │ │ │ ├── __init__.pxd
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── c14n.pxd
│ │ │ │ ├── config.pxd
│ │ │ │ ├── dtdvalid.pxd
│ │ │ │ ├── etree_defs.h
│ │ │ │ ├── etreepublic.pxd
│ │ │ │ ├── extlibs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── libcharset.h
│ │ │ │ │ ├── localcharset.h
│ │ │ │ │ ├── zconf.h
│ │ │ │ │ └── zlib.h
│ │ │ │ ├── htmlparser.pxd
│ │ │ │ ├── libexslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── exslt.h
│ │ │ │ │ ├── exsltconfig.h
│ │ │ │ │ └── exsltexports.h
│ │ │ │ ├── libxml
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── c14n.h
│ │ │ │ │ ├── catalog.h
│ │ │ │ │ ├── chvalid.h
│ │ │ │ │ ├── debugXML.h
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── encoding.h
│ │ │ │ │ ├── entities.h
│ │ │ │ │ ├── globals.h
│ │ │ │ │ ├── hash.h
│ │ │ │ │ ├── HTMLparser.h
│ │ │ │ │ ├── HTMLtree.h
│ │ │ │ │ ├── list.h
│ │ │ │ │ ├── nanoftp.h
│ │ │ │ │ ├── nanohttp.h
│ │ │ │ │ ├── parser.h
│ │ │ │ │ ├── parserInternals.h
│ │ │ │ │ ├── relaxng.h
│ │ │ │ │ ├── SAX.h
│ │ │ │ │ ├── SAX2.h
│ │ │ │ │ ├── schemasInternals.h
│ │ │ │ │ ├── schematron.h
│ │ │ │ │ ├── threads.h
│ │ │ │ │ ├── tree.h
│ │ │ │ │ ├── uri.h
│ │ │ │ │ ├── valid.h
│ │ │ │ │ ├── xinclude.h
│ │ │ │ │ ├── xlink.h
│ │ │ │ │ ├── xmlautomata.h
│ │ │ │ │ ├── xmlerror.h
│ │ │ │ │ ├── xmlexports.h
│ │ │ │ │ ├── xmlIO.h
│ │ │ │ │ ├── xmlmemory.h
│ │ │ │ │ ├── xmlmodule.h
│ │ │ │ │ ├── xmlreader.h
│ │ │ │ │ ├── xmlregexp.h
│ │ │ │ │ ├── xmlsave.h
│ │ │ │ │ ├── xmlschemas.h
│ │ │ │ │ ├── xmlschemastypes.h
│ │ │ │ │ ├── xmlstring.h
│ │ │ │ │ ├── xmlunicode.h
│ │ │ │ │ ├── xmlversion.h
│ │ │ │ │ ├── xmlwriter.h
│ │ │ │ │ ├── xpath.h
│ │ │ │ │ ├── xpathInternals.h
│ │ │ │ │ └── xpointer.h
│ │ │ │ ├── libxslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── attributes.h
│ │ │ │ │ ├── documents.h
│ │ │ │ │ ├── extensions.h
│ │ │ │ │ ├── extra.h
│ │ │ │ │ ├── functions.h
│ │ │ │ │ ├── imports.h
│ │ │ │ │ ├── keys.h
│ │ │ │ │ ├── namespaces.h
│ │ │ │ │ ├── numbersInternals.h
│ │ │ │ │ ├── pattern.h
│ │ │ │ │ ├── preproc.h
│ │ │ │ │ ├── security.h
│ │ │ │ │ ├── templates.h
│ │ │ │ │ ├── transform.h
│ │ │ │ │ ├── variables.h
│ │ │ │ │ ├── xslt.h
│ │ │ │ │ ├── xsltconfig.h
│ │ │ │ │ ├── xsltexports.h
│ │ │ │ │ ├── xsltInternals.h
│ │ │ │ │ ├── xsltlocale.h
│ │ │ │ │ └── xsltutils.h
│ │ │ │ ├── lxml-version.h
│ │ │ │ ├── relaxng.pxd
│ │ │ │ ├── schematron.pxd
│ │ │ │ ├── tree.pxd
│ │ │ │ ├── uri.pxd
│ │ │ │ ├── xinclude.pxd
│ │ │ │ ├── xmlerror.pxd
│ │ │ │ ├── xmlparser.pxd
│ │ │ │ ├── xmlschema.pxd
│ │ │ │ ├── xpath.pxd
│ │ │ │ └── xslt.pxd
│ │ │ ├── isoschematron
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ └── resources
│ │ │ │ ├── rng
│ │ │ │ │ └── iso-schematron.rng
│ │ │ │ └── xsl
│ │ │ │ ├── iso-schematron-xslt1
│ │ │ │ │ ├── iso_abstract_expand.xsl
│ │ │ │ │ ├── iso_dsdl_include.xsl
│ │ │ │ │ ├── iso_schematron_message.xsl
│ │ │ │ │ ├── iso_schematron_skeleton_for_xslt1.xsl
│ │ │ │ │ ├── iso_svrl_for_xslt1.xsl
│ │ │ │ │ └── readme.txt
│ │ │ │ ├── RNG2Schtrn.xsl
│ │ │ │ └── XSD2Schtrn.xsl
│ │ │ ├── iterparse.pxi
│ │ │ ├── lxml.etree_api.h
│ │ │ ├── lxml.etree.h
│ │ │ ├── nsclasses.pxi
│ │ │ ├── objectify.cpython-312-darwin.so
│ │ │ ├── objectify.pyx
│ │ │ ├── objectpath.pxi
│ │ │ ├── parser.pxi
│ │ │ ├── parsertarget.pxi
│ │ │ ├── proxy.pxi
│ │ │ ├── public-api.pxi
│ │ │ ├── pyclasslookup.py
│ │ │ ├── readonlytree.pxi
│ │ │ ├── relaxng.pxi
│ │ │ ├── sax.cpython-312-darwin.so
│ │ │ ├── sax.py
│ │ │ ├── saxparser.pxi
│ │ │ ├── schematron.pxi
│ │ │ ├── serializer.pxi
│ │ │ ├── usedoctest.py
│ │ │ ├── xinclude.pxi
│ │ │ ├── xmlerror.pxi
│ │ │ ├── xmlid.pxi
│ │ │ ├── xmlschema.pxi
│ │ │ ├── xpath.pxi
│ │ │ ├── xslt.pxi
│ │ │ └── xsltext.pxi
│ │ ├── lxml-5.3.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── LICENSES.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── markupsafe
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── _native.cpython-312.pyc
│ │ │ ├── _native.py
│ │ │ ├── _speedups.c
│ │ │ ├── _speedups.cpython-312-darwin.so
│ │ │ ├── _speedups.pyi
│ │ │ └── py.typed
│ │ ├── MarkupSafe-3.0.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── pip
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pip-runner__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── __pip-runner__.cpython-312.pyc
│ │ │ ├── _internal
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── build_env.cpython-312.pyc
│ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ ├── pyproject.cpython-312.pyc
│ │ │ │ │ ├── self_outdated_check.cpython-312.pyc
│ │ │ │ │ └── wheel_builder.cpython-312.pyc
│ │ │ │ ├── build_env.py
│ │ │ │ ├── cache.py
│ │ │ │ ├── cli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── autocompletion.cpython-312.pyc
│ │ │ │ │ │ ├── base_command.cpython-312.pyc
│ │ │ │ │ │ ├── cmdoptions.cpython-312.pyc
│ │ │ │ │ │ ├── command_context.cpython-312.pyc
│ │ │ │ │ │ ├── index_command.cpython-312.pyc
│ │ │ │ │ │ ├── main_parser.cpython-312.pyc
│ │ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bars.cpython-312.pyc
│ │ │ │ │ │ ├── req_command.cpython-312.pyc
│ │ │ │ │ │ ├── spinners.cpython-312.pyc
│ │ │ │ │ │ └── status_codes.cpython-312.pyc
│ │ │ │ │ ├── autocompletion.py
│ │ │ │ │ ├── base_command.py
│ │ │ │ │ ├── cmdoptions.py
│ │ │ │ │ ├── command_context.py
│ │ │ │ │ ├── index_command.py
│ │ │ │ │ ├── main_parser.py
│ │ │ │ │ ├── main.py
│ │ │ │ │ ├── parser.py
│ │ │ │ │ ├── progress_bars.py
│ │ │ │ │ ├── req_command.py
│ │ │ │ │ ├── spinners.py
│ │ │ │ │ └── status_codes.py
│ │ │ │ ├── commands
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── completion.cpython-312.pyc
│ │ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ ├── hash.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── inspect.cpython-312.pyc
│ │ │ │ │ │ ├── install.cpython-312.pyc
│ │ │ │ │ │ ├── list.cpython-312.pyc
│ │ │ │ │ │ ├── search.cpython-312.pyc
│ │ │ │ │ │ ├── show.cpython-312.pyc
│ │ │ │ │ │ ├── uninstall.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── completion.py
│ │ │ │ │ ├── configuration.py
│ │ │ │ │ ├── debug.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── hash.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── inspect.py
│ │ │ │ │ ├── install.py
│ │ │ │ │ ├── list.py
│ │ │ │ │ ├── search.py
│ │ │ │ │ ├── show.py
│ │ │ │ │ ├── uninstall.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── configuration.py
│ │ │ │ ├── distributions
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── installed.cpython-312.pyc
│ │ │ │ │ │ ├── sdist.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── installed.py
│ │ │ │ │ ├── sdist.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── index
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── collector.cpython-312.pyc
│ │ │ │ │ │ ├── package_finder.cpython-312.pyc
│ │ │ │ │ │ └── sources.cpython-312.pyc
│ │ │ │ │ ├── collector.py
│ │ │ │ │ ├── package_finder.py
│ │ │ │ │ └── sources.py
│ │ │ │ ├── locations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _distutils.cpython-312.pyc
│ │ │ │ │ │ ├── _sysconfig.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── _distutils.py
│ │ │ │ │ ├── _sysconfig.py
│ │ │ │ │ └── base.py
│ │ │ │ ├── main.py
│ │ │ │ ├── metadata
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ └── pkg_resources.cpython-312.pyc
│ │ │ │ │ ├── _json.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── importlib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ │ ├── _dists.cpython-312.pyc
│ │ │ │ │ │ │ └── _envs.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.py
│ │ │ │ │ │ ├── _dists.py
│ │ │ │ │ │ └── _envs.py
│ │ │ │ │ └── pkg_resources.py
│ │ │ │ ├── models
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── candidate.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url.cpython-312.pyc
│ │ │ │ │ │ ├── format_control.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── installation_report.cpython-312.pyc
│ │ │ │ │ │ ├── link.cpython-312.pyc
│ │ │ │ │ │ ├── scheme.cpython-312.pyc
│ │ │ │ │ │ ├── search_scope.cpython-312.pyc
│ │ │ │ │ │ ├── selection_prefs.cpython-312.pyc
│ │ │ │ │ │ ├── target_python.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── candidate.py
│ │ │ │ │ ├── direct_url.py
│ │ │ │ │ ├── format_control.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── installation_report.py
│ │ │ │ │ ├── link.py
│ │ │ │ │ ├── scheme.py
│ │ │ │ │ ├── search_scope.py
│ │ │ │ │ ├── selection_prefs.py
│ │ │ │ │ ├── target_python.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── network
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── lazy_wheel.cpython-312.pyc
│ │ │ │ │ │ ├── session.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── xmlrpc.cpython-312.pyc
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── lazy_wheel.py
│ │ │ │ │ ├── session.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── xmlrpc.py
│ │ │ │ ├── operations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ └── prepare.cpython-312.pyc
│ │ │ │ │ ├── build
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── build_tracker.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_legacy.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── build_tracker.py
│ │ │ │ │ │ ├── metadata_editable.py
│ │ │ │ │ │ ├── metadata_legacy.py
│ │ │ │ │ │ ├── metadata.py
│ │ │ │ │ │ ├── wheel_editable.py
│ │ │ │ │ │ ├── wheel_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── install
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── editable_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── editable_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ └── prepare.py
│ │ │ │ ├── pyproject.py
│ │ │ │ ├── req
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── constructors.cpython-312.pyc
│ │ │ │ │ │ ├── req_file.cpython-312.pyc
│ │ │ │ │ │ ├── req_install.cpython-312.pyc
│ │ │ │ │ │ ├── req_set.cpython-312.pyc
│ │ │ │ │ │ └── req_uninstall.cpython-312.pyc
│ │ │ │ │ ├── constructors.py
│ │ │ │ │ ├── req_file.py
│ │ │ │ │ ├── req_install.py
│ │ │ │ │ ├── req_set.py
│ │ │ │ │ └── req_uninstall.py
│ │ │ │ ├── resolution
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── legacy
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ │ └── resolver.py
│ │ │ │ │ └── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── candidates.cpython-312.pyc
│ │ │ │ │ │ ├── factory.cpython-312.pyc
│ │ │ │ │ │ ├── found_candidates.cpython-312.pyc
│ │ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ │ ├── reporter.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── candidates.py
│ │ │ │ │ ├── factory.py
│ │ │ │ │ ├── found_candidates.py
│ │ │ │ │ ├── provider.py
│ │ │ │ │ ├── reporter.py
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ └── resolver.py
│ │ │ │ ├── self_outdated_check.py
│ │ │ │ ├── utils
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _jaraco_text.cpython-312.pyc
│ │ │ │ │ │ ├── _log.cpython-312.pyc
│ │ │ │ │ │ ├── appdirs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── compatibility_tags.cpython-312.pyc
│ │ │ │ │ │ ├── datetime.cpython-312.pyc
│ │ │ │ │ │ ├── deprecation.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url_helpers.cpython-312.pyc
│ │ │ │ │ │ ├── egg_link.cpython-312.pyc
│ │ │ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ │ │ ├── entrypoints.cpython-312.pyc
│ │ │ │ │ │ ├── filesystem.cpython-312.pyc
│ │ │ │ │ │ ├── filetypes.cpython-312.pyc
│ │ │ │ │ │ ├── glibc.cpython-312.pyc
│ │ │ │ │ │ ├── hashes.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── misc.cpython-312.pyc
│ │ │ │ │ │ ├── packaging.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── setuptools_build.cpython-312.pyc
│ │ │ │ │ │ ├── subprocess.cpython-312.pyc
│ │ │ │ │ │ ├── temp_dir.cpython-312.pyc
│ │ │ │ │ │ ├── unpacking.cpython-312.pyc
│ │ │ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ │ │ ├── virtualenv.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── _jaraco_text.py
│ │ │ │ │ ├── _log.py
│ │ │ │ │ ├── appdirs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── compatibility_tags.py
│ │ │ │ │ ├── datetime.py
│ │ │ │ │ ├── deprecation.py
│ │ │ │ │ ├── direct_url_helpers.py
│ │ │ │ │ ├── egg_link.py
│ │ │ │ │ ├── encoding.py
│ │ │ │ │ ├── entrypoints.py
│ │ │ │ │ ├── filesystem.py
│ │ │ │ │ ├── filetypes.py
│ │ │ │ │ ├── glibc.py
│ │ │ │ │ ├── hashes.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── misc.py
│ │ │ │ │ ├── packaging.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── setuptools_build.py
│ │ │ │ │ ├── subprocess.py
│ │ │ │ │ ├── temp_dir.py
│ │ │ │ │ ├── unpacking.py
│ │ │ │ │ ├── urls.py
│ │ │ │ │ ├── virtualenv.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── vcs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── bazaar.cpython-312.pyc
│ │ │ │ │ │ ├── git.cpython-312.pyc
│ │ │ │ │ │ ├── mercurial.cpython-312.pyc
│ │ │ │ │ │ ├── subversion.cpython-312.pyc
│ │ │ │ │ │ └── versioncontrol.cpython-312.pyc
│ │ │ │ │ ├── bazaar.py
│ │ │ │ │ ├── git.py
│ │ │ │ │ ├── mercurial.py
│ │ │ │ │ ├── subversion.py
│ │ │ │ │ └── versioncontrol.py
│ │ │ │ └── wheel_builder.py
│ │ │ ├── _vendor
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ └── typing_extensions.cpython-312.pyc
│ │ │ │ ├── cachecontrol
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _cmd.cpython-312.pyc
│ │ │ │ │ │ ├── adapter.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── controller.cpython-312.pyc
│ │ │ │ │ │ ├── filewrapper.cpython-312.pyc
│ │ │ │ │ │ ├── heuristics.cpython-312.pyc
│ │ │ │ │ │ ├── serialize.cpython-312.pyc
│ │ │ │ │ │ └── wrapper.cpython-312.pyc
│ │ │ │ │ ├── _cmd.py
│ │ │ │ │ ├── adapter.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── caches
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── file_cache.cpython-312.pyc
│ │ │ │ │ │ │ └── redis_cache.cpython-312.pyc
│ │ │ │ │ │ ├── file_cache.py
│ │ │ │ │ │ └── redis_cache.py
│ │ │ │ │ ├── controller.py
│ │ │ │ │ ├── filewrapper.py
│ │ │ │ │ ├── heuristics.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── serialize.py
│ │ │ │ │ └── wrapper.py
│ │ │ │ ├── certifi
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── core.cpython-312.pyc
│ │ │ │ │ ├── cacert.pem
│ │ │ │ │ ├── core.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── distlib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── database.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── locators.cpython-312.pyc
│ │ │ │ │ │ ├── manifest.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── resources.cpython-312.pyc
│ │ │ │ │ │ ├── scripts.cpython-312.pyc
│ │ │ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── database.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── locators.py
│ │ │ │ │ ├── manifest.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── resources.py
│ │ │ │ │ ├── scripts.py
│ │ │ │ │ ├── t32.exe
│ │ │ │ │ ├── t64-arm.exe
│ │ │ │ │ ├── t64.exe
│ │ │ │ │ ├── util.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ ├── w32.exe
│ │ │ │ │ ├── w64-arm.exe
│ │ │ │ │ ├── w64.exe
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── distro
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── distro.cpython-312.pyc
│ │ │ │ │ ├── distro.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── idna
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ │ │ ├── codec.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── core.py
│ │ │ │ │ ├── idnadata.py
│ │ │ │ │ ├── intranges.py
│ │ │ │ │ ├── package_data.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ └── uts46data.py
│ │ │ │ ├── msgpack
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ │ │ └── fallback.cpython-312.pyc
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── ext.py
│ │ │ │ │ └── fallback.py
│ │ │ │ ├── packaging
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _elffile.cpython-312.pyc
│ │ │ │ │ │ ├── _manylinux.cpython-312.pyc
│ │ │ │ │ │ ├── _musllinux.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _structures.cpython-312.pyc
│ │ │ │ │ │ ├── _tokenizer.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ ├── specifiers.cpython-312.pyc
│ │ │ │ │ │ ├── tags.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── version.cpython-312.pyc
│ │ │ │ │ ├── _elffile.py
│ │ │ │ │ ├── _manylinux.py
│ │ │ │ │ ├── _musllinux.py
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _structures.py
│ │ │ │ │ ├── _tokenizer.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ ├── specifiers.py
│ │ │ │ │ ├── tags.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── version.py
│ │ │ │ ├── pkg_resources
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── platformdirs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── android.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── macos.cpython-312.pyc
│ │ │ │ │ │ ├── unix.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── windows.cpython-312.pyc
│ │ │ │ │ ├── android.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── macos.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── unix.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ └── windows.py
│ │ │ │ ├── pygments
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── cmdline.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── filter.cpython-312.pyc
│ │ │ │ │ │ ├── formatter.cpython-312.pyc
│ │ │ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ │ │ ├── modeline.cpython-312.pyc
│ │ │ │ │ │ ├── plugin.cpython-312.pyc
│ │ │ │ │ │ ├── regexopt.cpython-312.pyc
│ │ │ │ │ │ ├── scanner.cpython-312.pyc
│ │ │ │ │ │ ├── sphinxext.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── token.cpython-312.pyc
│ │ │ │ │ │ ├── unistring.cpython-312.pyc
│ │ │ │ │ │ └── util.cpython-312.pyc
│ │ │ │ │ ├── cmdline.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── filter.py
│ │ │ │ │ ├── filters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── formatter.py
│ │ │ │ │ ├── formatters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ ├── bbcode.cpython-312.pyc
│ │ │ │ │ │ │ ├── groff.cpython-312.pyc
│ │ │ │ │ │ │ ├── html.cpython-312.pyc
│ │ │ │ │ │ │ ├── img.cpython-312.pyc
│ │ │ │ │ │ │ ├── irc.cpython-312.pyc
│ │ │ │ │ │ │ ├── latex.cpython-312.pyc
│ │ │ │ │ │ │ ├── other.cpython-312.pyc
│ │ │ │ │ │ │ ├── pangomarkup.cpython-312.pyc
│ │ │ │ │ │ │ ├── rtf.cpython-312.pyc
│ │ │ │ │ │ │ ├── svg.cpython-312.pyc
│ │ │ │ │ │ │ ├── terminal.cpython-312.pyc
│ │ │ │ │ │ │ └── terminal256.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ ├── bbcode.py
│ │ │ │ │ │ ├── groff.py
│ │ │ │ │ │ ├── html.py
│ │ │ │ │ │ ├── img.py
│ │ │ │ │ │ ├── irc.py
│ │ │ │ │ │ ├── latex.py
│ │ │ │ │ │ ├── other.py
│ │ │ │ │ │ ├── pangomarkup.py
│ │ │ │ │ │ ├── rtf.py
│ │ │ │ │ │ ├── svg.py
│ │ │ │ │ │ ├── terminal.py
│ │ │ │ │ │ └── terminal256.py
│ │ │ │ │ ├── lexer.py
│ │ │ │ │ ├── lexers
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ └── python.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ └── python.py
│ │ │ │ │ ├── modeline.py
│ │ │ │ │ ├── plugin.py
│ │ │ │ │ ├── regexopt.py
│ │ │ │ │ ├── scanner.py
│ │ │ │ │ ├── sphinxext.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styles
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── _mapping.cpython-312.pyc
│ │ │ │ │ │ └── _mapping.py
│ │ │ │ │ ├── token.py
│ │ │ │ │ ├── unistring.py
│ │ │ │ │ └── util.py
│ │ │ │ ├── pyproject_hooks
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ └── _impl.cpython-312.pyc
│ │ │ │ │ ├── _compat.py
│ │ │ │ │ ├── _impl.py
│ │ │ │ │ └── _in_process
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── _in_process.cpython-312.pyc
│ │ │ │ │ └── _in_process.py
│ │ │ │ ├── requests
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ │ ├── __version__.py
│ │ │ │ │ ├── _internal_utils.py
│ │ │ │ │ ├── adapters.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── certs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── cookies.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── hooks.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── packages.py
│ │ │ │ │ ├── sessions.py
│ │ │ │ │ ├── status_codes.py
│ │ │ │ │ ├── structures.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── providers.cpython-312.pyc
│ │ │ │ │ │ ├── reporters.cpython-312.pyc
│ │ │ │ │ │ ├── resolvers.cpython-312.pyc
│ │ │ │ │ │ └── structs.cpython-312.pyc
│ │ │ │ │ ├── compat
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── collections_abc.cpython-312.pyc
│ │ │ │ │ │ └── collections_abc.py
│ │ │ │ │ ├── providers.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── reporters.py
│ │ │ │ │ ├── resolvers.py
│ │ │ │ │ └── structs.py
│ │ │ │ ├── rich
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── _cell_widths.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_codes.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_replace.cpython-312.pyc
│ │ │ │ │ │ ├── _export_format.cpython-312.pyc
│ │ │ │ │ │ ├── _extension.cpython-312.pyc
│ │ │ │ │ │ ├── _fileno.cpython-312.pyc
│ │ │ │ │ │ ├── _inspect.cpython-312.pyc
│ │ │ │ │ │ ├── _log_render.cpython-312.pyc
│ │ │ │ │ │ ├── _loop.cpython-312.pyc
│ │ │ │ │ │ ├── _null_file.cpython-312.pyc
│ │ │ │ │ │ ├── _palettes.cpython-312.pyc
│ │ │ │ │ │ ├── _pick.cpython-312.pyc
│ │ │ │ │ │ ├── _ratio.cpython-312.pyc
│ │ │ │ │ │ ├── _spinners.cpython-312.pyc
│ │ │ │ │ │ ├── _stack.cpython-312.pyc
│ │ │ │ │ │ ├── _timer.cpython-312.pyc
│ │ │ │ │ │ ├── _win32_console.cpython-312.pyc
│ │ │ │ │ │ ├── _windows_renderer.cpython-312.pyc
│ │ │ │ │ │ ├── _windows.cpython-312.pyc
│ │ │ │ │ │ ├── _wrap.cpython-312.pyc
│ │ │ │ │ │ ├── abc.cpython-312.pyc
│ │ │ │ │ │ ├── align.cpython-312.pyc
│ │ │ │ │ │ ├── ansi.cpython-312.pyc
│ │ │ │ │ │ ├── bar.cpython-312.pyc
│ │ │ │ │ │ ├── box.cpython-312.pyc
│ │ │ │ │ │ ├── cells.cpython-312.pyc
│ │ │ │ │ │ ├── color_triplet.cpython-312.pyc
│ │ │ │ │ │ ├── color.cpython-312.pyc
│ │ │ │ │ │ ├── columns.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── constrain.cpython-312.pyc
│ │ │ │ │ │ ├── containers.cpython-312.pyc
│ │ │ │ │ │ ├── control.cpython-312.pyc
│ │ │ │ │ │ ├── default_styles.cpython-312.pyc
│ │ │ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ │ │ ├── emoji.cpython-312.pyc
│ │ │ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ │ │ ├── file_proxy.cpython-312.pyc
│ │ │ │ │ │ ├── filesize.cpython-312.pyc
│ │ │ │ │ │ ├── highlighter.cpython-312.pyc
│ │ │ │ │ │ ├── json.cpython-312.pyc
│ │ │ │ │ │ ├── jupyter.cpython-312.pyc
│ │ │ │ │ │ ├── layout.cpython-312.pyc
│ │ │ │ │ │ ├── live_render.cpython-312.pyc
│ │ │ │ │ │ ├── live.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── markup.cpython-312.pyc
│ │ │ │ │ │ ├── measure.cpython-312.pyc
│ │ │ │ │ │ ├── padding.cpython-312.pyc
│ │ │ │ │ │ ├── pager.cpython-312.pyc
│ │ │ │ │ │ ├── palette.cpython-312.pyc
│ │ │ │ │ │ ├── panel.cpython-312.pyc
│ │ │ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bar.cpython-312.pyc
│ │ │ │ │ │ ├── progress.cpython-312.pyc
│ │ │ │ │ │ ├── prompt.cpython-312.pyc
│ │ │ │ │ │ ├── protocol.cpython-312.pyc
│ │ │ │ │ │ ├── region.cpython-312.pyc
│ │ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ │ ├── rule.cpython-312.pyc
│ │ │ │ │ │ ├── scope.cpython-312.pyc
│ │ │ │ │ │ ├── screen.cpython-312.pyc
│ │ │ │ │ │ ├── segment.cpython-312.pyc
│ │ │ │ │ │ ├── spinner.cpython-312.pyc
│ │ │ │ │ │ ├── status.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── styled.cpython-312.pyc
│ │ │ │ │ │ ├── syntax.cpython-312.pyc
│ │ │ │ │ │ ├── table.cpython-312.pyc
│ │ │ │ │ │ ├── terminal_theme.cpython-312.pyc
│ │ │ │ │ │ ├── text.cpython-312.pyc
│ │ │ │ │ │ ├── theme.cpython-312.pyc
│ │ │ │ │ │ ├── themes.cpython-312.pyc
│ │ │ │ │ │ ├── traceback.cpython-312.pyc
│ │ │ │ │ │ └── tree.cpython-312.pyc
│ │ │ │ │ ├── _cell_widths.py
│ │ │ │ │ ├── _emoji_codes.py
│ │ │ │ │ ├── _emoji_replace.py
│ │ │ │ │ ├── _export_format.py
│ │ │ │ │ ├── _extension.py
│ │ │ │ │ ├── _fileno.py
│ │ │ │ │ ├── _inspect.py
│ │ │ │ │ ├── _log_render.py
│ │ │ │ │ ├── _loop.py
│ │ │ │ │ ├── _null_file.py
│ │ │ │ │ ├── _palettes.py
│ │ │ │ │ ├── _pick.py
│ │ │ │ │ ├── _ratio.py
│ │ │ │ │ ├── _spinners.py
│ │ │ │ │ ├── _stack.py
│ │ │ │ │ ├── _timer.py
│ │ │ │ │ ├── _win32_console.py
│ │ │ │ │ ├── _windows_renderer.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ ├── _wrap.py
│ │ │ │ │ ├── abc.py
│ │ │ │ │ ├── align.py
│ │ │ │ │ ├── ansi.py
│ │ │ │ │ ├── bar.py
│ │ │ │ │ ├── box.py
│ │ │ │ │ ├── cells.py
│ │ │ │ │ ├── color_triplet.py
│ │ │ │ │ ├── color.py
│ │ │ │ │ ├── columns.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── constrain.py
│ │ │ │ │ ├── containers.py
│ │ │ │ │ ├── control.py
│ │ │ │ │ ├── default_styles.py
│ │ │ │ │ ├── diagnose.py
│ │ │ │ │ ├── emoji.py
│ │ │ │ │ ├── errors.py
│ │ │ │ │ ├── file_proxy.py
│ │ │ │ │ ├── filesize.py
│ │ │ │ │ ├── highlighter.py
│ │ │ │ │ ├── json.py
│ │ │ │ │ ├── jupyter.py
│ │ │ │ │ ├── layout.py
│ │ │ │ │ ├── live_render.py
│ │ │ │ │ ├── live.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── markup.py
│ │ │ │ │ ├── measure.py
│ │ │ │ │ ├── padding.py
│ │ │ │ │ ├── pager.py
│ │ │ │ │ ├── palette.py
│ │ │ │ │ ├── panel.py
│ │ │ │ │ ├── pretty.py
│ │ │ │ │ ├── progress_bar.py
│ │ │ │ │ ├── progress.py
│ │ │ │ │ ├── prompt.py
│ │ │ │ │ ├── protocol.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── region.py
│ │ │ │ │ ├── repr.py
│ │ │ │ │ ├── rule.py
│ │ │ │ │ ├── scope.py
│ │ │ │ │ ├── screen.py
│ │ │ │ │ ├── segment.py
│ │ │ │ │ ├── spinner.py
│ │ │ │ │ ├── status.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styled.py
│ │ │ │ │ ├── syntax.py
│ │ │ │ │ ├── table.py
│ │ │ │ │ ├── terminal_theme.py
│ │ │ │ │ ├── text.py
│ │ │ │ │ ├── theme.py
│ │ │ │ │ ├── themes.py
│ │ │ │ │ ├── traceback.py
│ │ │ │ │ └── tree.py
│ │ │ │ ├── tomli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _re.cpython-312.pyc
│ │ │ │ │ │ └── _types.cpython-312.pyc
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _re.py
│ │ │ │ │ ├── _types.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── truststore
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _api.cpython-312.pyc
│ │ │ │ │ │ ├── _macos.cpython-312.pyc
│ │ │ │ │ │ ├── _openssl.cpython-312.pyc
│ │ │ │ │ │ ├── _ssl_constants.cpython-312.pyc
│ │ │ │ │ │ └── _windows.cpython-312.pyc
│ │ │ │ │ ├── _api.py
│ │ │ │ │ ├── _macos.py
│ │ │ │ │ ├── _openssl.py
│ │ │ │ │ ├── _ssl_constants.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── typing_extensions.py
│ │ │ │ ├── urllib3
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── _collections.py
│ │ │ │ │ ├── _version.py
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── connectionpool.py
│ │ │ │ │ ├── contrib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _appengine_environ.cpython-312.pyc
│ │ │ │ │ │ │ ├── appengine.cpython-312.pyc
│ │ │ │ │ │ │ ├── ntlmpool.cpython-312.pyc
│ │ │ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ │ │ ├── securetransport.cpython-312.pyc
│ │ │ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ │ │ ├── _appengine_environ.py
│ │ │ │ │ │ ├── _securetransport
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── bindings.cpython-312.pyc
│ │ │ │ │ │ │ │ └── low_level.cpython-312.pyc
│ │ │ │ │ │ │ ├── bindings.py
│ │ │ │ │ │ │ └── low_level.py
│ │ │ │ │ │ ├── appengine.py
│ │ │ │ │ │ ├── ntlmpool.py
│ │ │ │ │ │ ├── pyopenssl.py
│ │ │ │ │ │ ├── securetransport.py
│ │ │ │ │ │ └── socks.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── fields.py
│ │ │ │ │ ├── filepost.py
│ │ │ │ │ ├── packages
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── six.cpython-312.pyc
│ │ │ │ │ │ ├── backports
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── makefile.cpython-312.pyc
│ │ │ │ │ │ │ │ └── weakref_finalize.cpython-312.pyc
│ │ │ │ │ │ │ ├── makefile.py
│ │ │ │ │ │ │ └── weakref_finalize.py
│ │ │ │ │ │ └── six.py
│ │ │ │ │ ├── poolmanager.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ └── util
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ │ │ ├── queue.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ │ │ └── wait.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── proxy.py
│ │ │ │ │ ├── queue.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── ssl_.py
│ │ │ │ │ ├── ssl_match_hostname.py
│ │ │ │ │ ├── ssltransport.py
│ │ │ │ │ ├── timeout.py
│ │ │ │ │ ├── url.py
│ │ │ │ │ └── wait.py
│ │ │ │ └── vendor.txt
│ │ │ └── py.typed
│ │ ├── pip-24.2.dist-info
│ │ │ ├── AUTHORS.txt
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── requests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── __version__.py
│ │ │ ├── _internal_utils.py
│ │ │ ├── adapters.py
│ │ │ ├── api.py
│ │ │ ├── auth.py
│ │ │ ├── certs.py
│ │ │ ├── compat.py
│ │ │ ├── cookies.py
│ │ │ ├── exceptions.py
│ │ │ ├── help.py
│ │ │ ├── hooks.py
│ │ │ ├── models.py
│ │ │ ├── packages.py
│ │ │ ├── sessions.py
│ │ │ ├── status_codes.py
│ │ │ ├── structures.py
│ │ │ └── utils.py
│ │ ├── requests-2.32.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── soupsieve
│ │ │ ├── __init__.py
│ │ │ ├── __meta__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __meta__.cpython-312.pyc
│ │ │ │ ├── css_match.cpython-312.pyc
│ │ │ │ ├── css_parser.cpython-312.pyc
│ │ │ │ ├── css_types.cpython-312.pyc
│ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ └── util.cpython-312.pyc
│ │ │ ├── css_match.py
│ │ │ ├── css_parser.py
│ │ │ ├── css_types.py
│ │ │ ├── pretty.py
│ │ │ ├── py.typed
│ │ │ └── util.py
│ │ ├── soupsieve-2.6.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── urllib3
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _base_connection.cpython-312.pyc
│ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ ├── _request_methods.cpython-312.pyc
│ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ └── response.cpython-312.pyc
│ │ │ ├── _base_connection.py
│ │ │ ├── _collections.py
│ │ │ ├── _request_methods.py
│ │ │ ├── _version.py
│ │ │ ├── connection.py
│ │ │ ├── connectionpool.py
│ │ │ ├── contrib
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ ├── emscripten
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── fetch.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── emscripten_fetch_worker.js
│ │ │ │ │ ├── fetch.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ └── response.py
│ │ │ │ ├── pyopenssl.py
│ │ │ │ └── socks.py
│ │ │ ├── exceptions.py
│ │ │ ├── fields.py
│ │ │ ├── filepost.py
│ │ │ ├── http2
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ └── probe.cpython-312.pyc
│ │ │ │ ├── connection.py
│ │ │ │ └── probe.py
│ │ │ ├── poolmanager.py
│ │ │ ├── py.typed
│ │ │ ├── response.py
│ │ │ └── util
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ └── wait.cpython-312.pyc
│ │ │ ├── connection.py
│ │ │ ├── proxy.py
│ │ │ ├── request.py
│ │ │ ├── response.py
│ │ │ ├── retry.py
│ │ │ ├── ssl_.py
│ │ │ ├── ssl_match_hostname.py
│ │ │ ├── ssltransport.py
│ │ │ ├── timeout.py
│ │ │ ├── url.py
│ │ │ ├── util.py
│ │ │ └── wait.py
│ │ ├── urllib3-2.2.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── useragent
│ │ │ ├── __init__.py
│ │ │ ├── __init__.pyc
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── resources
│ │ │ │ └── user_agent_data.json
│ │ │ └── test
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── test_additional_os.json
│ │ │ ├── test_browser.json
│ │ │ ├── test_device.json
│ │ │ ├── test_firefox.json
│ │ │ ├── test_os.json
│ │ │ └── test_pgts_browser.json
│ │ ├── useragent-0.1.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── werkzeug
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _internal.cpython-312.pyc
│ │ │ │ ├── _reloader.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formparser.cpython-312.pyc
│ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ ├── local.cpython-312.pyc
│ │ │ │ ├── security.cpython-312.pyc
│ │ │ │ ├── serving.cpython-312.pyc
│ │ │ │ ├── test.cpython-312.pyc
│ │ │ │ ├── testapp.cpython-312.pyc
│ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ ├── user_agent.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── wsgi.cpython-312.pyc
│ │ │ ├── _internal.py
│ │ │ ├── _reloader.py
│ │ │ ├── datastructures
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── accept.cpython-312.pyc
│ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ ├── cache_control.cpython-312.pyc
│ │ │ │ │ ├── csp.cpython-312.pyc
│ │ │ │ │ ├── etag.cpython-312.pyc
│ │ │ │ │ ├── file_storage.cpython-312.pyc
│ │ │ │ │ ├── headers.cpython-312.pyc
│ │ │ │ │ ├── mixins.cpython-312.pyc
│ │ │ │ │ ├── range.cpython-312.pyc
│ │ │ │ │ └── structures.cpython-312.pyc
│ │ │ │ ├── accept.py
│ │ │ │ ├── accept.pyi
│ │ │ │ ├── auth.py
│ │ │ │ ├── cache_control.py
│ │ │ │ ├── cache_control.pyi
│ │ │ │ ├── csp.py
│ │ │ │ ├── csp.pyi
│ │ │ │ ├── etag.py
│ │ │ │ ├── etag.pyi
│ │ │ │ ├── file_storage.py
│ │ │ │ ├── file_storage.pyi
│ │ │ │ ├── headers.py
│ │ │ │ ├── headers.pyi
│ │ │ │ ├── mixins.py
│ │ │ │ ├── mixins.pyi
│ │ │ │ ├── range.py
│ │ │ │ ├── range.pyi
│ │ │ │ ├── structures.py
│ │ │ │ └── structures.pyi
│ │ │ ├── debug
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ └── tbtools.cpython-312.pyc
│ │ │ │ ├── console.py
│ │ │ │ ├── repr.py
│ │ │ │ ├── shared
│ │ │ │ │ ├── console.png
│ │ │ │ │ ├── debugger.js
│ │ │ │ │ ├── ICON_LICENSE.md
│ │ │ │ │ ├── less.png
│ │ │ │ │ ├── more.png
│ │ │ │ │ └── style.css
│ │ │ │ └── tbtools.py
│ │ │ ├── exceptions.py
│ │ │ ├── formparser.py
│ │ │ ├── http.py
│ │ │ ├── local.py
│ │ │ ├── middleware
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── dispatcher.cpython-312.pyc
│ │ │ │ │ ├── http_proxy.cpython-312.pyc
│ │ │ │ │ ├── lint.cpython-312.pyc
│ │ │ │ │ ├── profiler.cpython-312.pyc
│ │ │ │ │ ├── proxy_fix.cpython-312.pyc
│ │ │ │ │ └── shared_data.cpython-312.pyc
│ │ │ │ ├── dispatcher.py
│ │ │ │ ├── http_proxy.py
│ │ │ │ ├── lint.py
│ │ │ │ ├── profiler.py
│ │ │ │ ├── proxy_fix.py
│ │ │ │ └── shared_data.py
│ │ │ ├── py.typed
│ │ │ ├── routing
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── converters.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── map.cpython-312.pyc
│ │ │ │ │ ├── matcher.cpython-312.pyc
│ │ │ │ │ └── rules.cpython-312.pyc
│ │ │ │ ├── converters.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── map.py
│ │ │ │ ├── matcher.py
│ │ │ │ └── rules.py
│ │ │ ├── sansio
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ │ ├── multipart.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ ├── http.py
│ │ │ │ ├── multipart.py
│ │ │ │ ├── request.py
│ │ │ │ ├── response.py
│ │ │ │ └── utils.py
│ │ │ ├── security.py
│ │ │ ├── serving.py
│ │ │ ├── test.py
│ │ │ ├── testapp.py
│ │ │ ├── urls.py
│ │ │ ├── user_agent.py
│ │ │ ├── utils.py
│ │ │ ├── wrappers
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ ├── request.py
│ │ │ │ └── response.py
│ │ │ └── wsgi.py
│ │ └── werkzeug-3.0.4.dist-info
│ │ ├── INSTALLER
│ │ ├── LICENSE.txt
│ │ ├── METADATA
│ │ ├── RECORD
│ │ └── WHEEL
│ ├── pyvenv.cfg
│ ├── static
│ │ └── styles.css
│ ├── templates
│ │ └── index.html
│ └── test.py
├── cline_config.json
├── mcp_server.py
├── README.md
├── search_results.json
├── settings.json
└── test_files
├── text1.txt
└── text2.txt
```
# Files
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/html/soupparser.py:
--------------------------------------------------------------------------------
```python
1 | """External interface to the BeautifulSoup HTML parser.
2 | """
3 |
4 | __all__ = ["fromstring", "parse", "convert_tree"]
5 |
6 | import re
7 | from lxml import etree, html
8 |
9 | try:
10 | from bs4 import (
11 | BeautifulSoup, Tag, Comment, ProcessingInstruction, NavigableString,
12 | Declaration, Doctype)
13 | _DECLARATION_OR_DOCTYPE = (Declaration, Doctype)
14 | except ImportError:
15 | from BeautifulSoup import (
16 | BeautifulSoup, Tag, Comment, ProcessingInstruction, NavigableString,
17 | Declaration)
18 | _DECLARATION_OR_DOCTYPE = Declaration
19 |
20 |
21 | def fromstring(data, beautifulsoup=None, makeelement=None, **bsargs):
22 | """Parse a string of HTML data into an Element tree using the
23 | BeautifulSoup parser.
24 |
25 | Returns the root ``<html>`` Element of the tree.
26 |
27 | You can pass a different BeautifulSoup parser through the
28 | `beautifulsoup` keyword, and a diffent Element factory function
29 | through the `makeelement` keyword. By default, the standard
30 | ``BeautifulSoup`` class and the default factory of `lxml.html` are
31 | used.
32 | """
33 | return _parse(data, beautifulsoup, makeelement, **bsargs)
34 |
35 |
36 | def parse(file, beautifulsoup=None, makeelement=None, **bsargs):
37 | """Parse a file into an ElemenTree using the BeautifulSoup parser.
38 |
39 | You can pass a different BeautifulSoup parser through the
40 | `beautifulsoup` keyword, and a diffent Element factory function
41 | through the `makeelement` keyword. By default, the standard
42 | ``BeautifulSoup`` class and the default factory of `lxml.html` are
43 | used.
44 | """
45 | if not hasattr(file, 'read'):
46 | file = open(file)
47 | root = _parse(file, beautifulsoup, makeelement, **bsargs)
48 | return etree.ElementTree(root)
49 |
50 |
51 | def convert_tree(beautiful_soup_tree, makeelement=None):
52 | """Convert a BeautifulSoup tree to a list of Element trees.
53 |
54 | Returns a list instead of a single root Element to support
55 | HTML-like soup with more than one root element.
56 |
57 | You can pass a different Element factory through the `makeelement`
58 | keyword.
59 | """
60 | root = _convert_tree(beautiful_soup_tree, makeelement)
61 | children = root.getchildren()
62 | for child in children:
63 | root.remove(child)
64 | return children
65 |
66 |
67 | # helpers
68 |
69 | def _parse(source, beautifulsoup, makeelement, **bsargs):
70 | if beautifulsoup is None:
71 | beautifulsoup = BeautifulSoup
72 | if hasattr(beautifulsoup, "HTML_ENTITIES"): # bs3
73 | if 'convertEntities' not in bsargs:
74 | bsargs['convertEntities'] = 'html'
75 | if hasattr(beautifulsoup, "DEFAULT_BUILDER_FEATURES"): # bs4
76 | if 'features' not in bsargs:
77 | bsargs['features'] = 'html.parser' # use Python html parser
78 | tree = beautifulsoup(source, **bsargs)
79 | root = _convert_tree(tree, makeelement)
80 | # from ET: wrap the document in a html root element, if necessary
81 | if len(root) == 1 and root[0].tag == "html":
82 | return root[0]
83 | root.tag = "html"
84 | return root
85 |
86 |
87 | _parse_doctype_declaration = re.compile(
88 | r'(?:\s|[<!])*DOCTYPE\s*HTML'
89 | r'(?:\s+PUBLIC)?(?:\s+(\'[^\']*\'|"[^"]*"))?'
90 | r'(?:\s+(\'[^\']*\'|"[^"]*"))?',
91 | re.IGNORECASE).match
92 |
93 |
94 | class _PseudoTag:
95 | # Minimal imitation of BeautifulSoup.Tag
96 | def __init__(self, contents):
97 | self.name = 'html'
98 | self.attrs = []
99 | self.contents = contents
100 |
101 | def __iter__(self):
102 | return self.contents.__iter__()
103 |
104 |
105 | def _convert_tree(beautiful_soup_tree, makeelement):
106 | if makeelement is None:
107 | makeelement = html.html_parser.makeelement
108 |
109 | # Split the tree into three parts:
110 | # i) everything before the root element: document type
111 | # declaration, comments, processing instructions, whitespace
112 | # ii) the root(s),
113 | # iii) everything after the root: comments, processing
114 | # instructions, whitespace
115 | first_element_idx = last_element_idx = None
116 | html_root = declaration = None
117 | for i, e in enumerate(beautiful_soup_tree):
118 | if isinstance(e, Tag):
119 | if first_element_idx is None:
120 | first_element_idx = i
121 | last_element_idx = i
122 | if html_root is None and e.name and e.name.lower() == 'html':
123 | html_root = e
124 | elif declaration is None and isinstance(e, _DECLARATION_OR_DOCTYPE):
125 | declaration = e
126 |
127 | # For a nice, well-formatted document, the variable roots below is
128 | # a list consisting of a single <html> element. However, the document
129 | # may be a soup like '<meta><head><title>Hello</head><body>Hi
130 | # all<\p>'. In this example roots is a list containing meta, head
131 | # and body elements.
132 | if first_element_idx is None:
133 | pre_root = post_root = []
134 | roots = beautiful_soup_tree.contents
135 | else:
136 | pre_root = beautiful_soup_tree.contents[:first_element_idx]
137 | roots = beautiful_soup_tree.contents[first_element_idx:last_element_idx+1]
138 | post_root = beautiful_soup_tree.contents[last_element_idx+1:]
139 |
140 | # Reorganize so that there is one <html> root...
141 | if html_root is not None:
142 | # ... use existing one if possible, ...
143 | i = roots.index(html_root)
144 | html_root.contents = roots[:i] + html_root.contents + roots[i+1:]
145 | else:
146 | # ... otherwise create a new one.
147 | html_root = _PseudoTag(roots)
148 |
149 | convert_node = _init_node_converters(makeelement)
150 |
151 | # Process pre_root
152 | res_root = convert_node(html_root)
153 | prev = res_root
154 | for e in reversed(pre_root):
155 | converted = convert_node(e)
156 | if converted is not None:
157 | prev.addprevious(converted)
158 | prev = converted
159 |
160 | # ditto for post_root
161 | prev = res_root
162 | for e in post_root:
163 | converted = convert_node(e)
164 | if converted is not None:
165 | prev.addnext(converted)
166 | prev = converted
167 |
168 | if declaration is not None:
169 | try:
170 | # bs4 provides full Doctype string
171 | doctype_string = declaration.output_ready()
172 | except AttributeError:
173 | doctype_string = declaration.string
174 |
175 | match = _parse_doctype_declaration(doctype_string)
176 | if not match:
177 | # Something is wrong if we end up in here. Since soupparser should
178 | # tolerate errors, do not raise Exception, just let it pass.
179 | pass
180 | else:
181 | external_id, sys_uri = match.groups()
182 | docinfo = res_root.getroottree().docinfo
183 | # strip quotes and update DOCTYPE values (any of None, '', '...')
184 | docinfo.public_id = external_id and external_id[1:-1]
185 | docinfo.system_url = sys_uri and sys_uri[1:-1]
186 |
187 | return res_root
188 |
189 |
190 | def _init_node_converters(makeelement):
191 | converters = {}
192 | ordered_node_types = []
193 |
194 | def converter(*types):
195 | def add(handler):
196 | for t in types:
197 | converters[t] = handler
198 | ordered_node_types.append(t)
199 | return handler
200 | return add
201 |
202 | def find_best_converter(node):
203 | for t in ordered_node_types:
204 | if isinstance(node, t):
205 | return converters[t]
206 | return None
207 |
208 | def convert_node(bs_node, parent=None):
209 | # duplicated in convert_tag() below
210 | try:
211 | handler = converters[type(bs_node)]
212 | except KeyError:
213 | handler = converters[type(bs_node)] = find_best_converter(bs_node)
214 | if handler is None:
215 | return None
216 | return handler(bs_node, parent)
217 |
218 | def map_attrs(bs_attrs):
219 | if isinstance(bs_attrs, dict): # bs4
220 | attribs = {}
221 | for k, v in bs_attrs.items():
222 | if isinstance(v, list):
223 | v = " ".join(v)
224 | attribs[k] = unescape(v)
225 | else:
226 | attribs = {k: unescape(v) for k, v in bs_attrs}
227 | return attribs
228 |
229 | def append_text(parent, text):
230 | if len(parent) == 0:
231 | parent.text = (parent.text or '') + text
232 | else:
233 | parent[-1].tail = (parent[-1].tail or '') + text
234 |
235 | # converters are tried in order of their definition
236 |
237 | @converter(Tag, _PseudoTag)
238 | def convert_tag(bs_node, parent):
239 | attrs = bs_node.attrs
240 | if parent is not None:
241 | attribs = map_attrs(attrs) if attrs else None
242 | res = etree.SubElement(parent, bs_node.name, attrib=attribs)
243 | else:
244 | attribs = map_attrs(attrs) if attrs else {}
245 | res = makeelement(bs_node.name, attrib=attribs)
246 |
247 | for child in bs_node:
248 | # avoid double recursion by inlining convert_node(), see above
249 | try:
250 | handler = converters[type(child)]
251 | except KeyError:
252 | pass
253 | else:
254 | if handler is not None:
255 | handler(child, res)
256 | continue
257 | convert_node(child, res)
258 | return res
259 |
260 | @converter(Comment)
261 | def convert_comment(bs_node, parent):
262 | res = html.HtmlComment(bs_node)
263 | if parent is not None:
264 | parent.append(res)
265 | return res
266 |
267 | @converter(ProcessingInstruction)
268 | def convert_pi(bs_node, parent):
269 | if bs_node.endswith('?'):
270 | # The PI is of XML style (<?as df?>) but BeautifulSoup
271 | # interpreted it as being SGML style (<?as df>). Fix.
272 | bs_node = bs_node[:-1]
273 | res = etree.ProcessingInstruction(*bs_node.split(' ', 1))
274 | if parent is not None:
275 | parent.append(res)
276 | return res
277 |
278 | @converter(NavigableString)
279 | def convert_text(bs_node, parent):
280 | if parent is not None:
281 | append_text(parent, unescape(bs_node))
282 | return None
283 |
284 | return convert_node
285 |
286 |
287 | # copied from ET's ElementSoup
288 |
289 | try:
290 | from html.entities import name2codepoint # Python 3
291 | except ImportError:
292 | from htmlentitydefs import name2codepoint
293 |
294 |
295 | handle_entities = re.compile(r"&(\w+);").sub
296 |
297 |
298 | try:
299 | unichr
300 | except NameError:
301 | # Python 3
302 | unichr = chr
303 |
304 |
305 | def unescape(string):
306 | if not string:
307 | return ''
308 | # work around oddities in BeautifulSoup's entity handling
309 | def unescape_entity(m):
310 | try:
311 | return unichr(name2codepoint[m.group(1)])
312 | except KeyError:
313 | return m.group(0) # use as is
314 | return handle_entities(unescape_entity, string)
315 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py:
--------------------------------------------------------------------------------
```python
1 | # Auto generated by make_terminal_widths.py
2 |
3 | CELL_WIDTHS = [
4 | (0, 0, 0),
5 | (1, 31, -1),
6 | (127, 159, -1),
7 | (173, 173, 0),
8 | (768, 879, 0),
9 | (1155, 1161, 0),
10 | (1425, 1469, 0),
11 | (1471, 1471, 0),
12 | (1473, 1474, 0),
13 | (1476, 1477, 0),
14 | (1479, 1479, 0),
15 | (1536, 1541, 0),
16 | (1552, 1562, 0),
17 | (1564, 1564, 0),
18 | (1611, 1631, 0),
19 | (1648, 1648, 0),
20 | (1750, 1757, 0),
21 | (1759, 1764, 0),
22 | (1767, 1768, 0),
23 | (1770, 1773, 0),
24 | (1807, 1807, 0),
25 | (1809, 1809, 0),
26 | (1840, 1866, 0),
27 | (1958, 1968, 0),
28 | (2027, 2035, 0),
29 | (2045, 2045, 0),
30 | (2070, 2073, 0),
31 | (2075, 2083, 0),
32 | (2085, 2087, 0),
33 | (2089, 2093, 0),
34 | (2137, 2139, 0),
35 | (2192, 2193, 0),
36 | (2200, 2207, 0),
37 | (2250, 2307, 0),
38 | (2362, 2364, 0),
39 | (2366, 2383, 0),
40 | (2385, 2391, 0),
41 | (2402, 2403, 0),
42 | (2433, 2435, 0),
43 | (2492, 2492, 0),
44 | (2494, 2500, 0),
45 | (2503, 2504, 0),
46 | (2507, 2509, 0),
47 | (2519, 2519, 0),
48 | (2530, 2531, 0),
49 | (2558, 2558, 0),
50 | (2561, 2563, 0),
51 | (2620, 2620, 0),
52 | (2622, 2626, 0),
53 | (2631, 2632, 0),
54 | (2635, 2637, 0),
55 | (2641, 2641, 0),
56 | (2672, 2673, 0),
57 | (2677, 2677, 0),
58 | (2689, 2691, 0),
59 | (2748, 2748, 0),
60 | (2750, 2757, 0),
61 | (2759, 2761, 0),
62 | (2763, 2765, 0),
63 | (2786, 2787, 0),
64 | (2810, 2815, 0),
65 | (2817, 2819, 0),
66 | (2876, 2876, 0),
67 | (2878, 2884, 0),
68 | (2887, 2888, 0),
69 | (2891, 2893, 0),
70 | (2901, 2903, 0),
71 | (2914, 2915, 0),
72 | (2946, 2946, 0),
73 | (3006, 3010, 0),
74 | (3014, 3016, 0),
75 | (3018, 3021, 0),
76 | (3031, 3031, 0),
77 | (3072, 3076, 0),
78 | (3132, 3132, 0),
79 | (3134, 3140, 0),
80 | (3142, 3144, 0),
81 | (3146, 3149, 0),
82 | (3157, 3158, 0),
83 | (3170, 3171, 0),
84 | (3201, 3203, 0),
85 | (3260, 3260, 0),
86 | (3262, 3268, 0),
87 | (3270, 3272, 0),
88 | (3274, 3277, 0),
89 | (3285, 3286, 0),
90 | (3298, 3299, 0),
91 | (3315, 3315, 0),
92 | (3328, 3331, 0),
93 | (3387, 3388, 0),
94 | (3390, 3396, 0),
95 | (3398, 3400, 0),
96 | (3402, 3405, 0),
97 | (3415, 3415, 0),
98 | (3426, 3427, 0),
99 | (3457, 3459, 0),
100 | (3530, 3530, 0),
101 | (3535, 3540, 0),
102 | (3542, 3542, 0),
103 | (3544, 3551, 0),
104 | (3570, 3571, 0),
105 | (3633, 3633, 0),
106 | (3636, 3642, 0),
107 | (3655, 3662, 0),
108 | (3761, 3761, 0),
109 | (3764, 3772, 0),
110 | (3784, 3790, 0),
111 | (3864, 3865, 0),
112 | (3893, 3893, 0),
113 | (3895, 3895, 0),
114 | (3897, 3897, 0),
115 | (3902, 3903, 0),
116 | (3953, 3972, 0),
117 | (3974, 3975, 0),
118 | (3981, 3991, 0),
119 | (3993, 4028, 0),
120 | (4038, 4038, 0),
121 | (4139, 4158, 0),
122 | (4182, 4185, 0),
123 | (4190, 4192, 0),
124 | (4194, 4196, 0),
125 | (4199, 4205, 0),
126 | (4209, 4212, 0),
127 | (4226, 4237, 0),
128 | (4239, 4239, 0),
129 | (4250, 4253, 0),
130 | (4352, 4447, 2),
131 | (4448, 4607, 0),
132 | (4957, 4959, 0),
133 | (5906, 5909, 0),
134 | (5938, 5940, 0),
135 | (5970, 5971, 0),
136 | (6002, 6003, 0),
137 | (6068, 6099, 0),
138 | (6109, 6109, 0),
139 | (6155, 6159, 0),
140 | (6277, 6278, 0),
141 | (6313, 6313, 0),
142 | (6432, 6443, 0),
143 | (6448, 6459, 0),
144 | (6679, 6683, 0),
145 | (6741, 6750, 0),
146 | (6752, 6780, 0),
147 | (6783, 6783, 0),
148 | (6832, 6862, 0),
149 | (6912, 6916, 0),
150 | (6964, 6980, 0),
151 | (7019, 7027, 0),
152 | (7040, 7042, 0),
153 | (7073, 7085, 0),
154 | (7142, 7155, 0),
155 | (7204, 7223, 0),
156 | (7376, 7378, 0),
157 | (7380, 7400, 0),
158 | (7405, 7405, 0),
159 | (7412, 7412, 0),
160 | (7415, 7417, 0),
161 | (7616, 7679, 0),
162 | (8203, 8207, 0),
163 | (8232, 8238, 0),
164 | (8288, 8292, 0),
165 | (8294, 8303, 0),
166 | (8400, 8432, 0),
167 | (8986, 8987, 2),
168 | (9001, 9002, 2),
169 | (9193, 9196, 2),
170 | (9200, 9200, 2),
171 | (9203, 9203, 2),
172 | (9725, 9726, 2),
173 | (9748, 9749, 2),
174 | (9800, 9811, 2),
175 | (9855, 9855, 2),
176 | (9875, 9875, 2),
177 | (9889, 9889, 2),
178 | (9898, 9899, 2),
179 | (9917, 9918, 2),
180 | (9924, 9925, 2),
181 | (9934, 9934, 2),
182 | (9940, 9940, 2),
183 | (9962, 9962, 2),
184 | (9970, 9971, 2),
185 | (9973, 9973, 2),
186 | (9978, 9978, 2),
187 | (9981, 9981, 2),
188 | (9989, 9989, 2),
189 | (9994, 9995, 2),
190 | (10024, 10024, 2),
191 | (10060, 10060, 2),
192 | (10062, 10062, 2),
193 | (10067, 10069, 2),
194 | (10071, 10071, 2),
195 | (10133, 10135, 2),
196 | (10160, 10160, 2),
197 | (10175, 10175, 2),
198 | (11035, 11036, 2),
199 | (11088, 11088, 2),
200 | (11093, 11093, 2),
201 | (11503, 11505, 0),
202 | (11647, 11647, 0),
203 | (11744, 11775, 0),
204 | (11904, 11929, 2),
205 | (11931, 12019, 2),
206 | (12032, 12245, 2),
207 | (12272, 12329, 2),
208 | (12330, 12335, 0),
209 | (12336, 12350, 2),
210 | (12353, 12438, 2),
211 | (12441, 12442, 0),
212 | (12443, 12543, 2),
213 | (12549, 12591, 2),
214 | (12593, 12686, 2),
215 | (12688, 12771, 2),
216 | (12783, 12830, 2),
217 | (12832, 12871, 2),
218 | (12880, 19903, 2),
219 | (19968, 42124, 2),
220 | (42128, 42182, 2),
221 | (42607, 42610, 0),
222 | (42612, 42621, 0),
223 | (42654, 42655, 0),
224 | (42736, 42737, 0),
225 | (43010, 43010, 0),
226 | (43014, 43014, 0),
227 | (43019, 43019, 0),
228 | (43043, 43047, 0),
229 | (43052, 43052, 0),
230 | (43136, 43137, 0),
231 | (43188, 43205, 0),
232 | (43232, 43249, 0),
233 | (43263, 43263, 0),
234 | (43302, 43309, 0),
235 | (43335, 43347, 0),
236 | (43360, 43388, 2),
237 | (43392, 43395, 0),
238 | (43443, 43456, 0),
239 | (43493, 43493, 0),
240 | (43561, 43574, 0),
241 | (43587, 43587, 0),
242 | (43596, 43597, 0),
243 | (43643, 43645, 0),
244 | (43696, 43696, 0),
245 | (43698, 43700, 0),
246 | (43703, 43704, 0),
247 | (43710, 43711, 0),
248 | (43713, 43713, 0),
249 | (43755, 43759, 0),
250 | (43765, 43766, 0),
251 | (44003, 44010, 0),
252 | (44012, 44013, 0),
253 | (44032, 55203, 2),
254 | (55216, 55295, 0),
255 | (63744, 64255, 2),
256 | (64286, 64286, 0),
257 | (65024, 65039, 0),
258 | (65040, 65049, 2),
259 | (65056, 65071, 0),
260 | (65072, 65106, 2),
261 | (65108, 65126, 2),
262 | (65128, 65131, 2),
263 | (65279, 65279, 0),
264 | (65281, 65376, 2),
265 | (65504, 65510, 2),
266 | (65529, 65531, 0),
267 | (66045, 66045, 0),
268 | (66272, 66272, 0),
269 | (66422, 66426, 0),
270 | (68097, 68099, 0),
271 | (68101, 68102, 0),
272 | (68108, 68111, 0),
273 | (68152, 68154, 0),
274 | (68159, 68159, 0),
275 | (68325, 68326, 0),
276 | (68900, 68903, 0),
277 | (69291, 69292, 0),
278 | (69373, 69375, 0),
279 | (69446, 69456, 0),
280 | (69506, 69509, 0),
281 | (69632, 69634, 0),
282 | (69688, 69702, 0),
283 | (69744, 69744, 0),
284 | (69747, 69748, 0),
285 | (69759, 69762, 0),
286 | (69808, 69818, 0),
287 | (69821, 69821, 0),
288 | (69826, 69826, 0),
289 | (69837, 69837, 0),
290 | (69888, 69890, 0),
291 | (69927, 69940, 0),
292 | (69957, 69958, 0),
293 | (70003, 70003, 0),
294 | (70016, 70018, 0),
295 | (70067, 70080, 0),
296 | (70089, 70092, 0),
297 | (70094, 70095, 0),
298 | (70188, 70199, 0),
299 | (70206, 70206, 0),
300 | (70209, 70209, 0),
301 | (70367, 70378, 0),
302 | (70400, 70403, 0),
303 | (70459, 70460, 0),
304 | (70462, 70468, 0),
305 | (70471, 70472, 0),
306 | (70475, 70477, 0),
307 | (70487, 70487, 0),
308 | (70498, 70499, 0),
309 | (70502, 70508, 0),
310 | (70512, 70516, 0),
311 | (70709, 70726, 0),
312 | (70750, 70750, 0),
313 | (70832, 70851, 0),
314 | (71087, 71093, 0),
315 | (71096, 71104, 0),
316 | (71132, 71133, 0),
317 | (71216, 71232, 0),
318 | (71339, 71351, 0),
319 | (71453, 71467, 0),
320 | (71724, 71738, 0),
321 | (71984, 71989, 0),
322 | (71991, 71992, 0),
323 | (71995, 71998, 0),
324 | (72000, 72000, 0),
325 | (72002, 72003, 0),
326 | (72145, 72151, 0),
327 | (72154, 72160, 0),
328 | (72164, 72164, 0),
329 | (72193, 72202, 0),
330 | (72243, 72249, 0),
331 | (72251, 72254, 0),
332 | (72263, 72263, 0),
333 | (72273, 72283, 0),
334 | (72330, 72345, 0),
335 | (72751, 72758, 0),
336 | (72760, 72767, 0),
337 | (72850, 72871, 0),
338 | (72873, 72886, 0),
339 | (73009, 73014, 0),
340 | (73018, 73018, 0),
341 | (73020, 73021, 0),
342 | (73023, 73029, 0),
343 | (73031, 73031, 0),
344 | (73098, 73102, 0),
345 | (73104, 73105, 0),
346 | (73107, 73111, 0),
347 | (73459, 73462, 0),
348 | (73472, 73473, 0),
349 | (73475, 73475, 0),
350 | (73524, 73530, 0),
351 | (73534, 73538, 0),
352 | (78896, 78912, 0),
353 | (78919, 78933, 0),
354 | (92912, 92916, 0),
355 | (92976, 92982, 0),
356 | (94031, 94031, 0),
357 | (94033, 94087, 0),
358 | (94095, 94098, 0),
359 | (94176, 94179, 2),
360 | (94180, 94180, 0),
361 | (94192, 94193, 0),
362 | (94208, 100343, 2),
363 | (100352, 101589, 2),
364 | (101632, 101640, 2),
365 | (110576, 110579, 2),
366 | (110581, 110587, 2),
367 | (110589, 110590, 2),
368 | (110592, 110882, 2),
369 | (110898, 110898, 2),
370 | (110928, 110930, 2),
371 | (110933, 110933, 2),
372 | (110948, 110951, 2),
373 | (110960, 111355, 2),
374 | (113821, 113822, 0),
375 | (113824, 113827, 0),
376 | (118528, 118573, 0),
377 | (118576, 118598, 0),
378 | (119141, 119145, 0),
379 | (119149, 119170, 0),
380 | (119173, 119179, 0),
381 | (119210, 119213, 0),
382 | (119362, 119364, 0),
383 | (121344, 121398, 0),
384 | (121403, 121452, 0),
385 | (121461, 121461, 0),
386 | (121476, 121476, 0),
387 | (121499, 121503, 0),
388 | (121505, 121519, 0),
389 | (122880, 122886, 0),
390 | (122888, 122904, 0),
391 | (122907, 122913, 0),
392 | (122915, 122916, 0),
393 | (122918, 122922, 0),
394 | (123023, 123023, 0),
395 | (123184, 123190, 0),
396 | (123566, 123566, 0),
397 | (123628, 123631, 0),
398 | (124140, 124143, 0),
399 | (125136, 125142, 0),
400 | (125252, 125258, 0),
401 | (126980, 126980, 2),
402 | (127183, 127183, 2),
403 | (127374, 127374, 2),
404 | (127377, 127386, 2),
405 | (127488, 127490, 2),
406 | (127504, 127547, 2),
407 | (127552, 127560, 2),
408 | (127568, 127569, 2),
409 | (127584, 127589, 2),
410 | (127744, 127776, 2),
411 | (127789, 127797, 2),
412 | (127799, 127868, 2),
413 | (127870, 127891, 2),
414 | (127904, 127946, 2),
415 | (127951, 127955, 2),
416 | (127968, 127984, 2),
417 | (127988, 127988, 2),
418 | (127992, 127994, 2),
419 | (127995, 127999, 0),
420 | (128000, 128062, 2),
421 | (128064, 128064, 2),
422 | (128066, 128252, 2),
423 | (128255, 128317, 2),
424 | (128331, 128334, 2),
425 | (128336, 128359, 2),
426 | (128378, 128378, 2),
427 | (128405, 128406, 2),
428 | (128420, 128420, 2),
429 | (128507, 128591, 2),
430 | (128640, 128709, 2),
431 | (128716, 128716, 2),
432 | (128720, 128722, 2),
433 | (128725, 128727, 2),
434 | (128732, 128735, 2),
435 | (128747, 128748, 2),
436 | (128756, 128764, 2),
437 | (128992, 129003, 2),
438 | (129008, 129008, 2),
439 | (129292, 129338, 2),
440 | (129340, 129349, 2),
441 | (129351, 129535, 2),
442 | (129648, 129660, 2),
443 | (129664, 129672, 2),
444 | (129680, 129725, 2),
445 | (129727, 129733, 2),
446 | (129742, 129755, 2),
447 | (129760, 129768, 2),
448 | (129776, 129784, 2),
449 | (131072, 196605, 2),
450 | (196608, 262141, 2),
451 | (917505, 917505, 0),
452 | (917536, 917631, 0),
453 | (917760, 917999, 0),
454 | ]
455 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py:
--------------------------------------------------------------------------------
```python
1 | """Handwritten parser of dependency specifiers.
2 |
3 | The docstring for each __parse_* function contains EBNF-inspired grammar representing
4 | the implementation.
5 | """
6 |
7 | from __future__ import annotations
8 |
9 | import ast
10 | from typing import NamedTuple, Sequence, Tuple, Union
11 |
12 | from ._tokenizer import DEFAULT_RULES, Tokenizer
13 |
14 |
15 | class Node:
16 | def __init__(self, value: str) -> None:
17 | self.value = value
18 |
19 | def __str__(self) -> str:
20 | return self.value
21 |
22 | def __repr__(self) -> str:
23 | return f"<{self.__class__.__name__}('{self}')>"
24 |
25 | def serialize(self) -> str:
26 | raise NotImplementedError
27 |
28 |
29 | class Variable(Node):
30 | def serialize(self) -> str:
31 | return str(self)
32 |
33 |
34 | class Value(Node):
35 | def serialize(self) -> str:
36 | return f'"{self}"'
37 |
38 |
39 | class Op(Node):
40 | def serialize(self) -> str:
41 | return str(self)
42 |
43 |
44 | MarkerVar = Union[Variable, Value]
45 | MarkerItem = Tuple[MarkerVar, Op, MarkerVar]
46 | MarkerAtom = Union[MarkerItem, Sequence["MarkerAtom"]]
47 | MarkerList = Sequence[Union["MarkerList", MarkerAtom, str]]
48 |
49 |
50 | class ParsedRequirement(NamedTuple):
51 | name: str
52 | url: str
53 | extras: list[str]
54 | specifier: str
55 | marker: MarkerList | None
56 |
57 |
58 | # --------------------------------------------------------------------------------------
59 | # Recursive descent parser for dependency specifier
60 | # --------------------------------------------------------------------------------------
61 | def parse_requirement(source: str) -> ParsedRequirement:
62 | return _parse_requirement(Tokenizer(source, rules=DEFAULT_RULES))
63 |
64 |
65 | def _parse_requirement(tokenizer: Tokenizer) -> ParsedRequirement:
66 | """
67 | requirement = WS? IDENTIFIER WS? extras WS? requirement_details
68 | """
69 | tokenizer.consume("WS")
70 |
71 | name_token = tokenizer.expect(
72 | "IDENTIFIER", expected="package name at the start of dependency specifier"
73 | )
74 | name = name_token.text
75 | tokenizer.consume("WS")
76 |
77 | extras = _parse_extras(tokenizer)
78 | tokenizer.consume("WS")
79 |
80 | url, specifier, marker = _parse_requirement_details(tokenizer)
81 | tokenizer.expect("END", expected="end of dependency specifier")
82 |
83 | return ParsedRequirement(name, url, extras, specifier, marker)
84 |
85 |
86 | def _parse_requirement_details(
87 | tokenizer: Tokenizer,
88 | ) -> tuple[str, str, MarkerList | None]:
89 | """
90 | requirement_details = AT URL (WS requirement_marker?)?
91 | | specifier WS? (requirement_marker)?
92 | """
93 |
94 | specifier = ""
95 | url = ""
96 | marker = None
97 |
98 | if tokenizer.check("AT"):
99 | tokenizer.read()
100 | tokenizer.consume("WS")
101 |
102 | url_start = tokenizer.position
103 | url = tokenizer.expect("URL", expected="URL after @").text
104 | if tokenizer.check("END", peek=True):
105 | return (url, specifier, marker)
106 |
107 | tokenizer.expect("WS", expected="whitespace after URL")
108 |
109 | # The input might end after whitespace.
110 | if tokenizer.check("END", peek=True):
111 | return (url, specifier, marker)
112 |
113 | marker = _parse_requirement_marker(
114 | tokenizer, span_start=url_start, after="URL and whitespace"
115 | )
116 | else:
117 | specifier_start = tokenizer.position
118 | specifier = _parse_specifier(tokenizer)
119 | tokenizer.consume("WS")
120 |
121 | if tokenizer.check("END", peek=True):
122 | return (url, specifier, marker)
123 |
124 | marker = _parse_requirement_marker(
125 | tokenizer,
126 | span_start=specifier_start,
127 | after=(
128 | "version specifier"
129 | if specifier
130 | else "name and no valid version specifier"
131 | ),
132 | )
133 |
134 | return (url, specifier, marker)
135 |
136 |
137 | def _parse_requirement_marker(
138 | tokenizer: Tokenizer, *, span_start: int, after: str
139 | ) -> MarkerList:
140 | """
141 | requirement_marker = SEMICOLON marker WS?
142 | """
143 |
144 | if not tokenizer.check("SEMICOLON"):
145 | tokenizer.raise_syntax_error(
146 | f"Expected end or semicolon (after {after})",
147 | span_start=span_start,
148 | )
149 | tokenizer.read()
150 |
151 | marker = _parse_marker(tokenizer)
152 | tokenizer.consume("WS")
153 |
154 | return marker
155 |
156 |
157 | def _parse_extras(tokenizer: Tokenizer) -> list[str]:
158 | """
159 | extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)?
160 | """
161 | if not tokenizer.check("LEFT_BRACKET", peek=True):
162 | return []
163 |
164 | with tokenizer.enclosing_tokens(
165 | "LEFT_BRACKET",
166 | "RIGHT_BRACKET",
167 | around="extras",
168 | ):
169 | tokenizer.consume("WS")
170 | extras = _parse_extras_list(tokenizer)
171 | tokenizer.consume("WS")
172 |
173 | return extras
174 |
175 |
176 | def _parse_extras_list(tokenizer: Tokenizer) -> list[str]:
177 | """
178 | extras_list = identifier (wsp* ',' wsp* identifier)*
179 | """
180 | extras: list[str] = []
181 |
182 | if not tokenizer.check("IDENTIFIER"):
183 | return extras
184 |
185 | extras.append(tokenizer.read().text)
186 |
187 | while True:
188 | tokenizer.consume("WS")
189 | if tokenizer.check("IDENTIFIER", peek=True):
190 | tokenizer.raise_syntax_error("Expected comma between extra names")
191 | elif not tokenizer.check("COMMA"):
192 | break
193 |
194 | tokenizer.read()
195 | tokenizer.consume("WS")
196 |
197 | extra_token = tokenizer.expect("IDENTIFIER", expected="extra name after comma")
198 | extras.append(extra_token.text)
199 |
200 | return extras
201 |
202 |
203 | def _parse_specifier(tokenizer: Tokenizer) -> str:
204 | """
205 | specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS
206 | | WS? version_many WS?
207 | """
208 | with tokenizer.enclosing_tokens(
209 | "LEFT_PARENTHESIS",
210 | "RIGHT_PARENTHESIS",
211 | around="version specifier",
212 | ):
213 | tokenizer.consume("WS")
214 | parsed_specifiers = _parse_version_many(tokenizer)
215 | tokenizer.consume("WS")
216 |
217 | return parsed_specifiers
218 |
219 |
220 | def _parse_version_many(tokenizer: Tokenizer) -> str:
221 | """
222 | version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)?
223 | """
224 | parsed_specifiers = ""
225 | while tokenizer.check("SPECIFIER"):
226 | span_start = tokenizer.position
227 | parsed_specifiers += tokenizer.read().text
228 | if tokenizer.check("VERSION_PREFIX_TRAIL", peek=True):
229 | tokenizer.raise_syntax_error(
230 | ".* suffix can only be used with `==` or `!=` operators",
231 | span_start=span_start,
232 | span_end=tokenizer.position + 1,
233 | )
234 | if tokenizer.check("VERSION_LOCAL_LABEL_TRAIL", peek=True):
235 | tokenizer.raise_syntax_error(
236 | "Local version label can only be used with `==` or `!=` operators",
237 | span_start=span_start,
238 | span_end=tokenizer.position,
239 | )
240 | tokenizer.consume("WS")
241 | if not tokenizer.check("COMMA"):
242 | break
243 | parsed_specifiers += tokenizer.read().text
244 | tokenizer.consume("WS")
245 |
246 | return parsed_specifiers
247 |
248 |
249 | # --------------------------------------------------------------------------------------
250 | # Recursive descent parser for marker expression
251 | # --------------------------------------------------------------------------------------
252 | def parse_marker(source: str) -> MarkerList:
253 | return _parse_full_marker(Tokenizer(source, rules=DEFAULT_RULES))
254 |
255 |
256 | def _parse_full_marker(tokenizer: Tokenizer) -> MarkerList:
257 | retval = _parse_marker(tokenizer)
258 | tokenizer.expect("END", expected="end of marker expression")
259 | return retval
260 |
261 |
262 | def _parse_marker(tokenizer: Tokenizer) -> MarkerList:
263 | """
264 | marker = marker_atom (BOOLOP marker_atom)+
265 | """
266 | expression = [_parse_marker_atom(tokenizer)]
267 | while tokenizer.check("BOOLOP"):
268 | token = tokenizer.read()
269 | expr_right = _parse_marker_atom(tokenizer)
270 | expression.extend((token.text, expr_right))
271 | return expression
272 |
273 |
274 | def _parse_marker_atom(tokenizer: Tokenizer) -> MarkerAtom:
275 | """
276 | marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS?
277 | | WS? marker_item WS?
278 | """
279 |
280 | tokenizer.consume("WS")
281 | if tokenizer.check("LEFT_PARENTHESIS", peek=True):
282 | with tokenizer.enclosing_tokens(
283 | "LEFT_PARENTHESIS",
284 | "RIGHT_PARENTHESIS",
285 | around="marker expression",
286 | ):
287 | tokenizer.consume("WS")
288 | marker: MarkerAtom = _parse_marker(tokenizer)
289 | tokenizer.consume("WS")
290 | else:
291 | marker = _parse_marker_item(tokenizer)
292 | tokenizer.consume("WS")
293 | return marker
294 |
295 |
296 | def _parse_marker_item(tokenizer: Tokenizer) -> MarkerItem:
297 | """
298 | marker_item = WS? marker_var WS? marker_op WS? marker_var WS?
299 | """
300 | tokenizer.consume("WS")
301 | marker_var_left = _parse_marker_var(tokenizer)
302 | tokenizer.consume("WS")
303 | marker_op = _parse_marker_op(tokenizer)
304 | tokenizer.consume("WS")
305 | marker_var_right = _parse_marker_var(tokenizer)
306 | tokenizer.consume("WS")
307 | return (marker_var_left, marker_op, marker_var_right)
308 |
309 |
310 | def _parse_marker_var(tokenizer: Tokenizer) -> MarkerVar:
311 | """
312 | marker_var = VARIABLE | QUOTED_STRING
313 | """
314 | if tokenizer.check("VARIABLE"):
315 | return process_env_var(tokenizer.read().text.replace(".", "_"))
316 | elif tokenizer.check("QUOTED_STRING"):
317 | return process_python_str(tokenizer.read().text)
318 | else:
319 | tokenizer.raise_syntax_error(
320 | message="Expected a marker variable or quoted string"
321 | )
322 |
323 |
324 | def process_env_var(env_var: str) -> Variable:
325 | if env_var in ("platform_python_implementation", "python_implementation"):
326 | return Variable("platform_python_implementation")
327 | else:
328 | return Variable(env_var)
329 |
330 |
331 | def process_python_str(python_str: str) -> Value:
332 | value = ast.literal_eval(python_str)
333 | return Value(str(value))
334 |
335 |
336 | def _parse_marker_op(tokenizer: Tokenizer) -> Op:
337 | """
338 | marker_op = IN | NOT IN | OP
339 | """
340 | if tokenizer.check("IN"):
341 | tokenizer.read()
342 | return Op("in")
343 | elif tokenizer.check("NOT"):
344 | tokenizer.read()
345 | tokenizer.expect("WS", expected="whitespace after 'not'")
346 | tokenizer.expect("IN", expected="'in' after 'not'")
347 | return Op("not in")
348 | elif tokenizer.check("OP"):
349 | return Op(tokenizer.read().text)
350 | else:
351 | return tokenizer.raise_syntax_error(
352 | "Expected marker operator, one of "
353 | "<=, <, !=, ==, >=, >, ~=, ===, in, not in"
354 | )
355 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/urllib3/util/timeout.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import time
4 | import typing
5 | from enum import Enum
6 | from socket import getdefaulttimeout
7 |
8 | from ..exceptions import TimeoutStateError
9 |
10 | if typing.TYPE_CHECKING:
11 | from typing import Final
12 |
13 |
14 | class _TYPE_DEFAULT(Enum):
15 | # This value should never be passed to socket.settimeout() so for safety we use a -1.
16 | # socket.settimout() raises a ValueError for negative values.
17 | token = -1
18 |
19 |
20 | _DEFAULT_TIMEOUT: Final[_TYPE_DEFAULT] = _TYPE_DEFAULT.token
21 |
22 | _TYPE_TIMEOUT = typing.Optional[typing.Union[float, _TYPE_DEFAULT]]
23 |
24 |
25 | class Timeout:
26 | """Timeout configuration.
27 |
28 | Timeouts can be defined as a default for a pool:
29 |
30 | .. code-block:: python
31 |
32 | import urllib3
33 |
34 | timeout = urllib3.util.Timeout(connect=2.0, read=7.0)
35 |
36 | http = urllib3.PoolManager(timeout=timeout)
37 |
38 | resp = http.request("GET", "https://example.com/")
39 |
40 | print(resp.status)
41 |
42 | Or per-request (which overrides the default for the pool):
43 |
44 | .. code-block:: python
45 |
46 | response = http.request("GET", "https://example.com/", timeout=Timeout(10))
47 |
48 | Timeouts can be disabled by setting all the parameters to ``None``:
49 |
50 | .. code-block:: python
51 |
52 | no_timeout = Timeout(connect=None, read=None)
53 | response = http.request("GET", "https://example.com/", timeout=no_timeout)
54 |
55 |
56 | :param total:
57 | This combines the connect and read timeouts into one; the read timeout
58 | will be set to the time leftover from the connect attempt. In the
59 | event that both a connect timeout and a total are specified, or a read
60 | timeout and a total are specified, the shorter timeout will be applied.
61 |
62 | Defaults to None.
63 |
64 | :type total: int, float, or None
65 |
66 | :param connect:
67 | The maximum amount of time (in seconds) to wait for a connection
68 | attempt to a server to succeed. Omitting the parameter will default the
69 | connect timeout to the system default, probably `the global default
70 | timeout in socket.py
71 | <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
72 | None will set an infinite timeout for connection attempts.
73 |
74 | :type connect: int, float, or None
75 |
76 | :param read:
77 | The maximum amount of time (in seconds) to wait between consecutive
78 | read operations for a response from the server. Omitting the parameter
79 | will default the read timeout to the system default, probably `the
80 | global default timeout in socket.py
81 | <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
82 | None will set an infinite timeout.
83 |
84 | :type read: int, float, or None
85 |
86 | .. note::
87 |
88 | Many factors can affect the total amount of time for urllib3 to return
89 | an HTTP response.
90 |
91 | For example, Python's DNS resolver does not obey the timeout specified
92 | on the socket. Other factors that can affect total request time include
93 | high CPU load, high swap, the program running at a low priority level,
94 | or other behaviors.
95 |
96 | In addition, the read and total timeouts only measure the time between
97 | read operations on the socket connecting the client and the server,
98 | not the total amount of time for the request to return a complete
99 | response. For most requests, the timeout is raised because the server
100 | has not sent the first byte in the specified time. This is not always
101 | the case; if a server streams one byte every fifteen seconds, a timeout
102 | of 20 seconds will not trigger, even though the request will take
103 | several minutes to complete.
104 | """
105 |
106 | #: A sentinel object representing the default timeout value
107 | DEFAULT_TIMEOUT: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT
108 |
109 | def __init__(
110 | self,
111 | total: _TYPE_TIMEOUT = None,
112 | connect: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
113 | read: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
114 | ) -> None:
115 | self._connect = self._validate_timeout(connect, "connect")
116 | self._read = self._validate_timeout(read, "read")
117 | self.total = self._validate_timeout(total, "total")
118 | self._start_connect: float | None = None
119 |
120 | def __repr__(self) -> str:
121 | return f"{type(self).__name__}(connect={self._connect!r}, read={self._read!r}, total={self.total!r})"
122 |
123 | # __str__ provided for backwards compatibility
124 | __str__ = __repr__
125 |
126 | @staticmethod
127 | def resolve_default_timeout(timeout: _TYPE_TIMEOUT) -> float | None:
128 | return getdefaulttimeout() if timeout is _DEFAULT_TIMEOUT else timeout
129 |
130 | @classmethod
131 | def _validate_timeout(cls, value: _TYPE_TIMEOUT, name: str) -> _TYPE_TIMEOUT:
132 | """Check that a timeout attribute is valid.
133 |
134 | :param value: The timeout value to validate
135 | :param name: The name of the timeout attribute to validate. This is
136 | used to specify in error messages.
137 | :return: The validated and casted version of the given value.
138 | :raises ValueError: If it is a numeric value less than or equal to
139 | zero, or the type is not an integer, float, or None.
140 | """
141 | if value is None or value is _DEFAULT_TIMEOUT:
142 | return value
143 |
144 | if isinstance(value, bool):
145 | raise ValueError(
146 | "Timeout cannot be a boolean value. It must "
147 | "be an int, float or None."
148 | )
149 | try:
150 | float(value)
151 | except (TypeError, ValueError):
152 | raise ValueError(
153 | "Timeout value %s was %s, but it must be an "
154 | "int, float or None." % (name, value)
155 | ) from None
156 |
157 | try:
158 | if value <= 0:
159 | raise ValueError(
160 | "Attempted to set %s timeout to %s, but the "
161 | "timeout cannot be set to a value less "
162 | "than or equal to 0." % (name, value)
163 | )
164 | except TypeError:
165 | raise ValueError(
166 | "Timeout value %s was %s, but it must be an "
167 | "int, float or None." % (name, value)
168 | ) from None
169 |
170 | return value
171 |
172 | @classmethod
173 | def from_float(cls, timeout: _TYPE_TIMEOUT) -> Timeout:
174 | """Create a new Timeout from a legacy timeout value.
175 |
176 | The timeout value used by httplib.py sets the same timeout on the
177 | connect(), and recv() socket requests. This creates a :class:`Timeout`
178 | object that sets the individual timeouts to the ``timeout`` value
179 | passed to this function.
180 |
181 | :param timeout: The legacy timeout value.
182 | :type timeout: integer, float, :attr:`urllib3.util.Timeout.DEFAULT_TIMEOUT`, or None
183 | :return: Timeout object
184 | :rtype: :class:`Timeout`
185 | """
186 | return Timeout(read=timeout, connect=timeout)
187 |
188 | def clone(self) -> Timeout:
189 | """Create a copy of the timeout object
190 |
191 | Timeout properties are stored per-pool but each request needs a fresh
192 | Timeout object to ensure each one has its own start/stop configured.
193 |
194 | :return: a copy of the timeout object
195 | :rtype: :class:`Timeout`
196 | """
197 | # We can't use copy.deepcopy because that will also create a new object
198 | # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to
199 | # detect the user default.
200 | return Timeout(connect=self._connect, read=self._read, total=self.total)
201 |
202 | def start_connect(self) -> float:
203 | """Start the timeout clock, used during a connect() attempt
204 |
205 | :raises urllib3.exceptions.TimeoutStateError: if you attempt
206 | to start a timer that has been started already.
207 | """
208 | if self._start_connect is not None:
209 | raise TimeoutStateError("Timeout timer has already been started.")
210 | self._start_connect = time.monotonic()
211 | return self._start_connect
212 |
213 | def get_connect_duration(self) -> float:
214 | """Gets the time elapsed since the call to :meth:`start_connect`.
215 |
216 | :return: Elapsed time in seconds.
217 | :rtype: float
218 | :raises urllib3.exceptions.TimeoutStateError: if you attempt
219 | to get duration for a timer that hasn't been started.
220 | """
221 | if self._start_connect is None:
222 | raise TimeoutStateError(
223 | "Can't get connect duration for timer that has not started."
224 | )
225 | return time.monotonic() - self._start_connect
226 |
227 | @property
228 | def connect_timeout(self) -> _TYPE_TIMEOUT:
229 | """Get the value to use when setting a connection timeout.
230 |
231 | This will be a positive float or integer, the value None
232 | (never timeout), or the default system timeout.
233 |
234 | :return: Connect timeout.
235 | :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
236 | """
237 | if self.total is None:
238 | return self._connect
239 |
240 | if self._connect is None or self._connect is _DEFAULT_TIMEOUT:
241 | return self.total
242 |
243 | return min(self._connect, self.total) # type: ignore[type-var]
244 |
245 | @property
246 | def read_timeout(self) -> float | None:
247 | """Get the value for the read timeout.
248 |
249 | This assumes some time has elapsed in the connection timeout and
250 | computes the read timeout appropriately.
251 |
252 | If self.total is set, the read timeout is dependent on the amount of
253 | time taken by the connect timeout. If the connection time has not been
254 | established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be
255 | raised.
256 |
257 | :return: Value to use for the read timeout.
258 | :rtype: int, float or None
259 | :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect`
260 | has not yet been called on this object.
261 | """
262 | if (
263 | self.total is not None
264 | and self.total is not _DEFAULT_TIMEOUT
265 | and self._read is not None
266 | and self._read is not _DEFAULT_TIMEOUT
267 | ):
268 | # In case the connect timeout has not yet been established.
269 | if self._start_connect is None:
270 | return self._read
271 | return max(0, min(self.total - self.get_connect_duration(), self._read))
272 | elif self.total is not None and self.total is not _DEFAULT_TIMEOUT:
273 | return max(0, self.total - self.get_connect_duration())
274 | else:
275 | return self.resolve_default_timeout(self._read)
276 |
```