This is page 47 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/pip/_vendor/idna/core.py:
--------------------------------------------------------------------------------
```python
1 | from . import idnadata
2 | import bisect
3 | import unicodedata
4 | import re
5 | from typing import Union, Optional
6 | from .intranges import intranges_contain
7 |
8 | _virama_combining_class = 9
9 | _alabel_prefix = b'xn--'
10 | _unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]')
11 |
12 | class IDNAError(UnicodeError):
13 | """ Base exception for all IDNA-encoding related problems """
14 | pass
15 |
16 |
17 | class IDNABidiError(IDNAError):
18 | """ Exception when bidirectional requirements are not satisfied """
19 | pass
20 |
21 |
22 | class InvalidCodepoint(IDNAError):
23 | """ Exception when a disallowed or unallocated codepoint is used """
24 | pass
25 |
26 |
27 | class InvalidCodepointContext(IDNAError):
28 | """ Exception when the codepoint is not valid in the context it is used """
29 | pass
30 |
31 |
32 | def _combining_class(cp: int) -> int:
33 | v = unicodedata.combining(chr(cp))
34 | if v == 0:
35 | if not unicodedata.name(chr(cp)):
36 | raise ValueError('Unknown character in unicodedata')
37 | return v
38 |
39 | def _is_script(cp: str, script: str) -> bool:
40 | return intranges_contain(ord(cp), idnadata.scripts[script])
41 |
42 | def _punycode(s: str) -> bytes:
43 | return s.encode('punycode')
44 |
45 | def _unot(s: int) -> str:
46 | return 'U+{:04X}'.format(s)
47 |
48 |
49 | def valid_label_length(label: Union[bytes, str]) -> bool:
50 | if len(label) > 63:
51 | return False
52 | return True
53 |
54 |
55 | def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool:
56 | if len(label) > (254 if trailing_dot else 253):
57 | return False
58 | return True
59 |
60 |
61 | def check_bidi(label: str, check_ltr: bool = False) -> bool:
62 | # Bidi rules should only be applied if string contains RTL characters
63 | bidi_label = False
64 | for (idx, cp) in enumerate(label, 1):
65 | direction = unicodedata.bidirectional(cp)
66 | if direction == '':
67 | # String likely comes from a newer version of Unicode
68 | raise IDNABidiError('Unknown directionality in label {} at position {}'.format(repr(label), idx))
69 | if direction in ['R', 'AL', 'AN']:
70 | bidi_label = True
71 | if not bidi_label and not check_ltr:
72 | return True
73 |
74 | # Bidi rule 1
75 | direction = unicodedata.bidirectional(label[0])
76 | if direction in ['R', 'AL']:
77 | rtl = True
78 | elif direction == 'L':
79 | rtl = False
80 | else:
81 | raise IDNABidiError('First codepoint in label {} must be directionality L, R or AL'.format(repr(label)))
82 |
83 | valid_ending = False
84 | number_type = None # type: Optional[str]
85 | for (idx, cp) in enumerate(label, 1):
86 | direction = unicodedata.bidirectional(cp)
87 |
88 | if rtl:
89 | # Bidi rule 2
90 | if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
91 | raise IDNABidiError('Invalid direction for codepoint at position {} in a right-to-left label'.format(idx))
92 | # Bidi rule 3
93 | if direction in ['R', 'AL', 'EN', 'AN']:
94 | valid_ending = True
95 | elif direction != 'NSM':
96 | valid_ending = False
97 | # Bidi rule 4
98 | if direction in ['AN', 'EN']:
99 | if not number_type:
100 | number_type = direction
101 | else:
102 | if number_type != direction:
103 | raise IDNABidiError('Can not mix numeral types in a right-to-left label')
104 | else:
105 | # Bidi rule 5
106 | if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
107 | raise IDNABidiError('Invalid direction for codepoint at position {} in a left-to-right label'.format(idx))
108 | # Bidi rule 6
109 | if direction in ['L', 'EN']:
110 | valid_ending = True
111 | elif direction != 'NSM':
112 | valid_ending = False
113 |
114 | if not valid_ending:
115 | raise IDNABidiError('Label ends with illegal codepoint directionality')
116 |
117 | return True
118 |
119 |
120 | def check_initial_combiner(label: str) -> bool:
121 | if unicodedata.category(label[0])[0] == 'M':
122 | raise IDNAError('Label begins with an illegal combining character')
123 | return True
124 |
125 |
126 | def check_hyphen_ok(label: str) -> bool:
127 | if label[2:4] == '--':
128 | raise IDNAError('Label has disallowed hyphens in 3rd and 4th position')
129 | if label[0] == '-' or label[-1] == '-':
130 | raise IDNAError('Label must not start or end with a hyphen')
131 | return True
132 |
133 |
134 | def check_nfc(label: str) -> None:
135 | if unicodedata.normalize('NFC', label) != label:
136 | raise IDNAError('Label must be in Normalization Form C')
137 |
138 |
139 | def valid_contextj(label: str, pos: int) -> bool:
140 | cp_value = ord(label[pos])
141 |
142 | if cp_value == 0x200c:
143 |
144 | if pos > 0:
145 | if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
146 | return True
147 |
148 | ok = False
149 | for i in range(pos-1, -1, -1):
150 | joining_type = idnadata.joining_types.get(ord(label[i]))
151 | if joining_type == ord('T'):
152 | continue
153 | elif joining_type in [ord('L'), ord('D')]:
154 | ok = True
155 | break
156 | else:
157 | break
158 |
159 | if not ok:
160 | return False
161 |
162 | ok = False
163 | for i in range(pos+1, len(label)):
164 | joining_type = idnadata.joining_types.get(ord(label[i]))
165 | if joining_type == ord('T'):
166 | continue
167 | elif joining_type in [ord('R'), ord('D')]:
168 | ok = True
169 | break
170 | else:
171 | break
172 | return ok
173 |
174 | if cp_value == 0x200d:
175 |
176 | if pos > 0:
177 | if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
178 | return True
179 | return False
180 |
181 | else:
182 |
183 | return False
184 |
185 |
186 | def valid_contexto(label: str, pos: int, exception: bool = False) -> bool:
187 | cp_value = ord(label[pos])
188 |
189 | if cp_value == 0x00b7:
190 | if 0 < pos < len(label)-1:
191 | if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c:
192 | return True
193 | return False
194 |
195 | elif cp_value == 0x0375:
196 | if pos < len(label)-1 and len(label) > 1:
197 | return _is_script(label[pos + 1], 'Greek')
198 | return False
199 |
200 | elif cp_value == 0x05f3 or cp_value == 0x05f4:
201 | if pos > 0:
202 | return _is_script(label[pos - 1], 'Hebrew')
203 | return False
204 |
205 | elif cp_value == 0x30fb:
206 | for cp in label:
207 | if cp == '\u30fb':
208 | continue
209 | if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'):
210 | return True
211 | return False
212 |
213 | elif 0x660 <= cp_value <= 0x669:
214 | for cp in label:
215 | if 0x6f0 <= ord(cp) <= 0x06f9:
216 | return False
217 | return True
218 |
219 | elif 0x6f0 <= cp_value <= 0x6f9:
220 | for cp in label:
221 | if 0x660 <= ord(cp) <= 0x0669:
222 | return False
223 | return True
224 |
225 | return False
226 |
227 |
228 | def check_label(label: Union[str, bytes, bytearray]) -> None:
229 | if isinstance(label, (bytes, bytearray)):
230 | label = label.decode('utf-8')
231 | if len(label) == 0:
232 | raise IDNAError('Empty Label')
233 |
234 | check_nfc(label)
235 | check_hyphen_ok(label)
236 | check_initial_combiner(label)
237 |
238 | for (pos, cp) in enumerate(label):
239 | cp_value = ord(cp)
240 | if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']):
241 | continue
242 | elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']):
243 | if not valid_contextj(label, pos):
244 | raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format(
245 | _unot(cp_value), pos+1, repr(label)))
246 | elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']):
247 | if not valid_contexto(label, pos):
248 | raise InvalidCodepointContext('Codepoint {} not allowed at position {} in {}'.format(_unot(cp_value), pos+1, repr(label)))
249 | else:
250 | raise InvalidCodepoint('Codepoint {} at position {} of {} not allowed'.format(_unot(cp_value), pos+1, repr(label)))
251 |
252 | check_bidi(label)
253 |
254 |
255 | def alabel(label: str) -> bytes:
256 | try:
257 | label_bytes = label.encode('ascii')
258 | ulabel(label_bytes)
259 | if not valid_label_length(label_bytes):
260 | raise IDNAError('Label too long')
261 | return label_bytes
262 | except UnicodeEncodeError:
263 | pass
264 |
265 | check_label(label)
266 | label_bytes = _alabel_prefix + _punycode(label)
267 |
268 | if not valid_label_length(label_bytes):
269 | raise IDNAError('Label too long')
270 |
271 | return label_bytes
272 |
273 |
274 | def ulabel(label: Union[str, bytes, bytearray]) -> str:
275 | if not isinstance(label, (bytes, bytearray)):
276 | try:
277 | label_bytes = label.encode('ascii')
278 | except UnicodeEncodeError:
279 | check_label(label)
280 | return label
281 | else:
282 | label_bytes = label
283 |
284 | label_bytes = label_bytes.lower()
285 | if label_bytes.startswith(_alabel_prefix):
286 | label_bytes = label_bytes[len(_alabel_prefix):]
287 | if not label_bytes:
288 | raise IDNAError('Malformed A-label, no Punycode eligible content found')
289 | if label_bytes.decode('ascii')[-1] == '-':
290 | raise IDNAError('A-label must not end with a hyphen')
291 | else:
292 | check_label(label_bytes)
293 | return label_bytes.decode('ascii')
294 |
295 | try:
296 | label = label_bytes.decode('punycode')
297 | except UnicodeError:
298 | raise IDNAError('Invalid A-label')
299 | check_label(label)
300 | return label
301 |
302 |
303 | def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str:
304 | """Re-map the characters in the string according to UTS46 processing."""
305 | from .uts46data import uts46data
306 | output = ''
307 |
308 | for pos, char in enumerate(domain):
309 | code_point = ord(char)
310 | try:
311 | uts46row = uts46data[code_point if code_point < 256 else
312 | bisect.bisect_left(uts46data, (code_point, 'Z')) - 1]
313 | status = uts46row[1]
314 | replacement = None # type: Optional[str]
315 | if len(uts46row) == 3:
316 | replacement = uts46row[2]
317 | if (status == 'V' or
318 | (status == 'D' and not transitional) or
319 | (status == '3' and not std3_rules and replacement is None)):
320 | output += char
321 | elif replacement is not None and (status == 'M' or
322 | (status == '3' and not std3_rules) or
323 | (status == 'D' and transitional)):
324 | output += replacement
325 | elif status != 'I':
326 | raise IndexError()
327 | except IndexError:
328 | raise InvalidCodepoint(
329 | 'Codepoint {} not allowed at position {} in {}'.format(
330 | _unot(code_point), pos + 1, repr(domain)))
331 |
332 | return unicodedata.normalize('NFC', output)
333 |
334 |
335 | def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False, transitional: bool = False) -> bytes:
336 | if not isinstance(s, str):
337 | try:
338 | s = str(s, 'ascii')
339 | except UnicodeDecodeError:
340 | raise IDNAError('should pass a unicode string to the function rather than a byte string.')
341 | if uts46:
342 | s = uts46_remap(s, std3_rules, transitional)
343 | trailing_dot = False
344 | result = []
345 | if strict:
346 | labels = s.split('.')
347 | else:
348 | labels = _unicode_dots_re.split(s)
349 | if not labels or labels == ['']:
350 | raise IDNAError('Empty domain')
351 | if labels[-1] == '':
352 | del labels[-1]
353 | trailing_dot = True
354 | for label in labels:
355 | s = alabel(label)
356 | if s:
357 | result.append(s)
358 | else:
359 | raise IDNAError('Empty label')
360 | if trailing_dot:
361 | result.append(b'')
362 | s = b'.'.join(result)
363 | if not valid_string_length(s, trailing_dot):
364 | raise IDNAError('Domain too long')
365 | return s
366 |
367 |
368 | def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False) -> str:
369 | try:
370 | if not isinstance(s, str):
371 | s = str(s, 'ascii')
372 | except UnicodeDecodeError:
373 | raise IDNAError('Invalid ASCII in A-label')
374 | if uts46:
375 | s = uts46_remap(s, std3_rules, False)
376 | trailing_dot = False
377 | result = []
378 | if not strict:
379 | labels = _unicode_dots_re.split(s)
380 | else:
381 | labels = s.split('.')
382 | if not labels or labels == ['']:
383 | raise IDNAError('Empty domain')
384 | if not labels[-1]:
385 | del labels[-1]
386 | trailing_dot = True
387 | for label in labels:
388 | s = ulabel(label)
389 | if s:
390 | result.append(s)
391 | else:
392 | raise IDNAError('Empty label')
393 | if trailing_dot:
394 | result.append('')
395 | return '.'.join(result)
396 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/urllib3/http2/connection.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import logging
4 | import re
5 | import threading
6 | import types
7 | import typing
8 |
9 | import h2.config # type: ignore[import-untyped]
10 | import h2.connection # type: ignore[import-untyped]
11 | import h2.events # type: ignore[import-untyped]
12 |
13 | from .._base_connection import _TYPE_BODY
14 | from .._collections import HTTPHeaderDict
15 | from ..connection import HTTPSConnection, _get_default_user_agent
16 | from ..exceptions import ConnectionError
17 | from ..response import BaseHTTPResponse
18 |
19 | orig_HTTPSConnection = HTTPSConnection
20 |
21 | T = typing.TypeVar("T")
22 |
23 | log = logging.getLogger(__name__)
24 |
25 | RE_IS_LEGAL_HEADER_NAME = re.compile(rb"^[!#$%&'*+\-.^_`|~0-9a-z]+$")
26 | RE_IS_ILLEGAL_HEADER_VALUE = re.compile(rb"[\0\x00\x0a\x0d\r\n]|^[ \r\n\t]|[ \r\n\t]$")
27 |
28 |
29 | def _is_legal_header_name(name: bytes) -> bool:
30 | """
31 | "An implementation that validates fields according to the definitions in Sections
32 | 5.1 and 5.5 of [HTTP] only needs an additional check that field names do not
33 | include uppercase characters." (https://httpwg.org/specs/rfc9113.html#n-field-validity)
34 |
35 | `http.client._is_legal_header_name` does not validate the field name according to the
36 | HTTP 1.1 spec, so we do that here, in addition to checking for uppercase characters.
37 |
38 | This does not allow for the `:` character in the header name, so should not
39 | be used to validate pseudo-headers.
40 | """
41 | return bool(RE_IS_LEGAL_HEADER_NAME.match(name))
42 |
43 |
44 | def _is_illegal_header_value(value: bytes) -> bool:
45 | """
46 | "A field value MUST NOT contain the zero value (ASCII NUL, 0x00), line feed
47 | (ASCII LF, 0x0a), or carriage return (ASCII CR, 0x0d) at any position. A field
48 | value MUST NOT start or end with an ASCII whitespace character (ASCII SP or HTAB,
49 | 0x20 or 0x09)." (https://httpwg.org/specs/rfc9113.html#n-field-validity)
50 | """
51 | return bool(RE_IS_ILLEGAL_HEADER_VALUE.search(value))
52 |
53 |
54 | class _LockedObject(typing.Generic[T]):
55 | """
56 | A wrapper class that hides a specific object behind a lock.
57 | The goal here is to provide a simple way to protect access to an object
58 | that cannot safely be simultaneously accessed from multiple threads. The
59 | intended use of this class is simple: take hold of it with a context
60 | manager, which returns the protected object.
61 | """
62 |
63 | __slots__ = (
64 | "lock",
65 | "_obj",
66 | )
67 |
68 | def __init__(self, obj: T):
69 | self.lock = threading.RLock()
70 | self._obj = obj
71 |
72 | def __enter__(self) -> T:
73 | self.lock.acquire()
74 | return self._obj
75 |
76 | def __exit__(
77 | self,
78 | exc_type: type[BaseException] | None,
79 | exc_val: BaseException | None,
80 | exc_tb: types.TracebackType | None,
81 | ) -> None:
82 | self.lock.release()
83 |
84 |
85 | class HTTP2Connection(HTTPSConnection):
86 | def __init__(
87 | self, host: str, port: int | None = None, **kwargs: typing.Any
88 | ) -> None:
89 | self._h2_conn = self._new_h2_conn()
90 | self._h2_stream: int | None = None
91 | self._headers: list[tuple[bytes, bytes]] = []
92 |
93 | if "proxy" in kwargs or "proxy_config" in kwargs: # Defensive:
94 | raise NotImplementedError("Proxies aren't supported with HTTP/2")
95 |
96 | super().__init__(host, port, **kwargs)
97 |
98 | if self._tunnel_host is not None:
99 | raise NotImplementedError("Tunneling isn't supported with HTTP/2")
100 |
101 | def _new_h2_conn(self) -> _LockedObject[h2.connection.H2Connection]:
102 | config = h2.config.H2Configuration(client_side=True)
103 | return _LockedObject(h2.connection.H2Connection(config=config))
104 |
105 | def connect(self) -> None:
106 | super().connect()
107 | with self._h2_conn as conn:
108 | conn.initiate_connection()
109 | if data_to_send := conn.data_to_send():
110 | self.sock.sendall(data_to_send)
111 |
112 | def putrequest( # type: ignore[override]
113 | self,
114 | method: str,
115 | url: str,
116 | **kwargs: typing.Any,
117 | ) -> None:
118 | """putrequest
119 | This deviates from the HTTPConnection method signature since we never need to override
120 | sending accept-encoding headers or the host header.
121 | """
122 | if "skip_host" in kwargs:
123 | raise NotImplementedError("`skip_host` isn't supported")
124 | if "skip_accept_encoding" in kwargs:
125 | raise NotImplementedError("`skip_accept_encoding` isn't supported")
126 |
127 | self._request_url = url or "/"
128 | self._validate_path(url) # type: ignore[attr-defined]
129 |
130 | if ":" in self.host:
131 | authority = f"[{self.host}]:{self.port or 443}"
132 | else:
133 | authority = f"{self.host}:{self.port or 443}"
134 |
135 | self._headers.append((b":scheme", b"https"))
136 | self._headers.append((b":method", method.encode()))
137 | self._headers.append((b":authority", authority.encode()))
138 | self._headers.append((b":path", url.encode()))
139 |
140 | with self._h2_conn as conn:
141 | self._h2_stream = conn.get_next_available_stream_id()
142 |
143 | def putheader(self, header: str | bytes, *values: str | bytes) -> None:
144 | # TODO SKIPPABLE_HEADERS from urllib3 are ignored.
145 | header = header.encode() if isinstance(header, str) else header
146 | header = header.lower() # A lot of upstream code uses capitalized headers.
147 | if not _is_legal_header_name(header):
148 | raise ValueError(f"Illegal header name {str(header)}")
149 |
150 | for value in values:
151 | value = value.encode() if isinstance(value, str) else value
152 | if _is_illegal_header_value(value):
153 | raise ValueError(f"Illegal header value {str(value)}")
154 | self._headers.append((header, value))
155 |
156 | def endheaders(self, message_body: typing.Any = None) -> None: # type: ignore[override]
157 | if self._h2_stream is None:
158 | raise ConnectionError("Must call `putrequest` first.")
159 |
160 | with self._h2_conn as conn:
161 | conn.send_headers(
162 | stream_id=self._h2_stream,
163 | headers=self._headers,
164 | end_stream=(message_body is None),
165 | )
166 | if data_to_send := conn.data_to_send():
167 | self.sock.sendall(data_to_send)
168 | self._headers = [] # Reset headers for the next request.
169 |
170 | def send(self, data: typing.Any) -> None:
171 | """Send data to the server.
172 | `data` can be: `str`, `bytes`, an iterable, or file-like objects
173 | that support a .read() method.
174 | """
175 | if self._h2_stream is None:
176 | raise ConnectionError("Must call `putrequest` first.")
177 |
178 | with self._h2_conn as conn:
179 | if data_to_send := conn.data_to_send():
180 | self.sock.sendall(data_to_send)
181 |
182 | if hasattr(data, "read"): # file-like objects
183 | while True:
184 | chunk = data.read(self.blocksize)
185 | if not chunk:
186 | break
187 | if isinstance(chunk, str):
188 | chunk = chunk.encode() # pragma: no cover
189 | conn.send_data(self._h2_stream, chunk, end_stream=False)
190 | if data_to_send := conn.data_to_send():
191 | self.sock.sendall(data_to_send)
192 | conn.end_stream(self._h2_stream)
193 | return
194 |
195 | if isinstance(data, str): # str -> bytes
196 | data = data.encode()
197 |
198 | try:
199 | if isinstance(data, bytes):
200 | conn.send_data(self._h2_stream, data, end_stream=True)
201 | if data_to_send := conn.data_to_send():
202 | self.sock.sendall(data_to_send)
203 | else:
204 | for chunk in data:
205 | conn.send_data(self._h2_stream, chunk, end_stream=False)
206 | if data_to_send := conn.data_to_send():
207 | self.sock.sendall(data_to_send)
208 | conn.end_stream(self._h2_stream)
209 | except TypeError:
210 | raise TypeError(
211 | "`data` should be str, bytes, iterable, or file. got %r"
212 | % type(data)
213 | )
214 |
215 | def set_tunnel(
216 | self,
217 | host: str,
218 | port: int | None = None,
219 | headers: typing.Mapping[str, str] | None = None,
220 | scheme: str = "http",
221 | ) -> None:
222 | raise NotImplementedError(
223 | "HTTP/2 does not support setting up a tunnel through a proxy"
224 | )
225 |
226 | def getresponse( # type: ignore[override]
227 | self,
228 | ) -> HTTP2Response:
229 | status = None
230 | data = bytearray()
231 | with self._h2_conn as conn:
232 | end_stream = False
233 | while not end_stream:
234 | # TODO: Arbitrary read value.
235 | if received_data := self.sock.recv(65535):
236 | events = conn.receive_data(received_data)
237 | for event in events:
238 | if isinstance(event, h2.events.ResponseReceived):
239 | headers = HTTPHeaderDict()
240 | for header, value in event.headers:
241 | if header == b":status":
242 | status = int(value.decode())
243 | else:
244 | headers.add(
245 | header.decode("ascii"), value.decode("ascii")
246 | )
247 |
248 | elif isinstance(event, h2.events.DataReceived):
249 | data += event.data
250 | conn.acknowledge_received_data(
251 | event.flow_controlled_length, event.stream_id
252 | )
253 |
254 | elif isinstance(event, h2.events.StreamEnded):
255 | end_stream = True
256 |
257 | if data_to_send := conn.data_to_send():
258 | self.sock.sendall(data_to_send)
259 |
260 | assert status is not None
261 | return HTTP2Response(
262 | status=status,
263 | headers=headers,
264 | request_url=self._request_url,
265 | data=bytes(data),
266 | )
267 |
268 | def request( # type: ignore[override]
269 | self,
270 | method: str,
271 | url: str,
272 | body: _TYPE_BODY | None = None,
273 | headers: typing.Mapping[str, str] | None = None,
274 | *,
275 | preload_content: bool = True,
276 | decode_content: bool = True,
277 | enforce_content_length: bool = True,
278 | **kwargs: typing.Any,
279 | ) -> None:
280 | """Send an HTTP/2 request"""
281 | if "chunked" in kwargs:
282 | # TODO this is often present from upstream.
283 | # raise NotImplementedError("`chunked` isn't supported with HTTP/2")
284 | pass
285 |
286 | if self.sock is not None:
287 | self.sock.settimeout(self.timeout)
288 |
289 | self.putrequest(method, url)
290 |
291 | headers = headers or {}
292 | for k, v in headers.items():
293 | if k.lower() == "transfer-encoding" and v == "chunked":
294 | continue
295 | else:
296 | self.putheader(k, v)
297 |
298 | if b"user-agent" not in dict(self._headers):
299 | self.putheader(b"user-agent", _get_default_user_agent())
300 |
301 | if body:
302 | self.endheaders(message_body=body)
303 | self.send(body)
304 | else:
305 | self.endheaders()
306 |
307 | def close(self) -> None:
308 | with self._h2_conn as conn:
309 | try:
310 | conn.close_connection()
311 | if data := conn.data_to_send():
312 | self.sock.sendall(data)
313 | except Exception:
314 | pass
315 |
316 | # Reset all our HTTP/2 connection state.
317 | self._h2_conn = self._new_h2_conn()
318 | self._h2_stream = None
319 | self._headers = []
320 |
321 | super().close()
322 |
323 |
324 | class HTTP2Response(BaseHTTPResponse):
325 | # TODO: This is a woefully incomplete response object, but works for non-streaming.
326 | def __init__(
327 | self,
328 | status: int,
329 | headers: HTTPHeaderDict,
330 | request_url: str,
331 | data: bytes,
332 | decode_content: bool = False, # TODO: support decoding
333 | ) -> None:
334 | super().__init__(
335 | status=status,
336 | headers=headers,
337 | # Following CPython, we map HTTP versions to major * 10 + minor integers
338 | version=20,
339 | version_string="HTTP/2",
340 | # No reason phrase in HTTP/2
341 | reason=None,
342 | decode_content=decode_content,
343 | request_url=request_url,
344 | )
345 | self._data = data
346 | self.length_remaining = 0
347 |
348 | @property
349 | def data(self) -> bytes:
350 | return self._data
351 |
352 | def get_redirect_location(self) -> None:
353 | return None
354 |
355 | def close(self) -> None:
356 | pass
357 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/commands/list.py:
--------------------------------------------------------------------------------
```python
1 | import json
2 | import logging
3 | from optparse import Values
4 | from typing import TYPE_CHECKING, Generator, List, Optional, Sequence, Tuple, cast
5 |
6 | from pip._vendor.packaging.utils import canonicalize_name
7 | from pip._vendor.packaging.version import Version
8 |
9 | from pip._internal.cli import cmdoptions
10 | from pip._internal.cli.index_command import IndexGroupCommand
11 | from pip._internal.cli.status_codes import SUCCESS
12 | from pip._internal.exceptions import CommandError
13 | from pip._internal.metadata import BaseDistribution, get_environment
14 | from pip._internal.models.selection_prefs import SelectionPreferences
15 | from pip._internal.utils.compat import stdlib_pkgs
16 | from pip._internal.utils.misc import tabulate, write_output
17 |
18 | if TYPE_CHECKING:
19 | from pip._internal.index.package_finder import PackageFinder
20 | from pip._internal.network.session import PipSession
21 |
22 | class _DistWithLatestInfo(BaseDistribution):
23 | """Give the distribution object a couple of extra fields.
24 |
25 | These will be populated during ``get_outdated()``. This is dirty but
26 | makes the rest of the code much cleaner.
27 | """
28 |
29 | latest_version: Version
30 | latest_filetype: str
31 |
32 | _ProcessedDists = Sequence[_DistWithLatestInfo]
33 |
34 |
35 | logger = logging.getLogger(__name__)
36 |
37 |
38 | class ListCommand(IndexGroupCommand):
39 | """
40 | List installed packages, including editables.
41 |
42 | Packages are listed in a case-insensitive sorted order.
43 | """
44 |
45 | ignore_require_venv = True
46 | usage = """
47 | %prog [options]"""
48 |
49 | def add_options(self) -> None:
50 | self.cmd_opts.add_option(
51 | "-o",
52 | "--outdated",
53 | action="store_true",
54 | default=False,
55 | help="List outdated packages",
56 | )
57 | self.cmd_opts.add_option(
58 | "-u",
59 | "--uptodate",
60 | action="store_true",
61 | default=False,
62 | help="List uptodate packages",
63 | )
64 | self.cmd_opts.add_option(
65 | "-e",
66 | "--editable",
67 | action="store_true",
68 | default=False,
69 | help="List editable projects.",
70 | )
71 | self.cmd_opts.add_option(
72 | "-l",
73 | "--local",
74 | action="store_true",
75 | default=False,
76 | help=(
77 | "If in a virtualenv that has global access, do not list "
78 | "globally-installed packages."
79 | ),
80 | )
81 | self.cmd_opts.add_option(
82 | "--user",
83 | dest="user",
84 | action="store_true",
85 | default=False,
86 | help="Only output packages installed in user-site.",
87 | )
88 | self.cmd_opts.add_option(cmdoptions.list_path())
89 | self.cmd_opts.add_option(
90 | "--pre",
91 | action="store_true",
92 | default=False,
93 | help=(
94 | "Include pre-release and development versions. By default, "
95 | "pip only finds stable versions."
96 | ),
97 | )
98 |
99 | self.cmd_opts.add_option(
100 | "--format",
101 | action="store",
102 | dest="list_format",
103 | default="columns",
104 | choices=("columns", "freeze", "json"),
105 | help=(
106 | "Select the output format among: columns (default), freeze, or json. "
107 | "The 'freeze' format cannot be used with the --outdated option."
108 | ),
109 | )
110 |
111 | self.cmd_opts.add_option(
112 | "--not-required",
113 | action="store_true",
114 | dest="not_required",
115 | help="List packages that are not dependencies of installed packages.",
116 | )
117 |
118 | self.cmd_opts.add_option(
119 | "--exclude-editable",
120 | action="store_false",
121 | dest="include_editable",
122 | help="Exclude editable package from output.",
123 | )
124 | self.cmd_opts.add_option(
125 | "--include-editable",
126 | action="store_true",
127 | dest="include_editable",
128 | help="Include editable package from output.",
129 | default=True,
130 | )
131 | self.cmd_opts.add_option(cmdoptions.list_exclude())
132 | index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser)
133 |
134 | self.parser.insert_option_group(0, index_opts)
135 | self.parser.insert_option_group(0, self.cmd_opts)
136 |
137 | def handle_pip_version_check(self, options: Values) -> None:
138 | if options.outdated or options.uptodate:
139 | super().handle_pip_version_check(options)
140 |
141 | def _build_package_finder(
142 | self, options: Values, session: "PipSession"
143 | ) -> "PackageFinder":
144 | """
145 | Create a package finder appropriate to this list command.
146 | """
147 | # Lazy import the heavy index modules as most list invocations won't need 'em.
148 | from pip._internal.index.collector import LinkCollector
149 | from pip._internal.index.package_finder import PackageFinder
150 |
151 | link_collector = LinkCollector.create(session, options=options)
152 |
153 | # Pass allow_yanked=False to ignore yanked versions.
154 | selection_prefs = SelectionPreferences(
155 | allow_yanked=False,
156 | allow_all_prereleases=options.pre,
157 | )
158 |
159 | return PackageFinder.create(
160 | link_collector=link_collector,
161 | selection_prefs=selection_prefs,
162 | )
163 |
164 | def run(self, options: Values, args: List[str]) -> int:
165 | if options.outdated and options.uptodate:
166 | raise CommandError("Options --outdated and --uptodate cannot be combined.")
167 |
168 | if options.outdated and options.list_format == "freeze":
169 | raise CommandError(
170 | "List format 'freeze' cannot be used with the --outdated option."
171 | )
172 |
173 | cmdoptions.check_list_path_option(options)
174 |
175 | skip = set(stdlib_pkgs)
176 | if options.excludes:
177 | skip.update(canonicalize_name(n) for n in options.excludes)
178 |
179 | packages: "_ProcessedDists" = [
180 | cast("_DistWithLatestInfo", d)
181 | for d in get_environment(options.path).iter_installed_distributions(
182 | local_only=options.local,
183 | user_only=options.user,
184 | editables_only=options.editable,
185 | include_editables=options.include_editable,
186 | skip=skip,
187 | )
188 | ]
189 |
190 | # get_not_required must be called firstly in order to find and
191 | # filter out all dependencies correctly. Otherwise a package
192 | # can't be identified as requirement because some parent packages
193 | # could be filtered out before.
194 | if options.not_required:
195 | packages = self.get_not_required(packages, options)
196 |
197 | if options.outdated:
198 | packages = self.get_outdated(packages, options)
199 | elif options.uptodate:
200 | packages = self.get_uptodate(packages, options)
201 |
202 | self.output_package_listing(packages, options)
203 | return SUCCESS
204 |
205 | def get_outdated(
206 | self, packages: "_ProcessedDists", options: Values
207 | ) -> "_ProcessedDists":
208 | return [
209 | dist
210 | for dist in self.iter_packages_latest_infos(packages, options)
211 | if dist.latest_version > dist.version
212 | ]
213 |
214 | def get_uptodate(
215 | self, packages: "_ProcessedDists", options: Values
216 | ) -> "_ProcessedDists":
217 | return [
218 | dist
219 | for dist in self.iter_packages_latest_infos(packages, options)
220 | if dist.latest_version == dist.version
221 | ]
222 |
223 | def get_not_required(
224 | self, packages: "_ProcessedDists", options: Values
225 | ) -> "_ProcessedDists":
226 | dep_keys = {
227 | canonicalize_name(dep.name)
228 | for dist in packages
229 | for dep in (dist.iter_dependencies() or ())
230 | }
231 |
232 | # Create a set to remove duplicate packages, and cast it to a list
233 | # to keep the return type consistent with get_outdated and
234 | # get_uptodate
235 | return list({pkg for pkg in packages if pkg.canonical_name not in dep_keys})
236 |
237 | def iter_packages_latest_infos(
238 | self, packages: "_ProcessedDists", options: Values
239 | ) -> Generator["_DistWithLatestInfo", None, None]:
240 | with self._build_session(options) as session:
241 | finder = self._build_package_finder(options, session)
242 |
243 | def latest_info(
244 | dist: "_DistWithLatestInfo",
245 | ) -> Optional["_DistWithLatestInfo"]:
246 | all_candidates = finder.find_all_candidates(dist.canonical_name)
247 | if not options.pre:
248 | # Remove prereleases
249 | all_candidates = [
250 | candidate
251 | for candidate in all_candidates
252 | if not candidate.version.is_prerelease
253 | ]
254 |
255 | evaluator = finder.make_candidate_evaluator(
256 | project_name=dist.canonical_name,
257 | )
258 | best_candidate = evaluator.sort_best_candidate(all_candidates)
259 | if best_candidate is None:
260 | return None
261 |
262 | remote_version = best_candidate.version
263 | if best_candidate.link.is_wheel:
264 | typ = "wheel"
265 | else:
266 | typ = "sdist"
267 | dist.latest_version = remote_version
268 | dist.latest_filetype = typ
269 | return dist
270 |
271 | for dist in map(latest_info, packages):
272 | if dist is not None:
273 | yield dist
274 |
275 | def output_package_listing(
276 | self, packages: "_ProcessedDists", options: Values
277 | ) -> None:
278 | packages = sorted(
279 | packages,
280 | key=lambda dist: dist.canonical_name,
281 | )
282 | if options.list_format == "columns" and packages:
283 | data, header = format_for_columns(packages, options)
284 | self.output_package_listing_columns(data, header)
285 | elif options.list_format == "freeze":
286 | for dist in packages:
287 | if options.verbose >= 1:
288 | write_output(
289 | "%s==%s (%s)", dist.raw_name, dist.version, dist.location
290 | )
291 | else:
292 | write_output("%s==%s", dist.raw_name, dist.version)
293 | elif options.list_format == "json":
294 | write_output(format_for_json(packages, options))
295 |
296 | def output_package_listing_columns(
297 | self, data: List[List[str]], header: List[str]
298 | ) -> None:
299 | # insert the header first: we need to know the size of column names
300 | if len(data) > 0:
301 | data.insert(0, header)
302 |
303 | pkg_strings, sizes = tabulate(data)
304 |
305 | # Create and add a separator.
306 | if len(data) > 0:
307 | pkg_strings.insert(1, " ".join("-" * x for x in sizes))
308 |
309 | for val in pkg_strings:
310 | write_output(val)
311 |
312 |
313 | def format_for_columns(
314 | pkgs: "_ProcessedDists", options: Values
315 | ) -> Tuple[List[List[str]], List[str]]:
316 | """
317 | Convert the package data into something usable
318 | by output_package_listing_columns.
319 | """
320 | header = ["Package", "Version"]
321 |
322 | running_outdated = options.outdated
323 | if running_outdated:
324 | header.extend(["Latest", "Type"])
325 |
326 | has_editables = any(x.editable for x in pkgs)
327 | if has_editables:
328 | header.append("Editable project location")
329 |
330 | if options.verbose >= 1:
331 | header.append("Location")
332 | if options.verbose >= 1:
333 | header.append("Installer")
334 |
335 | data = []
336 | for proj in pkgs:
337 | # if we're working on the 'outdated' list, separate out the
338 | # latest_version and type
339 | row = [proj.raw_name, proj.raw_version]
340 |
341 | if running_outdated:
342 | row.append(str(proj.latest_version))
343 | row.append(proj.latest_filetype)
344 |
345 | if has_editables:
346 | row.append(proj.editable_project_location or "")
347 |
348 | if options.verbose >= 1:
349 | row.append(proj.location or "")
350 | if options.verbose >= 1:
351 | row.append(proj.installer)
352 |
353 | data.append(row)
354 |
355 | return data, header
356 |
357 |
358 | def format_for_json(packages: "_ProcessedDists", options: Values) -> str:
359 | data = []
360 | for dist in packages:
361 | info = {
362 | "name": dist.raw_name,
363 | "version": str(dist.version),
364 | }
365 | if options.verbose >= 1:
366 | info["location"] = dist.location or ""
367 | info["installer"] = dist.installer
368 | if options.outdated:
369 | info["latest_version"] = str(dist.latest_version)
370 | info["latest_filetype"] = dist.latest_filetype
371 | editable_project_location = dist.editable_project_location
372 | if editable_project_location:
373 | info["editable_project_location"] = editable_project_location
374 | data.append(info)
375 | return json.dumps(data)
376 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxml/valid.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: The DTD validation
3 | * Description: API for the DTD handling and the validity checking
4 | *
5 | * Copy: See Copyright for the status of this software.
6 | *
7 | * Author: Daniel Veillard
8 | */
9 |
10 |
11 | #ifndef __XML_VALID_H__
12 | #define __XML_VALID_H__
13 |
14 | #include <libxml/xmlversion.h>
15 | #include <libxml/xmlerror.h>
16 | #define XML_TREE_INTERNALS
17 | #include <libxml/tree.h>
18 | #undef XML_TREE_INTERNALS
19 | #include <libxml/list.h>
20 | #include <libxml/xmlautomata.h>
21 | #include <libxml/xmlregexp.h>
22 |
23 | #ifdef __cplusplus
24 | extern "C" {
25 | #endif
26 |
27 | /*
28 | * Validation state added for non-determinist content model.
29 | */
30 | typedef struct _xmlValidState xmlValidState;
31 | typedef xmlValidState *xmlValidStatePtr;
32 |
33 | /**
34 | * xmlValidityErrorFunc:
35 | * @ctx: usually an xmlValidCtxtPtr to a validity error context,
36 | * but comes from ctxt->userData (which normally contains such
37 | * a pointer); ctxt->userData can be changed by the user.
38 | * @msg: the string to format *printf like vararg
39 | * @...: remaining arguments to the format
40 | *
41 | * Callback called when a validity error is found. This is a message
42 | * oriented function similar to an *printf function.
43 | */
44 | typedef void (*xmlValidityErrorFunc) (void *ctx,
45 | const char *msg,
46 | ...) LIBXML_ATTR_FORMAT(2,3);
47 |
48 | /**
49 | * xmlValidityWarningFunc:
50 | * @ctx: usually an xmlValidCtxtPtr to a validity error context,
51 | * but comes from ctxt->userData (which normally contains such
52 | * a pointer); ctxt->userData can be changed by the user.
53 | * @msg: the string to format *printf like vararg
54 | * @...: remaining arguments to the format
55 | *
56 | * Callback called when a validity warning is found. This is a message
57 | * oriented function similar to an *printf function.
58 | */
59 | typedef void (*xmlValidityWarningFunc) (void *ctx,
60 | const char *msg,
61 | ...) LIBXML_ATTR_FORMAT(2,3);
62 |
63 | /*
64 | * xmlValidCtxt:
65 | * An xmlValidCtxt is used for error reporting when validating.
66 | */
67 | typedef struct _xmlValidCtxt xmlValidCtxt;
68 | typedef xmlValidCtxt *xmlValidCtxtPtr;
69 | struct _xmlValidCtxt {
70 | void *userData; /* user specific data block */
71 | xmlValidityErrorFunc error; /* the callback in case of errors */
72 | xmlValidityWarningFunc warning; /* the callback in case of warning */
73 |
74 | /* Node analysis stack used when validating within entities */
75 | xmlNodePtr node; /* Current parsed Node */
76 | int nodeNr; /* Depth of the parsing stack */
77 | int nodeMax; /* Max depth of the parsing stack */
78 | xmlNodePtr *nodeTab; /* array of nodes */
79 |
80 | unsigned int flags; /* internal flags */
81 | xmlDocPtr doc; /* the document */
82 | int valid; /* temporary validity check result */
83 |
84 | /* state state used for non-determinist content validation */
85 | xmlValidState *vstate; /* current state */
86 | int vstateNr; /* Depth of the validation stack */
87 | int vstateMax; /* Max depth of the validation stack */
88 | xmlValidState *vstateTab; /* array of validation states */
89 |
90 | #ifdef LIBXML_REGEXP_ENABLED
91 | xmlAutomataPtr am; /* the automata */
92 | xmlAutomataStatePtr state; /* used to build the automata */
93 | #else
94 | void *am;
95 | void *state;
96 | #endif
97 | };
98 |
99 | /*
100 | * ALL notation declarations are stored in a table.
101 | * There is one table per DTD.
102 | */
103 |
104 | typedef struct _xmlHashTable xmlNotationTable;
105 | typedef xmlNotationTable *xmlNotationTablePtr;
106 |
107 | /*
108 | * ALL element declarations are stored in a table.
109 | * There is one table per DTD.
110 | */
111 |
112 | typedef struct _xmlHashTable xmlElementTable;
113 | typedef xmlElementTable *xmlElementTablePtr;
114 |
115 | /*
116 | * ALL attribute declarations are stored in a table.
117 | * There is one table per DTD.
118 | */
119 |
120 | typedef struct _xmlHashTable xmlAttributeTable;
121 | typedef xmlAttributeTable *xmlAttributeTablePtr;
122 |
123 | /*
124 | * ALL IDs attributes are stored in a table.
125 | * There is one table per document.
126 | */
127 |
128 | typedef struct _xmlHashTable xmlIDTable;
129 | typedef xmlIDTable *xmlIDTablePtr;
130 |
131 | /*
132 | * ALL Refs attributes are stored in a table.
133 | * There is one table per document.
134 | */
135 |
136 | typedef struct _xmlHashTable xmlRefTable;
137 | typedef xmlRefTable *xmlRefTablePtr;
138 |
139 | /* Notation */
140 | XMLPUBFUN xmlNotationPtr
141 | xmlAddNotationDecl (xmlValidCtxtPtr ctxt,
142 | xmlDtdPtr dtd,
143 | const xmlChar *name,
144 | const xmlChar *PublicID,
145 | const xmlChar *SystemID);
146 | #ifdef LIBXML_TREE_ENABLED
147 | XMLPUBFUN xmlNotationTablePtr
148 | xmlCopyNotationTable (xmlNotationTablePtr table);
149 | #endif /* LIBXML_TREE_ENABLED */
150 | XMLPUBFUN void
151 | xmlFreeNotationTable (xmlNotationTablePtr table);
152 | #ifdef LIBXML_OUTPUT_ENABLED
153 | XMLPUBFUN void
154 | xmlDumpNotationDecl (xmlBufferPtr buf,
155 | xmlNotationPtr nota);
156 | XMLPUBFUN void
157 | xmlDumpNotationTable (xmlBufferPtr buf,
158 | xmlNotationTablePtr table);
159 | #endif /* LIBXML_OUTPUT_ENABLED */
160 |
161 | /* Element Content */
162 | /* the non Doc version are being deprecated */
163 | XMLPUBFUN xmlElementContentPtr
164 | xmlNewElementContent (const xmlChar *name,
165 | xmlElementContentType type);
166 | XMLPUBFUN xmlElementContentPtr
167 | xmlCopyElementContent (xmlElementContentPtr content);
168 | XMLPUBFUN void
169 | xmlFreeElementContent (xmlElementContentPtr cur);
170 | /* the new versions with doc argument */
171 | XMLPUBFUN xmlElementContentPtr
172 | xmlNewDocElementContent (xmlDocPtr doc,
173 | const xmlChar *name,
174 | xmlElementContentType type);
175 | XMLPUBFUN xmlElementContentPtr
176 | xmlCopyDocElementContent(xmlDocPtr doc,
177 | xmlElementContentPtr content);
178 | XMLPUBFUN void
179 | xmlFreeDocElementContent(xmlDocPtr doc,
180 | xmlElementContentPtr cur);
181 | XMLPUBFUN void
182 | xmlSnprintfElementContent(char *buf,
183 | int size,
184 | xmlElementContentPtr content,
185 | int englob);
186 | #ifdef LIBXML_OUTPUT_ENABLED
187 | /* DEPRECATED */
188 | XMLPUBFUN void
189 | xmlSprintfElementContent(char *buf,
190 | xmlElementContentPtr content,
191 | int englob);
192 | #endif /* LIBXML_OUTPUT_ENABLED */
193 | /* DEPRECATED */
194 |
195 | /* Element */
196 | XMLPUBFUN xmlElementPtr
197 | xmlAddElementDecl (xmlValidCtxtPtr ctxt,
198 | xmlDtdPtr dtd,
199 | const xmlChar *name,
200 | xmlElementTypeVal type,
201 | xmlElementContentPtr content);
202 | #ifdef LIBXML_TREE_ENABLED
203 | XMLPUBFUN xmlElementTablePtr
204 | xmlCopyElementTable (xmlElementTablePtr table);
205 | #endif /* LIBXML_TREE_ENABLED */
206 | XMLPUBFUN void
207 | xmlFreeElementTable (xmlElementTablePtr table);
208 | #ifdef LIBXML_OUTPUT_ENABLED
209 | XMLPUBFUN void
210 | xmlDumpElementTable (xmlBufferPtr buf,
211 | xmlElementTablePtr table);
212 | XMLPUBFUN void
213 | xmlDumpElementDecl (xmlBufferPtr buf,
214 | xmlElementPtr elem);
215 | #endif /* LIBXML_OUTPUT_ENABLED */
216 |
217 | /* Enumeration */
218 | XMLPUBFUN xmlEnumerationPtr
219 | xmlCreateEnumeration (const xmlChar *name);
220 | XMLPUBFUN void
221 | xmlFreeEnumeration (xmlEnumerationPtr cur);
222 | #ifdef LIBXML_TREE_ENABLED
223 | XMLPUBFUN xmlEnumerationPtr
224 | xmlCopyEnumeration (xmlEnumerationPtr cur);
225 | #endif /* LIBXML_TREE_ENABLED */
226 |
227 | /* Attribute */
228 | XMLPUBFUN xmlAttributePtr
229 | xmlAddAttributeDecl (xmlValidCtxtPtr ctxt,
230 | xmlDtdPtr dtd,
231 | const xmlChar *elem,
232 | const xmlChar *name,
233 | const xmlChar *ns,
234 | xmlAttributeType type,
235 | xmlAttributeDefault def,
236 | const xmlChar *defaultValue,
237 | xmlEnumerationPtr tree);
238 | #ifdef LIBXML_TREE_ENABLED
239 | XMLPUBFUN xmlAttributeTablePtr
240 | xmlCopyAttributeTable (xmlAttributeTablePtr table);
241 | #endif /* LIBXML_TREE_ENABLED */
242 | XMLPUBFUN void
243 | xmlFreeAttributeTable (xmlAttributeTablePtr table);
244 | #ifdef LIBXML_OUTPUT_ENABLED
245 | XMLPUBFUN void
246 | xmlDumpAttributeTable (xmlBufferPtr buf,
247 | xmlAttributeTablePtr table);
248 | XMLPUBFUN void
249 | xmlDumpAttributeDecl (xmlBufferPtr buf,
250 | xmlAttributePtr attr);
251 | #endif /* LIBXML_OUTPUT_ENABLED */
252 |
253 | /* IDs */
254 | XMLPUBFUN xmlIDPtr
255 | xmlAddID (xmlValidCtxtPtr ctxt,
256 | xmlDocPtr doc,
257 | const xmlChar *value,
258 | xmlAttrPtr attr);
259 | XMLPUBFUN void
260 | xmlFreeIDTable (xmlIDTablePtr table);
261 | XMLPUBFUN xmlAttrPtr
262 | xmlGetID (xmlDocPtr doc,
263 | const xmlChar *ID);
264 | XMLPUBFUN int
265 | xmlIsID (xmlDocPtr doc,
266 | xmlNodePtr elem,
267 | xmlAttrPtr attr);
268 | XMLPUBFUN int
269 | xmlRemoveID (xmlDocPtr doc,
270 | xmlAttrPtr attr);
271 |
272 | /* IDREFs */
273 | XML_DEPRECATED
274 | XMLPUBFUN xmlRefPtr
275 | xmlAddRef (xmlValidCtxtPtr ctxt,
276 | xmlDocPtr doc,
277 | const xmlChar *value,
278 | xmlAttrPtr attr);
279 | XML_DEPRECATED
280 | XMLPUBFUN void
281 | xmlFreeRefTable (xmlRefTablePtr table);
282 | XML_DEPRECATED
283 | XMLPUBFUN int
284 | xmlIsRef (xmlDocPtr doc,
285 | xmlNodePtr elem,
286 | xmlAttrPtr attr);
287 | XML_DEPRECATED
288 | XMLPUBFUN int
289 | xmlRemoveRef (xmlDocPtr doc,
290 | xmlAttrPtr attr);
291 | XML_DEPRECATED
292 | XMLPUBFUN xmlListPtr
293 | xmlGetRefs (xmlDocPtr doc,
294 | const xmlChar *ID);
295 |
296 | /**
297 | * The public function calls related to validity checking.
298 | */
299 | #ifdef LIBXML_VALID_ENABLED
300 | /* Allocate/Release Validation Contexts */
301 | XMLPUBFUN xmlValidCtxtPtr
302 | xmlNewValidCtxt(void);
303 | XMLPUBFUN void
304 | xmlFreeValidCtxt(xmlValidCtxtPtr);
305 |
306 | XMLPUBFUN int
307 | xmlValidateRoot (xmlValidCtxtPtr ctxt,
308 | xmlDocPtr doc);
309 | XMLPUBFUN int
310 | xmlValidateElementDecl (xmlValidCtxtPtr ctxt,
311 | xmlDocPtr doc,
312 | xmlElementPtr elem);
313 | XMLPUBFUN xmlChar *
314 | xmlValidNormalizeAttributeValue(xmlDocPtr doc,
315 | xmlNodePtr elem,
316 | const xmlChar *name,
317 | const xmlChar *value);
318 | XMLPUBFUN xmlChar *
319 | xmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt,
320 | xmlDocPtr doc,
321 | xmlNodePtr elem,
322 | const xmlChar *name,
323 | const xmlChar *value);
324 | XMLPUBFUN int
325 | xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt,
326 | xmlDocPtr doc,
327 | xmlAttributePtr attr);
328 | XMLPUBFUN int
329 | xmlValidateAttributeValue(xmlAttributeType type,
330 | const xmlChar *value);
331 | XMLPUBFUN int
332 | xmlValidateNotationDecl (xmlValidCtxtPtr ctxt,
333 | xmlDocPtr doc,
334 | xmlNotationPtr nota);
335 | XMLPUBFUN int
336 | xmlValidateDtd (xmlValidCtxtPtr ctxt,
337 | xmlDocPtr doc,
338 | xmlDtdPtr dtd);
339 | XMLPUBFUN int
340 | xmlValidateDtdFinal (xmlValidCtxtPtr ctxt,
341 | xmlDocPtr doc);
342 | XMLPUBFUN int
343 | xmlValidateDocument (xmlValidCtxtPtr ctxt,
344 | xmlDocPtr doc);
345 | XMLPUBFUN int
346 | xmlValidateElement (xmlValidCtxtPtr ctxt,
347 | xmlDocPtr doc,
348 | xmlNodePtr elem);
349 | XMLPUBFUN int
350 | xmlValidateOneElement (xmlValidCtxtPtr ctxt,
351 | xmlDocPtr doc,
352 | xmlNodePtr elem);
353 | XMLPUBFUN int
354 | xmlValidateOneAttribute (xmlValidCtxtPtr ctxt,
355 | xmlDocPtr doc,
356 | xmlNodePtr elem,
357 | xmlAttrPtr attr,
358 | const xmlChar *value);
359 | XMLPUBFUN int
360 | xmlValidateOneNamespace (xmlValidCtxtPtr ctxt,
361 | xmlDocPtr doc,
362 | xmlNodePtr elem,
363 | const xmlChar *prefix,
364 | xmlNsPtr ns,
365 | const xmlChar *value);
366 | XMLPUBFUN int
367 | xmlValidateDocumentFinal(xmlValidCtxtPtr ctxt,
368 | xmlDocPtr doc);
369 | #endif /* LIBXML_VALID_ENABLED */
370 |
371 | #if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
372 | XMLPUBFUN int
373 | xmlValidateNotationUse (xmlValidCtxtPtr ctxt,
374 | xmlDocPtr doc,
375 | const xmlChar *notationName);
376 | #endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */
377 |
378 | XMLPUBFUN int
379 | xmlIsMixedElement (xmlDocPtr doc,
380 | const xmlChar *name);
381 | XMLPUBFUN xmlAttributePtr
382 | xmlGetDtdAttrDesc (xmlDtdPtr dtd,
383 | const xmlChar *elem,
384 | const xmlChar *name);
385 | XMLPUBFUN xmlAttributePtr
386 | xmlGetDtdQAttrDesc (xmlDtdPtr dtd,
387 | const xmlChar *elem,
388 | const xmlChar *name,
389 | const xmlChar *prefix);
390 | XMLPUBFUN xmlNotationPtr
391 | xmlGetDtdNotationDesc (xmlDtdPtr dtd,
392 | const xmlChar *name);
393 | XMLPUBFUN xmlElementPtr
394 | xmlGetDtdQElementDesc (xmlDtdPtr dtd,
395 | const xmlChar *name,
396 | const xmlChar *prefix);
397 | XMLPUBFUN xmlElementPtr
398 | xmlGetDtdElementDesc (xmlDtdPtr dtd,
399 | const xmlChar *name);
400 |
401 | #ifdef LIBXML_VALID_ENABLED
402 |
403 | XMLPUBFUN int
404 | xmlValidGetPotentialChildren(xmlElementContent *ctree,
405 | const xmlChar **names,
406 | int *len,
407 | int max);
408 |
409 | XMLPUBFUN int
410 | xmlValidGetValidElements(xmlNode *prev,
411 | xmlNode *next,
412 | const xmlChar **names,
413 | int max);
414 | XMLPUBFUN int
415 | xmlValidateNameValue (const xmlChar *value);
416 | XMLPUBFUN int
417 | xmlValidateNamesValue (const xmlChar *value);
418 | XMLPUBFUN int
419 | xmlValidateNmtokenValue (const xmlChar *value);
420 | XMLPUBFUN int
421 | xmlValidateNmtokensValue(const xmlChar *value);
422 |
423 | #ifdef LIBXML_REGEXP_ENABLED
424 | /*
425 | * Validation based on the regexp support
426 | */
427 | XMLPUBFUN int
428 | xmlValidBuildContentModel(xmlValidCtxtPtr ctxt,
429 | xmlElementPtr elem);
430 |
431 | XMLPUBFUN int
432 | xmlValidatePushElement (xmlValidCtxtPtr ctxt,
433 | xmlDocPtr doc,
434 | xmlNodePtr elem,
435 | const xmlChar *qname);
436 | XMLPUBFUN int
437 | xmlValidatePushCData (xmlValidCtxtPtr ctxt,
438 | const xmlChar *data,
439 | int len);
440 | XMLPUBFUN int
441 | xmlValidatePopElement (xmlValidCtxtPtr ctxt,
442 | xmlDocPtr doc,
443 | xmlNodePtr elem,
444 | const xmlChar *qname);
445 | #endif /* LIBXML_REGEXP_ENABLED */
446 | #endif /* LIBXML_VALID_ENABLED */
447 | #ifdef __cplusplus
448 | }
449 | #endif
450 | #endif /* __XML_VALID_H__ */
451 |
```