This is page 42 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/pyproject_hooks/_in_process/_in_process.py:
--------------------------------------------------------------------------------
```python
1 | """This is invoked in a subprocess to call the build backend hooks.
2 |
3 | It expects:
4 | - Command line args: hook_name, control_dir
5 | - Environment variables:
6 | PEP517_BUILD_BACKEND=entry.point:spec
7 | PEP517_BACKEND_PATH=paths (separated with os.pathsep)
8 | - control_dir/input.json:
9 | - {"kwargs": {...}}
10 |
11 | Results:
12 | - control_dir/output.json
13 | - {"return_val": ...}
14 | """
15 | import json
16 | import os
17 | import os.path
18 | import re
19 | import shutil
20 | import sys
21 | import traceback
22 | from glob import glob
23 | from importlib import import_module
24 | from os.path import join as pjoin
25 |
26 | # This file is run as a script, and `import wrappers` is not zip-safe, so we
27 | # include write_json() and read_json() from wrappers.py.
28 |
29 |
30 | def write_json(obj, path, **kwargs):
31 | with open(path, 'w', encoding='utf-8') as f:
32 | json.dump(obj, f, **kwargs)
33 |
34 |
35 | def read_json(path):
36 | with open(path, encoding='utf-8') as f:
37 | return json.load(f)
38 |
39 |
40 | class BackendUnavailable(Exception):
41 | """Raised if we cannot import the backend"""
42 | def __init__(self, traceback):
43 | self.traceback = traceback
44 |
45 |
46 | class BackendInvalid(Exception):
47 | """Raised if the backend is invalid"""
48 | def __init__(self, message):
49 | self.message = message
50 |
51 |
52 | class HookMissing(Exception):
53 | """Raised if a hook is missing and we are not executing the fallback"""
54 | def __init__(self, hook_name=None):
55 | super().__init__(hook_name)
56 | self.hook_name = hook_name
57 |
58 |
59 | def contained_in(filename, directory):
60 | """Test if a file is located within the given directory."""
61 | filename = os.path.normcase(os.path.abspath(filename))
62 | directory = os.path.normcase(os.path.abspath(directory))
63 | return os.path.commonprefix([filename, directory]) == directory
64 |
65 |
66 | def _build_backend():
67 | """Find and load the build backend"""
68 | # Add in-tree backend directories to the front of sys.path.
69 | backend_path = os.environ.get('PEP517_BACKEND_PATH')
70 | if backend_path:
71 | extra_pathitems = backend_path.split(os.pathsep)
72 | sys.path[:0] = extra_pathitems
73 |
74 | ep = os.environ['PEP517_BUILD_BACKEND']
75 | mod_path, _, obj_path = ep.partition(':')
76 | try:
77 | obj = import_module(mod_path)
78 | except ImportError:
79 | raise BackendUnavailable(traceback.format_exc())
80 |
81 | if backend_path:
82 | if not any(
83 | contained_in(obj.__file__, path)
84 | for path in extra_pathitems
85 | ):
86 | raise BackendInvalid("Backend was not loaded from backend-path")
87 |
88 | if obj_path:
89 | for path_part in obj_path.split('.'):
90 | obj = getattr(obj, path_part)
91 | return obj
92 |
93 |
94 | def _supported_features():
95 | """Return the list of options features supported by the backend.
96 |
97 | Returns a list of strings.
98 | The only possible value is 'build_editable'.
99 | """
100 | backend = _build_backend()
101 | features = []
102 | if hasattr(backend, "build_editable"):
103 | features.append("build_editable")
104 | return features
105 |
106 |
107 | def get_requires_for_build_wheel(config_settings):
108 | """Invoke the optional get_requires_for_build_wheel hook
109 |
110 | Returns [] if the hook is not defined.
111 | """
112 | backend = _build_backend()
113 | try:
114 | hook = backend.get_requires_for_build_wheel
115 | except AttributeError:
116 | return []
117 | else:
118 | return hook(config_settings)
119 |
120 |
121 | def get_requires_for_build_editable(config_settings):
122 | """Invoke the optional get_requires_for_build_editable hook
123 |
124 | Returns [] if the hook is not defined.
125 | """
126 | backend = _build_backend()
127 | try:
128 | hook = backend.get_requires_for_build_editable
129 | except AttributeError:
130 | return []
131 | else:
132 | return hook(config_settings)
133 |
134 |
135 | def prepare_metadata_for_build_wheel(
136 | metadata_directory, config_settings, _allow_fallback):
137 | """Invoke optional prepare_metadata_for_build_wheel
138 |
139 | Implements a fallback by building a wheel if the hook isn't defined,
140 | unless _allow_fallback is False in which case HookMissing is raised.
141 | """
142 | backend = _build_backend()
143 | try:
144 | hook = backend.prepare_metadata_for_build_wheel
145 | except AttributeError:
146 | if not _allow_fallback:
147 | raise HookMissing()
148 | else:
149 | return hook(metadata_directory, config_settings)
150 | # fallback to build_wheel outside the try block to avoid exception chaining
151 | # which can be confusing to users and is not relevant
152 | whl_basename = backend.build_wheel(metadata_directory, config_settings)
153 | return _get_wheel_metadata_from_wheel(whl_basename, metadata_directory,
154 | config_settings)
155 |
156 |
157 | def prepare_metadata_for_build_editable(
158 | metadata_directory, config_settings, _allow_fallback):
159 | """Invoke optional prepare_metadata_for_build_editable
160 |
161 | Implements a fallback by building an editable wheel if the hook isn't
162 | defined, unless _allow_fallback is False in which case HookMissing is
163 | raised.
164 | """
165 | backend = _build_backend()
166 | try:
167 | hook = backend.prepare_metadata_for_build_editable
168 | except AttributeError:
169 | if not _allow_fallback:
170 | raise HookMissing()
171 | try:
172 | build_hook = backend.build_editable
173 | except AttributeError:
174 | raise HookMissing(hook_name='build_editable')
175 | else:
176 | whl_basename = build_hook(metadata_directory, config_settings)
177 | return _get_wheel_metadata_from_wheel(whl_basename,
178 | metadata_directory,
179 | config_settings)
180 | else:
181 | return hook(metadata_directory, config_settings)
182 |
183 |
184 | WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL'
185 |
186 |
187 | def _dist_info_files(whl_zip):
188 | """Identify the .dist-info folder inside a wheel ZipFile."""
189 | res = []
190 | for path in whl_zip.namelist():
191 | m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path)
192 | if m:
193 | res.append(path)
194 | if res:
195 | return res
196 | raise Exception("No .dist-info folder found in wheel")
197 |
198 |
199 | def _get_wheel_metadata_from_wheel(
200 | whl_basename, metadata_directory, config_settings):
201 | """Extract the metadata from a wheel.
202 |
203 | Fallback for when the build backend does not
204 | define the 'get_wheel_metadata' hook.
205 | """
206 | from zipfile import ZipFile
207 | with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'):
208 | pass # Touch marker file
209 |
210 | whl_file = os.path.join(metadata_directory, whl_basename)
211 | with ZipFile(whl_file) as zipf:
212 | dist_info = _dist_info_files(zipf)
213 | zipf.extractall(path=metadata_directory, members=dist_info)
214 | return dist_info[0].split('/')[0]
215 |
216 |
217 | def _find_already_built_wheel(metadata_directory):
218 | """Check for a wheel already built during the get_wheel_metadata hook.
219 | """
220 | if not metadata_directory:
221 | return None
222 | metadata_parent = os.path.dirname(metadata_directory)
223 | if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)):
224 | return None
225 |
226 | whl_files = glob(os.path.join(metadata_parent, '*.whl'))
227 | if not whl_files:
228 | print('Found wheel built marker, but no .whl files')
229 | return None
230 | if len(whl_files) > 1:
231 | print('Found multiple .whl files; unspecified behaviour. '
232 | 'Will call build_wheel.')
233 | return None
234 |
235 | # Exactly one .whl file
236 | return whl_files[0]
237 |
238 |
239 | def build_wheel(wheel_directory, config_settings, metadata_directory=None):
240 | """Invoke the mandatory build_wheel hook.
241 |
242 | If a wheel was already built in the
243 | prepare_metadata_for_build_wheel fallback, this
244 | will copy it rather than rebuilding the wheel.
245 | """
246 | prebuilt_whl = _find_already_built_wheel(metadata_directory)
247 | if prebuilt_whl:
248 | shutil.copy2(prebuilt_whl, wheel_directory)
249 | return os.path.basename(prebuilt_whl)
250 |
251 | return _build_backend().build_wheel(wheel_directory, config_settings,
252 | metadata_directory)
253 |
254 |
255 | def build_editable(wheel_directory, config_settings, metadata_directory=None):
256 | """Invoke the optional build_editable hook.
257 |
258 | If a wheel was already built in the
259 | prepare_metadata_for_build_editable fallback, this
260 | will copy it rather than rebuilding the wheel.
261 | """
262 | backend = _build_backend()
263 | try:
264 | hook = backend.build_editable
265 | except AttributeError:
266 | raise HookMissing()
267 | else:
268 | prebuilt_whl = _find_already_built_wheel(metadata_directory)
269 | if prebuilt_whl:
270 | shutil.copy2(prebuilt_whl, wheel_directory)
271 | return os.path.basename(prebuilt_whl)
272 |
273 | return hook(wheel_directory, config_settings, metadata_directory)
274 |
275 |
276 | def get_requires_for_build_sdist(config_settings):
277 | """Invoke the optional get_requires_for_build_wheel hook
278 |
279 | Returns [] if the hook is not defined.
280 | """
281 | backend = _build_backend()
282 | try:
283 | hook = backend.get_requires_for_build_sdist
284 | except AttributeError:
285 | return []
286 | else:
287 | return hook(config_settings)
288 |
289 |
290 | class _DummyException(Exception):
291 | """Nothing should ever raise this exception"""
292 |
293 |
294 | class GotUnsupportedOperation(Exception):
295 | """For internal use when backend raises UnsupportedOperation"""
296 | def __init__(self, traceback):
297 | self.traceback = traceback
298 |
299 |
300 | def build_sdist(sdist_directory, config_settings):
301 | """Invoke the mandatory build_sdist hook."""
302 | backend = _build_backend()
303 | try:
304 | return backend.build_sdist(sdist_directory, config_settings)
305 | except getattr(backend, 'UnsupportedOperation', _DummyException):
306 | raise GotUnsupportedOperation(traceback.format_exc())
307 |
308 |
309 | HOOK_NAMES = {
310 | 'get_requires_for_build_wheel',
311 | 'prepare_metadata_for_build_wheel',
312 | 'build_wheel',
313 | 'get_requires_for_build_editable',
314 | 'prepare_metadata_for_build_editable',
315 | 'build_editable',
316 | 'get_requires_for_build_sdist',
317 | 'build_sdist',
318 | '_supported_features',
319 | }
320 |
321 |
322 | def main():
323 | if len(sys.argv) < 3:
324 | sys.exit("Needs args: hook_name, control_dir")
325 | hook_name = sys.argv[1]
326 | control_dir = sys.argv[2]
327 | if hook_name not in HOOK_NAMES:
328 | sys.exit("Unknown hook: %s" % hook_name)
329 | hook = globals()[hook_name]
330 |
331 | hook_input = read_json(pjoin(control_dir, 'input.json'))
332 |
333 | json_out = {'unsupported': False, 'return_val': None}
334 | try:
335 | json_out['return_val'] = hook(**hook_input['kwargs'])
336 | except BackendUnavailable as e:
337 | json_out['no_backend'] = True
338 | json_out['traceback'] = e.traceback
339 | except BackendInvalid as e:
340 | json_out['backend_invalid'] = True
341 | json_out['backend_error'] = e.message
342 | except GotUnsupportedOperation as e:
343 | json_out['unsupported'] = True
344 | json_out['traceback'] = e.traceback
345 | except HookMissing as e:
346 | json_out['hook_missing'] = True
347 | json_out['missing_hook_name'] = e.hook_name or hook_name
348 |
349 | write_json(json_out, pjoin(control_dir, 'output.json'), indent=2)
350 |
351 |
352 | if __name__ == '__main__':
353 | main()
354 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | This module provides a pool manager that uses Google App Engine's
3 | `URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_.
4 |
5 | Example usage::
6 |
7 | from pip._vendor.urllib3 import PoolManager
8 | from pip._vendor.urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox
9 |
10 | if is_appengine_sandbox():
11 | # AppEngineManager uses AppEngine's URLFetch API behind the scenes
12 | http = AppEngineManager()
13 | else:
14 | # PoolManager uses a socket-level API behind the scenes
15 | http = PoolManager()
16 |
17 | r = http.request('GET', 'https://google.com/')
18 |
19 | There are `limitations <https://cloud.google.com/appengine/docs/python/\
20 | urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be
21 | the best choice for your application. There are three options for using
22 | urllib3 on Google App Engine:
23 |
24 | 1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is
25 | cost-effective in many circumstances as long as your usage is within the
26 | limitations.
27 | 2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets.
28 | Sockets also have `limitations and restrictions
29 | <https://cloud.google.com/appengine/docs/python/sockets/\
30 | #limitations-and-restrictions>`_ and have a lower free quota than URLFetch.
31 | To use sockets, be sure to specify the following in your ``app.yaml``::
32 |
33 | env_variables:
34 | GAE_USE_SOCKETS_HTTPLIB : 'true'
35 |
36 | 3. If you are using `App Engine Flexible
37 | <https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard
38 | :class:`PoolManager` without any configuration or special environment variables.
39 | """
40 |
41 | from __future__ import absolute_import
42 |
43 | import io
44 | import logging
45 | import warnings
46 |
47 | from ..exceptions import (
48 | HTTPError,
49 | HTTPWarning,
50 | MaxRetryError,
51 | ProtocolError,
52 | SSLError,
53 | TimeoutError,
54 | )
55 | from ..packages.six.moves.urllib.parse import urljoin
56 | from ..request import RequestMethods
57 | from ..response import HTTPResponse
58 | from ..util.retry import Retry
59 | from ..util.timeout import Timeout
60 | from . import _appengine_environ
61 |
62 | try:
63 | from google.appengine.api import urlfetch
64 | except ImportError:
65 | urlfetch = None
66 |
67 |
68 | log = logging.getLogger(__name__)
69 |
70 |
71 | class AppEnginePlatformWarning(HTTPWarning):
72 | pass
73 |
74 |
75 | class AppEnginePlatformError(HTTPError):
76 | pass
77 |
78 |
79 | class AppEngineManager(RequestMethods):
80 | """
81 | Connection manager for Google App Engine sandbox applications.
82 |
83 | This manager uses the URLFetch service directly instead of using the
84 | emulated httplib, and is subject to URLFetch limitations as described in
85 | the App Engine documentation `here
86 | <https://cloud.google.com/appengine/docs/python/urlfetch>`_.
87 |
88 | Notably it will raise an :class:`AppEnginePlatformError` if:
89 | * URLFetch is not available.
90 | * If you attempt to use this on App Engine Flexible, as full socket
91 | support is available.
92 | * If a request size is more than 10 megabytes.
93 | * If a response size is more than 32 megabytes.
94 | * If you use an unsupported request method such as OPTIONS.
95 |
96 | Beyond those cases, it will raise normal urllib3 errors.
97 | """
98 |
99 | def __init__(
100 | self,
101 | headers=None,
102 | retries=None,
103 | validate_certificate=True,
104 | urlfetch_retries=True,
105 | ):
106 | if not urlfetch:
107 | raise AppEnginePlatformError(
108 | "URLFetch is not available in this environment."
109 | )
110 |
111 | warnings.warn(
112 | "urllib3 is using URLFetch on Google App Engine sandbox instead "
113 | "of sockets. To use sockets directly instead of URLFetch see "
114 | "https://urllib3.readthedocs.io/en/1.26.x/reference/urllib3.contrib.html.",
115 | AppEnginePlatformWarning,
116 | )
117 |
118 | RequestMethods.__init__(self, headers)
119 | self.validate_certificate = validate_certificate
120 | self.urlfetch_retries = urlfetch_retries
121 |
122 | self.retries = retries or Retry.DEFAULT
123 |
124 | def __enter__(self):
125 | return self
126 |
127 | def __exit__(self, exc_type, exc_val, exc_tb):
128 | # Return False to re-raise any potential exceptions
129 | return False
130 |
131 | def urlopen(
132 | self,
133 | method,
134 | url,
135 | body=None,
136 | headers=None,
137 | retries=None,
138 | redirect=True,
139 | timeout=Timeout.DEFAULT_TIMEOUT,
140 | **response_kw
141 | ):
142 |
143 | retries = self._get_retries(retries, redirect)
144 |
145 | try:
146 | follow_redirects = redirect and retries.redirect != 0 and retries.total
147 | response = urlfetch.fetch(
148 | url,
149 | payload=body,
150 | method=method,
151 | headers=headers or {},
152 | allow_truncated=False,
153 | follow_redirects=self.urlfetch_retries and follow_redirects,
154 | deadline=self._get_absolute_timeout(timeout),
155 | validate_certificate=self.validate_certificate,
156 | )
157 | except urlfetch.DeadlineExceededError as e:
158 | raise TimeoutError(self, e)
159 |
160 | except urlfetch.InvalidURLError as e:
161 | if "too large" in str(e):
162 | raise AppEnginePlatformError(
163 | "URLFetch request too large, URLFetch only "
164 | "supports requests up to 10mb in size.",
165 | e,
166 | )
167 | raise ProtocolError(e)
168 |
169 | except urlfetch.DownloadError as e:
170 | if "Too many redirects" in str(e):
171 | raise MaxRetryError(self, url, reason=e)
172 | raise ProtocolError(e)
173 |
174 | except urlfetch.ResponseTooLargeError as e:
175 | raise AppEnginePlatformError(
176 | "URLFetch response too large, URLFetch only supports"
177 | "responses up to 32mb in size.",
178 | e,
179 | )
180 |
181 | except urlfetch.SSLCertificateError as e:
182 | raise SSLError(e)
183 |
184 | except urlfetch.InvalidMethodError as e:
185 | raise AppEnginePlatformError(
186 | "URLFetch does not support method: %s" % method, e
187 | )
188 |
189 | http_response = self._urlfetch_response_to_http_response(
190 | response, retries=retries, **response_kw
191 | )
192 |
193 | # Handle redirect?
194 | redirect_location = redirect and http_response.get_redirect_location()
195 | if redirect_location:
196 | # Check for redirect response
197 | if self.urlfetch_retries and retries.raise_on_redirect:
198 | raise MaxRetryError(self, url, "too many redirects")
199 | else:
200 | if http_response.status == 303:
201 | method = "GET"
202 |
203 | try:
204 | retries = retries.increment(
205 | method, url, response=http_response, _pool=self
206 | )
207 | except MaxRetryError:
208 | if retries.raise_on_redirect:
209 | raise MaxRetryError(self, url, "too many redirects")
210 | return http_response
211 |
212 | retries.sleep_for_retry(http_response)
213 | log.debug("Redirecting %s -> %s", url, redirect_location)
214 | redirect_url = urljoin(url, redirect_location)
215 | return self.urlopen(
216 | method,
217 | redirect_url,
218 | body,
219 | headers,
220 | retries=retries,
221 | redirect=redirect,
222 | timeout=timeout,
223 | **response_kw
224 | )
225 |
226 | # Check if we should retry the HTTP response.
227 | has_retry_after = bool(http_response.headers.get("Retry-After"))
228 | if retries.is_retry(method, http_response.status, has_retry_after):
229 | retries = retries.increment(method, url, response=http_response, _pool=self)
230 | log.debug("Retry: %s", url)
231 | retries.sleep(http_response)
232 | return self.urlopen(
233 | method,
234 | url,
235 | body=body,
236 | headers=headers,
237 | retries=retries,
238 | redirect=redirect,
239 | timeout=timeout,
240 | **response_kw
241 | )
242 |
243 | return http_response
244 |
245 | def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw):
246 |
247 | if is_prod_appengine():
248 | # Production GAE handles deflate encoding automatically, but does
249 | # not remove the encoding header.
250 | content_encoding = urlfetch_resp.headers.get("content-encoding")
251 |
252 | if content_encoding == "deflate":
253 | del urlfetch_resp.headers["content-encoding"]
254 |
255 | transfer_encoding = urlfetch_resp.headers.get("transfer-encoding")
256 | # We have a full response's content,
257 | # so let's make sure we don't report ourselves as chunked data.
258 | if transfer_encoding == "chunked":
259 | encodings = transfer_encoding.split(",")
260 | encodings.remove("chunked")
261 | urlfetch_resp.headers["transfer-encoding"] = ",".join(encodings)
262 |
263 | original_response = HTTPResponse(
264 | # In order for decoding to work, we must present the content as
265 | # a file-like object.
266 | body=io.BytesIO(urlfetch_resp.content),
267 | msg=urlfetch_resp.header_msg,
268 | headers=urlfetch_resp.headers,
269 | status=urlfetch_resp.status_code,
270 | **response_kw
271 | )
272 |
273 | return HTTPResponse(
274 | body=io.BytesIO(urlfetch_resp.content),
275 | headers=urlfetch_resp.headers,
276 | status=urlfetch_resp.status_code,
277 | original_response=original_response,
278 | **response_kw
279 | )
280 |
281 | def _get_absolute_timeout(self, timeout):
282 | if timeout is Timeout.DEFAULT_TIMEOUT:
283 | return None # Defer to URLFetch's default.
284 | if isinstance(timeout, Timeout):
285 | if timeout._read is not None or timeout._connect is not None:
286 | warnings.warn(
287 | "URLFetch does not support granular timeout settings, "
288 | "reverting to total or default URLFetch timeout.",
289 | AppEnginePlatformWarning,
290 | )
291 | return timeout.total
292 | return timeout
293 |
294 | def _get_retries(self, retries, redirect):
295 | if not isinstance(retries, Retry):
296 | retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
297 |
298 | if retries.connect or retries.read or retries.redirect:
299 | warnings.warn(
300 | "URLFetch only supports total retries and does not "
301 | "recognize connect, read, or redirect retry parameters.",
302 | AppEnginePlatformWarning,
303 | )
304 |
305 | return retries
306 |
307 |
308 | # Alias methods from _appengine_environ to maintain public API interface.
309 |
310 | is_appengine = _appengine_environ.is_appengine
311 | is_appengine_sandbox = _appengine_environ.is_appengine_sandbox
312 | is_local_appengine = _appengine_environ.is_local_appengine
313 | is_prod_appengine = _appengine_environ.is_prod_appengine
314 | is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms
315 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py:
--------------------------------------------------------------------------------
```python
1 | from typing import Any, Generic, List, Optional, TextIO, TypeVar, Union, overload
2 |
3 | from . import get_console
4 | from .console import Console
5 | from .text import Text, TextType
6 |
7 | PromptType = TypeVar("PromptType")
8 | DefaultType = TypeVar("DefaultType")
9 |
10 |
11 | class PromptError(Exception):
12 | """Exception base class for prompt related errors."""
13 |
14 |
15 | class InvalidResponse(PromptError):
16 | """Exception to indicate a response was invalid. Raise this within process_response() to indicate an error
17 | and provide an error message.
18 |
19 | Args:
20 | message (Union[str, Text]): Error message.
21 | """
22 |
23 | def __init__(self, message: TextType) -> None:
24 | self.message = message
25 |
26 | def __rich__(self) -> TextType:
27 | return self.message
28 |
29 |
30 | class PromptBase(Generic[PromptType]):
31 | """Ask the user for input until a valid response is received. This is the base class, see one of
32 | the concrete classes for examples.
33 |
34 | Args:
35 | prompt (TextType, optional): Prompt text. Defaults to "".
36 | console (Console, optional): A Console instance or None to use global console. Defaults to None.
37 | password (bool, optional): Enable password input. Defaults to False.
38 | choices (List[str], optional): A list of valid choices. Defaults to None.
39 | show_default (bool, optional): Show default in prompt. Defaults to True.
40 | show_choices (bool, optional): Show choices in prompt. Defaults to True.
41 | """
42 |
43 | response_type: type = str
44 |
45 | validate_error_message = "[prompt.invalid]Please enter a valid value"
46 | illegal_choice_message = (
47 | "[prompt.invalid.choice]Please select one of the available options"
48 | )
49 | prompt_suffix = ": "
50 |
51 | choices: Optional[List[str]] = None
52 |
53 | def __init__(
54 | self,
55 | prompt: TextType = "",
56 | *,
57 | console: Optional[Console] = None,
58 | password: bool = False,
59 | choices: Optional[List[str]] = None,
60 | show_default: bool = True,
61 | show_choices: bool = True,
62 | ) -> None:
63 | self.console = console or get_console()
64 | self.prompt = (
65 | Text.from_markup(prompt, style="prompt")
66 | if isinstance(prompt, str)
67 | else prompt
68 | )
69 | self.password = password
70 | if choices is not None:
71 | self.choices = choices
72 | self.show_default = show_default
73 | self.show_choices = show_choices
74 |
75 | @classmethod
76 | @overload
77 | def ask(
78 | cls,
79 | prompt: TextType = "",
80 | *,
81 | console: Optional[Console] = None,
82 | password: bool = False,
83 | choices: Optional[List[str]] = None,
84 | show_default: bool = True,
85 | show_choices: bool = True,
86 | default: DefaultType,
87 | stream: Optional[TextIO] = None,
88 | ) -> Union[DefaultType, PromptType]:
89 | ...
90 |
91 | @classmethod
92 | @overload
93 | def ask(
94 | cls,
95 | prompt: TextType = "",
96 | *,
97 | console: Optional[Console] = None,
98 | password: bool = False,
99 | choices: Optional[List[str]] = None,
100 | show_default: bool = True,
101 | show_choices: bool = True,
102 | stream: Optional[TextIO] = None,
103 | ) -> PromptType:
104 | ...
105 |
106 | @classmethod
107 | def ask(
108 | cls,
109 | prompt: TextType = "",
110 | *,
111 | console: Optional[Console] = None,
112 | password: bool = False,
113 | choices: Optional[List[str]] = None,
114 | show_default: bool = True,
115 | show_choices: bool = True,
116 | default: Any = ...,
117 | stream: Optional[TextIO] = None,
118 | ) -> Any:
119 | """Shortcut to construct and run a prompt loop and return the result.
120 |
121 | Example:
122 | >>> filename = Prompt.ask("Enter a filename")
123 |
124 | Args:
125 | prompt (TextType, optional): Prompt text. Defaults to "".
126 | console (Console, optional): A Console instance or None to use global console. Defaults to None.
127 | password (bool, optional): Enable password input. Defaults to False.
128 | choices (List[str], optional): A list of valid choices. Defaults to None.
129 | show_default (bool, optional): Show default in prompt. Defaults to True.
130 | show_choices (bool, optional): Show choices in prompt. Defaults to True.
131 | stream (TextIO, optional): Optional text file open for reading to get input. Defaults to None.
132 | """
133 | _prompt = cls(
134 | prompt,
135 | console=console,
136 | password=password,
137 | choices=choices,
138 | show_default=show_default,
139 | show_choices=show_choices,
140 | )
141 | return _prompt(default=default, stream=stream)
142 |
143 | def render_default(self, default: DefaultType) -> Text:
144 | """Turn the supplied default in to a Text instance.
145 |
146 | Args:
147 | default (DefaultType): Default value.
148 |
149 | Returns:
150 | Text: Text containing rendering of default value.
151 | """
152 | return Text(f"({default})", "prompt.default")
153 |
154 | def make_prompt(self, default: DefaultType) -> Text:
155 | """Make prompt text.
156 |
157 | Args:
158 | default (DefaultType): Default value.
159 |
160 | Returns:
161 | Text: Text to display in prompt.
162 | """
163 | prompt = self.prompt.copy()
164 | prompt.end = ""
165 |
166 | if self.show_choices and self.choices:
167 | _choices = "/".join(self.choices)
168 | choices = f"[{_choices}]"
169 | prompt.append(" ")
170 | prompt.append(choices, "prompt.choices")
171 |
172 | if (
173 | default != ...
174 | and self.show_default
175 | and isinstance(default, (str, self.response_type))
176 | ):
177 | prompt.append(" ")
178 | _default = self.render_default(default)
179 | prompt.append(_default)
180 |
181 | prompt.append(self.prompt_suffix)
182 |
183 | return prompt
184 |
185 | @classmethod
186 | def get_input(
187 | cls,
188 | console: Console,
189 | prompt: TextType,
190 | password: bool,
191 | stream: Optional[TextIO] = None,
192 | ) -> str:
193 | """Get input from user.
194 |
195 | Args:
196 | console (Console): Console instance.
197 | prompt (TextType): Prompt text.
198 | password (bool): Enable password entry.
199 |
200 | Returns:
201 | str: String from user.
202 | """
203 | return console.input(prompt, password=password, stream=stream)
204 |
205 | def check_choice(self, value: str) -> bool:
206 | """Check value is in the list of valid choices.
207 |
208 | Args:
209 | value (str): Value entered by user.
210 |
211 | Returns:
212 | bool: True if choice was valid, otherwise False.
213 | """
214 | assert self.choices is not None
215 | return value.strip() in self.choices
216 |
217 | def process_response(self, value: str) -> PromptType:
218 | """Process response from user, convert to prompt type.
219 |
220 | Args:
221 | value (str): String typed by user.
222 |
223 | Raises:
224 | InvalidResponse: If ``value`` is invalid.
225 |
226 | Returns:
227 | PromptType: The value to be returned from ask method.
228 | """
229 | value = value.strip()
230 | try:
231 | return_value: PromptType = self.response_type(value)
232 | except ValueError:
233 | raise InvalidResponse(self.validate_error_message)
234 |
235 | if self.choices is not None and not self.check_choice(value):
236 | raise InvalidResponse(self.illegal_choice_message)
237 |
238 | return return_value
239 |
240 | def on_validate_error(self, value: str, error: InvalidResponse) -> None:
241 | """Called to handle validation error.
242 |
243 | Args:
244 | value (str): String entered by user.
245 | error (InvalidResponse): Exception instance the initiated the error.
246 | """
247 | self.console.print(error)
248 |
249 | def pre_prompt(self) -> None:
250 | """Hook to display something before the prompt."""
251 |
252 | @overload
253 | def __call__(self, *, stream: Optional[TextIO] = None) -> PromptType:
254 | ...
255 |
256 | @overload
257 | def __call__(
258 | self, *, default: DefaultType, stream: Optional[TextIO] = None
259 | ) -> Union[PromptType, DefaultType]:
260 | ...
261 |
262 | def __call__(self, *, default: Any = ..., stream: Optional[TextIO] = None) -> Any:
263 | """Run the prompt loop.
264 |
265 | Args:
266 | default (Any, optional): Optional default value.
267 |
268 | Returns:
269 | PromptType: Processed value.
270 | """
271 | while True:
272 | self.pre_prompt()
273 | prompt = self.make_prompt(default)
274 | value = self.get_input(self.console, prompt, self.password, stream=stream)
275 | if value == "" and default != ...:
276 | return default
277 | try:
278 | return_value = self.process_response(value)
279 | except InvalidResponse as error:
280 | self.on_validate_error(value, error)
281 | continue
282 | else:
283 | return return_value
284 |
285 |
286 | class Prompt(PromptBase[str]):
287 | """A prompt that returns a str.
288 |
289 | Example:
290 | >>> name = Prompt.ask("Enter your name")
291 |
292 |
293 | """
294 |
295 | response_type = str
296 |
297 |
298 | class IntPrompt(PromptBase[int]):
299 | """A prompt that returns an integer.
300 |
301 | Example:
302 | >>> burrito_count = IntPrompt.ask("How many burritos do you want to order")
303 |
304 | """
305 |
306 | response_type = int
307 | validate_error_message = "[prompt.invalid]Please enter a valid integer number"
308 |
309 |
310 | class FloatPrompt(PromptBase[float]):
311 | """A prompt that returns a float.
312 |
313 | Example:
314 | >>> temperature = FloatPrompt.ask("Enter desired temperature")
315 |
316 | """
317 |
318 | response_type = float
319 | validate_error_message = "[prompt.invalid]Please enter a number"
320 |
321 |
322 | class Confirm(PromptBase[bool]):
323 | """A yes / no confirmation prompt.
324 |
325 | Example:
326 | >>> if Confirm.ask("Continue"):
327 | run_job()
328 |
329 | """
330 |
331 | response_type = bool
332 | validate_error_message = "[prompt.invalid]Please enter Y or N"
333 | choices: List[str] = ["y", "n"]
334 |
335 | def render_default(self, default: DefaultType) -> Text:
336 | """Render the default as (y) or (n) rather than True/False."""
337 | yes, no = self.choices
338 | return Text(f"({yes})" if default else f"({no})", style="prompt.default")
339 |
340 | def process_response(self, value: str) -> bool:
341 | """Convert choices to a bool."""
342 | value = value.strip().lower()
343 | if value not in self.choices:
344 | raise InvalidResponse(self.validate_error_message)
345 | return value == self.choices[0]
346 |
347 |
348 | if __name__ == "__main__": # pragma: no cover
349 | from pip._vendor.rich import print
350 |
351 | if Confirm.ask("Run [i]prompt[/i] tests?", default=True):
352 | while True:
353 | result = IntPrompt.ask(
354 | ":rocket: Enter a number between [b]1[/b] and [b]10[/b]", default=5
355 | )
356 | if result >= 1 and result <= 10:
357 | break
358 | print(":pile_of_poo: [prompt.invalid]Number must be between 1 and 10")
359 | print(f"number={result}")
360 |
361 | while True:
362 | password = Prompt.ask(
363 | "Please enter a password [cyan](must be at least 5 characters)",
364 | password=True,
365 | )
366 | if len(password) >= 5:
367 | break
368 | print("[prompt.invalid]password too short")
369 | print(f"password={password!r}")
370 |
371 | fruit = Prompt.ask("Enter a fruit", choices=["apple", "orange", "pear"])
372 | print(f"fruit={fruit!r}")
373 |
374 | else:
375 | print("[b]OK :loudly_crying_face:")
376 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import absolute_import
2 |
3 | try:
4 | from collections.abc import Mapping, MutableMapping
5 | except ImportError:
6 | from collections import Mapping, MutableMapping
7 | try:
8 | from threading import RLock
9 | except ImportError: # Platform-specific: No threads available
10 |
11 | class RLock:
12 | def __enter__(self):
13 | pass
14 |
15 | def __exit__(self, exc_type, exc_value, traceback):
16 | pass
17 |
18 |
19 | from collections import OrderedDict
20 |
21 | from .exceptions import InvalidHeader
22 | from .packages import six
23 | from .packages.six import iterkeys, itervalues
24 |
25 | __all__ = ["RecentlyUsedContainer", "HTTPHeaderDict"]
26 |
27 |
28 | _Null = object()
29 |
30 |
31 | class RecentlyUsedContainer(MutableMapping):
32 | """
33 | Provides a thread-safe dict-like container which maintains up to
34 | ``maxsize`` keys while throwing away the least-recently-used keys beyond
35 | ``maxsize``.
36 |
37 | :param maxsize:
38 | Maximum number of recent elements to retain.
39 |
40 | :param dispose_func:
41 | Every time an item is evicted from the container,
42 | ``dispose_func(value)`` is called. Callback which will get called
43 | """
44 |
45 | ContainerCls = OrderedDict
46 |
47 | def __init__(self, maxsize=10, dispose_func=None):
48 | self._maxsize = maxsize
49 | self.dispose_func = dispose_func
50 |
51 | self._container = self.ContainerCls()
52 | self.lock = RLock()
53 |
54 | def __getitem__(self, key):
55 | # Re-insert the item, moving it to the end of the eviction line.
56 | with self.lock:
57 | item = self._container.pop(key)
58 | self._container[key] = item
59 | return item
60 |
61 | def __setitem__(self, key, value):
62 | evicted_value = _Null
63 | with self.lock:
64 | # Possibly evict the existing value of 'key'
65 | evicted_value = self._container.get(key, _Null)
66 | self._container[key] = value
67 |
68 | # If we didn't evict an existing value, we might have to evict the
69 | # least recently used item from the beginning of the container.
70 | if len(self._container) > self._maxsize:
71 | _key, evicted_value = self._container.popitem(last=False)
72 |
73 | if self.dispose_func and evicted_value is not _Null:
74 | self.dispose_func(evicted_value)
75 |
76 | def __delitem__(self, key):
77 | with self.lock:
78 | value = self._container.pop(key)
79 |
80 | if self.dispose_func:
81 | self.dispose_func(value)
82 |
83 | def __len__(self):
84 | with self.lock:
85 | return len(self._container)
86 |
87 | def __iter__(self):
88 | raise NotImplementedError(
89 | "Iteration over this class is unlikely to be threadsafe."
90 | )
91 |
92 | def clear(self):
93 | with self.lock:
94 | # Copy pointers to all values, then wipe the mapping
95 | values = list(itervalues(self._container))
96 | self._container.clear()
97 |
98 | if self.dispose_func:
99 | for value in values:
100 | self.dispose_func(value)
101 |
102 | def keys(self):
103 | with self.lock:
104 | return list(iterkeys(self._container))
105 |
106 |
107 | class HTTPHeaderDict(MutableMapping):
108 | """
109 | :param headers:
110 | An iterable of field-value pairs. Must not contain multiple field names
111 | when compared case-insensitively.
112 |
113 | :param kwargs:
114 | Additional field-value pairs to pass in to ``dict.update``.
115 |
116 | A ``dict`` like container for storing HTTP Headers.
117 |
118 | Field names are stored and compared case-insensitively in compliance with
119 | RFC 7230. Iteration provides the first case-sensitive key seen for each
120 | case-insensitive pair.
121 |
122 | Using ``__setitem__`` syntax overwrites fields that compare equal
123 | case-insensitively in order to maintain ``dict``'s api. For fields that
124 | compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add``
125 | in a loop.
126 |
127 | If multiple fields that are equal case-insensitively are passed to the
128 | constructor or ``.update``, the behavior is undefined and some will be
129 | lost.
130 |
131 | >>> headers = HTTPHeaderDict()
132 | >>> headers.add('Set-Cookie', 'foo=bar')
133 | >>> headers.add('set-cookie', 'baz=quxx')
134 | >>> headers['content-length'] = '7'
135 | >>> headers['SET-cookie']
136 | 'foo=bar, baz=quxx'
137 | >>> headers['Content-Length']
138 | '7'
139 | """
140 |
141 | def __init__(self, headers=None, **kwargs):
142 | super(HTTPHeaderDict, self).__init__()
143 | self._container = OrderedDict()
144 | if headers is not None:
145 | if isinstance(headers, HTTPHeaderDict):
146 | self._copy_from(headers)
147 | else:
148 | self.extend(headers)
149 | if kwargs:
150 | self.extend(kwargs)
151 |
152 | def __setitem__(self, key, val):
153 | self._container[key.lower()] = [key, val]
154 | return self._container[key.lower()]
155 |
156 | def __getitem__(self, key):
157 | val = self._container[key.lower()]
158 | return ", ".join(val[1:])
159 |
160 | def __delitem__(self, key):
161 | del self._container[key.lower()]
162 |
163 | def __contains__(self, key):
164 | return key.lower() in self._container
165 |
166 | def __eq__(self, other):
167 | if not isinstance(other, Mapping) and not hasattr(other, "keys"):
168 | return False
169 | if not isinstance(other, type(self)):
170 | other = type(self)(other)
171 | return dict((k.lower(), v) for k, v in self.itermerged()) == dict(
172 | (k.lower(), v) for k, v in other.itermerged()
173 | )
174 |
175 | def __ne__(self, other):
176 | return not self.__eq__(other)
177 |
178 | if six.PY2: # Python 2
179 | iterkeys = MutableMapping.iterkeys
180 | itervalues = MutableMapping.itervalues
181 |
182 | __marker = object()
183 |
184 | def __len__(self):
185 | return len(self._container)
186 |
187 | def __iter__(self):
188 | # Only provide the originally cased names
189 | for vals in self._container.values():
190 | yield vals[0]
191 |
192 | def pop(self, key, default=__marker):
193 | """D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
194 | If key is not found, d is returned if given, otherwise KeyError is raised.
195 | """
196 | # Using the MutableMapping function directly fails due to the private marker.
197 | # Using ordinary dict.pop would expose the internal structures.
198 | # So let's reinvent the wheel.
199 | try:
200 | value = self[key]
201 | except KeyError:
202 | if default is self.__marker:
203 | raise
204 | return default
205 | else:
206 | del self[key]
207 | return value
208 |
209 | def discard(self, key):
210 | try:
211 | del self[key]
212 | except KeyError:
213 | pass
214 |
215 | def add(self, key, val):
216 | """Adds a (name, value) pair, doesn't overwrite the value if it already
217 | exists.
218 |
219 | >>> headers = HTTPHeaderDict(foo='bar')
220 | >>> headers.add('Foo', 'baz')
221 | >>> headers['foo']
222 | 'bar, baz'
223 | """
224 | key_lower = key.lower()
225 | new_vals = [key, val]
226 | # Keep the common case aka no item present as fast as possible
227 | vals = self._container.setdefault(key_lower, new_vals)
228 | if new_vals is not vals:
229 | vals.append(val)
230 |
231 | def extend(self, *args, **kwargs):
232 | """Generic import function for any type of header-like object.
233 | Adapted version of MutableMapping.update in order to insert items
234 | with self.add instead of self.__setitem__
235 | """
236 | if len(args) > 1:
237 | raise TypeError(
238 | "extend() takes at most 1 positional "
239 | "arguments ({0} given)".format(len(args))
240 | )
241 | other = args[0] if len(args) >= 1 else ()
242 |
243 | if isinstance(other, HTTPHeaderDict):
244 | for key, val in other.iteritems():
245 | self.add(key, val)
246 | elif isinstance(other, Mapping):
247 | for key in other:
248 | self.add(key, other[key])
249 | elif hasattr(other, "keys"):
250 | for key in other.keys():
251 | self.add(key, other[key])
252 | else:
253 | for key, value in other:
254 | self.add(key, value)
255 |
256 | for key, value in kwargs.items():
257 | self.add(key, value)
258 |
259 | def getlist(self, key, default=__marker):
260 | """Returns a list of all the values for the named field. Returns an
261 | empty list if the key doesn't exist."""
262 | try:
263 | vals = self._container[key.lower()]
264 | except KeyError:
265 | if default is self.__marker:
266 | return []
267 | return default
268 | else:
269 | return vals[1:]
270 |
271 | def _prepare_for_method_change(self):
272 | """
273 | Remove content-specific header fields before changing the request
274 | method to GET or HEAD according to RFC 9110, Section 15.4.
275 | """
276 | content_specific_headers = [
277 | "Content-Encoding",
278 | "Content-Language",
279 | "Content-Location",
280 | "Content-Type",
281 | "Content-Length",
282 | "Digest",
283 | "Last-Modified",
284 | ]
285 | for header in content_specific_headers:
286 | self.discard(header)
287 | return self
288 |
289 | # Backwards compatibility for httplib
290 | getheaders = getlist
291 | getallmatchingheaders = getlist
292 | iget = getlist
293 |
294 | # Backwards compatibility for http.cookiejar
295 | get_all = getlist
296 |
297 | def __repr__(self):
298 | return "%s(%s)" % (type(self).__name__, dict(self.itermerged()))
299 |
300 | def _copy_from(self, other):
301 | for key in other:
302 | val = other.getlist(key)
303 | if isinstance(val, list):
304 | # Don't need to convert tuples
305 | val = list(val)
306 | self._container[key.lower()] = [key] + val
307 |
308 | def copy(self):
309 | clone = type(self)()
310 | clone._copy_from(self)
311 | return clone
312 |
313 | def iteritems(self):
314 | """Iterate over all header lines, including duplicate ones."""
315 | for key in self:
316 | vals = self._container[key.lower()]
317 | for val in vals[1:]:
318 | yield vals[0], val
319 |
320 | def itermerged(self):
321 | """Iterate over all headers, merging duplicate ones together."""
322 | for key in self:
323 | val = self._container[key.lower()]
324 | yield val[0], ", ".join(val[1:])
325 |
326 | def items(self):
327 | return list(self.iteritems())
328 |
329 | @classmethod
330 | def from_httplib(cls, message): # Python 2
331 | """Read headers from a Python 2 httplib message object."""
332 | # python2.7 does not expose a proper API for exporting multiheaders
333 | # efficiently. This function re-reads raw lines from the message
334 | # object and extracts the multiheaders properly.
335 | obs_fold_continued_leaders = (" ", "\t")
336 | headers = []
337 |
338 | for line in message.headers:
339 | if line.startswith(obs_fold_continued_leaders):
340 | if not headers:
341 | # We received a header line that starts with OWS as described
342 | # in RFC-7230 S3.2.4. This indicates a multiline header, but
343 | # there exists no previous header to which we can attach it.
344 | raise InvalidHeader(
345 | "Header continuation with no previous header: %s" % line
346 | )
347 | else:
348 | key, value = headers[-1]
349 | headers[-1] = (key, value + " " + line.strip())
350 | continue
351 |
352 | key, value = line.split(":", 1)
353 | headers.append((key, value.strip()))
354 |
355 | return cls(headers)
356 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/useragent/test/test_os.json:
--------------------------------------------------------------------------------
```json
1 | {"test_cases": [{"major": null, "family": "Linux", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Linux x86_64) AppleWebKit/534.26+ WebKitGTK+/1.4.1 luakit/f3a2dbe", "minor": null, "patch": null}, {"major": null, "family": "Linux", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (X11; Linux x86_64; rv:2.0) Gecko/20110408 conkeror/0.9.3", "minor": null, "patch": null}, {"major": "0", "family": "Debian", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20110302 Conkeror/0.9.2 (Debian-0.9.2+git100804-1)", "minor": "9", "patch": "2"}, {"major": null, "family": "Windows XP", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.17) Gecko/20110414 Lightning/1.0b3pre Thunderbird/3.1.10", "minor": null, "patch": null}, {"major": null, "family": "Windows 7", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.17) Gecko/20110414 Thunderbird/3.1.10 ThunderBrowse/3.3.5", "minor": null, "patch": null}, {"major": null, "family": "Windows", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Windows; U; en-US) AppleWebKit/531.9 (KHTML, like Gecko) AdobeAIR/2.5.1", "minor": null, "patch": null}, {"major": null, "family": "Other", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)", "minor": null, "patch": null}, {"major": null, "family": "Other", "patch_minor": null, "user_agent_string": "Mozilla/5.0 YottaaMonitor;", "minor": null, "patch": null}, {"major": null, "family": "Windows XP", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) RockMelt/0.8.34.841 Chrome/6.0.472.63 Safari/534.3", "minor": null, "patch": null}, {"major": null, "family": "Linux", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (X11; Linux x86_64; rv:2.0) Gecko/20110417 IceCat/4.0", "minor": null, "patch": null}, {"major": null, "family": "WeTab", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (X11; U; Linux i686; nl-NL) AppleWebKit/534.3 (KHTML, like Gecko) WeTab-Browser Safari/534.3", "minor": null, "patch": null}, {"major": "1", "family": "Kindle", "patch_minor": null, "user_agent_string": "Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)", "minor": "0", "patch": null}, {"major": "3", "family": "Android", "patch_minor": null, "user_agent_string": "Opera/9.80 (Android 3.2; Linux; Opera Tablet/ADR-1106291546; U; en) Presto/2.8.149 Version/11.10", "minor": "2", "patch": null}, {"major": null, "family": "Windows 7", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) FireWeb/1.0.0.0", "minor": null, "patch": null}, {"major": null, "family": "Windows XP", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Comodo_Dragon/4.1.1.11 Chrome/4.1.249.1042 Safari/532.5", "minor": null, "patch": null}, {"major": "4", "family": "iOS", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5", "minor": "3", "patch": "2"}, {"major": "3", "family": "Android", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; GT-P7510 Build/HRI83) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13", "minor": "0", "patch": "1"}, {"major": "3", "family": "webOS", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.58 Safari/534.6 TouchPad/1.0", "minor": "0", "patch": "0"}, {"major": "7", "family": "Windows Phone OS", "patch_minor": null, "user_agent_string": "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; SAMSUNG; SGH-i917)", "minor": "0", "patch": null}, {"major": "10", "family": "Mac OS X", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17 Skyfire/2.0", "minor": "5", "patch": "7"}, {"major": "1", "family": "BlackBerry Tablet OS", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/0.0.1 Safari/534.8+", "minor": "0", "patch": "0"}, {"major": "10", "family": "Ubuntu", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16", "minor": "10", "patch": null}, {"major": null, "family": "Windows XP", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20110407 Firefox/4.0.3 PaleMoon/4.0.3", "minor": null, "patch": null}, {"major": null, "family": "Symbian OS", "patch_minor": null, "user_agent_string": "Opera/9.80 (Series 60; Opera Mini/6.24455/25.677; U; fr) Presto/2.5.25 Version/10.54", "minor": null, "patch": null}, {"major": null, "family": "Linux", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (X11; Linux i686 (x86_64); rv:2.0b4) Gecko/20100818 Firefox/4.0b4", "minor": null, "patch": null}, {"major": "10", "family": "Ubuntu", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.04 (lucid) Firefox/3.6.12", "minor": "04", "patch": null}, {"major": "9", "family": "Ubuntu", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.1pre) Gecko/20090717 Ubuntu/9.04 (jaunty) Shiretoko/3.5.1pre", "minor": "04", "patch": null}, {"major": null, "family": "Linux", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (X11; Linux x86_64; rv:2.0b8pre) Gecko/20101031 Firefox-4.0/4.0b8pre", "minor": null, "patch": null}, {"major": null, "family": "BSD", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (X11; U; BSD Four; en-US) AppleWebKit/533.3 (KHTML, like Gecko) rekonq Safari/533.3", "minor": null, "patch": null}, {"major": null, "family": "Linux", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (X11; U; Linux; de-DE) AppleWebKit/527 (KHTML, like Gecko, Safari/419.3) konqueror/4.3.1", "minor": null, "patch": null}, {"major": null, "family": "Other", "patch_minor": null, "user_agent_string": "SomethingWeNeverKnewExisted", "minor": null, "patch": null}, {"major": null, "family": "Linux", "patch_minor": null, "user_agent_string": "Midori/0.2 (X11; Linux; U; en-us) WebKit/531.2 ", "minor": null, "patch": null}, {"major": null, "family": "Windows 7", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a1) Gecko/20100208 MozillaDeveloperPreview/3.7a1 (.NET CLR 3.5.30729)", "minor": null, "patch": null}, {"major": null, "family": "Windows XP", "patch_minor": null, "user_agent_string": "Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.24 Version/10.53", "minor": null, "patch": null}, {"major": null, "family": "Symbian OS", "patch_minor": null, "user_agent_string": "Opera/9.80 (S60; SymbOS; Opera Mobi/275; U; es-ES) Presto/2.4.13 Version/10.00", "minor": null, "patch": null}, {"major": "1", "family": "webOS", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (webOS/1.2; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Desktop/1.0", "minor": "2", "patch": null}, {"major": "3", "family": "iOS", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10", "minor": "2", "patch": null}, {"major": "1", "family": "Bada", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S8500/S8500XXJEE; U; Bada/1.0; nl-nl) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.0 Mobile WVGA SMM-MMS/1.2.0 OPN-B", "minor": "0", "patch": null}, {"major": null, "family": "Windows XP", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; BOLT/2.101) AppleWebKit/530 (KHTML, like Gecko) Version/4.0 Safari/530.17", "minor": null, "patch": null}, {"major": null, "family": "Mac OS X", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3", "minor": null, "patch": null}, {"major": "10", "family": "Mac OS X", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-us) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "minor": "6", "patch": "5"}, {"major": "6", "family": "BlackBerry OS", "patch_minor": "141", "user_agent_string": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en-GB) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.141 Mobile Safari/534.1+", "minor": "0", "patch": "0"}, {"major": "6", "family": "BlackBerry OS", "patch_minor": "91", "user_agent_string": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Version/6.0.0.91 Mobile Safari/534.1 ", "minor": "0", "patch": "0"}, {"major": null, "js_ua": "{'js_user_agent_string': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.169.1 Safari/530.1'}", "family": "Windows XP", "patch_minor": null, "user_agent_string": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; chromeframe; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; Sleipnir 2.8.5)3.0.30729)", "minor": null, "patch": null}, {"major": null, "js_ua": "{'js_user_agent_string': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.169.1 Safari/530.1'}", "family": "Windows Vista", "patch_minor": null, "user_agent_string": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; chromeframe; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)", "minor": null, "patch": null}, {"major": null, "js_ua": "{'js_user_agent_string': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; chromeframe; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)'}", "family": "Windows XP", "patch_minor": null, "user_agent_string": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; chromeframe; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)", "minor": null, "patch": null}, {"major": null, "js_ua": "{'js_user_agent_string': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 1.1.4322)', 'js_user_agent_family': 'IE Platform Preview', 'js_user_agent_v1': '9', 'js_user_agent_v2': '0', 'js_user_agent_v3': '1'}", "family": "Windows XP", "patch_minor": null, "user_agent_string": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; .NET CLR 2.0.50727; .NET CLR 1.1.4322)", "minor": null, "patch": null}, {"major": null, "family": "Windows Phone OS", "patch_minor": null, "user_agent_string": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7)", "minor": null, "patch": null}]}
```