From 3ddbc40bb50abba27fc2129632cf455dc1690e0c Mon Sep 17 00:00:00 2001 From: ComputerTech312 Date: Tue, 7 Oct 2025 17:22:51 +0100 Subject: [PATCH] Improve subscription UI with large tier buttons - Replace dropdown tier selection with attractive visual buttons - Add tier-button CSS with hover effects and selection states - Remove 'or pay by card' divider from subscription form for cleaner UI - Update JavaScript to handle tier button selection events - Fix Stripe module import conflict by renaming stripe directory to stripe_config - Add responsive grid layout for tier buttons on mobile devices --- server.py | 208 +- static/css/styles.css | 166 + static/js/subscriptions.js | 216 + stripe_config/.env | 4 + stripe_config/.env.example | 3 + stripe_config/.venv/bin/Activate.ps1 | 247 + stripe_config/.venv/bin/activate | 70 + stripe_config/.venv/bin/activate.csh | 27 + stripe_config/.venv/bin/activate.fish | 69 + stripe_config/.venv/bin/dotenv | 8 + stripe_config/.venv/bin/flask | 8 + stripe_config/.venv/bin/normalizer | 8 + stripe_config/.venv/bin/pip | 8 + stripe_config/.venv/bin/pip3 | 8 + stripe_config/.venv/bin/pip3.12 | 8 + stripe_config/.venv/bin/python | 1 + stripe_config/.venv/bin/python3 | 1 + stripe_config/.venv/bin/python3.12 | 1 + .../MarkupSafe-3.0.2.dist-info/INSTALLER | 1 + .../MarkupSafe-3.0.2.dist-info/LICENSE.txt | 28 + .../MarkupSafe-3.0.2.dist-info/METADATA | 92 + .../MarkupSafe-3.0.2.dist-info/RECORD | 14 + .../MarkupSafe-3.0.2.dist-info/WHEEL | 6 + .../MarkupSafe-3.0.2.dist-info/top_level.txt | 1 + .../typing_extensions.cpython-312.pyc | Bin 0 -> 163738 bytes .../blinker-1.9.0.dist-info/INSTALLER | 1 + .../blinker-1.9.0.dist-info/LICENSE.txt | 20 + .../blinker-1.9.0.dist-info/METADATA | 60 + .../blinker-1.9.0.dist-info/RECORD | 12 + .../blinker-1.9.0.dist-info/WHEEL | 4 + .../site-packages/blinker/__init__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 482 bytes .../__pycache__/_utilities.cpython-312.pyc | Bin 0 -> 2709 bytes .../blinker/__pycache__/base.cpython-312.pyc | Bin 0 -> 21986 bytes .../site-packages/blinker/_utilities.py | 64 + .../python3.12/site-packages/blinker/base.py | 512 + .../python3.12/site-packages/blinker/py.typed | 0 .../certifi-2025.8.3.dist-info/INSTALLER | 1 + .../certifi-2025.8.3.dist-info/METADATA | 77 + .../certifi-2025.8.3.dist-info/RECORD | 14 + .../certifi-2025.8.3.dist-info/WHEEL | 5 + .../licenses/LICENSE | 20 + .../certifi-2025.8.3.dist-info/top_level.txt | 1 + .../site-packages/certifi/__init__.py | 4 + .../site-packages/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 297 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 612 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 2044 bytes .../site-packages/certifi/cacert.pem | 4738 +++++++ .../python3.12/site-packages/certifi/core.py | 83 + .../python3.12/site-packages/certifi/py.typed | 0 .../INSTALLER | 1 + .../METADATA | 750 ++ .../charset_normalizer-3.4.3.dist-info/RECORD | 35 + .../charset_normalizer-3.4.3.dist-info/WHEEL | 7 + .../entry_points.txt | 2 + .../licenses/LICENSE | 21 + .../top_level.txt | 1 + .../charset_normalizer/__init__.py | 48 + .../charset_normalizer/__main__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1763 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 338 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 18174 bytes .../__pycache__/cd.cpython-312.pyc | Bin 0 -> 13279 bytes .../__pycache__/constant.cpython-312.pyc | Bin 0 -> 40793 bytes .../__pycache__/legacy.cpython-312.pyc | Bin 0 -> 2993 bytes .../__pycache__/md.cpython-312.pyc | Bin 0 -> 24330 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 17110 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 13739 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 365 bytes .../site-packages/charset_normalizer/api.py | 669 + .../site-packages/charset_normalizer/cd.py | 395 + .../charset_normalizer/cli/__init__.py | 8 + .../charset_normalizer/cli/__main__.py | 381 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 326 bytes .../cli/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 14387 bytes .../charset_normalizer/constant.py | 2015 +++ .../charset_normalizer/legacy.py | 80 + .../md.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 15912 bytes .../site-packages/charset_normalizer/md.py | 635 + .../md__mypyc.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 289536 bytes .../charset_normalizer/models.py | 360 + .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 414 + .../charset_normalizer/version.py | 8 + .../click-8.3.0.dist-info/INSTALLER | 1 + .../click-8.3.0.dist-info/METADATA | 84 + .../click-8.3.0.dist-info/RECORD | 40 + .../site-packages/click-8.3.0.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 28 + .../site-packages/click/__init__.py | 123 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4054 bytes .../click/__pycache__/_compat.cpython-312.pyc | Bin 0 -> 24176 bytes .../__pycache__/_termui_impl.cpython-312.pyc | Bin 0 -> 31593 bytes .../__pycache__/_textwrap.cpython-312.pyc | Bin 0 -> 2407 bytes .../click/__pycache__/_utils.cpython-312.pyc | Bin 0 -> 1182 bytes .../__pycache__/_winconsole.cpython-312.pyc | Bin 0 -> 11752 bytes .../click/__pycache__/core.cpython-312.pyc | Bin 0 -> 133413 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 0 -> 22119 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 14758 bytes .../__pycache__/formatting.cpython-312.pyc | Bin 0 -> 13654 bytes .../click/__pycache__/globals.cpython-312.pyc | Bin 0 -> 2947 bytes .../click/__pycache__/parser.cpython-312.pyc | Bin 0 -> 20424 bytes .../shell_completion.cpython-312.pyc | Bin 0 -> 23319 bytes .../click/__pycache__/termui.cpython-312.pyc | Bin 0 -> 34505 bytes .../click/__pycache__/testing.cpython-312.pyc | Bin 0 -> 27391 bytes .../click/__pycache__/types.cpython-312.pyc | Bin 0 -> 50020 bytes .../click/__pycache__/utils.cpython-312.pyc | Bin 0 -> 24861 bytes .../python3.12/site-packages/click/_compat.py | 622 + .../site-packages/click/_termui_impl.py | 847 ++ .../site-packages/click/_textwrap.py | 51 + .../python3.12/site-packages/click/_utils.py | 36 + .../site-packages/click/_winconsole.py | 296 + .../python3.12/site-packages/click/core.py | 3347 +++++ .../site-packages/click/decorators.py | 551 + .../site-packages/click/exceptions.py | 308 + .../site-packages/click/formatting.py | 301 + .../python3.12/site-packages/click/globals.py | 67 + .../python3.12/site-packages/click/parser.py | 532 + .../python3.12/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 667 + .../python3.12/site-packages/click/termui.py | 877 ++ .../python3.12/site-packages/click/testing.py | 577 + .../python3.12/site-packages/click/types.py | 1209 ++ .../python3.12/site-packages/click/utils.py | 627 + .../site-packages/dotenv/__init__.py | 49 + .../site-packages/dotenv/__main__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1678 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 342 bytes .../dotenv/__pycache__/cli.cpython-312.pyc | Bin 0 -> 9712 bytes .../__pycache__/ipython.cpython-312.pyc | Bin 0 -> 1951 bytes .../dotenv/__pycache__/main.cpython-312.pyc | Bin 0 -> 16445 bytes .../dotenv/__pycache__/parser.cpython-312.pyc | Bin 0 -> 9984 bytes .../__pycache__/variables.cpython-312.pyc | Bin 0 -> 5015 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 194 bytes .../python3.12/site-packages/dotenv/cli.py | 199 + .../site-packages/dotenv/ipython.py | 39 + .../python3.12/site-packages/dotenv/main.py | 392 + .../python3.12/site-packages/dotenv/parser.py | 175 + .../python3.12/site-packages/dotenv/py.typed | 1 + .../site-packages/dotenv/variables.py | 86 + .../site-packages/dotenv/version.py | 1 + .../flask-3.0.3.dist-info/INSTALLER | 1 + .../flask-3.0.3.dist-info/LICENSE.txt | 28 + .../flask-3.0.3.dist-info/METADATA | 101 + .../flask-3.0.3.dist-info/RECORD | 58 + .../flask-3.0.3.dist-info/REQUESTED | 0 .../site-packages/flask-3.0.3.dist-info/WHEEL | 4 + .../flask-3.0.3.dist-info/entry_points.txt | 3 + .../site-packages/flask/__init__.py | 60 + .../site-packages/flask/__main__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2461 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 222 bytes .../flask/__pycache__/app.cpython-312.pyc | Bin 0 -> 61157 bytes .../__pycache__/blueprints.cpython-312.pyc | Bin 0 -> 4876 bytes .../flask/__pycache__/cli.cpython-312.pyc | Bin 0 -> 42254 bytes .../flask/__pycache__/config.cpython-312.pyc | Bin 0 -> 16242 bytes .../flask/__pycache__/ctx.cpython-312.pyc | Bin 0 -> 19819 bytes .../__pycache__/debughelpers.cpython-312.pyc | Bin 0 -> 9131 bytes .../flask/__pycache__/globals.cpython-312.pyc | Bin 0 -> 1846 bytes .../flask/__pycache__/helpers.cpython-312.pyc | Bin 0 -> 24799 bytes .../flask/__pycache__/logging.cpython-312.pyc | Bin 0 -> 3248 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 16295 bytes .../flask/__pycache__/signals.cpython-312.pyc | Bin 0 -> 1203 bytes .../__pycache__/templating.cpython-312.pyc | Bin 0 -> 9913 bytes .../flask/__pycache__/testing.cpython-312.pyc | Bin 0 -> 13687 bytes .../flask/__pycache__/typing.cpython-312.pyc | Bin 0 -> 4258 bytes .../flask/__pycache__/views.cpython-312.pyc | Bin 0 -> 6998 bytes .../__pycache__/wrappers.cpython-312.pyc | Bin 0 -> 6104 bytes .../lib/python3.12/site-packages/flask/app.py | 1498 +++ .../site-packages/flask/blueprints.py | 129 + .../lib/python3.12/site-packages/flask/cli.py | 1109 ++ .../python3.12/site-packages/flask/config.py | 370 + .../lib/python3.12/site-packages/flask/ctx.py | 449 + .../site-packages/flask/debughelpers.py | 178 + .../python3.12/site-packages/flask/globals.py | 51 + .../python3.12/site-packages/flask/helpers.py | 621 + .../site-packages/flask/json/__init__.py | 170 + .../json/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6674 bytes .../json/__pycache__/provider.cpython-312.pyc | Bin 0 -> 9241 bytes .../json/__pycache__/tag.cpython-312.pyc | Bin 0 -> 13936 bytes .../site-packages/flask/json/provider.py | 215 + .../site-packages/flask/json/tag.py | 327 + .../python3.12/site-packages/flask/logging.py | 79 + .../python3.12/site-packages/flask/py.typed | 0 .../site-packages/flask/sansio/README.md | 6 + .../sansio/__pycache__/app.cpython-312.pyc | Bin 0 -> 33594 bytes .../__pycache__/blueprints.cpython-312.pyc | Bin 0 -> 31194 bytes .../__pycache__/scaffold.cpython-312.pyc | Bin 0 -> 30472 bytes .../site-packages/flask/sansio/app.py | 964 ++ .../site-packages/flask/sansio/blueprints.py | 632 + .../site-packages/flask/sansio/scaffold.py | 801 ++ .../site-packages/flask/sessions.py | 379 + .../python3.12/site-packages/flask/signals.py | 17 + .../site-packages/flask/templating.py | 219 + .../python3.12/site-packages/flask/testing.py | 298 + .../python3.12/site-packages/flask/typing.py | 90 + .../python3.12/site-packages/flask/views.py | 191 + .../site-packages/flask/wrappers.py | 174 + .../idna-3.10.dist-info/INSTALLER | 1 + .../idna-3.10.dist-info/LICENSE.md | 31 + .../idna-3.10.dist-info/METADATA | 250 + .../site-packages/idna-3.10.dist-info/RECORD | 22 + .../site-packages/idna-3.10.dist-info/WHEEL | 4 + .../python3.12/site-packages/idna/__init__.py | 45 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 865 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4965 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 869 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 16155 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 99455 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2617 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 196 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158825 bytes .../python3.12/site-packages/idna/codec.py | 122 + .../python3.12/site-packages/idna/compat.py | 15 + .../lib/python3.12/site-packages/idna/core.py | 437 + .../python3.12/site-packages/idna/idnadata.py | 4243 ++++++ .../site-packages/idna/intranges.py | 57 + .../site-packages/idna/package_data.py | 1 + .../python3.12/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 8681 +++++++++++++ .../itsdangerous-2.2.0.dist-info/INSTALLER | 1 + .../itsdangerous-2.2.0.dist-info/LICENSE.txt | 28 + .../itsdangerous-2.2.0.dist-info/METADATA | 60 + .../itsdangerous-2.2.0.dist-info/RECORD | 22 + .../itsdangerous-2.2.0.dist-info/WHEEL | 4 + .../site-packages/itsdangerous/__init__.py | 38 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1613 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 1167 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2667 bytes .../__pycache__/exc.cpython-312.pyc | Bin 0 -> 3927 bytes .../__pycache__/serializer.cpython-312.pyc | Bin 0 -> 15408 bytes .../__pycache__/signer.cpython-312.pyc | Bin 0 -> 11273 bytes .../__pycache__/timed.cpython-312.pyc | Bin 0 -> 8721 bytes .../__pycache__/url_safe.cpython-312.pyc | Bin 0 -> 3517 bytes .../site-packages/itsdangerous/_json.py | 18 + .../site-packages/itsdangerous/encoding.py | 54 + .../site-packages/itsdangerous/exc.py | 106 + .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 406 + .../site-packages/itsdangerous/signer.py | 266 + .../site-packages/itsdangerous/timed.py | 228 + .../site-packages/itsdangerous/url_safe.py | 83 + .../jinja2-3.1.6.dist-info/INSTALLER | 1 + .../jinja2-3.1.6.dist-info/METADATA | 84 + .../jinja2-3.1.6.dist-info/RECORD | 57 + .../jinja2-3.1.6.dist-info/WHEEL | 4 + .../jinja2-3.1.6.dist-info/entry_points.txt | 3 + .../licenses/LICENSE.txt | 28 + .../site-packages/jinja2/__init__.py | 38 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1638 bytes .../__pycache__/_identifier.cpython-312.pyc | Bin 0 -> 2119 bytes .../__pycache__/async_utils.cpython-312.pyc | Bin 0 -> 4959 bytes .../__pycache__/bccache.cpython-312.pyc | Bin 0 -> 19330 bytes .../__pycache__/compiler.cpython-312.pyc | Bin 0 -> 104045 bytes .../__pycache__/constants.cpython-312.pyc | Bin 0 -> 1541 bytes .../jinja2/__pycache__/debug.cpython-312.pyc | Bin 0 -> 6566 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 0 -> 1591 bytes .../__pycache__/environment.cpython-312.pyc | Bin 0 -> 76667 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7705 bytes .../jinja2/__pycache__/ext.cpython-312.pyc | Bin 0 -> 41898 bytes .../__pycache__/filters.cpython-312.pyc | Bin 0 -> 72315 bytes .../__pycache__/idtracking.cpython-312.pyc | Bin 0 -> 19180 bytes .../jinja2/__pycache__/lexer.cpython-312.pyc | Bin 0 -> 32061 bytes .../__pycache__/loaders.cpython-312.pyc | Bin 0 -> 32340 bytes .../jinja2/__pycache__/meta.cpython-312.pyc | Bin 0 -> 5475 bytes .../__pycache__/nativetypes.cpython-312.pyc | Bin 0 -> 6996 bytes .../jinja2/__pycache__/nodes.cpython-312.pyc | Bin 0 -> 58258 bytes .../__pycache__/optimizer.cpython-312.pyc | Bin 0 -> 2674 bytes .../jinja2/__pycache__/parser.cpython-312.pyc | Bin 0 -> 61188 bytes .../__pycache__/runtime.cpython-312.pyc | Bin 0 -> 48876 bytes .../__pycache__/sandbox.cpython-312.pyc | Bin 0 -> 18092 bytes .../jinja2/__pycache__/tests.cpython-312.pyc | Bin 0 -> 9035 bytes .../jinja2/__pycache__/utils.cpython-312.pyc | Bin 0 -> 34848 bytes .../__pycache__/visitor.cpython-312.pyc | Bin 0 -> 5350 bytes .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/async_utils.py | 99 + .../site-packages/jinja2/bccache.py | 408 + .../site-packages/jinja2/compiler.py | 1998 +++ .../site-packages/jinja2/constants.py | 20 + .../python3.12/site-packages/jinja2/debug.py | 191 + .../site-packages/jinja2/defaults.py | 48 + .../site-packages/jinja2/environment.py | 1672 +++ .../site-packages/jinja2/exceptions.py | 166 + .../python3.12/site-packages/jinja2/ext.py | 870 ++ .../site-packages/jinja2/filters.py | 1873 +++ .../site-packages/jinja2/idtracking.py | 318 + .../python3.12/site-packages/jinja2/lexer.py | 868 ++ .../site-packages/jinja2/loaders.py | 693 + .../python3.12/site-packages/jinja2/meta.py | 112 + .../site-packages/jinja2/nativetypes.py | 130 + .../python3.12/site-packages/jinja2/nodes.py | 1206 ++ .../site-packages/jinja2/optimizer.py | 48 + .../python3.12/site-packages/jinja2/parser.py | 1049 ++ .../python3.12/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1062 ++ .../site-packages/jinja2/sandbox.py | 436 + .../python3.12/site-packages/jinja2/tests.py | 256 + .../python3.12/site-packages/jinja2/utils.py | 766 ++ .../site-packages/jinja2/visitor.py | 92 + .../site-packages/markupsafe/__init__.py | 395 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 20913 bytes .../__pycache__/_native.cpython-312.pyc | Bin 0 -> 600 bytes .../site-packages/markupsafe/_native.py | 8 + .../site-packages/markupsafe/_speedups.c | 204 + .../_speedups.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 43432 bytes .../site-packages/markupsafe/_speedups.pyi | 1 + .../site-packages/markupsafe/py.typed | 0 .../pip-24.0.dist-info/AUTHORS.txt | 760 ++ .../pip-24.0.dist-info/INSTALLER | 1 + .../pip-24.0.dist-info/LICENSE.txt | 20 + .../site-packages/pip-24.0.dist-info/METADATA | 88 + .../site-packages/pip-24.0.dist-info/RECORD | 1005 ++ .../pip-24.0.dist-info/REQUESTED | 0 .../site-packages/pip-24.0.dist-info/WHEEL | 5 + .../pip-24.0.dist-info/entry_points.txt | 4 + .../pip-24.0.dist-info/top_level.txt | 1 + .../python3.12/site-packages/pip/__init__.py | 13 + .../python3.12/site-packages/pip/__main__.py | 24 + .../site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 675 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 831 bytes .../__pip-runner__.cpython-312.pyc | Bin 0 -> 2194 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 777 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 0 -> 14284 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 12655 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 17656 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 33274 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 660 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 0 -> 4961 bytes .../self_outdated_check.cpython-312.pyc | Bin 0 -> 10542 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 0 -> 13639 bytes .../site-packages/pip/_internal/build_env.py | 311 + .../site-packages/pip/_internal/cache.py | 290 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 268 bytes .../autocompletion.cpython-312.pyc | Bin 0 -> 8455 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 0 -> 10445 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 0 -> 30364 bytes .../command_context.cpython-312.pyc | Bin 0 -> 1771 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 0 -> 2288 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 0 -> 4895 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 0 -> 15012 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 0 -> 2610 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 0 -> 18842 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 0 -> 7830 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 365 bytes .../pip/_internal/cli/autocompletion.py | 172 + .../pip/_internal/cli/base_command.py | 236 + .../pip/_internal/cli/cmdoptions.py | 1074 ++ .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 79 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 68 + .../pip/_internal/cli/req_command.py | 505 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3992 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 9701 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 2080 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 5182 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 13202 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 10151 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 7579 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 4406 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 0 -> 2973 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 0 -> 1663 bytes .../__pycache__/index.cpython-312.pyc | Bin 0 -> 6710 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 0 -> 3965 bytes .../__pycache__/install.cpython-312.pyc | Bin 0 -> 28903 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 0 -> 15646 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 7611 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 0 -> 9718 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 0 -> 4716 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 8946 bytes .../pip/_internal/commands/cache.py | 225 + .../pip/_internal/commands/check.py | 54 + .../pip/_internal/commands/completion.py | 130 + .../pip/_internal/commands/configuration.py | 280 + .../pip/_internal/commands/debug.py | 201 + .../pip/_internal/commands/download.py | 147 + .../pip/_internal/commands/freeze.py | 109 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 139 + .../pip/_internal/commands/inspect.py | 92 + .../pip/_internal/commands/install.py | 774 ++ .../pip/_internal/commands/list.py | 370 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 189 + .../pip/_internal/commands/uninstall.py | 113 + .../pip/_internal/commands/wheel.py | 183 + .../pip/_internal/configuration.py | 383 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 931 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 2852 bytes .../__pycache__/installed.cpython-312.pyc | Bin 0 -> 1690 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 0 -> 8478 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 2238 bytes .../pip/_internal/distributions/base.py | 51 + .../pip/_internal/distributions/installed.py | 29 + .../pip/_internal/distributions/sdist.py | 156 + .../pip/_internal/distributions/wheel.py | 40 + .../site-packages/pip/_internal/exceptions.py | 728 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 222 bytes .../__pycache__/collector.cpython-312.pyc | Bin 0 -> 21876 bytes .../package_finder.cpython-312.pyc | Bin 0 -> 40725 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 0 -> 12594 bytes .../pip/_internal/index/collector.py | 507 + .../pip/_internal/index/package_finder.py | 1027 ++ .../pip/_internal/index/sources.py | 285 + .../pip/_internal/locations/__init__.py | 467 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 16766 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 0 -> 6846 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 0 -> 8001 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 3771 bytes .../pip/_internal/locations/_distutils.py | 172 + .../pip/_internal/locations/_sysconfig.py | 213 + .../pip/_internal/locations/base.py | 81 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 128 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5872 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 2865 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 0 -> 35702 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 0 -> 15780 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 702 + .../_internal/metadata/importlib/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 348 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 3323 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 0 -> 13415 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 0 -> 11170 bytes .../_internal/metadata/importlib/_compat.py | 55 + .../_internal/metadata/importlib/_dists.py | 227 + .../pip/_internal/metadata/importlib/_envs.py | 189 + .../pip/_internal/metadata/pkg_resources.py | 278 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 256 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 0 -> 1895 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 0 -> 11189 bytes .../format_control.cpython-312.pyc | Bin 0 -> 4217 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 0 -> 1684 bytes .../installation_report.cpython-312.pyc | Bin 0 -> 2262 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 0 -> 25992 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 0 -> 1159 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 0 -> 5078 bytes .../selection_prefs.cpython-312.pyc | Bin 0 -> 1841 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 0 -> 4944 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5770 bytes .../pip/_internal/models/candidate.py | 30 + .../pip/_internal/models/direct_url.py | 235 + .../pip/_internal/models/format_control.py | 78 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 56 + .../pip/_internal/models/link.py | 579 + .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 132 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 122 + .../pip/_internal/models/wheel.py | 92 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 244 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 0 -> 21986 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 0 -> 6508 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 8543 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 0 -> 11653 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 18764 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2243 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 0 -> 2939 bytes .../pip/_internal/network/auth.py | 561 + .../pip/_internal/network/cache.py | 106 + .../pip/_internal/network/download.py | 186 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 520 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 62 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 187 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 7569 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 10107 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 0 -> 25737 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 193 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 0 -> 7813 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 1870 bytes .../metadata_editable.cpython-312.pyc | Bin 0 -> 1904 bytes .../metadata_legacy.cpython-312.pyc | Bin 0 -> 3055 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 1674 bytes .../wheel_editable.cpython-312.pyc | Bin 0 -> 2015 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 0 -> 3919 bytes .../operations/build/build_tracker.py | 139 + .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 187 + .../pip/_internal/operations/freeze.py | 255 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 256 bytes .../editable_legacy.cpython-312.pyc | Bin 0 -> 1807 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 33849 bytes .../operations/install/editable_legacy.py | 46 + .../pip/_internal/operations/install/wheel.py | 734 ++ .../pip/_internal/operations/prepare.py | 730 ++ .../site-packages/pip/_internal/pyproject.py | 179 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3733 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 0 -> 21572 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 0 -> 21451 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 0 -> 38404 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 0 -> 7208 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 0 -> 32967 bytes .../pip/_internal/req/constructors.py | 576 + .../pip/_internal/req/req_file.py | 554 + .../pip/_internal/req/req_install.py | 923 ++ .../pip/_internal/req/req_set.py | 119 + .../pip/_internal/req/req_uninstall.py | 649 + .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 187 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 1175 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 194 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 22429 bytes .../_internal/resolution/legacy/resolver.py | 598 + .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 198 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 8327 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 0 -> 30388 bytes .../__pycache__/factory.cpython-312.pyc | Bin 0 -> 32104 bytes .../found_candidates.cpython-312.pyc | Bin 0 -> 6198 bytes .../__pycache__/provider.cpython-312.pyc | Bin 0 -> 10368 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 0 -> 4925 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 11419 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 12341 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 597 + .../resolution/resolvelib/factory.py | 812 ++ .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 255 + .../resolution/resolvelib/reporter.py | 80 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 317 + .../pip/_internal/self_outdated_check.py | 248 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 182 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 0 -> 4523 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 0 -> 1853 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 0 -> 2397 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 0 -> 2200 bytes .../compatibility_tags.cpython-312.pyc | Bin 0 -> 5548 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 0 -> 671 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 0 -> 4173 bytes .../direct_url_helpers.cpython-312.pyc | Bin 0 -> 3550 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 0 -> 3213 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2145 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 0 -> 3980 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 0 -> 7445 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 0 -> 1151 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 0 -> 2329 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 0 -> 7541 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13544 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 0 -> 34108 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 0 -> 2699 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 0 -> 2570 bytes .../setuptools_build.cpython-312.pyc | Bin 0 -> 4537 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 0 -> 8705 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 0 -> 12049 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 0 -> 11095 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 0 -> 2392 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 0 -> 4467 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5913 bytes .../pip/_internal/utils/_jaraco_text.py | 109 + .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 120 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/egg_link.py | 80 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 84 + .../pip/_internal/utils/filesystem.py | 153 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 151 + .../pip/_internal/utils/logging.py | 348 + .../site-packages/pip/_internal/utils/misc.py | 783 ++ .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 146 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 296 + .../pip/_internal/utils/unpacking.py | 257 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 134 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 521 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 0 -> 5013 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 0 -> 18982 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 0 -> 7602 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 0 -> 12474 bytes .../versioncontrol.cpython-312.pyc | Bin 0 -> 29000 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 + .../pip/_internal/wheel_builder.py | 354 + .../site-packages/pip/_vendor/__init__.py | 121 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4683 bytes .../_vendor/__pycache__/six.cpython-312.pyc | Bin 0 -> 41260 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 122040 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 893 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 0 -> 2637 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 0 -> 6455 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 3800 bytes .../__pycache__/controller.cpython-312.pyc | Bin 0 -> 16158 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 0 -> 4338 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 0 -> 6685 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 0 -> 6396 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 0 -> 1665 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 + .../pip/_vendor/cachecontrol/adapter.py | 161 + .../pip/_vendor/cachecontrol/cache.py | 74 + .../_vendor/cachecontrol/caches/__init__.py | 8 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 426 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 0 -> 7701 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 0 -> 2729 bytes .../_vendor/cachecontrol/caches/file_cache.py | 181 + .../cachecontrol/caches/redis_cache.py | 48 + .../pip/_vendor/cachecontrol/controller.py | 494 + .../pip/_vendor/cachecontrol/filewrapper.py | 119 + .../pip/_vendor/cachecontrol/heuristics.py | 154 + .../pip/_vendor/cachecontrol/serialize.py | 206 + .../pip/_vendor/cachecontrol/wrapper.py | 43 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 309 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 636 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 3318 bytes .../pip/_vendor/certifi/cacert.pem | 4635 +++++++ .../site-packages/pip/_vendor/certifi/core.py | 119 + .../pip/_vendor/chardet/__init__.py | 115 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4559 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 0 -> 27190 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 0 -> 1378 bytes .../chardistribution.cpython-312.pyc | Bin 0 -> 9629 bytes .../charsetgroupprober.cpython-312.pyc | Bin 0 -> 4113 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 0 -> 5009 bytes .../codingstatemachine.cpython-312.pyc | Bin 0 -> 3869 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 0 -> 780 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 0 -> 1387 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 0 -> 2987 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 0 -> 4557 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 0 -> 15301 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 0 -> 4374 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 0 -> 12073 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 0 -> 1381 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 0 -> 27195 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 0 -> 1381 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 0 -> 19117 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 0 -> 1394 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 0 -> 5813 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 0 -> 22146 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 0 -> 82994 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 0 -> 1385 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 0 -> 39540 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 0 -> 83113 bytes .../langgreekmodel.cpython-312.pyc | Bin 0 -> 76979 bytes .../langhebrewmodel.cpython-312.pyc | Bin 0 -> 77490 bytes .../langhungarianmodel.cpython-312.pyc | Bin 0 -> 83067 bytes .../langrussianmodel.cpython-312.pyc | Bin 0 -> 105242 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 0 -> 77668 bytes .../langturkishmodel.cpython-312.pyc | Bin 0 -> 77507 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 0 -> 6993 bytes .../macromanprober.cpython-312.pyc | Bin 0 -> 7173 bytes .../mbcharsetprober.cpython-312.pyc | Bin 0 -> 3894 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 0 -> 1579 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 0 -> 38636 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 0 -> 623 bytes .../sbcharsetprober.cpython-312.pyc | Bin 0 -> 6378 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 0 -> 2348 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 0 -> 4486 bytes .../universaldetector.cpython-312.pyc | Bin 0 -> 12260 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 0 -> 9970 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 0 -> 3166 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 479 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 261 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 147 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 186 bytes .../__pycache__/chardetect.cpython-312.pyc | Bin 0 -> 4003 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 + .../pip/_vendor/chardet/codingstatemachine.py | 90 + .../_vendor/chardet/codingstatemachinedict.py | 19 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 85 + .../pip/_vendor/chardet/escprober.py | 102 + .../pip/_vendor/chardet/escsm.py | 261 + .../pip/_vendor/chardet/eucjpprober.py | 102 + .../pip/_vendor/chardet/euckrfreq.py | 196 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 388 + .../pip/_vendor/chardet/euctwprober.py | 47 + .../pip/_vendor/chardet/gb2312freq.py | 284 + .../pip/_vendor/chardet/gb2312prober.py | 47 + .../pip/_vendor/chardet/hebrewprober.py | 316 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/johabfreq.py | 2382 ++++ .../pip/_vendor/chardet/johabprober.py | 47 + .../pip/_vendor/chardet/jpcntx.py | 238 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 +++++++ .../pip/_vendor/chardet/langgreekmodel.py | 4397 +++++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 +++++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 +++++++ .../pip/_vendor/chardet/langrussianmodel.py | 5725 +++++++++ .../pip/_vendor/chardet/langthaimodel.py | 4380 +++++++ .../pip/_vendor/chardet/langturkishmodel.py | 4380 +++++++ .../pip/_vendor/chardet/latin1prober.py | 147 + .../pip/_vendor/chardet/macromanprober.py | 162 + .../pip/_vendor/chardet/mbcharsetprober.py | 95 + .../pip/_vendor/chardet/mbcsgroupprober.py | 57 + .../pip/_vendor/chardet/mbcssm.py | 661 + .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 191 bytes .../__pycache__/languages.cpython-312.pyc | Bin 0 -> 9746 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 + .../pip/_vendor/chardet/resultdict.py | 16 + .../pip/_vendor/chardet/sbcharsetprober.py | 162 + .../pip/_vendor/chardet/sbcsgroupprober.py | 88 + .../pip/_vendor/chardet/sjisprober.py | 105 + .../pip/_vendor/chardet/universaldetector.py | 362 + .../pip/_vendor/chardet/utf1632prober.py | 225 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 483 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 3941 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 0 -> 16412 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 0 -> 3541 bytes .../__pycache__/win32.cpython-312.pyc | Bin 0 -> 8117 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 0 -> 9079 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 277 + .../pip/_vendor/colorama/initialise.py | 121 + .../pip/_vendor/colorama/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 189 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 0 -> 5458 bytes .../ansitowin32_test.cpython-312.pyc | Bin 0 -> 18094 bytes .../initialise_test.cpython-312.pyc | Bin 0 -> 11739 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 0 -> 4895 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2479 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 0 -> 6603 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 + .../colorama/tests/ansitowin32_test.py | 294 + .../_vendor/colorama/tests/initialise_test.py | 189 + .../pip/_vendor/colorama/tests/isatty_test.py | 57 + .../pip/_vendor/colorama/tests/utils.py | 49 + .../_vendor/colorama/tests/winterm_test.py | 131 + .../pip/_vendor/colorama/win32.py | 180 + .../pip/_vendor/colorama/winterm.py | 195 + .../pip/_vendor/distlib/__init__.py | 33 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1260 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 45596 bytes .../__pycache__/database.cpython-312.pyc | Bin 0 -> 66018 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 0 -> 24357 bytes .../__pycache__/locators.cpython-312.pyc | Bin 0 -> 60149 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 0 -> 15116 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 7673 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 41790 bytes .../__pycache__/resources.cpython-312.pyc | Bin 0 -> 17316 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 0 -> 19571 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 0 -> 88247 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 30357 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 51852 bytes .../pip/_vendor/distlib/compat.py | 1138 ++ .../pip/_vendor/distlib/database.py | 1359 ++ .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1303 ++ .../pip/_vendor/distlib/manifest.py | 384 + .../pip/_vendor/distlib/markers.py | 167 + .../pip/_vendor/distlib/metadata.py | 1068 ++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 452 + .../site-packages/pip/_vendor/distlib/util.py | 2025 +++ .../pip/_vendor/distlib/version.py | 751 ++ .../pip/_vendor/distlib/wheel.py | 1099 ++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 951 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 283 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 0 -> 53745 bytes .../pip/_vendor/distro/distro.py | 1399 ++ .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 872 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4624 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 878 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 16014 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 99488 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2629 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 207 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158861 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 400 + .../pip/_vendor/idna/idnadata.py | 4246 ++++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8600 +++++++++++++ .../pip/_vendor/msgpack/__init__.py | 57 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1822 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2016 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 0 -> 8659 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 0 -> 43567 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1010 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-312.pyc | Bin 0 -> 621 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 457 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 12067 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 6901 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3232 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 14049 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 6937 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 31238 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 18947 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 5859 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 19930 bytes .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 ++ .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pkg_resources/__init__.py | 3361 +++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 146465 bytes .../pip/_vendor/platformdirs/__init__.py | 566 + .../pip/_vendor/platformdirs/__main__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 18020 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1937 bytes .../__pycache__/android.cpython-312.pyc | Bin 0 -> 9435 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 9663 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 5628 bytes .../__pycache__/unix.cpython-312.pyc | Bin 0 -> 12432 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 302 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 12990 bytes .../pip/_vendor/platformdirs/android.py | 210 + .../pip/_vendor/platformdirs/api.py | 223 + .../pip/_vendor/platformdirs/macos.py | 91 + .../pip/_vendor/platformdirs/unix.py | 223 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 255 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3480 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 726 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 0 -> 26597 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2618 bytes .../__pycache__/filter.cpython-312.pyc | Bin 0 -> 3224 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4561 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 38321 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 0 -> 1560 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 3388 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 0 -> 4073 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 4748 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 0 -> 11038 bytes .../__pycache__/style.cpython-312.pyc | Bin 0 -> 6666 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 8134 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 0 -> 32980 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 0 -> 13973 bytes .../pip/_vendor/pygments/cmdline.py | 668 + .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37928 bytes .../pip/_vendor/pygments/formatter.py | 124 + .../_vendor/pygments/formatters/__init__.py | 158 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6918 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4207 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 0 -> 4186 bytes .../__pycache__/groff.cpython-312.pyc | Bin 0 -> 7256 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 40564 bytes .../__pycache__/img.cpython-312.pyc | Bin 0 -> 27035 bytes .../__pycache__/irc.cpython-312.pyc | Bin 0 -> 6057 bytes .../__pycache__/latex.cpython-312.pyc | Bin 0 -> 19946 bytes .../__pycache__/other.cpython-312.pyc | Bin 0 -> 6876 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 0 -> 2922 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 0 -> 6118 bytes .../__pycache__/svg.cpython-312.pyc | Bin 0 -> 9058 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 5821 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 0 -> 15149 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 170 + .../pip/_vendor/pygments/formatters/html.py | 989 ++ .../pip/_vendor/pygments/formatters/img.py | 645 + .../pip/_vendor/pygments/formatters/irc.py | 154 + .../pip/_vendor/pygments/formatters/latex.py | 521 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 943 ++ .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14644 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 64396 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 0 -> 42631 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 559 + .../pip/_vendor/pygments/lexers/python.py | 1198 ++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 88 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 217 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 103 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4440 bytes .../pip/_vendor/pygments/token.py | 213 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 330 + .../pip/_vendor/pyparsing/__init__.py | 322 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7903 bytes .../__pycache__/actions.cpython-312.pyc | Bin 0 -> 8387 bytes .../__pycache__/common.cpython-312.pyc | Bin 0 -> 13406 bytes .../__pycache__/core.cpython-312.pyc | Bin 0 -> 267700 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 12986 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 0 -> 48493 bytes .../__pycache__/results.cpython-312.pyc | Bin 0 -> 34102 bytes .../__pycache__/testing.cpython-312.pyc | Bin 0 -> 17180 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 0 -> 13176 bytes .../__pycache__/util.cpython-312.pyc | Bin 0 -> 14896 bytes .../pip/_vendor/pyparsing/actions.py | 217 + .../pip/_vendor/pyparsing/common.py | 432 + .../pip/_vendor/pyparsing/core.py | 6115 +++++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 656 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26805 bytes .../pip/_vendor/pyparsing/exceptions.py | 299 + .../pip/_vendor/pyparsing/helpers.py | 1100 ++ .../pip/_vendor/pyparsing/results.py | 796 ++ .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 361 + .../pip/_vendor/pyparsing/util.py | 284 + .../pip/_vendor/pyproject_hooks/__init__.py | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 605 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 366 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 0 -> 14717 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 + .../pip/_vendor/pyproject_hooks/_impl.py | 330 + .../pyproject_hooks/_in_process/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1072 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 0 -> 14389 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 182 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5445 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 576 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2016 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 21272 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7196 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13915 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 914 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 1499 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25238 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7039 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4304 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1044 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35440 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 764 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27749 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 5951 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5609 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36067 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 538 + .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 315 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 67 + .../pip/_vendor/requests/cookies.py | 561 + .../pip/_vendor/requests/exceptions.py | 141 + .../pip/_vendor/requests/help.py | 131 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1034 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 833 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1088 ++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 626 bytes .../__pycache__/providers.cpython-312.pyc | Bin 0 -> 6843 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 0 -> 2646 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 0 -> 25889 bytes .../__pycache__/structs.cpython-312.pyc | Bin 0 -> 10498 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 192 bytes .../collections_abc.cpython-312.pyc | Bin 0 -> 412 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 547 + .../pip/_vendor/resolvelib/structs.py | 170 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 274 + .../rich/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7007 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 10296 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 0 -> 7813 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 0 -> 205968 bytes .../_emoji_replace.cpython-312.pyc | Bin 0 -> 1721 bytes .../_export_format.cpython-312.pyc | Bin 0 -> 2313 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 0 -> 529 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 0 -> 847 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 0 -> 12069 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 0 -> 4139 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 0 -> 1877 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 0 -> 3612 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 0 -> 5152 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 0 -> 718 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 0 -> 6571 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 0 -> 13171 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 0 -> 957 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 0 -> 857 bytes .../_win32_console.cpython-312.pyc | Bin 0 -> 28968 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 0 -> 2482 bytes .../_windows_renderer.cpython-312.pyc | Bin 0 -> 3565 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 0 -> 2352 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 0 -> 1600 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 0 -> 12314 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 9098 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 0 -> 4264 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 0 -> 11850 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 0 -> 5610 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 0 -> 26562 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 0 -> 1693 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 0 -> 8579 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 0 -> 113785 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 0 -> 2250 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 9218 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 0 -> 10921 bytes .../default_styles.cpython-312.pyc | Bin 0 -> 10365 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 1479 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 0 -> 4201 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 0 -> 1837 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 0 -> 3569 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 0 -> 3074 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 0 -> 9890 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 0 -> 6027 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 0 -> 5201 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 0 -> 20212 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 0 -> 19135 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 0 -> 4886 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13546 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 0 -> 9290 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 0 -> 6368 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 0 -> 7126 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 0 -> 1812 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 0 -> 5306 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 0 -> 12089 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 0 -> 40048 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 0 -> 75070 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 0 -> 10381 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 0 -> 14773 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 0 -> 1784 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 0 -> 559 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 0 -> 6618 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 0 -> 6560 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 0 -> 3822 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 0 -> 2476 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 0 -> 28153 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 0 -> 6056 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 0 -> 6060 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 0 -> 33506 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 0 -> 2131 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 0 -> 39604 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 0 -> 43576 bytes .../terminal_theme.cpython-312.pyc | Bin 0 -> 3340 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 0 -> 58955 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 0 -> 6332 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 0 -> 306 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 0 -> 31540 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 0 -> 11431 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 ++++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 76 + .../pip/_vendor/rich/_extension.py | 10 + .../site-packages/pip/_vendor/rich/_fileno.py | 24 + .../pip/_vendor/rich/_inspect.py | 270 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 69 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 662 + .../pip/_vendor/rich/_windows.py | 72 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 56 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 240 + .../site-packages/pip/_vendor/rich/bar.py | 94 + .../site-packages/pip/_vendor/rich/box.py | 517 + .../site-packages/pip/_vendor/rich/cells.py | 154 + .../site-packages/pip/_vendor/rich/color.py | 622 + .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2633 ++++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 225 + .../pip/_vendor/rich/default_styles.py | 190 + .../pip/_vendor/rich/diagnose.py | 37 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 57 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 443 + .../site-packages/pip/_vendor/rich/live.py | 375 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 289 + .../site-packages/pip/_vendor/rich/markup.py | 246 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 308 + .../site-packages/pip/_vendor/rich/pretty.py | 994 ++ .../pip/_vendor/rich/progress.py | 1702 +++ .../pip/_vendor/rich/progress_bar.py | 224 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 130 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 739 ++ .../site-packages/pip/_vendor/rich/spinner.py | 137 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 796 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 948 ++ .../site-packages/pip/_vendor/rich/table.py | 1002 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1307 ++ .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 756 ++ .../site-packages/pip/_vendor/rich/tree.py | 251 + .../site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 608 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27078 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 0 -> 4798 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 2307 bytes .../__pycache__/after.cpython-312.pyc | Bin 0 -> 1616 bytes .../__pycache__/before.cpython-312.pyc | Bin 0 -> 1456 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 0 -> 2294 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 0 -> 1404 bytes .../__pycache__/retry.cpython-312.pyc | Bin 0 -> 14273 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 0 -> 5560 bytes .../__pycache__/tornadoweb.cpython-312.pyc | Bin 0 -> 2578 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 0 -> 12405 bytes .../pip/_vendor/tenacity/_asyncio.py | 94 + .../pip/_vendor/tenacity/_utils.py | 76 + .../pip/_vendor/tenacity/after.py | 51 + .../pip/_vendor/tenacity/before.py | 46 + .../pip/_vendor/tenacity/before_sleep.py | 71 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 272 + .../pip/_vendor/tenacity/stop.py | 103 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 228 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 376 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 0 -> 26919 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 0 -> 3900 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 0 -> 358 bytes .../pip/_vendor/tomli/_parser.py | 691 + .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../pip/_vendor/truststore/__init__.py | 13 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 610 bytes .../__pycache__/_api.cpython-312.pyc | Bin 0 -> 15789 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 0 -> 16654 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 0 -> 2207 bytes .../_ssl_constants.cpython-312.pyc | Bin 0 -> 1091 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 0 -> 15498 bytes .../pip/_vendor/truststore/_api.py | 302 + .../pip/_vendor/truststore/_macos.py | 501 + .../pip/_vendor/truststore/_openssl.py | 66 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 554 + .../pip/_vendor/typing_extensions.py | 3072 +++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3397 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 16480 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 210 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 20399 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 36434 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13485 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 10405 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 4010 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 20792 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 7286 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 33960 bytes .../pip/_vendor/urllib3/_collections.py | 355 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 572 + .../pip/_vendor/urllib3/connectionpool.py | 1137 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 190 bytes .../_appengine_environ.cpython-312.pyc | Bin 0 -> 1840 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 0 -> 11556 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 0 -> 5711 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 24442 bytes .../securetransport.cpython-312.pyc | Bin 0 -> 35548 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 7503 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 207 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 0 -> 17419 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 0 -> 14793 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 921 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 191 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 0 -> 41311 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 201 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 0 -> 1817 bytes .../weakref_finalize.cpython-312.pyc | Bin 0 -> 7323 bytes .../urllib3/packages/backports/makefile.py | 51 + .../packages/backports/weakref_finalize.py | 155 + .../pip/_vendor/urllib3/packages/six.py | 1076 ++ .../pip/_vendor/urllib3/poolmanager.py | 556 + .../pip/_vendor/urllib3/request.py | 191 + .../pip/_vendor/urllib3/response.py | 879 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1138 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4748 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1544 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 0 -> 1344 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 4175 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 2981 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 21710 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 15095 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5063 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 10764 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11131 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 15787 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 4395 bytes .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 622 + .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 271 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../site-packages/pip/_vendor/vendor.txt | 24 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 11993 bytes .../__pycache__/labels.cpython-312.pyc | Bin 0 -> 7124 bytes .../__pycache__/mklabels.cpython-312.pyc | Bin 0 -> 2691 bytes .../__pycache__/tests.cpython-312.pyc | Bin 0 -> 9243 bytes .../x_user_defined.cpython-312.pyc | Bin 0 -> 3287 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../lib/python3.12/site-packages/pip/py.typed | 4 + .../python_dotenv-1.0.1.dist-info/INSTALLER | 1 + .../python_dotenv-1.0.1.dist-info/LICENSE | 27 + .../python_dotenv-1.0.1.dist-info/METADATA | 692 + .../python_dotenv-1.0.1.dist-info/RECORD | 26 + .../python_dotenv-1.0.1.dist-info/REQUESTED | 0 .../python_dotenv-1.0.1.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../top_level.txt | 1 + .../requests-2.32.5.dist-info/INSTALLER | 1 + .../requests-2.32.5.dist-info/METADATA | 133 + .../requests-2.32.5.dist-info/RECORD | 42 + .../requests-2.32.5.dist-info/WHEEL | 5 + .../licenses/LICENSE | 175 + .../requests-2.32.5.dist-info/top_level.txt | 1 + .../site-packages/requests/__init__.py | 184 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5400 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 564 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2004 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 27791 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7184 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13903 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 646 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 2360 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25256 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7565 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4307 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1032 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35481 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 1119 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27870 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 6011 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5597 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36158 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 50 + .../site-packages/requests/adapters.py | 696 + .../python3.12/site-packages/requests/api.py | 157 + .../python3.12/site-packages/requests/auth.py | 314 + .../site-packages/requests/certs.py | 17 + .../site-packages/requests/compat.py | 106 + .../site-packages/requests/cookies.py | 561 + .../site-packages/requests/exceptions.py | 151 + .../python3.12/site-packages/requests/help.py | 134 + .../site-packages/requests/hooks.py | 33 + .../site-packages/requests/models.py | 1039 ++ .../site-packages/requests/packages.py | 23 + .../site-packages/requests/sessions.py | 831 ++ .../site-packages/requests/status_codes.py | 128 + .../site-packages/requests/structures.py | 99 + .../site-packages/requests/utils.py | 1086 ++ .../stripe-10.8.0.dist-info/INSTALLER | 1 + .../stripe-10.8.0.dist-info/LICENSE | 21 + .../stripe-10.8.0.dist-info/METADATA | 71 + .../stripe-10.8.0.dist-info/RECORD | 1091 ++ .../stripe-10.8.0.dist-info/REQUESTED | 0 .../stripe-10.8.0.dist-info/WHEEL | 6 + .../stripe-10.8.0.dist-info/top_level.txt | 1 + .../site-packages/stripe/__init__.py | 530 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 18887 bytes .../__pycache__/_account.cpython-312.pyc | Bin 0 -> 117539 bytes ...account_capability_service.cpython-312.pyc | Bin 0 -> 5374 bytes ...t_external_account_service.cpython-312.pyc | Bin 0 -> 12911 bytes .../__pycache__/_account_link.cpython-312.pyc | Bin 0 -> 3317 bytes .../_account_link_service.cpython-312.pyc | Bin 0 -> 2808 bytes ...account_login_link_service.cpython-312.pyc | Bin 0 -> 2427 bytes .../_account_person_service.cpython-312.pyc | Bin 0 -> 21766 bytes .../_account_service.cpython-312.pyc | Bin 0 -> 88608 bytes .../_account_session.cpython-312.pyc | Bin 0 -> 16852 bytes .../_account_session_service.cpython-312.pyc | Bin 0 -> 10856 bytes .../__pycache__/_any_iterator.cpython-312.pyc | Bin 0 -> 1792 bytes .../__pycache__/_api_mode.cpython-312.pyc | Bin 0 -> 268 bytes .../_api_requestor.cpython-312.pyc | Bin 0 -> 23696 bytes .../__pycache__/_api_resource.cpython-312.pyc | Bin 0 -> 8004 bytes .../__pycache__/_api_version.cpython-312.pyc | Bin 0 -> 373 bytes .../__pycache__/_app_info.cpython-312.pyc | Bin 0 -> 591 bytes .../_apple_pay_domain.cpython-312.pyc | Bin 0 -> 8174 bytes .../_apple_pay_domain_service.cpython-312.pyc | Bin 0 -> 5849 bytes .../__pycache__/_application.cpython-312.pyc | Bin 0 -> 803 bytes .../_application_fee.cpython-312.pyc | Bin 0 -> 15514 bytes .../_application_fee_refund.cpython-312.pyc | Bin 0 -> 3136 bytes ...ication_fee_refund_service.cpython-312.pyc | Bin 0 -> 7920 bytes .../_application_fee_service.cpython-312.pyc | Bin 0 -> 4724 bytes .../__pycache__/_apps_service.cpython-312.pyc | Bin 0 -> 811 bytes .../__pycache__/_balance.cpython-312.pyc | Bin 0 -> 6766 bytes .../_balance_service.cpython-312.pyc | Bin 0 -> 2071 bytes .../_balance_transaction.cpython-312.pyc | Bin 0 -> 7994 bytes ...alance_transaction_service.cpython-312.pyc | Bin 0 -> 4668 bytes .../__pycache__/_bank_account.cpython-312.pyc | Bin 0 -> 12860 bytes .../__pycache__/_base_address.cpython-312.pyc | Bin 0 -> 709 bytes .../_billing_portal_service.cpython-312.pyc | Bin 0 -> 1032 bytes .../_billing_service.cpython-312.pyc | Bin 0 -> 1340 bytes .../__pycache__/_capability.cpython-312.pyc | Bin 0 -> 8421 bytes .../stripe/__pycache__/_card.cpython-312.pyc | Bin 0 -> 8617 bytes .../__pycache__/_cash_balance.cpython-312.pyc | Bin 0 -> 2257 bytes .../__pycache__/_charge.cpython-312.pyc | Bin 0 -> 60427 bytes .../_charge_service.cpython-312.pyc | Bin 0 -> 15287 bytes .../_checkout_service.cpython-312.pyc | Bin 0 -> 830 bytes .../_client_options.cpython-312.pyc | Bin 0 -> 871 bytes .../_climate_service.cpython-312.pyc | Bin 0 -> 1131 bytes .../_confirmation_token.cpython-312.pyc | Bin 0 -> 52586 bytes ...confirmation_token_service.cpython-312.pyc | Bin 0 -> 2269 bytes ...onnect_collection_transfer.cpython-312.pyc | Bin 0 -> 1051 bytes .../__pycache__/_country_spec.cpython-312.pyc | Bin 0 -> 5290 bytes .../_country_spec_service.cpython-312.pyc | Bin 0 -> 3579 bytes .../__pycache__/_coupon.cpython-312.pyc | Bin 0 -> 13745 bytes .../_coupon_service.cpython-312.pyc | Bin 0 -> 9965 bytes .../_createable_api_resource.cpython-312.pyc | Bin 0 -> 985 bytes .../__pycache__/_credit_note.cpython-312.pyc | Bin 0 -> 25054 bytes .../_credit_note_line_item.cpython-312.pyc | Bin 0 -> 2818 bytes ...dit_note_line_item_service.cpython-312.pyc | Bin 0 -> 2664 bytes ...note_preview_lines_service.cpython-312.pyc | Bin 0 -> 4680 bytes .../_credit_note_service.cpython-312.pyc | Bin 0 -> 14466 bytes .../_custom_method.cpython-312.pyc | Bin 0 -> 2619 bytes .../__pycache__/_customer.cpython-312.pyc | Bin 0 -> 73532 bytes ...stomer_balance_transaction.cpython-312.pyc | Bin 0 -> 3330 bytes ...alance_transaction_service.cpython-312.pyc | Bin 0 -> 7431 bytes ...tomer_cash_balance_service.cpython-312.pyc | Bin 0 -> 3929 bytes ...r_cash_balance_transaction.cpython-312.pyc | Bin 0 -> 5887 bytes ...alance_transaction_service.cpython-312.pyc | Bin 0 -> 4369 bytes ...nding_instructions_service.cpython-312.pyc | Bin 0 -> 3755 bytes ...mer_payment_method_service.cpython-312.pyc | Bin 0 -> 4618 bytes ...mer_payment_source_service.cpython-312.pyc | Bin 0 -> 12877 bytes .../_customer_service.cpython-312.pyc | Bin 0 -> 22608 bytes .../_customer_session.cpython-312.pyc | Bin 0 -> 6760 bytes .../_customer_session_service.cpython-312.pyc | Bin 0 -> 4457 bytes .../_customer_tax_id_service.cpython-312.pyc | Bin 0 -> 7138 bytes .../_deletable_api_resource.cpython-312.pyc | Bin 0 -> 1584 bytes .../__pycache__/_discount.cpython-312.pyc | Bin 0 -> 1919 bytes .../__pycache__/_dispute.cpython-312.pyc | Bin 0 -> 15824 bytes .../_dispute_service.cpython-312.pyc | Bin 0 -> 9194 bytes .../__pycache__/_encode.cpython-312.pyc | Bin 0 -> 2475 bytes .../_entitlements_service.cpython-312.pyc | Bin 0 -> 1043 bytes .../_ephemeral_key.cpython-312.pyc | Bin 0 -> 4738 bytes .../_ephemeral_key_service.cpython-312.pyc | Bin 0 -> 3492 bytes .../stripe/__pycache__/_error.cpython-312.pyc | Bin 0 -> 7010 bytes .../__pycache__/_error_object.cpython-312.pyc | Bin 0 -> 3274 bytes .../stripe/__pycache__/_event.cpython-312.pyc | Bin 0 -> 14019 bytes .../_event_service.cpython-312.pyc | Bin 0 -> 4431 bytes .../_exchange_rate.cpython-312.pyc | Bin 0 -> 5361 bytes .../_exchange_rate_service.cpython-312.pyc | Bin 0 -> 3731 bytes .../_expandable_field.cpython-312.pyc | Bin 0 -> 317 bytes .../stripe/__pycache__/_file.cpython-312.pyc | Bin 0 -> 7918 bytes .../__pycache__/_file_link.cpython-312.pyc | Bin 0 -> 7584 bytes .../_file_link_service.cpython-312.pyc | Bin 0 -> 6613 bytes .../__pycache__/_file_service.cpython-312.pyc | Bin 0 -> 6550 bytes ...ancial_connections_service.cpython-312.pyc | Bin 0 -> 1235 bytes .../_forwarding_service.cpython-312.pyc | Bin 0 -> 838 bytes .../_funding_instructions.cpython-312.pyc | Bin 0 -> 4627 bytes .../__pycache__/_http_client.cpython-312.pyc | Bin 0 -> 56061 bytes .../_identity_service.cpython-312.pyc | Bin 0 -> 1067 bytes .../__pycache__/_invoice.cpython-312.pyc | Bin 0 -> 168784 bytes .../__pycache__/_invoice_item.cpython-312.pyc | Bin 0 -> 16729 bytes .../_invoice_item_service.cpython-312.pyc | Bin 0 -> 11860 bytes .../_invoice_line_item.cpython-312.pyc | Bin 0 -> 9725 bytes ..._invoice_line_item_service.cpython-312.pyc | Bin 0 -> 8175 bytes .../_invoice_service.cpython-312.pyc | Bin 0 -> 105912 bytes ...ice_upcoming_lines_service.cpython-312.pyc | Bin 0 -> 26331 bytes .../_issuing_service.cpython-312.pyc | Bin 0 -> 2014 bytes .../__pycache__/_line_item.cpython-312.pyc | Bin 0 -> 2350 bytes .../__pycache__/_list_object.cpython-312.pyc | Bin 0 -> 10236 bytes .../_listable_api_resource.cpython-312.pyc | Bin 0 -> 1499 bytes .../__pycache__/_login_link.cpython-312.pyc | Bin 0 -> 1055 bytes .../__pycache__/_mandate.cpython-312.pyc | Bin 0 -> 7739 bytes .../_mandate_service.cpython-312.pyc | Bin 0 -> 2127 bytes .../_multipart_data_generator.cpython-312.pyc | Bin 0 -> 4471 bytes ...ted_resource_class_methods.cpython-312.pyc | Bin 0 -> 4600 bytes .../stripe/__pycache__/_oauth.cpython-312.pyc | Bin 0 -> 7372 bytes .../_oauth_service.cpython-312.pyc | Bin 0 -> 4230 bytes .../_object_classes.cpython-312.pyc | Bin 0 -> 18672 bytes .../_payment_intent.cpython-312.pyc | Bin 0 -> 209130 bytes .../_payment_intent_service.cpython-312.pyc | Bin 0 -> 156983 bytes .../__pycache__/_payment_link.cpython-312.pyc | Bin 0 -> 52040 bytes ...ent_link_line_item_service.cpython-312.pyc | Bin 0 -> 2669 bytes .../_payment_link_service.cpython-312.pyc | Bin 0 -> 36510 bytes .../_payment_method.cpython-312.pyc | Bin 0 -> 58507 bytes ...yment_method_configuration.cpython-312.pyc | Bin 0 -> 82453 bytes ...thod_configuration_service.cpython-312.pyc | Bin 0 -> 61912 bytes .../_payment_method_domain.cpython-312.pyc | Bin 0 -> 12916 bytes ...ment_method_domain_service.cpython-312.pyc | Bin 0 -> 8146 bytes .../_payment_method_service.cpython-312.pyc | Bin 0 -> 29257 bytes .../__pycache__/_payout.cpython-312.pyc | Bin 0 -> 17253 bytes .../_payout_service.cpython-312.pyc | Bin 0 -> 11255 bytes .../__pycache__/_person.cpython-312.pyc | Bin 0 -> 14023 bytes .../stripe/__pycache__/_plan.cpython-312.pyc | Bin 0 -> 15234 bytes .../__pycache__/_plan_service.cpython-312.pyc | Bin 0 -> 10492 bytes .../stripe/__pycache__/_price.cpython-312.pyc | Bin 0 -> 20837 bytes .../_price_service.cpython-312.pyc | Bin 0 -> 15358 bytes .../__pycache__/_product.cpython-312.pyc | Bin 0 -> 26030 bytes .../_product_feature.cpython-312.pyc | Bin 0 -> 1205 bytes .../_product_feature_service.cpython-312.pyc | Bin 0 -> 6564 bytes .../_product_service.cpython-312.pyc | Bin 0 -> 15843 bytes .../_promotion_code.cpython-312.pyc | Bin 0 -> 10808 bytes .../_promotion_code_service.cpython-312.pyc | Bin 0 -> 9010 bytes .../stripe/__pycache__/_quote.cpython-312.pyc | Bin 0 -> 45607 bytes ...upfront_line_items_service.cpython-312.pyc | Bin 0 -> 2829 bytes .../_quote_line_item_service.cpython-312.pyc | Bin 0 -> 2608 bytes .../_quote_service.cpython-312.pyc | Bin 0 -> 22112 bytes .../_radar_service.cpython-312.pyc | Bin 0 -> 1193 bytes .../__pycache__/_refund.cpython-312.pyc | Bin 0 -> 25773 bytes .../_refund_service.cpython-312.pyc | Bin 0 -> 9288 bytes .../_reporting_service.cpython-312.pyc | Bin 0 -> 1011 bytes .../_request_metrics.cpython-312.pyc | Bin 0 -> 1121 bytes .../_request_options.cpython-312.pyc | Bin 0 -> 2574 bytes .../_requestor_options.cpython-312.pyc | Bin 0 -> 3420 bytes .../_reserve_transaction.cpython-312.pyc | Bin 0 -> 848 bytes .../__pycache__/_reversal.cpython-312.pyc | Bin 0 -> 3685 bytes .../__pycache__/_review.cpython-312.pyc | Bin 0 -> 9347 bytes .../_review_service.cpython-312.pyc | Bin 0 -> 5279 bytes .../_search_result_object.cpython-312.pyc | Bin 0 -> 7997 bytes .../_searchable_api_resource.cpython-312.pyc | Bin 0 -> 2132 bytes .../_setup_attempt.cpython-312.pyc | Bin 0 -> 19593 bytes .../_setup_attempt_service.cpython-312.pyc | Bin 0 -> 2680 bytes .../__pycache__/_setup_intent.cpython-312.pyc | Bin 0 -> 113151 bytes .../_setup_intent_service.cpython-312.pyc | Bin 0 -> 92035 bytes .../_shipping_rate.cpython-312.pyc | Bin 0 -> 12403 bytes .../_shipping_rate_service.cpython-312.pyc | Bin 0 -> 9871 bytes .../_sigma_service.cpython-312.pyc | Bin 0 -> 857 bytes .../_singleton_api_resource.cpython-312.pyc | Bin 0 -> 1584 bytes .../__pycache__/_source.cpython-312.pyc | Bin 0 -> 38716 bytes ...ource_mandate_notification.cpython-312.pyc | Bin 0 -> 2303 bytes .../_source_service.cpython-312.pyc | Bin 0 -> 18388 bytes .../_source_transaction.cpython-312.pyc | Bin 0 -> 3641 bytes ...source_transaction_service.cpython-312.pyc | Bin 0 -> 2511 bytes .../_stripe_client.cpython-312.pyc | Bin 0 -> 14537 bytes .../_stripe_object.cpython-312.pyc | Bin 0 -> 23051 bytes .../_stripe_response.cpython-312.pyc | Bin 0 -> 3827 bytes .../_stripe_service.cpython-312.pyc | Bin 0 -> 3061 bytes .../__pycache__/_subscription.cpython-312.pyc | Bin 0 -> 71216 bytes .../_subscription_item.cpython-312.pyc | Bin 0 -> 20529 bytes ..._subscription_item_service.cpython-312.pyc | Bin 0 -> 12706 bytes ..._item_usage_record_service.cpython-312.pyc | Bin 0 -> 3694 bytes ...age_record_summary_service.cpython-312.pyc | Bin 0 -> 3209 bytes .../_subscription_schedule.cpython-312.pyc | Bin 0 -> 46463 bytes ...scription_schedule_service.cpython-312.pyc | Bin 0 -> 33245 bytes .../_subscription_service.cpython-312.pyc | Bin 0 -> 52440 bytes .../__pycache__/_tax_code.cpython-312.pyc | Bin 0 -> 3914 bytes .../_tax_code_service.cpython-312.pyc | Bin 0 -> 3687 bytes .../_tax_deducted_at_source.cpython-312.pyc | Bin 0 -> 856 bytes .../__pycache__/_tax_id.cpython-312.pyc | Bin 0 -> 11449 bytes .../_tax_id_service.cpython-312.pyc | Bin 0 -> 7126 bytes .../__pycache__/_tax_rate.cpython-312.pyc | Bin 0 -> 8744 bytes .../_tax_rate_service.cpython-312.pyc | Bin 0 -> 7418 bytes .../__pycache__/_tax_service.cpython-312.pyc | Bin 0 -> 1308 bytes .../_terminal_service.cpython-312.pyc | Bin 0 -> 1341 bytes .../__pycache__/_test_helpers.cpython-312.pyc | Bin 0 -> 3447 bytes .../_test_helpers_service.cpython-312.pyc | Bin 0 -> 1848 bytes .../stripe/__pycache__/_token.cpython-312.pyc | Bin 0 -> 24726 bytes .../_token_service.cpython-312.pyc | Bin 0 -> 23676 bytes .../stripe/__pycache__/_topup.cpython-312.pyc | Bin 0 -> 11851 bytes .../_topup_service.cpython-312.pyc | Bin 0 -> 8438 bytes .../__pycache__/_transfer.cpython-312.pyc | Bin 0 -> 16192 bytes ..._transfer_reversal_service.cpython-312.pyc | Bin 0 -> 7784 bytes .../_transfer_service.cpython-312.pyc | Bin 0 -> 7984 bytes .../_treasury_service.cpython-312.pyc | Bin 0 -> 2477 bytes .../_updateable_api_resource.cpython-312.pyc | Bin 0 -> 1969 bytes .../__pycache__/_usage_record.cpython-312.pyc | Bin 0 -> 1825 bytes .../_usage_record_summary.cpython-312.pyc | Bin 0 -> 1250 bytes .../stripe/__pycache__/_util.cpython-312.pyc | Bin 0 -> 15068 bytes .../__pycache__/_verify_mixin.cpython-312.pyc | Bin 0 -> 1379 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 192 bytes .../__pycache__/_webhook.cpython-312.pyc | Bin 0 -> 4302 bytes .../_webhook_endpoint.cpython-312.pyc | Bin 0 -> 19288 bytes .../_webhook_endpoint_service.cpython-312.pyc | Bin 0 -> 16354 bytes .../__pycache__/api_version.cpython-312.pyc | Bin 0 -> 494 bytes .../__pycache__/app_info.cpython-312.pyc | Bin 0 -> 496 bytes .../stripe/__pycache__/error.cpython-312.pyc | Bin 0 -> 1046 bytes .../__pycache__/http_client.cpython-312.pyc | Bin 0 -> 627 bytes .../multipart_data_generator.cpython-312.pyc | Bin 0 -> 544 bytes .../stripe/__pycache__/oauth.cpython-312.pyc | Bin 0 -> 606 bytes .../__pycache__/oauth_error.cpython-312.pyc | Bin 0 -> 2241 bytes .../request_metrics.cpython-312.pyc | Bin 0 -> 509 bytes .../request_options.cpython-312.pyc | Bin 0 -> 680 bytes .../__pycache__/stripe_object.cpython-312.pyc | Bin 0 -> 659 bytes .../stripe_response.cpython-312.pyc | Bin 0 -> 731 bytes .../stripe/__pycache__/util.cpython-312.pyc | Bin 0 -> 627 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 529 bytes .../__pycache__/webhook.cpython-312.pyc | Bin 0 -> 652 bytes .../site-packages/stripe/_account.py | 5033 ++++++++ .../stripe/_account_capability_service.py | 181 + .../_account_external_account_service.py | 459 + .../site-packages/stripe/_account_link.py | 108 + .../stripe/_account_link_service.py | 91 + .../stripe/_account_login_link_service.py | 66 + .../stripe/_account_person_service.py | 1056 ++ .../site-packages/stripe/_account_service.py | 3657 ++++++ .../site-packages/stripe/_account_session.py | 607 + .../stripe/_account_session_service.py | 365 + .../site-packages/stripe/_any_iterator.py | 34 + .../site-packages/stripe/_api_mode.py | 4 + .../site-packages/stripe/_api_requestor.py | 779 ++ .../site-packages/stripe/_api_resource.py | 244 + .../site-packages/stripe/_api_version.py | 4 + .../site-packages/stripe/_app_info.py | 9 + .../site-packages/stripe/_apple_pay_domain.py | 271 + .../stripe/_apple_pay_domain_service.py | 218 + .../site-packages/stripe/_application.py | 25 + .../site-packages/stripe/_application_fee.py | 618 + .../stripe/_application_fee_refund.py | 80 + .../stripe/_application_fee_refund_service.py | 263 + .../stripe/_application_fee_service.py | 148 + .../site-packages/stripe/_apps_service.py | 10 + .../site-packages/stripe/_balance.py | 261 + .../site-packages/stripe/_balance_service.py | 57 + .../stripe/_balance_transaction.py | 327 + .../stripe/_balance_transaction_service.py | 163 + .../site-packages/stripe/_bank_account.py | 522 + .../site-packages/stripe/_base_address.py | 11 + .../stripe/_billing_portal_service.py | 12 + .../site-packages/stripe/_billing_service.py | 20 + .../site-packages/stripe/_capability.py | 399 + .../python3.12/site-packages/stripe/_card.py | 322 + .../site-packages/stripe/_cash_balance.py | 58 + .../site-packages/stripe/_charge.py | 2763 ++++ .../site-packages/stripe/_charge_service.py | 634 + .../site-packages/stripe/_checkout_service.py | 10 + .../site-packages/stripe/_client_options.py | 17 + .../site-packages/stripe/_climate_service.py | 14 + .../stripe/_confirmation_token.py | 2282 ++++ .../stripe/_confirmation_token_service.py | 62 + .../stripe/_connect_collection_transfer.py | 39 + .../site-packages/stripe/_country_spec.py | 164 + .../stripe/_country_spec_service.py | 121 + .../site-packages/stripe/_coupon.py | 481 + .../site-packages/stripe/_coupon_service.py | 364 + .../stripe/_createable_api_resource.py | 14 + .../site-packages/stripe/_credit_note.py | 1127 ++ .../stripe/_credit_note_line_item.py | 139 + .../stripe/_credit_note_line_item_service.py | 75 + .../_credit_note_preview_lines_service.py | 191 + .../stripe/_credit_note_service.py | 620 + .../site-packages/stripe/_custom_method.py | 71 + .../site-packages/stripe/_customer.py | 3019 +++++ .../stripe/_customer_balance_transaction.py | 107 + .../_customer_balance_transaction_service.py | 263 + .../stripe/_customer_cash_balance_service.py | 128 + .../_customer_cash_balance_transaction.py | 202 + ...stomer_cash_balance_transaction_service.py | 133 + .../_customer_funding_instructions_service.py | 112 + .../_customer_payment_method_service.py | 181 + .../_customer_payment_source_service.py | 474 + .../site-packages/stripe/_customer_service.py | 965 ++ .../site-packages/stripe/_customer_session.py | 267 + .../stripe/_customer_session_service.py | 145 + .../stripe/_customer_tax_id_service.py | 318 + .../stripe/_deletable_api_resource.py | 23 + .../site-packages/stripe/_discount.py | 76 + .../site-packages/stripe/_dispute.py | 691 + .../site-packages/stripe/_dispute_service.py | 377 + .../site-packages/stripe/_encode.py | 45 + .../stripe/_entitlements_service.py | 14 + .../site-packages/stripe/_ephemeral_key.py | 161 + .../stripe/_ephemeral_key_service.py | 120 + .../python3.12/site-packages/stripe/_error.py | 179 + .../site-packages/stripe/_error_object.py | 136 + .../python3.12/site-packages/stripe/_event.py | 461 + .../site-packages/stripe/_event_service.py | 151 + .../site-packages/stripe/_exchange_rate.py | 139 + .../stripe/_exchange_rate_service.py | 121 + .../site-packages/stripe/_expandable_field.py | 4 + .../python3.12/site-packages/stripe/_file.py | 315 + .../site-packages/stripe/_file_link.py | 283 + .../stripe/_file_link_service.py | 261 + .../site-packages/stripe/_file_service.py | 244 + .../stripe/_financial_connections_service.py | 16 + .../stripe/_forwarding_service.py | 10 + .../stripe/_funding_instructions.py | 214 + .../site-packages/stripe/_http_client.py | 1514 +++ .../site-packages/stripe/_identity_service.py | 18 + .../site-packages/stripe/_invoice.py | 7783 +++++++++++ .../site-packages/stripe/_invoice_item.py | 689 + .../stripe/_invoice_item_service.py | 534 + .../stripe/_invoice_line_item.py | 445 + .../stripe/_invoice_line_item_service.py | 328 + .../site-packages/stripe/_invoice_service.py | 4707 +++++++ .../stripe/_invoice_upcoming_lines_service.py | 1196 ++ .../site-packages/stripe/_issuing_service.py | 28 + .../site-packages/stripe/_line_item.py | 119 + .../site-packages/stripe/_list_object.py | 261 + .../stripe/_listable_api_resource.py | 31 + .../site-packages/stripe/_login_link.py | 25 + .../site-packages/stripe/_mandate.py | 249 + .../site-packages/stripe/_mandate_service.py | 58 + .../stripe/_multipart_data_generator.py | 87 + .../stripe/_nested_resource_class_methods.py | 118 + .../python3.12/site-packages/stripe/_oauth.py | 357 + .../site-packages/stripe/_oauth_service.py | 101 + .../site-packages/stripe/_object_classes.py | 145 + .../site-packages/stripe/_payment_intent.py | 10645 ++++++++++++++++ .../stripe/_payment_intent_service.py | 7838 ++++++++++++ .../site-packages/stripe/_payment_link.py | 2744 ++++ .../stripe/_payment_link_line_item_service.py | 75 + .../stripe/_payment_link_service.py | 1845 +++ .../site-packages/stripe/_payment_method.py | 2675 ++++ .../stripe/_payment_method_configuration.py | 2774 ++++ .../_payment_method_configuration_service.py | 1843 +++ .../stripe/_payment_method_domain.py | 490 + .../stripe/_payment_method_domain_service.py | 301 + .../stripe/_payment_method_service.py | 1135 ++ .../site-packages/stripe/_payout.py | 653 + .../site-packages/stripe/_payout_service.py | 419 + .../site-packages/stripe/_person.py | 691 + .../python3.12/site-packages/stripe/_plan.py | 607 + .../site-packages/stripe/_plan_service.py | 437 + .../python3.12/site-packages/stripe/_price.py | 911 ++ .../site-packages/stripe/_price_service.py | 686 + .../site-packages/stripe/_product.py | 1005 ++ .../site-packages/stripe/_product_feature.py | 38 + .../stripe/_product_feature_service.py | 240 + .../site-packages/stripe/_product_service.py | 661 + .../site-packages/stripe/_promotion_code.py | 401 + .../stripe/_promotion_code_service.py | 351 + .../python3.12/site-packages/stripe/_quote.py | 1924 +++ ...ote_computed_upfront_line_items_service.py | 75 + .../stripe/_quote_line_item_service.py | 75 + .../site-packages/stripe/_quote_service.py | 946 ++ .../site-packages/stripe/_radar_service.py | 14 + .../site-packages/stripe/_refund.py | 929 ++ .../site-packages/stripe/_refund_service.py | 370 + .../stripe/_reporting_service.py | 12 + .../site-packages/stripe/_request_metrics.py | 23 + .../site-packages/stripe/_request_options.py | 69 + .../stripe/_requestor_options.py | 78 + .../stripe/_reserve_transaction.py | 28 + .../site-packages/stripe/_reversal.py | 98 + .../site-packages/stripe/_review.py | 359 + .../site-packages/stripe/_review_service.py | 191 + .../stripe/_search_result_object.py | 180 + .../stripe/_searchable_api_resource.py | 49 + .../site-packages/stripe/_setup_attempt.py | 845 ++ .../stripe/_setup_attempt_service.py | 97 + .../site-packages/stripe/_setup_intent.py | 4709 +++++++ .../stripe/_setup_intent_service.py | 3813 ++++++ .../site-packages/stripe/_shipping_rate.py | 468 + .../stripe/_shipping_rate_service.py | 391 + .../site-packages/stripe/_sigma_service.py | 10 + .../stripe/_singleton_api_resource.py | 29 + .../site-packages/stripe/_source.py | 1473 +++ .../stripe/_source_mandate_notification.py | 100 + .../site-packages/stripe/_source_service.py | 762 ++ .../stripe/_source_transaction.py | 176 + .../stripe/_source_transaction_service.py | 75 + .../site-packages/stripe/_stripe_client.py | 270 + .../site-packages/stripe/_stripe_object.py | 624 + .../site-packages/stripe/_stripe_response.py | 66 + .../site-packages/stripe/_stripe_service.py | 100 + .../site-packages/stripe/_subscription.py | 2874 +++++ .../stripe/_subscription_item.py | 777 ++ .../stripe/_subscription_item_service.py | 544 + ..._subscription_item_usage_record_service.py | 86 + ...ption_item_usage_record_summary_service.py | 79 + .../stripe/_subscription_schedule.py | 2035 +++ .../stripe/_subscription_schedule_service.py | 1449 +++ .../stripe/_subscription_service.py | 2067 +++ .../site-packages/stripe/_tax_code.py | 118 + .../site-packages/stripe/_tax_code_service.py | 117 + .../stripe/_tax_deducted_at_source.py | 31 + .../site-packages/stripe/_tax_id.py | 527 + .../site-packages/stripe/_tax_id_service.py | 322 + .../site-packages/stripe/_tax_rate.py | 402 + .../site-packages/stripe/_tax_rate_service.py | 351 + .../site-packages/stripe/_tax_service.py | 16 + .../site-packages/stripe/_terminal_service.py | 16 + .../site-packages/stripe/_test_helpers.py | 65 + .../stripe/_test_helpers_service.py | 24 + .../python3.12/site-packages/stripe/_token.py | 1166 ++ .../site-packages/stripe/_token_service.py | 1130 ++ .../python3.12/site-packages/stripe/_topup.py | 456 + .../site-packages/stripe/_topup_service.py | 341 + .../site-packages/stripe/_transfer.py | 567 + .../stripe/_transfer_reversal_service.py | 263 + .../site-packages/stripe/_transfer_service.py | 298 + .../site-packages/stripe/_treasury_service.py | 28 + .../stripe/_updateable_api_resource.py | 31 + .../site-packages/stripe/_usage_record.py | 58 + .../stripe/_usage_record_summary.py | 48 + .../python3.12/site-packages/stripe/_util.py | 429 + .../site-packages/stripe/_verify_mixin.py | 21 + .../site-packages/stripe/_version.py | 1 + .../site-packages/stripe/_webhook.py | 96 + .../site-packages/stripe/_webhook_endpoint.py | 981 ++ .../stripe/_webhook_endpoint_service.py | 901 ++ .../stripe/api_resources/__init__.py | 142 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6690 bytes .../__pycache__/account.cpython-312.pyc | Bin 0 -> 664 bytes .../__pycache__/account_link.cpython-312.pyc | Bin 0 -> 696 bytes .../account_session.cpython-312.pyc | Bin 0 -> 720 bytes .../apple_pay_domain.cpython-312.pyc | Bin 0 -> 724 bytes .../__pycache__/application.cpython-312.pyc | Bin 0 -> 692 bytes .../application_fee.cpython-312.pyc | Bin 0 -> 720 bytes .../application_fee_refund.cpython-312.pyc | Bin 0 -> 766 bytes .../__pycache__/balance.cpython-312.pyc | Bin 0 -> 664 bytes .../balance_transaction.cpython-312.pyc | Bin 0 -> 748 bytes .../__pycache__/bank_account.cpython-312.pyc | Bin 0 -> 696 bytes .../__pycache__/capability.cpython-312.pyc | Bin 0 -> 685 bytes .../__pycache__/card.cpython-312.pyc | Bin 0 -> 643 bytes .../__pycache__/cash_balance.cpython-312.pyc | Bin 0 -> 696 bytes .../__pycache__/charge.cpython-312.pyc | Bin 0 -> 657 bytes .../confirmation_token.cpython-312.pyc | Bin 0 -> 741 bytes ...onnect_collection_transfer.cpython-312.pyc | Bin 0 -> 801 bytes .../__pycache__/country_spec.cpython-312.pyc | Bin 0 -> 696 bytes .../__pycache__/coupon.cpython-312.pyc | Bin 0 -> 657 bytes .../__pycache__/credit_note.cpython-312.pyc | Bin 0 -> 689 bytes .../credit_note_line_item.cpython-312.pyc | Bin 0 -> 756 bytes .../__pycache__/customer.cpython-312.pyc | Bin 0 -> 671 bytes ...stomer_balance_transaction.cpython-312.pyc | Bin 0 -> 808 bytes ...r_cash_balance_transaction.cpython-312.pyc | Bin 0 -> 840 bytes .../customer_session.cpython-312.pyc | Bin 0 -> 727 bytes .../__pycache__/discount.cpython-312.pyc | Bin 0 -> 671 bytes .../__pycache__/dispute.cpython-312.pyc | Bin 0 -> 664 bytes .../__pycache__/ephemeral_key.cpython-312.pyc | Bin 0 -> 706 bytes .../__pycache__/error_object.cpython-312.pyc | Bin 0 -> 700 bytes .../__pycache__/event.cpython-312.pyc | Bin 0 -> 650 bytes .../__pycache__/exchange_rate.cpython-312.pyc | Bin 0 -> 706 bytes .../__pycache__/file.cpython-312.pyc | Bin 0 -> 643 bytes .../__pycache__/file_link.cpython-312.pyc | Bin 0 -> 675 bytes .../funding_instructions.cpython-312.pyc | Bin 0 -> 755 bytes .../__pycache__/invoice.cpython-312.pyc | Bin 0 -> 664 bytes .../__pycache__/invoice_item.cpython-312.pyc | Bin 0 -> 696 bytes .../invoice_line_item.cpython-312.pyc | Bin 0 -> 731 bytes .../__pycache__/line_item.cpython-312.pyc | Bin 0 -> 675 bytes .../__pycache__/list_object.cpython-312.pyc | Bin 0 -> 689 bytes .../__pycache__/login_link.cpython-312.pyc | Bin 0 -> 682 bytes .../__pycache__/mandate.cpython-312.pyc | Bin 0 -> 664 bytes .../payment_intent.cpython-312.pyc | Bin 0 -> 713 bytes .../__pycache__/payment_link.cpython-312.pyc | Bin 0 -> 696 bytes .../payment_method.cpython-312.pyc | Bin 0 -> 713 bytes ...yment_method_configuration.cpython-312.pyc | Bin 0 -> 808 bytes .../payment_method_domain.cpython-312.pyc | Bin 0 -> 759 bytes .../__pycache__/payout.cpython-312.pyc | Bin 0 -> 657 bytes .../__pycache__/person.cpython-312.pyc | Bin 0 -> 657 bytes .../__pycache__/plan.cpython-312.pyc | Bin 0 -> 643 bytes .../__pycache__/price.cpython-312.pyc | Bin 0 -> 650 bytes .../__pycache__/product.cpython-312.pyc | Bin 0 -> 664 bytes .../product_feature.cpython-312.pyc | Bin 0 -> 720 bytes .../promotion_code.cpython-312.pyc | Bin 0 -> 713 bytes .../__pycache__/quote.cpython-312.pyc | Bin 0 -> 650 bytes .../recipient_transfer.cpython-312.pyc | Bin 0 -> 684 bytes .../__pycache__/refund.cpython-312.pyc | Bin 0 -> 657 bytes .../reserve_transaction.cpython-312.pyc | Bin 0 -> 748 bytes .../__pycache__/reversal.cpython-312.pyc | Bin 0 -> 671 bytes .../__pycache__/review.cpython-312.pyc | Bin 0 -> 657 bytes .../search_result_object.cpython-312.pyc | Bin 0 -> 752 bytes .../__pycache__/setup_attempt.cpython-312.pyc | Bin 0 -> 706 bytes .../__pycache__/setup_intent.cpython-312.pyc | Bin 0 -> 696 bytes .../__pycache__/shipping_rate.cpython-312.pyc | Bin 0 -> 706 bytes .../__pycache__/source.cpython-312.pyc | Bin 0 -> 657 bytes ...ource_mandate_notification.cpython-312.pyc | Bin 0 -> 801 bytes .../source_transaction.cpython-312.pyc | Bin 0 -> 741 bytes .../__pycache__/subscription.cpython-312.pyc | Bin 0 -> 699 bytes .../subscription_item.cpython-312.pyc | Bin 0 -> 734 bytes .../subscription_schedule.cpython-312.pyc | Bin 0 -> 762 bytes .../__pycache__/tax_code.cpython-312.pyc | Bin 0 -> 668 bytes .../tax_deducted_at_source.cpython-312.pyc | Bin 0 -> 763 bytes .../__pycache__/tax_id.cpython-312.pyc | Bin 0 -> 654 bytes .../__pycache__/tax_rate.cpython-312.pyc | Bin 0 -> 668 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 650 bytes .../__pycache__/topup.cpython-312.pyc | Bin 0 -> 650 bytes .../__pycache__/transfer.cpython-312.pyc | Bin 0 -> 671 bytes .../__pycache__/usage_record.cpython-312.pyc | Bin 0 -> 696 bytes .../usage_record_summary.cpython-312.pyc | Bin 0 -> 752 bytes .../webhook_endpoint.cpython-312.pyc | Bin 0 -> 727 bytes .../stripe/api_resources/abstract/__init__.py | 45 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1676 bytes .../__pycache__/api_resource.cpython-312.pyc | Bin 0 -> 705 bytes .../createable_api_resource.cpython-312.pyc | Bin 0 -> 782 bytes .../__pycache__/custom_method.cpython-312.pyc | Bin 0 -> 718 bytes .../deletable_api_resource.cpython-312.pyc | Bin 0 -> 775 bytes .../listable_api_resource.cpython-312.pyc | Bin 0 -> 768 bytes ...ted_resource_class_methods.cpython-312.pyc | Bin 0 -> 830 bytes .../searchable_api_resource.cpython-312.pyc | Bin 0 -> 782 bytes .../singleton_api_resource.cpython-312.pyc | Bin 0 -> 775 bytes .../__pycache__/test_helpers.cpython-312.pyc | Bin 0 -> 741 bytes .../updateable_api_resource.cpython-312.pyc | Bin 0 -> 782 bytes .../__pycache__/verify_mixin.cpython-312.pyc | Bin 0 -> 705 bytes .../api_resources/abstract/api_resource.py | 21 + .../abstract/createable_api_resource.py | 21 + .../api_resources/abstract/custom_method.py | 21 + .../abstract/deletable_api_resource.py | 21 + .../abstract/listable_api_resource.py | 21 + .../abstract/nested_resource_class_methods.py | 21 + .../abstract/searchable_api_resource.py | 21 + .../abstract/singleton_api_resource.py | 21 + .../api_resources/abstract/test_helpers.py | 21 + .../abstract/updateable_api_resource.py | 21 + .../api_resources/abstract/verify_mixin.py | 21 + .../stripe/api_resources/account.py | 21 + .../stripe/api_resources/account_link.py | 21 + .../stripe/api_resources/account_session.py | 21 + .../stripe/api_resources/apple_pay_domain.py | 21 + .../stripe/api_resources/application.py | 21 + .../stripe/api_resources/application_fee.py | 21 + .../api_resources/application_fee_refund.py | 21 + .../stripe/api_resources/apps/__init__.py | 19 + .../apps/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 680 bytes .../apps/__pycache__/secret.cpython-312.pyc | Bin 0 -> 687 bytes .../stripe/api_resources/apps/secret.py | 21 + .../stripe/api_resources/balance.py | 21 + .../api_resources/balance_transaction.py | 21 + .../stripe/api_resources/bank_account.py | 21 + .../stripe/api_resources/billing/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1113 bytes .../billing/__pycache__/alert.cpython-312.pyc | Bin 0 -> 701 bytes .../alert_triggered.cpython-312.pyc | Bin 0 -> 768 bytes .../billing/__pycache__/meter.cpython-312.pyc | Bin 0 -> 701 bytes .../__pycache__/meter_event.cpython-312.pyc | Bin 0 -> 740 bytes .../meter_event_adjustment.cpython-312.pyc | Bin 0 -> 814 bytes .../meter_event_summary.cpython-312.pyc | Bin 0 -> 793 bytes .../stripe/api_resources/billing/alert.py | 21 + .../api_resources/billing/alert_triggered.py | 21 + .../stripe/api_resources/billing/meter.py | 21 + .../api_resources/billing/meter_event.py | 21 + .../billing/meter_event_adjustment.py | 21 + .../billing/meter_event_summary.py | 21 + .../api_resources/billing_portal/__init__.py | 20 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 833 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 799 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 757 bytes .../billing_portal/configuration.py | 21 + .../api_resources/billing_portal/session.py | 21 + .../stripe/api_resources/capability.py | 21 + .../stripe/api_resources/card.py | 21 + .../stripe/api_resources/cash_balance.py | 21 + .../stripe/api_resources/charge.py | 21 + .../stripe/api_resources/checkout/__init__.py | 19 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 706 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 721 bytes .../stripe/api_resources/checkout/session.py | 21 + .../stripe/api_resources/climate/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 836 bytes .../climate/__pycache__/order.cpython-312.pyc | Bin 0 -> 701 bytes .../__pycache__/product.cpython-312.pyc | Bin 0 -> 715 bytes .../__pycache__/supplier.cpython-312.pyc | Bin 0 -> 722 bytes .../stripe/api_resources/climate/order.py | 21 + .../stripe/api_resources/climate/product.py | 21 + .../stripe/api_resources/climate/supplier.py | 21 + .../api_resources/confirmation_token.py | 21 + .../connect_collection_transfer.py | 21 + .../stripe/api_resources/country_spec.py | 21 + .../stripe/api_resources/coupon.py | 21 + .../stripe/api_resources/credit_note.py | 21 + .../api_resources/credit_note_line_item.py | 21 + .../stripe/api_resources/customer.py | 21 + .../customer_balance_transaction.py | 21 + .../customer_cash_balance_transaction.py | 21 + .../stripe/api_resources/customer_session.py | 21 + .../stripe/api_resources/discount.py | 21 + .../stripe/api_resources/dispute.py | 21 + .../api_resources/entitlements/__init__.py | 25 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 945 bytes .../active_entitlement.cpython-312.pyc | Bin 0 -> 819 bytes ...active_entitlement_summary.cpython-312.pyc | Bin 0 -> 872 bytes .../__pycache__/feature.cpython-312.pyc | Bin 0 -> 745 bytes .../entitlements/active_entitlement.py | 21 + .../active_entitlement_summary.py | 21 + .../api_resources/entitlements/feature.py | 21 + .../stripe/api_resources/ephemeral_key.py | 21 + .../stripe/api_resources/error_object.py | 20 + .../stripe/api_resources/event.py | 21 + .../stripe/api_resources/exchange_rate.py | 21 + .../stripe/api_resources/file.py | 21 + .../stripe/api_resources/file_link.py | 21 + .../financial_connections/__init__.py | 29 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1166 bytes .../__pycache__/account.cpython-312.pyc | Bin 0 -> 799 bytes .../__pycache__/account_owner.cpython-312.pyc | Bin 0 -> 838 bytes .../account_ownership.cpython-312.pyc | Bin 0 -> 866 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 799 bytes .../__pycache__/transaction.cpython-312.pyc | Bin 0 -> 827 bytes .../financial_connections/account.py | 21 + .../financial_connections/account_owner.py | 21 + .../account_ownership.py | 21 + .../financial_connections/session.py | 21 + .../financial_connections/transaction.py | 21 + .../api_resources/forwarding/__init__.py | 19 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 718 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 733 bytes .../api_resources/forwarding/request.py | 21 + .../api_resources/funding_instructions.py | 21 + .../stripe/api_resources/identity/__init__.py | 24 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 828 bytes .../verification_report.cpython-312.pyc | Bin 0 -> 802 bytes .../verification_session.cpython-312.pyc | Bin 0 -> 809 bytes .../identity/verification_report.py | 21 + .../identity/verification_session.py | 21 + .../stripe/api_resources/invoice.py | 21 + .../stripe/api_resources/invoice_item.py | 21 + .../stripe/api_resources/invoice_line_item.py | 21 + .../stripe/api_resources/issuing/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1248 bytes .../__pycache__/authorization.cpython-312.pyc | Bin 0 -> 757 bytes .../issuing/__pycache__/card.cpython-312.pyc | Bin 0 -> 691 bytes .../__pycache__/cardholder.cpython-312.pyc | Bin 0 -> 736 bytes .../__pycache__/dispute.cpython-312.pyc | Bin 0 -> 715 bytes .../personalization_design.cpython-312.pyc | Bin 0 -> 817 bytes .../physical_bundle.cpython-312.pyc | Bin 0 -> 768 bytes .../issuing/__pycache__/token.cpython-312.pyc | Bin 0 -> 701 bytes .../__pycache__/transaction.cpython-312.pyc | Bin 0 -> 743 bytes .../api_resources/issuing/authorization.py | 21 + .../stripe/api_resources/issuing/card.py | 21 + .../api_resources/issuing/cardholder.py | 21 + .../stripe/api_resources/issuing/dispute.py | 21 + .../issuing/personalization_design.py | 21 + .../api_resources/issuing/physical_bundle.py | 21 + .../stripe/api_resources/issuing/token.py | 21 + .../api_resources/issuing/transaction.py | 21 + .../stripe/api_resources/line_item.py | 21 + .../stripe/api_resources/list_object.py | 21 + .../stripe/api_resources/login_link.py | 21 + .../stripe/api_resources/mandate.py | 21 + .../stripe/api_resources/payment_intent.py | 21 + .../stripe/api_resources/payment_link.py | 21 + .../stripe/api_resources/payment_method.py | 21 + .../payment_method_configuration.py | 21 + .../api_resources/payment_method_domain.py | 21 + .../stripe/api_resources/payout.py | 21 + .../stripe/api_resources/person.py | 21 + .../stripe/api_resources/plan.py | 21 + .../stripe/api_resources/price.py | 21 + .../stripe/api_resources/product.py | 21 + .../stripe/api_resources/product_feature.py | 21 + .../stripe/api_resources/promotion_code.py | 21 + .../stripe/api_resources/quote.py | 21 + .../stripe/api_resources/radar/__init__.py | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 868 bytes .../early_fraud_warning.cpython-312.pyc | Bin 0 -> 781 bytes .../__pycache__/value_list.cpython-312.pyc | Bin 0 -> 721 bytes .../value_list_item.cpython-312.pyc | Bin 0 -> 753 bytes .../radar/early_fraud_warning.py | 21 + .../stripe/api_resources/radar/value_list.py | 21 + .../api_resources/radar/value_list_item.py | 21 + .../api_resources/recipient_transfer.py | 15 + .../stripe/api_resources/refund.py | 21 + .../api_resources/reporting/__init__.py | 20 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 795 bytes .../__pycache__/report_run.cpython-312.pyc | Bin 0 -> 745 bytes .../__pycache__/report_type.cpython-312.pyc | Bin 0 -> 752 bytes .../api_resources/reporting/report_run.py | 21 + .../api_resources/reporting/report_type.py | 21 + .../api_resources/reserve_transaction.py | 21 + .../stripe/api_resources/reversal.py | 21 + .../stripe/api_resources/review.py | 21 + .../api_resources/search_result_object.py | 21 + .../stripe/api_resources/setup_attempt.py | 21 + .../stripe/api_resources/setup_intent.py | 21 + .../stripe/api_resources/shipping_rate.py | 21 + .../stripe/api_resources/sigma/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 712 bytes .../scheduled_query_run.cpython-312.pyc | Bin 0 -> 781 bytes .../sigma/scheduled_query_run.py | 21 + .../stripe/api_resources/source.py | 21 + .../source_mandate_notification.py | 21 + .../api_resources/source_transaction.py | 21 + .../stripe/api_resources/subscription.py | 21 + .../stripe/api_resources/subscription_item.py | 21 + .../api_resources/subscription_schedule.py | 21 + .../stripe/api_resources/tax/__init__.py | 28 + .../tax/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1088 bytes .../__pycache__/calculation.cpython-312.pyc | Bin 0 -> 719 bytes .../calculation_line_item.cpython-312.pyc | Bin 0 -> 783 bytes .../__pycache__/registration.cpython-312.pyc | Bin 0 -> 726 bytes .../tax/__pycache__/settings.cpython-312.pyc | Bin 0 -> 695 bytes .../__pycache__/transaction.cpython-312.pyc | Bin 0 -> 719 bytes .../transaction_line_item.cpython-312.pyc | Bin 0 -> 783 bytes .../stripe/api_resources/tax/calculation.py | 21 + .../tax/calculation_line_item.py | 21 + .../stripe/api_resources/tax/registration.py | 21 + .../stripe/api_resources/tax/settings.py | 21 + .../stripe/api_resources/tax/transaction.py | 21 + .../tax/transaction_line_item.py | 21 + .../stripe/api_resources/tax_code.py | 21 + .../api_resources/tax_deducted_at_source.py | 21 + .../stripe/api_resources/tax_id.py | 21 + .../stripe/api_resources/tax_rate.py | 21 + .../stripe/api_resources/terminal/__init__.py | 22 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 945 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 763 bytes .../connection_token.cpython-312.pyc | Bin 0 -> 781 bytes .../__pycache__/location.cpython-312.pyc | Bin 0 -> 728 bytes .../__pycache__/reader.cpython-312.pyc | Bin 0 -> 714 bytes .../api_resources/terminal/configuration.py | 21 + .../terminal/connection_token.py | 21 + .../stripe/api_resources/terminal/location.py | 21 + .../stripe/api_resources/terminal/reader.py | 21 + .../api_resources/test_helpers/__init__.py | 19 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 738 bytes .../__pycache__/test_clock.cpython-312.pyc | Bin 0 -> 763 bytes .../api_resources/test_helpers/test_clock.py | 21 + .../stripe/api_resources/token.py | 21 + .../stripe/api_resources/topup.py | 21 + .../stripe/api_resources/transfer.py | 21 + .../stripe/api_resources/treasury/__init__.py | 37 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1611 bytes .../credit_reversal.cpython-312.pyc | Bin 0 -> 774 bytes .../debit_reversal.cpython-312.pyc | Bin 0 -> 767 bytes .../financial_account.cpython-312.pyc | Bin 0 -> 788 bytes ...financial_account_features.cpython-312.pyc | Bin 0 -> 848 bytes .../inbound_transfer.cpython-312.pyc | Bin 0 -> 781 bytes .../outbound_payment.cpython-312.pyc | Bin 0 -> 781 bytes .../outbound_transfer.cpython-312.pyc | Bin 0 -> 788 bytes .../received_credit.cpython-312.pyc | Bin 0 -> 774 bytes .../received_debit.cpython-312.pyc | Bin 0 -> 767 bytes .../__pycache__/transaction.cpython-312.pyc | Bin 0 -> 749 bytes .../transaction_entry.cpython-312.pyc | Bin 0 -> 788 bytes .../api_resources/treasury/credit_reversal.py | 21 + .../api_resources/treasury/debit_reversal.py | 21 + .../treasury/financial_account.py | 21 + .../treasury/financial_account_features.py | 21 + .../treasury/inbound_transfer.py | 21 + .../treasury/outbound_payment.py | 21 + .../treasury/outbound_transfer.py | 21 + .../api_resources/treasury/received_credit.py | 21 + .../api_resources/treasury/received_debit.py | 21 + .../api_resources/treasury/transaction.py | 21 + .../treasury/transaction_entry.py | 21 + .../stripe/api_resources/usage_record.py | 21 + .../api_resources/usage_record_summary.py | 21 + .../stripe/api_resources/webhook_endpoint.py | 21 + .../site-packages/stripe/api_version.py | 15 + .../site-packages/stripe/app_info.py | 21 + .../site-packages/stripe/apps/__init__.py | 4 + .../apps/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 295 bytes .../apps/__pycache__/_secret.cpython-312.pyc | Bin 0 -> 8602 bytes .../_secret_service.cpython-312.pyc | Bin 0 -> 6685 bytes .../site-packages/stripe/apps/_secret.py | 315 + .../stripe/apps/_secret_service.py | 274 + .../site-packages/stripe/billing/__init__.py | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 998 bytes .../__pycache__/_alert.cpython-312.pyc | Bin 0 -> 16058 bytes .../_alert_service.cpython-312.pyc | Bin 0 -> 9189 bytes .../_alert_triggered.cpython-312.pyc | Bin 0 -> 952 bytes .../__pycache__/_meter.cpython-312.pyc | Bin 0 -> 16773 bytes .../__pycache__/_meter_event.cpython-312.pyc | Bin 0 -> 2731 bytes .../_meter_event_adjustment.cpython-312.pyc | Bin 0 -> 3363 bytes ...r_event_adjustment_service.cpython-312.pyc | Bin 0 -> 2431 bytes .../_meter_event_service.cpython-312.pyc | Bin 0 -> 2084 bytes .../_meter_event_summary.cpython-312.pyc | Bin 0 -> 1158 bytes ...eter_event_summary_service.cpython-312.pyc | Bin 0 -> 2733 bytes .../_meter_service.cpython-312.pyc | Bin 0 -> 9761 bytes .../site-packages/stripe/billing/_alert.py | 585 + .../stripe/billing/_alert_service.py | 353 + .../stripe/billing/_alert_triggered.py | 38 + .../site-packages/stripe/billing/_meter.py | 626 + .../stripe/billing/_meter_event.py | 100 + .../stripe/billing/_meter_event_adjustment.py | 106 + .../_meter_event_adjustment_service.py | 73 + .../stripe/billing/_meter_event_service.py | 71 + .../stripe/billing/_meter_event_summary.py | 44 + .../billing/_meter_event_summary_service.py | 91 + .../stripe/billing/_meter_service.py | 374 + .../stripe/billing_portal/__init__.py | 10 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 501 bytes .../_configuration.cpython-312.pyc | Bin 0 -> 19398 bytes .../_configuration_service.cpython-312.pyc | Bin 0 -> 15477 bytes .../__pycache__/_session.cpython-312.pyc | Bin 0 -> 11800 bytes .../_session_service.cpython-312.pyc | Bin 0 -> 7022 bytes .../stripe/billing_portal/_configuration.py | 746 ++ .../billing_portal/_configuration_service.py | 578 + .../stripe/billing_portal/_session.py | 525 + .../stripe/billing_portal/_session_service.py | 274 + .../site-packages/stripe/checkout/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 406 bytes .../__pycache__/_session.cpython-312.pyc | Bin 0 -> 87419 bytes ..._session_line_item_service.cpython-312.pyc | Bin 0 -> 2655 bytes .../_session_service.cpython-312.pyc | Bin 0 -> 52369 bytes .../site-packages/stripe/checkout/_session.py | 4553 +++++++ .../checkout/_session_line_item_service.py | 75 + .../stripe/checkout/_session_service.py | 2553 ++++ .../site-packages/stripe/climate/__init__.py | 8 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 558 bytes .../__pycache__/_order.cpython-312.pyc | Bin 0 -> 13394 bytes .../_order_service.cpython-312.pyc | Bin 0 -> 8638 bytes .../__pycache__/_product.cpython-312.pyc | Bin 0 -> 4648 bytes .../_product_service.cpython-312.pyc | Bin 0 -> 3564 bytes .../__pycache__/_supplier.cpython-312.pyc | Bin 0 -> 4415 bytes .../_supplier_service.cpython-312.pyc | Bin 0 -> 3554 bytes .../site-packages/stripe/climate/_order.py | 525 + .../stripe/climate/_order_service.py | 315 + .../site-packages/stripe/climate/_product.py | 163 + .../stripe/climate/_product_service.py | 121 + .../site-packages/stripe/climate/_supplier.py | 159 + .../stripe/climate/_supplier_service.py | 121 + .../stripe/data/ca-certificates.crt | 3347 +++++ .../stripe/entitlements/__init__.py | 15 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 607 bytes .../_active_entitlement.cpython-312.pyc | Bin 0 -> 4061 bytes ...active_entitlement_service.cpython-312.pyc | Bin 0 -> 3704 bytes ...active_entitlement_summary.cpython-312.pyc | Bin 0 -> 1116 bytes .../__pycache__/_feature.cpython-312.pyc | Bin 0 -> 6882 bytes .../_feature_service.cpython-312.pyc | Bin 0 -> 6173 bytes .../entitlements/_active_entitlement.py | 132 + .../_active_entitlement_service.py | 125 + .../_active_entitlement_summary.py | 35 + .../stripe/entitlements/_feature.py | 248 + .../stripe/entitlements/_feature_service.py | 243 + .../python3.12/site-packages/stripe/error.py | 28 + .../stripe/financial_connections/__init__.py | 25 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 960 bytes .../__pycache__/_account.cpython-312.pyc | Bin 0 -> 24241 bytes .../_account_owner.cpython-312.pyc | Bin 0 -> 1080 bytes .../_account_owner_service.cpython-312.pyc | Bin 0 -> 2547 bytes .../_account_ownership.cpython-312.pyc | Bin 0 -> 1125 bytes .../_account_service.cpython-312.pyc | Bin 0 -> 9944 bytes .../__pycache__/_session.cpython-312.pyc | Bin 0 -> 6123 bytes .../_session_service.cpython-312.pyc | Bin 0 -> 4694 bytes .../__pycache__/_transaction.cpython-312.pyc | Bin 0 -> 5440 bytes .../_transaction_service.cpython-312.pyc | Bin 0 -> 4567 bytes .../stripe/financial_connections/_account.py | 956 ++ .../financial_connections/_account_owner.py | 47 + .../_account_owner_service.py | 79 + .../_account_ownership.py | 35 + .../financial_connections/_account_service.py | 366 + .../stripe/financial_connections/_session.py | 232 + .../financial_connections/_session_service.py | 168 + .../financial_connections/_transaction.py | 200 + .../_transaction_service.py | 161 + .../stripe/forwarding/__init__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 317 bytes .../__pycache__/_request.cpython-312.pyc | Bin 0 -> 9033 bytes .../_request_service.cpython-312.pyc | Bin 0 -> 5931 bytes .../stripe/forwarding/_request.py | 327 + .../stripe/forwarding/_request_service.py | 225 + .../site-packages/stripe/http_client.py | 19 + .../site-packages/stripe/identity/__init__.py | 14 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 542 bytes .../_verification_report.cpython-312.pyc | Bin 0 -> 12525 bytes ...erification_report_service.cpython-312.pyc | Bin 0 -> 4366 bytes .../_verification_session.cpython-312.pyc | Bin 0 -> 24289 bytes ...rification_session_service.cpython-312.pyc | Bin 0 -> 14372 bytes .../stripe/identity/_verification_report.py | 535 + .../identity/_verification_report_service.py | 155 + .../stripe/identity/_verification_session.py | 1037 ++ .../identity/_verification_session_service.py | 550 + .../site-packages/stripe/issuing/__init__.py | 30 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1339 bytes .../_authorization.cpython-312.pyc | Bin 0 -> 63104 bytes .../_authorization_service.cpython-312.pyc | Bin 0 -> 9072 bytes .../issuing/__pycache__/_card.cpython-312.pyc | Bin 0 -> 40814 bytes .../__pycache__/_card_service.cpython-312.pyc | Bin 0 -> 21715 bytes .../__pycache__/_cardholder.cpython-312.pyc | Bin 0 -> 30072 bytes .../_cardholder_service.cpython-312.pyc | Bin 0 -> 24470 bytes .../__pycache__/_dispute.cpython-312.pyc | Bin 0 -> 26101 bytes .../_dispute_service.cpython-312.pyc | Bin 0 -> 18044 bytes .../_personalization_design.cpython-312.pyc | Bin 0 -> 22856 bytes ...onalization_design_service.cpython-312.pyc | Bin 0 -> 9112 bytes .../_physical_bundle.cpython-312.pyc | Bin 0 -> 4734 bytes .../_physical_bundle_service.cpython-312.pyc | Bin 0 -> 3942 bytes .../__pycache__/_token.cpython-312.pyc | Bin 0 -> 10224 bytes .../_token_service.cpython-312.pyc | Bin 0 -> 5381 bytes .../__pycache__/_transaction.cpython-312.pyc | Bin 0 -> 41870 bytes .../_transaction_service.cpython-312.pyc | Bin 0 -> 5768 bytes .../stripe/issuing/_authorization.py | 2632 ++++ .../stripe/issuing/_authorization_service.py | 331 + .../site-packages/stripe/issuing/_card.py | 4082 ++++++ .../stripe/issuing/_card_service.py | 2388 ++++ .../stripe/issuing/_cardholder.py | 3623 ++++++ .../stripe/issuing/_cardholder_service.py | 2481 ++++ .../site-packages/stripe/issuing/_dispute.py | 1179 ++ .../stripe/issuing/_dispute_service.py | 847 ++ .../stripe/issuing/_personalization_design.py | 901 ++ .../_personalization_design_service.py | 365 + .../stripe/issuing/_physical_bundle.py | 154 + .../issuing/_physical_bundle_service.py | 129 + .../site-packages/stripe/issuing/_token.py | 403 + .../stripe/issuing/_token_service.py | 197 + .../stripe/issuing/_transaction.py | 2019 +++ .../stripe/issuing/_transaction_service.py | 211 + .../stripe/multipart_data_generator.py | 15 + .../python3.12/site-packages/stripe/oauth.py | 21 + .../site-packages/stripe/oauth_error.py | 52 + .../python3.12/site-packages/stripe/py.typed | 0 .../site-packages/stripe/radar/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 638 bytes .../_early_fraud_warning.cpython-312.pyc | Bin 0 -> 5121 bytes ...arly_fraud_warning_service.cpython-312.pyc | Bin 0 -> 4439 bytes .../__pycache__/_value_list.cpython-312.pyc | Bin 0 -> 11142 bytes .../_value_list_item.cpython-312.pyc | Bin 0 -> 9060 bytes .../_value_list_item_service.cpython-312.pyc | Bin 0 -> 6587 bytes .../_value_list_service.cpython-312.pyc | Bin 0 -> 8448 bytes .../stripe/radar/_early_fraud_warning.py | 184 + .../radar/_early_fraud_warning_service.py | 155 + .../site-packages/stripe/radar/_value_list.py | 425 + .../stripe/radar/_value_list_item.py | 322 + .../stripe/radar/_value_list_item_service.py | 254 + .../stripe/radar/_value_list_service.py | 339 + .../stripe/reporting/__init__.py | 10 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 477 bytes .../__pycache__/_report_run.cpython-312.pyc | Bin 0 -> 18150 bytes .../_report_run_service.cpython-312.pyc | Bin 0 -> 16410 bytes .../__pycache__/_report_type.cpython-312.pyc | Bin 0 -> 4419 bytes .../_report_type_service.cpython-312.pyc | Bin 0 -> 3487 bytes .../stripe/reporting/_report_run.py | 944 ++ .../stripe/reporting/_report_run_service.py | 872 ++ .../stripe/reporting/_report_type.py | 135 + .../stripe/reporting/_report_type_service.py | 109 + .../site-packages/stripe/request_metrics.py | 15 + .../site-packages/stripe/request_options.py | 18 + .../site-packages/stripe/sigma/__init__.py | 8 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 348 bytes .../_scheduled_query_run.cpython-312.pyc | Bin 0 -> 4885 bytes ...cheduled_query_run_service.cpython-312.pyc | Bin 0 -> 3698 bytes .../stripe/sigma/_scheduled_query_run.py | 164 + .../sigma/_scheduled_query_run_service.py | 121 + .../site-packages/stripe/stripe_object.py | 21 + .../site-packages/stripe/stripe_response.py | 20 + .../site-packages/stripe/tax/__init__.py | 28 + .../tax/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1070 bytes .../__pycache__/_calculation.cpython-312.pyc | Bin 0 -> 17226 bytes .../_calculation_line_item.cpython-312.pyc | Bin 0 -> 2917 bytes ...culation_line_item_service.cpython-312.pyc | Bin 0 -> 2598 bytes .../_calculation_service.cpython-312.pyc | Bin 0 -> 8100 bytes .../__pycache__/_registration.cpython-312.pyc | Bin 0 -> 55772 bytes .../_registration_service.cpython-312.pyc | Bin 0 -> 35361 bytes .../tax/__pycache__/_settings.cpython-312.pyc | Bin 0 -> 6797 bytes .../_settings_service.cpython-312.pyc | Bin 0 -> 4332 bytes .../__pycache__/_transaction.cpython-312.pyc | Bin 0 -> 15511 bytes .../_transaction_line_item.cpython-312.pyc | Bin 0 -> 1561 bytes ...nsaction_line_item_service.cpython-312.pyc | Bin 0 -> 2580 bytes .../_transaction_service.cpython-312.pyc | Bin 0 -> 6545 bytes .../site-packages/stripe/tax/_calculation.py | 888 ++ .../stripe/tax/_calculation_line_item.py | 145 + .../tax/_calculation_line_item_service.py | 75 + .../stripe/tax/_calculation_service.py | 364 + .../site-packages/stripe/tax/_registration.py | 1895 +++ .../stripe/tax/_registration_service.py | 1179 ++ .../site-packages/stripe/tax/_settings.py | 222 + .../stripe/tax/_settings_service.py | 153 + .../site-packages/stripe/tax/_transaction.py | 706 + .../stripe/tax/_transaction_line_item.py | 71 + .../tax/_transaction_line_item_service.py | 75 + .../stripe/tax/_transaction_service.py | 245 + .../site-packages/stripe/terminal/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 769 bytes .../_configuration.cpython-312.pyc | Bin 0 -> 28655 bytes .../_configuration_service.cpython-312.pyc | Bin 0 -> 21181 bytes .../_connection_token.cpython-312.pyc | Bin 0 -> 2553 bytes .../_connection_token_service.cpython-312.pyc | Bin 0 -> 2158 bytes .../__pycache__/_location.cpython-312.pyc | Bin 0 -> 11503 bytes .../_location_service.cpython-312.pyc | Bin 0 -> 8605 bytes .../__pycache__/_reader.cpython-312.pyc | Bin 0 -> 38412 bytes .../_reader_service.cpython-312.pyc | Bin 0 -> 17113 bytes .../stripe/terminal/_configuration.py | 1248 ++ .../stripe/terminal/_configuration_service.py | 926 ++ .../stripe/terminal/_connection_token.py | 73 + .../terminal/_connection_token_service.py | 59 + .../stripe/terminal/_location.py | 432 + .../stripe/terminal/_location_service.py | 354 + .../site-packages/stripe/terminal/_reader.py | 1476 +++ .../stripe/terminal/_reader_service.py | 707 + .../stripe/test_helpers/__init__.py | 27 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 927 bytes ...confirmation_token_service.cpython-312.pyc | Bin 0 -> 21055 bytes .../_customer_service.cpython-312.pyc | Bin 0 -> 2419 bytes .../_issuing_service.cpython-312.pyc | Bin 0 -> 1440 bytes .../_refund_service.cpython-312.pyc | Bin 0 -> 2177 bytes .../_terminal_service.cpython-312.pyc | Bin 0 -> 853 bytes .../__pycache__/_test_clock.cpython-312.pyc | Bin 0 -> 11849 bytes .../_test_clock_service.cpython-312.pyc | Bin 0 -> 7229 bytes .../_treasury_service.cpython-312.pyc | Bin 0 -> 1671 bytes .../_confirmation_token_service.py | 759 ++ .../stripe/test_helpers/_customer_service.py | 76 + .../stripe/test_helpers/_issuing_service.py | 22 + .../stripe/test_helpers/_refund_service.py | 62 + .../stripe/test_helpers/_terminal_service.py | 10 + .../stripe/test_helpers/_test_clock.py | 414 + .../test_helpers/_test_clock_service.py | 280 + .../stripe/test_helpers/_treasury_service.py | 28 + .../stripe/test_helpers/issuing/__init__.py | 14 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 579 bytes .../_authorization_service.cpython-312.pyc | Bin 0 -> 32486 bytes .../__pycache__/_card_service.cpython-312.pyc | Bin 0 -> 5859 bytes ...onalization_design_service.cpython-312.pyc | Bin 0 -> 5835 bytes .../_transaction_service.cpython-312.pyc | Bin 0 -> 26787 bytes .../issuing/_authorization_service.py | 1326 ++ .../test_helpers/issuing/_card_service.py | 218 + .../_personalization_design_service.py | 207 + .../issuing/_transaction_service.py | 1378 ++ .../stripe/test_helpers/terminal/__init__.py | 5 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 278 bytes .../_reader_service.cpython-312.pyc | Bin 0 -> 3301 bytes .../test_helpers/terminal/_reader_service.py | 94 + .../stripe/test_helpers/treasury/__init__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 709 bytes .../_inbound_transfer_service.cpython-312.pyc | Bin 0 -> 5867 bytes .../_outbound_payment_service.cpython-312.pyc | Bin 0 -> 8213 bytes ..._outbound_transfer_service.cpython-312.pyc | Bin 0 -> 8345 bytes .../_received_credit_service.cpython-312.pyc | Bin 0 -> 3368 bytes .../_received_debit_service.cpython-312.pyc | Bin 0 -> 3332 bytes .../treasury/_inbound_transfer_service.py | 194 + .../treasury/_outbound_payment_service.py | 285 + .../treasury/_outbound_transfer_service.py | 285 + .../treasury/_received_credit_service.py | 107 + .../treasury/_received_debit_service.py | 107 + .../site-packages/stripe/treasury/__init__.py | 58 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2030 bytes .../_credit_reversal.cpython-312.pyc | Bin 0 -> 6574 bytes .../_credit_reversal_service.cpython-312.pyc | Bin 0 -> 5178 bytes .../_debit_reversal.cpython-312.pyc | Bin 0 -> 6835 bytes .../_debit_reversal_service.cpython-312.pyc | Bin 0 -> 5104 bytes .../_financial_account.cpython-312.pyc | Bin 0 -> 31502 bytes ...financial_account_features.cpython-312.pyc | Bin 0 -> 8129 bytes ...l_account_features_service.cpython-312.pyc | Bin 0 -> 8345 bytes ..._financial_account_service.cpython-312.pyc | Bin 0 -> 17709 bytes .../_inbound_transfer.cpython-312.pyc | Bin 0 -> 24410 bytes .../_inbound_transfer_service.cpython-312.pyc | Bin 0 -> 6519 bytes .../_outbound_payment.cpython-312.pyc | Bin 0 -> 34331 bytes .../_outbound_payment_service.cpython-312.pyc | Bin 0 -> 11089 bytes .../_outbound_transfer.cpython-312.pyc | Bin 0 -> 30681 bytes ..._outbound_transfer_service.cpython-312.pyc | Bin 0 -> 7665 bytes .../_received_credit.cpython-312.pyc | Bin 0 -> 12187 bytes .../_received_credit_service.cpython-312.pyc | Bin 0 -> 4257 bytes .../_received_debit.cpython-312.pyc | Bin 0 -> 11011 bytes .../_received_debit_service.cpython-312.pyc | Bin 0 -> 3800 bytes .../__pycache__/_transaction.cpython-312.pyc | Bin 0 -> 7845 bytes .../_transaction_entry.cpython-312.pyc | Bin 0 -> 7784 bytes ..._transaction_entry_service.cpython-312.pyc | Bin 0 -> 4683 bytes .../_transaction_service.cpython-312.pyc | Bin 0 -> 4994 bytes .../stripe/treasury/_credit_reversal.py | 232 + .../treasury/_credit_reversal_service.py | 187 + .../stripe/treasury/_debit_reversal.py | 249 + .../treasury/_debit_reversal_service.py | 191 + .../stripe/treasury/_financial_account.py | 1137 ++ .../treasury/_financial_account_features.py | 511 + .../_financial_account_features_service.py | 256 + .../treasury/_financial_account_service.py | 584 + .../stripe/treasury/_inbound_transfer.py | 920 ++ .../treasury/_inbound_transfer_service.py | 257 + .../stripe/treasury/_outbound_payment.py | 1303 ++ .../treasury/_outbound_payment_service.py | 425 + .../stripe/treasury/_outbound_transfer.py | 1143 ++ .../treasury/_outbound_transfer_service.py | 277 + .../stripe/treasury/_received_credit.py | 470 + .../treasury/_received_credit_service.py | 143 + .../stripe/treasury/_received_debit.py | 423 + .../treasury/_received_debit_service.py | 125 + .../stripe/treasury/_transaction.py | 341 + .../stripe/treasury/_transaction_entry.py | 338 + .../treasury/_transaction_entry_service.py | 176 + .../stripe/treasury/_transaction_service.py | 183 + .../python3.12/site-packages/stripe/util.py | 19 + .../site-packages/stripe/version.py | 16 + .../site-packages/stripe/webhook.py | 22 + .../INSTALLER | 1 + .../METADATA | 72 + .../typing_extensions-4.15.0.dist-info/RECORD | 7 + .../typing_extensions-4.15.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 279 + .../site-packages/typing_extensions.py | 4317 +++++++ .../urllib3-2.5.0.dist-info/INSTALLER | 1 + .../urllib3-2.5.0.dist-info/METADATA | 154 + .../urllib3-2.5.0.dist-info/RECORD | 79 + .../urllib3-2.5.0.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 21 + .../site-packages/urllib3/__init__.py | 211 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7295 bytes .../_base_connection.cpython-312.pyc | Bin 0 -> 6833 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 22554 bytes .../_request_methods.cpython-312.pyc | Bin 0 -> 10587 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 631 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 38398 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 39720 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 16596 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 12007 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 3474 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 24388 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 52698 bytes .../site-packages/urllib3/_base_connection.py | 165 + .../site-packages/urllib3/_collections.py | 479 + .../site-packages/urllib3/_request_methods.py | 278 + .../site-packages/urllib3/_version.py | 21 + .../site-packages/urllib3/connection.py | 1093 ++ .../site-packages/urllib3/connectionpool.py | 1178 ++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 178 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 28201 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 8156 bytes .../urllib3/contrib/emscripten/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 886 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 10227 bytes .../__pycache__/fetch.cpython-312.pyc | Bin 0 -> 28617 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 1406 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 12200 bytes .../urllib3/contrib/emscripten/connection.py | 255 + .../emscripten/emscripten_fetch_worker.js | 110 + .../urllib3/contrib/emscripten/fetch.py | 728 ++ .../urllib3/contrib/emscripten/request.py | 22 + .../urllib3/contrib/emscripten/response.py | 277 + .../urllib3/contrib/pyopenssl.py | 564 + .../site-packages/urllib3/contrib/socks.py | 228 + .../site-packages/urllib3/exceptions.py | 335 + .../site-packages/urllib3/fields.py | 341 + .../site-packages/urllib3/filepost.py | 89 + .../site-packages/urllib3/http2/__init__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1731 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 17038 bytes .../http2/__pycache__/probe.cpython-312.pyc | Bin 0 -> 3682 bytes .../site-packages/urllib3/http2/connection.py | 356 + .../site-packages/urllib3/http2/probe.py | 87 + .../site-packages/urllib3/poolmanager.py | 653 + .../python3.12/site-packages/urllib3/py.typed | 2 + .../site-packages/urllib3/response.py | 1307 ++ .../site-packages/urllib3/util/__init__.py | 42 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 991 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4681 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1203 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 8303 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 2859 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 20272 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 17155 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5543 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 13310 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11675 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 16212 bytes .../util/__pycache__/util.cpython-312.pyc | Bin 0 -> 1980 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 3426 bytes .../site-packages/urllib3/util/connection.py | 137 + .../site-packages/urllib3/util/proxy.py | 43 + .../site-packages/urllib3/util/request.py | 266 + .../site-packages/urllib3/util/response.py | 101 + .../site-packages/urllib3/util/retry.py | 533 + .../site-packages/urllib3/util/ssl_.py | 524 + .../urllib3/util/ssl_match_hostname.py | 159 + .../urllib3/util/ssltransport.py | 271 + .../site-packages/urllib3/util/timeout.py | 275 + .../site-packages/urllib3/util/url.py | 469 + .../site-packages/urllib3/util/util.py | 42 + .../site-packages/urllib3/util/wait.py | 124 + .../werkzeug-3.1.3.dist-info/INSTALLER | 1 + .../werkzeug-3.1.3.dist-info/LICENSE.txt | 28 + .../werkzeug-3.1.3.dist-info/METADATA | 99 + .../werkzeug-3.1.3.dist-info/RECORD | 116 + .../werkzeug-3.1.3.dist-info/WHEEL | 4 + .../site-packages/werkzeug/__init__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 325 bytes .../__pycache__/_internal.cpython-312.pyc | Bin 0 -> 9745 bytes .../__pycache__/_reloader.cpython-312.pyc | Bin 0 -> 20596 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 33311 bytes .../__pycache__/formparser.cpython-312.pyc | Bin 0 -> 17011 bytes .../werkzeug/__pycache__/http.cpython-312.pyc | Bin 0 -> 50236 bytes .../__pycache__/local.cpython-312.pyc | Bin 0 -> 28466 bytes .../__pycache__/security.cpython-312.pyc | Bin 0 -> 7119 bytes .../__pycache__/serving.cpython-312.pyc | Bin 0 -> 46113 bytes .../werkzeug/__pycache__/test.cpython-312.pyc | Bin 0 -> 59855 bytes .../__pycache__/testapp.cpython-312.pyc | Bin 0 -> 8876 bytes .../werkzeug/__pycache__/urls.cpython-312.pyc | Bin 0 -> 8255 bytes .../__pycache__/user_agent.cpython-312.pyc | Bin 0 -> 2138 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 28129 bytes .../werkzeug/__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 25201 bytes .../site-packages/werkzeug/_internal.py | 211 + .../site-packages/werkzeug/_reloader.py | 471 + .../werkzeug/datastructures/__init__.py | 64 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2402 bytes .../__pycache__/accept.cpython-312.pyc | Bin 0 -> 15929 bytes .../__pycache__/auth.cpython-312.pyc | Bin 0 -> 14444 bytes .../__pycache__/cache_control.cpython-312.pyc | Bin 0 -> 12211 bytes .../__pycache__/csp.cpython-312.pyc | Bin 0 -> 6172 bytes .../__pycache__/etag.cpython-312.pyc | Bin 0 -> 5387 bytes .../__pycache__/file_storage.cpython-312.pyc | Bin 0 -> 8809 bytes .../__pycache__/headers.cpython-312.pyc | Bin 0 -> 30505 bytes .../__pycache__/mixins.cpython-312.pyc | Bin 0 -> 16385 bytes .../__pycache__/range.cpython-312.pyc | Bin 0 -> 10040 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 59076 bytes .../werkzeug/datastructures/accept.py | 350 + .../werkzeug/datastructures/auth.py | 317 + .../werkzeug/datastructures/cache_control.py | 273 + .../werkzeug/datastructures/csp.py | 100 + .../werkzeug/datastructures/etag.py | 106 + .../werkzeug/datastructures/file_storage.py | 209 + .../werkzeug/datastructures/headers.py | 662 + .../werkzeug/datastructures/mixins.py | 317 + .../werkzeug/datastructures/range.py | 214 + .../werkzeug/datastructures/structures.py | 1239 ++ .../site-packages/werkzeug/debug/__init__.py | 565 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 23461 bytes .../debug/__pycache__/console.cpython-312.pyc | Bin 0 -> 11622 bytes .../debug/__pycache__/repr.cpython-312.pyc | Bin 0 -> 13795 bytes .../debug/__pycache__/tbtools.cpython-312.pyc | Bin 0 -> 16994 bytes .../site-packages/werkzeug/debug/console.py | 219 + .../site-packages/werkzeug/debug/repr.py | 282 + .../werkzeug/debug/shared/ICON_LICENSE.md | 6 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 344 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/style.css | 150 + .../site-packages/werkzeug/debug/tbtools.py | 450 + .../site-packages/werkzeug/exceptions.py | 894 ++ .../site-packages/werkzeug/formparser.py | 430 + .../python3.12/site-packages/werkzeug/http.py | 1405 ++ .../site-packages/werkzeug/local.py | 653 + .../werkzeug/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 182 bytes .../__pycache__/dispatcher.cpython-312.pyc | Bin 0 -> 3300 bytes .../__pycache__/http_proxy.cpython-312.pyc | Bin 0 -> 9392 bytes .../__pycache__/lint.cpython-312.pyc | Bin 0 -> 17762 bytes .../__pycache__/profiler.cpython-312.pyc | Bin 0 -> 7186 bytes .../__pycache__/proxy_fix.cpython-312.pyc | Bin 0 -> 7183 bytes .../__pycache__/shared_data.cpython-312.pyc | Bin 0 -> 12738 bytes .../werkzeug/middleware/dispatcher.py | 81 + .../werkzeug/middleware/http_proxy.py | 236 + .../site-packages/werkzeug/middleware/lint.py | 439 + .../werkzeug/middleware/profiler.py | 155 + .../werkzeug/middleware/proxy_fix.py | 183 + .../werkzeug/middleware/shared_data.py | 283 + .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 134 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4655 bytes .../__pycache__/converters.cpython-312.pyc | Bin 0 -> 10895 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7898 bytes .../routing/__pycache__/map.cpython-312.pyc | Bin 0 -> 39823 bytes .../__pycache__/matcher.cpython-312.pyc | Bin 0 -> 8266 bytes .../routing/__pycache__/rules.cpython-312.pyc | Bin 0 -> 39157 bytes .../werkzeug/routing/converters.py | 261 + .../werkzeug/routing/exceptions.py | 152 + .../site-packages/werkzeug/routing/map.py | 951 ++ .../site-packages/werkzeug/routing/matcher.py | 202 + .../site-packages/werkzeug/routing/rules.py | 928 ++ .../site-packages/werkzeug/sansio/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 178 bytes .../sansio/__pycache__/http.cpython-312.pyc | Bin 0 -> 5629 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 0 -> 14037 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 21871 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 31726 bytes .../sansio/__pycache__/utils.cpython-312.pyc | Bin 0 -> 6168 bytes .../site-packages/werkzeug/sansio/http.py | 170 + .../werkzeug/sansio/multipart.py | 323 + .../site-packages/werkzeug/sansio/request.py | 534 + .../site-packages/werkzeug/sansio/response.py | 763 ++ .../site-packages/werkzeug/sansio/utils.py | 167 + .../site-packages/werkzeug/security.py | 166 + .../site-packages/werkzeug/serving.py | 1125 ++ .../python3.12/site-packages/werkzeug/test.py | 1464 +++ .../site-packages/werkzeug/testapp.py | 194 + .../python3.12/site-packages/werkzeug/urls.py | 203 + .../site-packages/werkzeug/user_agent.py | 47 + .../site-packages/werkzeug/utils.py | 691 + .../werkzeug/wrappers/__init__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 302 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 26132 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 34557 bytes .../werkzeug/wrappers/request.py | 650 + .../werkzeug/wrappers/response.py | 831 ++ .../python3.12/site-packages/werkzeug/wsgi.py | 595 + stripe_config/.venv/lib64 | 1 + stripe_config/.venv/pyvenv.cfg | 5 + templates/index.html | 62 +- 2655 files changed, 516264 insertions(+), 2 deletions(-) create mode 100644 static/js/subscriptions.js create mode 100644 stripe_config/.env create mode 100644 stripe_config/.env.example create mode 100644 stripe_config/.venv/bin/Activate.ps1 create mode 100644 stripe_config/.venv/bin/activate create mode 100644 stripe_config/.venv/bin/activate.csh create mode 100644 stripe_config/.venv/bin/activate.fish create mode 100755 stripe_config/.venv/bin/dotenv create mode 100755 stripe_config/.venv/bin/flask create mode 100755 stripe_config/.venv/bin/normalizer create mode 100755 stripe_config/.venv/bin/pip create mode 100755 stripe_config/.venv/bin/pip3 create mode 100755 stripe_config/.venv/bin/pip3.12 create mode 120000 stripe_config/.venv/bin/python create mode 120000 stripe_config/.venv/bin/python3 create mode 120000 stripe_config/.venv/bin/python3.12 create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/blinker/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/blinker/__pycache__/base.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/blinker/_utilities.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/blinker/base.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/blinker/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/licenses/LICENSE create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/top_level.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi/__main__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi/cacert.pem create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi/core.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/certifi/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/entry_points.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/licenses/LICENSE create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/top_level.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__main__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__main__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/api.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cd.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/constant.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/legacy.py create mode 100755 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/md.py create mode 100755 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/models.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/version.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/licenses/LICENSE.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/_compat.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/_termui_impl.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/_textwrap.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/_utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/_winconsole.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/core.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/decorators.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/exceptions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/formatting.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/globals.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/parser.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/shell_completion.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/termui.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/testing.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/types.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/click/utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/__main__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/ipython.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/cli.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/ipython.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/main.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/parser.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/variables.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/dotenv/version.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/LICENSE.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/REQUESTED create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/entry_points.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__main__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/__main__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/blueprints.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/cli.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/config.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/ctx.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/globals.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/logging.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/sessions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/signals.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/templating.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/typing.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/views.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/wrappers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/app.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/blueprints.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/cli.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/config.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/ctx.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/debughelpers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/globals.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/helpers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/json/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/json/__pycache__/tag.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/json/provider.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/json/tag.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/logging.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/README.md create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/app.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/blueprints.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/scaffold.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/sessions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/signals.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/templating.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/testing.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/typing.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/views.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/flask/wrappers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/LICENSE.md create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/codec.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/codec.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/compat.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/core.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/idnadata.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/intranges.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/package_data.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/idna/uts46data.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/_json.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/encoding.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/exc.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/serializer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/signer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/timed.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/url_safe.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/constants.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/parser.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/tests.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/_identifier.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/async_utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/bccache.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/compiler.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/constants.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/debug.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/defaults.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/environment.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/exceptions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/ext.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/filters.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/idtracking.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/lexer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/loaders.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/meta.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/nativetypes.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/nodes.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/optimizer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/parser.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/runtime.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/sandbox.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/tests.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/jinja2/visitor.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/markupsafe/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/markupsafe/__pycache__/_native.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/markupsafe/_native.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/markupsafe/_speedups.c create mode 100755 stripe_config/.venv/lib/python3.12/site-packages/markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/markupsafe/_speedups.pyi create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/markupsafe/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/__main__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/__pip-runner__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/build_env.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cache.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/main.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/check.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/download.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/help.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/index.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/install.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/list.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/search.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/show.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/configuration.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/exceptions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/index/collector.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/index/sources.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/locations/base.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/main.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/index.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/link.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/auth.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/cache.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/download.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/check.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/pyproject.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/models.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/six.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/pip/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/LICENSE create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/REQUESTED create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/entry_points.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/top_level.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/licenses/LICENSE create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/top_level.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/api.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/auth.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/certs.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/compat.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/help.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/models.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/packages.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/structures.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__pycache__/utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/__version__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/_internal_utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/adapters.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/api.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/auth.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/certs.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/compat.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/cookies.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/exceptions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/help.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/hooks.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/models.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/packages.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/sessions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/status_codes.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/structures.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/requests/utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe-10.8.0.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe-10.8.0.dist-info/LICENSE create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe-10.8.0.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe-10.8.0.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe-10.8.0.dist-info/REQUESTED create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe-10.8.0.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe-10.8.0.dist-info/top_level.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_account.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_account_capability_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_account_external_account_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_account_link.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_account_link_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_account_login_link_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_account_person_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_account_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_account_session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_account_session_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_any_iterator.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_api_mode.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_api_requestor.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_api_version.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_app_info.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_apple_pay_domain.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_apple_pay_domain_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_application.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_application_fee.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_application_fee_refund.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_application_fee_refund_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_application_fee_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_apps_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_balance.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_balance_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_balance_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_balance_transaction_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_bank_account.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_base_address.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_billing_portal_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_billing_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_capability.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_card.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_cash_balance.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_charge.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_charge_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_checkout_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_client_options.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_climate_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_confirmation_token.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_confirmation_token_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_connect_collection_transfer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_country_spec.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_country_spec_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_coupon.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_coupon_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_createable_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_credit_note.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_credit_note_line_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_credit_note_line_item_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_credit_note_preview_lines_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_credit_note_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_custom_method.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer_balance_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer_balance_transaction_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer_cash_balance_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer_cash_balance_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer_cash_balance_transaction_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer_funding_instructions_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer_payment_method_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer_payment_source_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer_session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer_session_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_customer_tax_id_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_deletable_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_discount.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_dispute.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_dispute_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_encode.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_entitlements_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_ephemeral_key.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_ephemeral_key_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_error.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_error_object.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_event.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_event_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_exchange_rate.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_exchange_rate_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_expandable_field.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_file.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_file_link.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_file_link_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_file_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_financial_connections_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_forwarding_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_funding_instructions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_http_client.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_identity_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_invoice.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_invoice_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_invoice_item_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_invoice_line_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_invoice_line_item_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_invoice_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_invoice_upcoming_lines_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_issuing_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_line_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_list_object.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_listable_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_login_link.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_mandate.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_mandate_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_multipart_data_generator.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_nested_resource_class_methods.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_oauth.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_oauth_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_object_classes.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payment_intent.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payment_intent_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payment_link.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payment_link_line_item_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payment_link_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payment_method.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payment_method_configuration.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payment_method_configuration_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payment_method_domain.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payment_method_domain_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payment_method_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payout.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_payout_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_person.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_plan.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_plan_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_price.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_price_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_product.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_product_feature.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_product_feature_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_product_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_promotion_code.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_promotion_code_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_quote.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_quote_computed_upfront_line_items_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_quote_line_item_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_quote_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_radar_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_refund.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_refund_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_reporting_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_request_metrics.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_request_options.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_requestor_options.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_reserve_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_reversal.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_review.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_review_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_search_result_object.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_searchable_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_setup_attempt.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_setup_attempt_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_setup_intent.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_setup_intent_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_shipping_rate.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_shipping_rate_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_sigma_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_singleton_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_source.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_source_mandate_notification.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_source_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_source_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_source_transaction_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_client.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_object.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_response.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_subscription.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_subscription_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_subscription_item_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_subscription_item_usage_record_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_subscription_item_usage_record_summary_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_subscription_schedule.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_subscription_schedule_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_subscription_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_tax_code.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_tax_code_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_tax_deducted_at_source.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_tax_id.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_tax_id_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_tax_rate.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_tax_rate_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_tax_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_terminal_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_test_helpers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_test_helpers_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_token.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_token_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_topup.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_topup_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_transfer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_transfer_reversal_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_transfer_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_treasury_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_updateable_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_usage_record.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_usage_record_summary.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_util.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_verify_mixin.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_version.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_webhook.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_webhook_endpoint.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/_webhook_endpoint_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/api_version.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/app_info.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/error.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/http_client.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/multipart_data_generator.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/oauth.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/oauth_error.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/request_metrics.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/request_options.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/stripe_object.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/stripe_response.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/util.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/version.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/__pycache__/webhook.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_account.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_account_capability_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_account_external_account_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_account_link.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_account_link_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_account_login_link_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_account_person_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_account_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_account_session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_account_session_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_any_iterator.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_api_mode.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_api_requestor.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_api_version.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_app_info.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_apple_pay_domain.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_apple_pay_domain_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_application.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_application_fee.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_application_fee_refund.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_application_fee_refund_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_application_fee_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_apps_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_balance.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_balance_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_balance_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_balance_transaction_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_bank_account.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_base_address.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_billing_portal_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_billing_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_capability.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_card.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_cash_balance.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_charge.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_charge_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_checkout_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_client_options.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_climate_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_confirmation_token.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_confirmation_token_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_connect_collection_transfer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_country_spec.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_country_spec_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_coupon.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_coupon_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_createable_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_credit_note.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_credit_note_line_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_credit_note_line_item_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_credit_note_preview_lines_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_credit_note_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_custom_method.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer_balance_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer_balance_transaction_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer_cash_balance_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer_cash_balance_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer_cash_balance_transaction_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer_funding_instructions_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer_payment_method_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer_payment_source_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer_session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer_session_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_customer_tax_id_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_deletable_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_discount.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_dispute.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_dispute_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_encode.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_entitlements_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_ephemeral_key.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_ephemeral_key_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_error.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_error_object.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_event.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_event_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_exchange_rate.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_exchange_rate_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_expandable_field.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_file.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_file_link.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_file_link_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_file_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_financial_connections_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_forwarding_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_funding_instructions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_http_client.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_identity_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_invoice.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_invoice_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_invoice_item_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_invoice_line_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_invoice_line_item_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_invoice_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_invoice_upcoming_lines_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_issuing_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_line_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_list_object.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_listable_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_login_link.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_mandate.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_mandate_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_multipart_data_generator.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_nested_resource_class_methods.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_oauth.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_oauth_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_object_classes.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payment_intent.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payment_intent_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payment_link.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payment_link_line_item_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payment_link_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payment_method.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payment_method_configuration.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payment_method_configuration_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payment_method_domain.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payment_method_domain_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payment_method_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payout.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_payout_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_person.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_plan.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_plan_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_price.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_price_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_product.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_product_feature.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_product_feature_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_product_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_promotion_code.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_promotion_code_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_quote.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_quote_computed_upfront_line_items_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_quote_line_item_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_quote_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_radar_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_refund.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_refund_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_reporting_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_request_metrics.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_request_options.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_requestor_options.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_reserve_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_reversal.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_review.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_review_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_search_result_object.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_searchable_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_setup_attempt.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_setup_attempt_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_setup_intent.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_setup_intent_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_shipping_rate.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_shipping_rate_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_sigma_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_singleton_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_source.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_source_mandate_notification.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_source_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_source_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_source_transaction_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_stripe_client.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_stripe_object.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_stripe_response.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_stripe_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_subscription.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_subscription_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_subscription_item_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_subscription_item_usage_record_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_subscription_item_usage_record_summary_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_subscription_schedule.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_subscription_schedule_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_subscription_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_tax_code.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_tax_code_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_tax_deducted_at_source.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_tax_id.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_tax_id_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_tax_rate.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_tax_rate_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_tax_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_terminal_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_test_helpers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_test_helpers_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_token.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_token_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_topup.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_topup_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_transfer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_transfer_reversal_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_transfer_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_treasury_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_updateable_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_usage_record.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_usage_record_summary.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_util.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_verify_mixin.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_version.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_webhook.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_webhook_endpoint.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/_webhook_endpoint_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/account.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/account_link.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/account_session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/apple_pay_domain.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/application.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/application_fee.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/application_fee_refund.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/balance.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/balance_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/bank_account.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/capability.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/card.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/cash_balance.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/charge.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/confirmation_token.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/connect_collection_transfer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/country_spec.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/coupon.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/credit_note.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/credit_note_line_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/customer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/customer_balance_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/customer_cash_balance_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/customer_session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/discount.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/dispute.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/ephemeral_key.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/error_object.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/event.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/exchange_rate.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/file.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/file_link.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/funding_instructions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/invoice.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/invoice_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/invoice_line_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/line_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/list_object.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/login_link.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/mandate.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/payment_intent.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/payment_link.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/payment_method.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/payment_method_configuration.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/payment_method_domain.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/payout.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/person.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/plan.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/price.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/product.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/product_feature.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/promotion_code.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/quote.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/recipient_transfer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/refund.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/reserve_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/reversal.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/review.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/search_result_object.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/setup_attempt.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/setup_intent.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/shipping_rate.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/source.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/source_mandate_notification.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/source_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/subscription.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/subscription_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/subscription_schedule.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/tax_code.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/tax_deducted_at_source.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/tax_id.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/tax_rate.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/token.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/topup.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/transfer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/usage_record.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/usage_record_summary.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/__pycache__/webhook_endpoint.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__pycache__/api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__pycache__/createable_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__pycache__/custom_method.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__pycache__/deletable_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__pycache__/listable_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__pycache__/nested_resource_class_methods.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__pycache__/searchable_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__pycache__/singleton_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__pycache__/test_helpers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__pycache__/updateable_api_resource.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/__pycache__/verify_mixin.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/createable_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/custom_method.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/deletable_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/listable_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/nested_resource_class_methods.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/searchable_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/singleton_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/test_helpers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/updateable_api_resource.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/abstract/verify_mixin.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/account.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/account_link.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/account_session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/apple_pay_domain.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/application.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/application_fee.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/application_fee_refund.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/apps/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/apps/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/apps/__pycache__/secret.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/apps/secret.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/balance.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/balance_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/bank_account.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/__pycache__/alert.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/__pycache__/alert_triggered.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/__pycache__/meter.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/__pycache__/meter_event.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/__pycache__/meter_event_adjustment.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/__pycache__/meter_event_summary.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/alert.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/alert_triggered.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/meter.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/meter_event.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/meter_event_adjustment.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing/meter_event_summary.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing_portal/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing_portal/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing_portal/__pycache__/configuration.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing_portal/__pycache__/session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing_portal/configuration.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/billing_portal/session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/capability.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/card.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/cash_balance.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/charge.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/checkout/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/checkout/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/checkout/__pycache__/session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/checkout/session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/climate/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/climate/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/climate/__pycache__/order.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/climate/__pycache__/product.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/climate/__pycache__/supplier.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/climate/order.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/climate/product.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/climate/supplier.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/confirmation_token.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/connect_collection_transfer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/country_spec.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/coupon.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/credit_note.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/credit_note_line_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/customer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/customer_balance_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/customer_cash_balance_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/customer_session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/discount.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/dispute.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/entitlements/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/entitlements/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/entitlements/__pycache__/active_entitlement.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/entitlements/__pycache__/active_entitlement_summary.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/entitlements/__pycache__/feature.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/entitlements/active_entitlement.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/entitlements/active_entitlement_summary.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/entitlements/feature.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/ephemeral_key.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/error_object.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/event.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/exchange_rate.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/file.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/file_link.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/financial_connections/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/financial_connections/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/financial_connections/__pycache__/account.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/financial_connections/__pycache__/account_owner.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/financial_connections/__pycache__/account_ownership.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/financial_connections/__pycache__/session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/financial_connections/__pycache__/transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/financial_connections/account.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/financial_connections/account_owner.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/financial_connections/account_ownership.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/financial_connections/session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/financial_connections/transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/forwarding/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/forwarding/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/forwarding/__pycache__/request.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/forwarding/request.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/funding_instructions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/identity/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/identity/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/identity/__pycache__/verification_report.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/identity/__pycache__/verification_session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/identity/verification_report.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/identity/verification_session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/invoice.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/invoice_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/invoice_line_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/__pycache__/authorization.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/__pycache__/card.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/__pycache__/cardholder.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/__pycache__/dispute.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/__pycache__/personalization_design.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/__pycache__/physical_bundle.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/__pycache__/token.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/__pycache__/transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/authorization.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/card.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/cardholder.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/dispute.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/personalization_design.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/physical_bundle.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/token.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/issuing/transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/line_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/list_object.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/login_link.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/mandate.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/payment_intent.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/payment_link.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/payment_method.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/payment_method_configuration.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/payment_method_domain.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/payout.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/person.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/plan.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/price.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/product.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/product_feature.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/promotion_code.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/quote.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/radar/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/radar/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/radar/__pycache__/early_fraud_warning.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/radar/__pycache__/value_list.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/radar/__pycache__/value_list_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/radar/early_fraud_warning.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/radar/value_list.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/radar/value_list_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/recipient_transfer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/refund.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/reporting/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/reporting/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/reporting/__pycache__/report_run.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/reporting/__pycache__/report_type.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/reporting/report_run.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/reporting/report_type.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/reserve_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/reversal.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/review.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/search_result_object.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/setup_attempt.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/setup_intent.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/shipping_rate.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/sigma/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/sigma/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/sigma/__pycache__/scheduled_query_run.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/sigma/scheduled_query_run.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/source.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/source_mandate_notification.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/source_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/subscription.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/subscription_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/subscription_schedule.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/__pycache__/calculation.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/__pycache__/calculation_line_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/__pycache__/registration.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/__pycache__/settings.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/__pycache__/transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/__pycache__/transaction_line_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/calculation.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/calculation_line_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/registration.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/settings.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax/transaction_line_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax_code.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax_deducted_at_source.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax_id.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/tax_rate.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/terminal/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/terminal/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/terminal/__pycache__/configuration.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/terminal/__pycache__/connection_token.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/terminal/__pycache__/location.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/terminal/__pycache__/reader.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/terminal/configuration.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/terminal/connection_token.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/terminal/location.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/terminal/reader.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/test_helpers/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/test_helpers/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/test_helpers/__pycache__/test_clock.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/test_helpers/test_clock.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/token.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/topup.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/transfer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__pycache__/credit_reversal.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__pycache__/debit_reversal.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__pycache__/financial_account.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__pycache__/financial_account_features.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__pycache__/inbound_transfer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__pycache__/outbound_payment.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__pycache__/outbound_transfer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__pycache__/received_credit.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__pycache__/received_debit.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__pycache__/transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/__pycache__/transaction_entry.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/credit_reversal.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/debit_reversal.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/financial_account.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/financial_account_features.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/inbound_transfer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/outbound_payment.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/outbound_transfer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/received_credit.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/received_debit.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/treasury/transaction_entry.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/usage_record.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/usage_record_summary.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_resources/webhook_endpoint.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/api_version.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/app_info.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/apps/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/apps/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/apps/__pycache__/_secret.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/apps/__pycache__/_secret_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/apps/_secret.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/apps/_secret_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__pycache__/_alert.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__pycache__/_alert_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__pycache__/_alert_triggered.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__pycache__/_meter.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__pycache__/_meter_event.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__pycache__/_meter_event_adjustment.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__pycache__/_meter_event_adjustment_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__pycache__/_meter_event_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__pycache__/_meter_event_summary.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__pycache__/_meter_event_summary_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/__pycache__/_meter_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/_alert.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/_alert_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/_alert_triggered.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/_meter.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/_meter_event.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/_meter_event_adjustment.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/_meter_event_adjustment_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/_meter_event_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/_meter_event_summary.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/_meter_event_summary_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing/_meter_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing_portal/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing_portal/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing_portal/__pycache__/_configuration.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing_portal/__pycache__/_configuration_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing_portal/__pycache__/_session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing_portal/__pycache__/_session_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing_portal/_configuration.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing_portal/_configuration_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing_portal/_session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/billing_portal/_session_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/checkout/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/checkout/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/checkout/__pycache__/_session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/checkout/__pycache__/_session_line_item_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/checkout/__pycache__/_session_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/checkout/_session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/checkout/_session_line_item_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/checkout/_session_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/__pycache__/_order.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/__pycache__/_order_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/__pycache__/_product.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/__pycache__/_product_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/__pycache__/_supplier.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/__pycache__/_supplier_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/_order.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/_order_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/_product.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/_product_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/_supplier.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/climate/_supplier_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/data/ca-certificates.crt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/entitlements/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/entitlements/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/entitlements/__pycache__/_active_entitlement.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/entitlements/__pycache__/_active_entitlement_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/entitlements/__pycache__/_active_entitlement_summary.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/entitlements/__pycache__/_feature.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/entitlements/__pycache__/_feature_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/entitlements/_active_entitlement.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/entitlements/_active_entitlement_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/entitlements/_active_entitlement_summary.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/entitlements/_feature.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/entitlements/_feature_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/error.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/__pycache__/_account.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/__pycache__/_account_owner.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/__pycache__/_account_owner_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/__pycache__/_account_ownership.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/__pycache__/_account_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/__pycache__/_session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/__pycache__/_session_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/__pycache__/_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/__pycache__/_transaction_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/_account.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/_account_owner.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/_account_owner_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/_account_ownership.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/_account_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/_session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/_session_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/financial_connections/_transaction_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/forwarding/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/forwarding/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/forwarding/__pycache__/_request.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/forwarding/__pycache__/_request_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/forwarding/_request.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/forwarding/_request_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/http_client.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/identity/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/identity/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/identity/__pycache__/_verification_report.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/identity/__pycache__/_verification_report_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/identity/__pycache__/_verification_session.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/identity/__pycache__/_verification_session_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/identity/_verification_report.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/identity/_verification_report_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/identity/_verification_session.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/identity/_verification_session_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_authorization.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_authorization_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_card.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_card_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_cardholder.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_cardholder_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_dispute.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_dispute_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_personalization_design.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_personalization_design_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_physical_bundle.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_physical_bundle_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_token.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_token_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/__pycache__/_transaction_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_authorization.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_authorization_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_card.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_card_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_cardholder.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_cardholder_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_dispute.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_dispute_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_personalization_design.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_personalization_design_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_physical_bundle.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_physical_bundle_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_token.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_token_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/issuing/_transaction_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/multipart_data_generator.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/oauth.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/oauth_error.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/__pycache__/_early_fraud_warning.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/__pycache__/_early_fraud_warning_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/__pycache__/_value_list.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/__pycache__/_value_list_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/__pycache__/_value_list_item_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/__pycache__/_value_list_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/_early_fraud_warning.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/_early_fraud_warning_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/_value_list.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/_value_list_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/_value_list_item_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/radar/_value_list_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/reporting/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/reporting/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/reporting/__pycache__/_report_run.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/reporting/__pycache__/_report_run_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/reporting/__pycache__/_report_type.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/reporting/__pycache__/_report_type_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/reporting/_report_run.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/reporting/_report_run_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/reporting/_report_type.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/reporting/_report_type_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/request_metrics.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/request_options.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/sigma/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/sigma/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/sigma/__pycache__/_scheduled_query_run.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/sigma/__pycache__/_scheduled_query_run_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/sigma/_scheduled_query_run.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/sigma/_scheduled_query_run_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/stripe_object.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/stripe_response.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/_calculation.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/_calculation_line_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/_calculation_line_item_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/_calculation_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/_registration.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/_registration_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/_settings.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/_settings_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/_transaction_line_item.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/_transaction_line_item_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/__pycache__/_transaction_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/_calculation.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/_calculation_line_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/_calculation_line_item_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/_calculation_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/_registration.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/_registration_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/_settings.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/_settings_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/_transaction_line_item.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/_transaction_line_item_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/tax/_transaction_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/__pycache__/_configuration.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/__pycache__/_configuration_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/__pycache__/_connection_token.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/__pycache__/_connection_token_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/__pycache__/_location.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/__pycache__/_location_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/__pycache__/_reader.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/__pycache__/_reader_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/_configuration.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/_configuration_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/_connection_token.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/_connection_token_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/_location.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/_location_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/_reader.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/terminal/_reader_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/__pycache__/_confirmation_token_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/__pycache__/_customer_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/__pycache__/_issuing_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/__pycache__/_refund_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/__pycache__/_terminal_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/__pycache__/_test_clock.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/__pycache__/_test_clock_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/__pycache__/_treasury_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/_confirmation_token_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/_customer_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/_issuing_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/_refund_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/_terminal_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/_test_clock.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/_test_clock_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/_treasury_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/issuing/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/issuing/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/issuing/__pycache__/_authorization_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/issuing/__pycache__/_card_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/issuing/__pycache__/_personalization_design_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/issuing/__pycache__/_transaction_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/issuing/_authorization_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/issuing/_card_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/issuing/_personalization_design_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/issuing/_transaction_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/terminal/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/terminal/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/terminal/__pycache__/_reader_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/terminal/_reader_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/treasury/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/treasury/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/treasury/__pycache__/_inbound_transfer_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/treasury/__pycache__/_outbound_payment_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/treasury/__pycache__/_outbound_transfer_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/treasury/__pycache__/_received_credit_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/treasury/__pycache__/_received_debit_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/treasury/_inbound_transfer_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/treasury/_outbound_payment_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/treasury/_outbound_transfer_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/treasury/_received_credit_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/test_helpers/treasury/_received_debit_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_credit_reversal.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_credit_reversal_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_debit_reversal.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_debit_reversal_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_financial_account.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_financial_account_features.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_financial_account_features_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_financial_account_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_inbound_transfer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_inbound_transfer_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_outbound_payment.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_outbound_payment_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_outbound_transfer.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_outbound_transfer_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_received_credit.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_received_credit_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_received_debit.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_received_debit_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_transaction.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_transaction_entry.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_transaction_entry_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/__pycache__/_transaction_service.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_credit_reversal.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_credit_reversal_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_debit_reversal.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_debit_reversal_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_financial_account.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_financial_account_features.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_financial_account_features_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_financial_account_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_inbound_transfer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_inbound_transfer_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_outbound_payment.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_outbound_payment_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_outbound_transfer.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_outbound_transfer_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_received_credit.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_received_credit_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_received_debit.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_received_debit_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_transaction.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_transaction_entry.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_transaction_entry_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/treasury/_transaction_service.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/util.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/version.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/stripe/webhook.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/licenses/LICENSE create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/typing_extensions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/licenses/LICENSE.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/_base_connection.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/_collections.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/_request_methods.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/_version.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/connection.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/connectionpool.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/connection.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/fetch.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/request.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/response.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/contrib/socks.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/exceptions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/fields.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/filepost.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/http2/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/connection.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/http2/connection.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/http2/probe.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/poolmanager.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/response.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/connection.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/proxy.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/request.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/response.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/retry.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/ssl_.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/ssl_match_hostname.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/ssltransport.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/timeout.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/url.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/util.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/urllib3/util/wait.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug-3.1.3.dist-info/INSTALLER create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug-3.1.3.dist-info/LICENSE.txt create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug-3.1.3.dist-info/METADATA create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug-3.1.3.dist-info/RECORD create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug-3.1.3.dist-info/WHEEL create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/_internal.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/_reloader.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/exceptions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/formparser.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/http.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/local.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/security.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/serving.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/test.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/testapp.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/urls.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/user_agent.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/wsgi.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/_internal.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/_reloader.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/range.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/accept.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/auth.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/cache_control.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/csp.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/etag.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/file_storage.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/headers.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/mixins.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/range.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/datastructures/structures.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/console.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/repr.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/console.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/repr.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/shared/ICON_LICENSE.md create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/shared/console.png create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/shared/less.png create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/shared/more.png create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/shared/style.css create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/debug/tbtools.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/exceptions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/formparser.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/http.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/local.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/lint.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/dispatcher.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/http_proxy.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/lint.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/profiler.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/proxy_fix.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/middleware/shared_data.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/py.typed create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/routing/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/converters.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/map.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/matcher.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/rules.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/routing/converters.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/routing/exceptions.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/routing/map.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/routing/matcher.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/routing/rules.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/sansio/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/http.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/request.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/response.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/utils.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/sansio/http.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/sansio/multipart.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/sansio/request.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/sansio/response.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/sansio/utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/security.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/serving.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/test.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/testapp.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/urls.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/user_agent.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/utils.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/wrappers/__init__.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/request.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/response.cpython-312.pyc create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/wrappers/request.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/wrappers/response.py create mode 100644 stripe_config/.venv/lib/python3.12/site-packages/werkzeug/wsgi.py create mode 120000 stripe_config/.venv/lib64 create mode 100644 stripe_config/.venv/pyvenv.cfg diff --git a/server.py b/server.py index 1ec0080..dec94c3 100644 --- a/server.py +++ b/server.py @@ -5,7 +5,7 @@ import stripe import json from datetime import datetime -load_dotenv() +load_dotenv('stripe_config/.env') app = Flask(__name__) @@ -16,6 +16,46 @@ DEFAULT_CURRENCY = os.getenv("DEFAULT_CURRENCY", "GBP") # In-memory supporter storage (in production, use a proper database) supporters = [] +# Subscription tiers - UPDATE THESE WITH YOUR REAL STRIPE PRICE IDs +SUBSCRIPTION_TIERS = { + "bronze": { + "price_id": "price_1SFdA1H7p78X3gVbFafKga1f", # Bronze tier price ID from Stripe Dashboard + "amount": 2.00, + "currency": "GBP", + "interval": "month", + "name": "Bronze", + "description": "Essential support that makes a difference" + }, + "silver": { + "price_id": "price_1SFdD4H7p78X3gVb0ENAfHNZ", # Silver tier price ID from Stripe Dashboard + "amount": 5.00, + "currency": "GBP", + "interval": "month", + "name": "Silver", + "description": "Enhanced support with greater impact" + }, + "gold": { + "price_id": "price_1SFdFkH7p78X3gVbLfjZvKIW", # Gold tier price ID from Stripe Dashboard + "amount": 10.00, + "currency": "GBP", + "interval": "month", + "name": "Gold", + "description": "Premium support for maximum impact" + }, + "diamond": { + "price_id": "price_1SFdHFH7p78X3gVbN7UdxkPa", # Diamond tier price ID from Stripe Dashboard + "amount": 25.00, + "currency": "GBP", + "interval": "month", + "name": "Diamond", + "description": "Ultimate support for our biggest champions" + } +} + +# In-memory customer storage (in production, use a proper database) +customers = [] +subscriptions = [] + @app.route("/") def index(): return render_template("index.html") @@ -97,5 +137,171 @@ def get_supporters(): return jsonify({"supporters": supporters[:20]}) # Return last 20 +@app.route("/subscription-tiers", methods=["GET"]) +def get_subscription_tiers(): + """Get available subscription tiers""" + return jsonify({"tiers": SUBSCRIPTION_TIERS}) + +@app.route("/create-subscription", methods=["POST"]) +def create_subscription(): + """Create a new subscription - NOTE: Requires real Stripe Price IDs""" + data = request.get_json() + tier_id = data.get("tier_id") + email = data.get("email") + name = data.get("name", "").strip() + + if tier_id not in SUBSCRIPTION_TIERS: + return jsonify({"error": "Invalid subscription tier"}), 400 + + if not email: + return jsonify({"error": "Email is required for subscriptions"}), 400 + + # Check if price IDs are still placeholders + price_id = SUBSCRIPTION_TIERS[tier_id]["price_id"] + if price_id.startswith("price_1234567890"): + return jsonify({ + "error": "Subscription functionality requires setting up real Stripe Price IDs. " + "Please create products and prices in your Stripe Dashboard first." + }), 400 + + try: + # Create or retrieve customer + customer = stripe.Customer.create( + email=email, + name=name if name else None, + metadata={ + "source": "donation_subscription" + } + ) + + # Create subscription + subscription = stripe.Subscription.create( + customer=customer.id, + items=[{"price": price_id}], + payment_behavior="default_incomplete", + payment_settings={"save_default_payment_method": "on_subscription"}, + expand=["latest_invoice.payment_intent"], + ) + + # Store customer and subscription data + customer_data = { + "id": customer.id, + "email": email, + "name": name, + "created": datetime.now().isoformat() + } + customers.append(customer_data) + + subscription_data = { + "id": subscription.id, + "customer_id": customer.id, + "tier_id": tier_id, + "status": subscription.status, + "created": datetime.now().isoformat() + } + subscriptions.append(subscription_data) + + return jsonify({ + "subscriptionId": subscription.id, + "clientSecret": subscription.latest_invoice.payment_intent.client_secret + }) + + except Exception as e: + # Catch all exceptions since IDE might not recognize stripe error classes + error_msg = str(e) + if "No such price" in error_msg: + return jsonify({"error": "Invalid price ID. Please check your Stripe Dashboard."}), 400 + return jsonify({"error": f"Subscription creation failed: {error_msg}"}), 400 + +@app.route("/cancel-subscription", methods=["POST"]) +def cancel_subscription(): + """Cancel a subscription""" + data = request.get_json() + subscription_id = data.get("subscription_id") + + if not subscription_id: + return jsonify({"error": "Subscription ID is required"}), 400 + + try: + # Cancel the subscription at period end + subscription = stripe.Subscription.modify( + subscription_id, + cancel_at_period_end=True + ) + + # Update local storage + for sub in subscriptions: + if sub["id"] == subscription_id: + sub["status"] = "cancel_at_period_end" + sub["cancelled_at"] = datetime.now().isoformat() + break + + return jsonify({ + "success": True, + "message": "Subscription will be cancelled at the end of the current billing period" + }) + + except Exception as e: + return jsonify({"error": f"Cancellation failed: {str(e)}"}), 400 + +@app.route("/webhook", methods=["POST"]) +def stripe_webhook(): + """Handle Stripe webhooks""" + payload = request.data + sig_header = request.headers.get('Stripe-Signature') + endpoint_secret = os.getenv('STRIPE_WEBHOOK_SECRET') + + if not endpoint_secret: + return jsonify({"error": "Webhook secret not configured"}), 400 + + try: + event = stripe.Webhook.construct_event(payload, sig_header, endpoint_secret) + except ValueError: + return jsonify({"error": "Invalid payload"}), 400 + except Exception as signature_error: + if "signature" in str(signature_error).lower(): + return jsonify({"error": "Invalid signature"}), 400 + return jsonify({"error": "Webhook processing failed"}), 400 + + # Handle the event + if event['type'] == 'invoice.payment_succeeded': + subscription = event['data']['object']['subscription'] + customer_id = event['data']['object']['customer'] + + # Update subscription status + for sub in subscriptions: + if sub["id"] == subscription: + sub["status"] = "active" + sub["last_payment"] = datetime.now().isoformat() + break + + print(f"Payment succeeded for subscription {subscription}") + + elif event['type'] == 'invoice.payment_failed': + subscription = event['data']['object']['subscription'] + + # Update subscription status + for sub in subscriptions: + if sub["id"] == subscription: + sub["status"] = "past_due" + sub["last_failed_payment"] = datetime.now().isoformat() + break + + print(f"Payment failed for subscription {subscription}") + + elif event['type'] == 'customer.subscription.deleted': + subscription_id = event['data']['object']['id'] + + # Update subscription status + for sub in subscriptions: + if sub["id"] == subscription_id: + sub["status"] = "cancelled" + sub["cancelled_at"] = datetime.now().isoformat() + break + + print(f"Subscription {subscription_id} was cancelled") + + return jsonify({"success": True}) + if __name__ == "__main__": app.run(port=4242, debug=True) diff --git a/static/css/styles.css b/static/css/styles.css index a2d0fc5..49d6027 100644 --- a/static/css/styles.css +++ b/static/css/styles.css @@ -842,3 +842,169 @@ button { cursor: pointer; } #result { margin-top: 12px; min-height: 20px; } + +/* Payment Type Tabs */ +.payment-type-tabs { + display: flex; + margin-bottom: 24px; + border-radius: 12px; + overflow: hidden; + border: 1px solid var(--border-color); +} + +.tab-button { + flex: 1; + padding: 12px 16px; + border: none; + background: var(--bg-secondary); + color: var(--text-secondary); + cursor: pointer; + font-size: 14px; + font-weight: 500; + transition: all 0.2s ease; +} + +.tab-button.active { + background: var(--accent); + color: white; +} + +.tab-button:hover:not(.active) { + background: var(--border-color); + color: var(--text-primary); +} + +/* Payment Forms */ +.payment-form { + display: none; +} + +.payment-form.active { + display: block; +} + +/* Subscription specific styles */ +#subscription-form select { + margin-bottom: 16px; +} + +#subscription-form input[type="email"] { + margin-bottom: 16px; +} + +/* Subscription result styling */ +#subscription-result { + margin-top: 16px; + padding: 12px; + border-radius: 8px; + font-weight: 500; +} + +/* Tier Button Styling */ +.tier-buttons { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 16px; + margin: 20px 0; +} + +.tier-button { + background: var(--bg-secondary); + border: 2px solid var(--border-color); + border-radius: 16px; + padding: 24px 20px; + text-align: center; + cursor: pointer; + transition: all 0.3s ease; + position: relative; + overflow: hidden; +} + +.tier-button:hover { + border-color: var(--accent); + background: var(--bg-input); + transform: translateY(-2px); + box-shadow: 0 8px 25px var(--shadow); +} + +.tier-button.selected { + border-color: var(--accent); + background: var(--accent); + color: white; + transform: translateY(-2px); + box-shadow: 0 8px 25px var(--shadow); +} + +.tier-button.selected .tier-description { + color: rgba(255, 255, 255, 0.9); +} + +.tier-icon { + font-size: 32px; + margin-bottom: 8px; +} + +.tier-name { + font-size: 20px; + font-weight: 600; + margin-bottom: 4px; + color: var(--text-primary); +} + +.tier-button.selected .tier-name { + color: white; +} + +.tier-price { + font-size: 24px; + font-weight: 700; + margin-bottom: 8px; + color: var(--accent); +} + +.tier-button.selected .tier-price { + color: white; +} + +.tier-period { + font-size: 14px; + font-weight: 400; + opacity: 0.8; +} + +.tier-description { + font-size: 12px; + color: var(--text-secondary); + line-height: 1.4; + margin-top: 8px; +} + +/* Mobile responsive */ +@media (max-width: 768px) { + .tier-buttons { + grid-template-columns: 1fr 1fr; + gap: 12px; + } + + .tier-button { + padding: 20px 16px; + } + + .tier-icon { + font-size: 28px; + } + + .tier-name { + font-size: 18px; + } + + .tier-price { + font-size: 20px; + } +} + +@media (max-width: 480px) { + .tier-buttons { + grid-template-columns: 1fr; + } +} diff --git a/static/js/subscriptions.js b/static/js/subscriptions.js new file mode 100644 index 0000000..e88caa5 --- /dev/null +++ b/static/js/subscriptions.js @@ -0,0 +1,216 @@ +(async () => { + const cfg = await fetch("/config").then(r => r.json()); + const stripe = Stripe(cfg.publishableKey); + + const subscriptionForm = document.getElementById("subscription-form"); + const subscriptionResult = document.getElementById("subscription-result"); + const tierSelect = document.getElementById("subscription-tier"); + const emailInput = document.getElementById("subscriber-email"); + const nameInput = document.getElementById("subscriber-name"); + const submitButton = document.getElementById("subscription-submit-button"); + + let subscriptionElements, subscriptionCardElement; + + // Initialize tier button selection + function initializeTierButtons() { + const tierButtons = document.querySelectorAll('.tier-button'); + const tierInput = document.getElementById('subscription-tier'); + + tierButtons.forEach(button => { + button.addEventListener('click', function() { + // Remove selected class from all buttons + tierButtons.forEach(btn => btn.classList.remove('selected')); + // Add selected class to clicked button + this.classList.add('selected'); + + // Update the tier input value + const selectedTier = this.getAttribute('data-tier'); + if (tierInput) { + tierInput.value = selectedTier; + } + }); + }); + } + + // Initialize basic card element (display only, no payment processing) + function initializeBasicCardElement() { + // Clean up existing elements + if (subscriptionElements) { + subscriptionElements.destroy(); + } + + // Create basic elements for card display + subscriptionElements = stripe.elements({ + appearance: { + theme: document.documentElement.getAttribute('data-theme') === 'dark' ? 'night' : 'stripe' + } + }); + + // Create and mount card element + subscriptionCardElement = subscriptionElements.create("card", { + style: { + base: { + fontSize: '16px', + color: getComputedStyle(document.documentElement).getPropertyValue('--text-primary'), + '::placeholder': { + color: getComputedStyle(document.documentElement).getPropertyValue('--text-secondary'), + }, + }, + } + }); + subscriptionCardElement.mount("#subscription-card-element"); + } + + // Handle subscription payment + async function handleSubscriptionPayment(e) { + e.preventDefault(); + + const tier_id = tierSelect.value; + const email = emailInput.value; + const name = nameInput.value; + + if (!tier_id || !email) { + subscriptionResult.textContent = "❌ Please fill in all required fields."; + return; + } + + subscriptionResult.textContent = "Creating subscription..."; + submitButton.disabled = true; + + try { + // Create subscription + const res = await fetch("/create-subscription", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ tier_id, email, name }) + }); + + const data = await res.json(); + + if (data.error) { + subscriptionResult.textContent = "❌ " + data.error; + submitButton.disabled = false; + return; + } + + const clientSecret = data.clientSecret; + subscriptionResult.textContent = "Processing payment..."; + + // Confirm payment with the card element + const { error } = await stripe.confirmPayment({ + elements: subscriptionElements, + confirmParams: { + return_url: window.location.href, + }, + redirect: "if_required" + }); + + if (error) { + subscriptionResult.textContent = "❌ " + error.message; + } else { + subscriptionResult.innerHTML = "✅ Thank you! Your subscription is now active.
You'll receive an email confirmation shortly."; + showSubscriptionSuccessAnimation(); + + // Add to supporter wall + const name = nameInput.value.trim(); + if (name && window.supporterWall) { + const tierData = await getTierData(tier_id); + await window.supporterWall.addSupporter(name, tierData.amount * 100, tierData.currency); + } + } + } catch (err) { + subscriptionResult.textContent = "❌ Subscription failed. Please try again."; + console.error(err); + } finally { + submitButton.disabled = false; + } + } + + // Get tier data + async function getTierData(tierId) { + const tiers = await fetch("/subscription-tiers").then(r => r.json()); + return tiers.tiers[tierId]; + } + + // Success animation for subscriptions + function showSubscriptionSuccessAnimation() { + subscriptionResult.style.background = 'linear-gradient(135deg, #28a745, #20c997)'; + subscriptionResult.style.color = 'white'; + subscriptionResult.style.padding = '12px'; + subscriptionResult.style.borderRadius = '8px'; + subscriptionResult.style.animation = 'bounce 0.6s ease-out'; + } + + // Update submit button text based on tier + async function updateSubmitButtonText() { + const tier_id = tierSelect.value; + + if (tier_id) { + try { + const tierData = await getTierData(tier_id); + if (tierData.interval === 'month') { + submitButton.textContent = `Start Monthly Support - ${tierData.currency} ${tierData.amount}/${tierData.interval}`; + } else { + submitButton.textContent = `Start Yearly Support - ${tierData.currency} ${tierData.amount}/${tierData.interval}`; + } + } catch (err) { + submitButton.textContent = "Start Support"; + } + } else { + submitButton.textContent = "Start Support"; + } + } + + // Event listeners + subscriptionForm.addEventListener("submit", handleSubscriptionPayment); + tierSelect.addEventListener("change", updateSubmitButtonText); + + // Tab switching functionality + const oneTimeTab = document.getElementById("one-time-tab"); + const recurringTab = document.getElementById("recurring-tab"); + const donationForm = document.getElementById("donation-form"); + + function switchToOneTime() { + oneTimeTab.classList.add("active"); + recurringTab.classList.remove("active"); + donationForm.classList.add("active"); + subscriptionForm.classList.remove("active"); + } + + function switchToRecurring() { + recurringTab.classList.add("active"); + oneTimeTab.classList.remove("active"); + subscriptionForm.classList.add("active"); + donationForm.classList.remove("active"); + + // Initialize card element when switching to subscription tab + if (!subscriptionElements) { + initializeBasicCardElement(); + } + } + + oneTimeTab.addEventListener("click", switchToOneTime); + recurringTab.addEventListener("click", switchToRecurring); + + // Update elements theme when theme changes + if (window.themeManager) { + const originalSetTheme = window.themeManager.setTheme; + window.themeManager.setTheme = function(theme) { + originalSetTheme.call(this, theme); + // Reinitialize card element with new theme + setTimeout(() => { + if (subscriptionForm.classList.contains("active")) { + initializeBasicCardElement(); + } + }, 100); + }; + } + + // Initialize card element on page load if subscription form is visible + if (subscriptionForm.classList.contains("active")) { + initializeBasicCardElement(); + } + + // Initialize tier button selection + initializeTierButtons(); +})(); \ No newline at end of file diff --git a/stripe_config/.env b/stripe_config/.env new file mode 100644 index 0000000..8a8c2e7 --- /dev/null +++ b/stripe_config/.env @@ -0,0 +1,4 @@ +STRIPE_SECRET_KEY=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 +STRIPE_PUBLISHABLE_KEY=pk_live_51KlIf4H7p78X3gVbh1ueYesO2XAYFZID6M62Tm8I2X61N6y0CSZiLDI0vWfgA1cv91cBzQXCl0BR91bSiUKBsdzi00uMxoZutY +DEFAULT_CURRENCY=GBP +STRIPE_WEBHOOK_SECRET=whsec_your_webhook_secret_here diff --git a/stripe_config/.env.example b/stripe_config/.env.example new file mode 100644 index 0000000..27d02d3 --- /dev/null +++ b/stripe_config/.env.example @@ -0,0 +1,3 @@ +STRIPE_SECRET_KEY=sk_test_yourkeyhere +STRIPE_PUBLISHABLE_KEY=pk_test_yourkeyhere +DEFAULT_CURRENCY=GBP diff --git a/stripe_config/.venv/bin/Activate.ps1 b/stripe_config/.venv/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/stripe_config/.venv/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/stripe_config/.venv/bin/activate b/stripe_config/.venv/bin/activate new file mode 100644 index 0000000..e756b45 --- /dev/null +++ b/stripe_config/.venv/bin/activate @@ -0,0 +1,70 @@ +# This file must be used with "source bin/activate" *from bash* +# You cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # Call hash to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + hash -r 2> /dev/null + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +# on Windows, a path can contain colons and backslashes and has to be converted: +if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then + # transform D:\path\to\venv to /d/path/to/venv on MSYS + # and to /cygdrive/d/path/to/venv on Cygwin + export VIRTUAL_ENV=$(cygpath /home/colby/stripe/.venv) +else + # use the path as-is + export VIRTUAL_ENV=/home/colby/stripe/.venv +fi + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/"bin":$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1='(.venv) '"${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT='(.venv) ' + export VIRTUAL_ENV_PROMPT +fi + +# Call hash to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +hash -r 2> /dev/null diff --git a/stripe_config/.venv/bin/activate.csh b/stripe_config/.venv/bin/activate.csh new file mode 100644 index 0000000..eea5d6a --- /dev/null +++ b/stripe_config/.venv/bin/activate.csh @@ -0,0 +1,27 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. + +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV /home/colby/stripe/.venv + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/"bin":$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = '(.venv) '"$prompt" + setenv VIRTUAL_ENV_PROMPT '(.venv) ' +endif + +alias pydoc python -m pydoc + +rehash diff --git a/stripe_config/.venv/bin/activate.fish b/stripe_config/.venv/bin/activate.fish new file mode 100644 index 0000000..2dd2fda --- /dev/null +++ b/stripe_config/.venv/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/). You cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV /home/colby/stripe/.venv + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/"bin $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) '(.venv) ' (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT '(.venv) ' +end diff --git a/stripe_config/.venv/bin/dotenv b/stripe_config/.venv/bin/dotenv new file mode 100755 index 0000000..d4e9deb --- /dev/null +++ b/stripe_config/.venv/bin/dotenv @@ -0,0 +1,8 @@ +#!/home/colby/stripe/.venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from dotenv.__main__ import cli +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli()) diff --git a/stripe_config/.venv/bin/flask b/stripe_config/.venv/bin/flask new file mode 100755 index 0000000..220ea1a --- /dev/null +++ b/stripe_config/.venv/bin/flask @@ -0,0 +1,8 @@ +#!/home/colby/stripe/.venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from flask.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/stripe_config/.venv/bin/normalizer b/stripe_config/.venv/bin/normalizer new file mode 100755 index 0000000..4c96cf6 --- /dev/null +++ b/stripe_config/.venv/bin/normalizer @@ -0,0 +1,8 @@ +#!/home/colby/stripe/.venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from charset_normalizer.cli import cli_detect +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli_detect()) diff --git a/stripe_config/.venv/bin/pip b/stripe_config/.venv/bin/pip new file mode 100755 index 0000000..d8955c4 --- /dev/null +++ b/stripe_config/.venv/bin/pip @@ -0,0 +1,8 @@ +#!/home/colby/stripe/.venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/stripe_config/.venv/bin/pip3 b/stripe_config/.venv/bin/pip3 new file mode 100755 index 0000000..d8955c4 --- /dev/null +++ b/stripe_config/.venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/colby/stripe/.venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/stripe_config/.venv/bin/pip3.12 b/stripe_config/.venv/bin/pip3.12 new file mode 100755 index 0000000..d8955c4 --- /dev/null +++ b/stripe_config/.venv/bin/pip3.12 @@ -0,0 +1,8 @@ +#!/home/colby/stripe/.venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/stripe_config/.venv/bin/python b/stripe_config/.venv/bin/python new file mode 120000 index 0000000..acd4152 --- /dev/null +++ b/stripe_config/.venv/bin/python @@ -0,0 +1 @@ +/usr/bin/python \ No newline at end of file diff --git a/stripe_config/.venv/bin/python3 b/stripe_config/.venv/bin/python3 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/stripe_config/.venv/bin/python3 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/stripe_config/.venv/bin/python3.12 b/stripe_config/.venv/bin/python3.12 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/stripe_config/.venv/bin/python3.12 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER b/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt b/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/METADATA b/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/METADATA new file mode 100644 index 0000000..82261f2 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/METADATA @@ -0,0 +1,92 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 3.0.2 +Summary: Safely add untrusted strings to HTML/XML markup. +Maintainer-email: Pallets +License: Copyright 2010 Pallets + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ +Project-URL: Source, https://github.com/pallets/markupsafe/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Typing :: Typed +Requires-Python: >=3.9 +Description-Content-Type: text/markdown +License-File: LICENSE.txt + +# MarkupSafe + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +## Examples + +```pycon +>>> from markupsafe import Markup, escape + +>>> # escape replaces special characters and wraps in Markup +>>> escape("") +Markup('<script>alert(document.cookie);</script>') + +>>> # wrap in Markup to mark text "safe" and prevent escaping +>>> Markup("Hello") +Markup('hello') + +>>> escape(Markup("Hello")) +Markup('hello') + +>>> # Markup is a str subclass +>>> # methods and operators escape their arguments +>>> template = Markup("Hello {name}") +>>> template.format(name='"World"') +Markup('Hello "World"') +``` + +## Donate + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +[please donate today][]. + +[please donate today]: https://palletsprojects.com/donate diff --git a/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/RECORD b/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/RECORD new file mode 100644 index 0000000..b7ba0b7 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/RECORD @@ -0,0 +1,14 @@ +MarkupSafe-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-3.0.2.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +MarkupSafe-3.0.2.dist-info/METADATA,sha256=aAwbZhSmXdfFuMM-rEHpeiHRkBOGESyVLJIuwzHP-nw,3975 +MarkupSafe-3.0.2.dist-info/RECORD,, +MarkupSafe-3.0.2.dist-info/WHEEL,sha256=OVgtqZzfzIXXtylXP90gxCZ6CKBCwKYyHM8PpMEjN1M,151 +MarkupSafe-3.0.2.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=sr-U6_27DfaSrj5jnHYxWN-pvhM27sjlDplMDPZKm7k,13214 +markupsafe/__pycache__/__init__.cpython-312.pyc,, +markupsafe/__pycache__/_native.cpython-312.pyc,, +markupsafe/_native.py,sha256=hSLs8Jmz5aqayuengJJ3kdT5PwNpBWpKrmQSdipndC8,210 +markupsafe/_speedups.c,sha256=O7XulmTo-epI6n2FtMVOrJXl8EAaIwD2iNYmBI5SEoQ,4149 +markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so,sha256=t1DBZlpsjFA30BOOvXfXfT1wvO_4cS16VbHz1-49q5U,43432 +markupsafe/_speedups.pyi,sha256=ENd1bYe7gbBUf2ywyYWOGUpnXOHNJ-cgTNqetlW8h5k,41 +markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL b/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL new file mode 100644 index 0000000..057fef6 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: false +Tag: cp312-cp312-manylinux_2_17_x86_64 +Tag: cp312-cp312-manylinux2014_x86_64 + diff --git a/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt b/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/stripe_config/.venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4318d2656ff023101accbcbc5a430fcbb2ac498 GIT binary patch literal 163738 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 z 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 Mts?VZ1x6qV05-(JB>(^b literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER b/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt b/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..79c9825 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright 2010 Jason Kirtland + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA b/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA new file mode 100644 index 0000000..6d343f5 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.3 +Name: blinker +Version: 1.9.0 +Summary: Fast, simple object-to-object and broadcast signaling +Author: Jason Kirtland +Maintainer-email: Pallets Ecosystem +Requires-Python: >=3.9 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Typing :: Typed +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://blinker.readthedocs.io +Project-URL: Source, https://github.com/pallets-eco/blinker/ + +# Blinker + +Blinker provides a fast dispatching system that allows any number of +interested parties to subscribe to events, or "signals". + + +## Pallets Community Ecosystem + +> [!IMPORTANT]\ +> This project is part of the Pallets Community Ecosystem. Pallets is the open +> source organization that maintains Flask; Pallets-Eco enables community +> maintenance of related projects. If you are interested in helping maintain +> this project, please reach out on [the Pallets Discord server][discord]. +> +> [discord]: https://discord.gg/pallets + + +## Example + +Signal receivers can subscribe to specific senders or receive signals +sent by any sender. + +```pycon +>>> from blinker import signal +>>> started = signal('round-started') +>>> def each(round): +... print(f"Round {round}") +... +>>> started.connect(each) + +>>> def round_two(round): +... print("This is round two.") +... +>>> started.connect(round_two, sender=2) + +>>> for round in range(1, 4): +... started.send(round) +... +Round 1! +Round 2! +This is round two. +Round 3! +``` + diff --git a/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD b/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD new file mode 100644 index 0000000..7cfb714 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD @@ -0,0 +1,12 @@ +blinker-1.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +blinker-1.9.0.dist-info/LICENSE.txt,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 +blinker-1.9.0.dist-info/METADATA,sha256=uIRiM8wjjbHkCtbCyTvctU37IAZk0kEe5kxAld1dvzA,1633 +blinker-1.9.0.dist-info/RECORD,, +blinker-1.9.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 +blinker/__init__.py,sha256=I2EdZqpy4LyjX17Hn1yzJGWCjeLaVaPzsMgHkLfj_cQ,317 +blinker/__pycache__/__init__.cpython-312.pyc,, +blinker/__pycache__/_utilities.cpython-312.pyc,, +blinker/__pycache__/base.cpython-312.pyc,, +blinker/_utilities.py,sha256=0J7eeXXTUx0Ivf8asfpx0ycVkp0Eqfqnj117x2mYX9E,1675 +blinker/base.py,sha256=QpDuvXXcwJF49lUBcH5BiST46Rz9wSG7VW_p7N_027M,19132 +blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL b/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL new file mode 100644 index 0000000..e3c6fee --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.10.1 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/stripe_config/.venv/lib/python3.12/site-packages/blinker/__init__.py b/stripe_config/.venv/lib/python3.12/site-packages/blinker/__init__.py new file mode 100644 index 0000000..1772fa4 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/blinker/__init__.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from .base import ANY +from .base import default_namespace +from .base import NamedSignal +from .base import Namespace +from .base import Signal +from .base import signal + +__all__ = [ + "ANY", + "default_namespace", + "NamedSignal", + "Namespace", + "Signal", + "signal", +] diff --git a/stripe_config/.venv/lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fa4f08e19dc2c4931f4285057375cc8e62a46ac GIT binary patch literal 482 zcmaKoy-ve05XaBWcdH6@Kte(cz|?_SzzRr=EM;IKi*Xvajp{g2J}PD8DcIR~79Id8 zQYOUE4YgY*&Ov45Wc~fS^WE9L_kO<%X!q-n`85If)XvU2zd$xm2rm#qNF>C>Cj`Py zXvj`%_(sbnvgw;GTgaAgwQM8XzTL8e?D$U0F0$*p1ZEI=uf+GN?y$Gg*9}SC<4Pq3 zFQP={D}0lV8Mos{+y<1)U@^sAyhf zQ7Y(YDb$k6D4=Oo%oBAvI=`TKRERVD%7V{CP6HXKg~%vlk%|h&MrpNmui_*urMSrk m*jY~`KSudB2q6uee8GMLrwtr6aM-{BuC?j(I?qnFhgmp$m;rLLAQFs8N&S!UT z4cKz4R855=Lpdf(`kSdiv^bHyih^Nl(*@;7;Qdjcq?9A-= zw==V|_ghz20>Sw3@7vRtVhH`g7wsX33|{*Vm?dN*8@s54^B8kJ;zmkRUT*Qxd{oF{ zc?D+4RZH=FTNK_`(Nn@6^CBhr#}*$G>nm-A^m zX{YS?d^De_MY3Igadj34Nz?Pn%w$g4^G9JVQBs5{@fk5^KOk(nYzO$P75WOP6i#^U z3@{hrUNZ#A1Wl$w^)Nm{f?# zh^<+s>-rictV%sFBnb_MZT43D@-fPfa>*I~E)F869f*o0tfc@C3fqN{NUck0Si=+E>7QkC#vbH_(hw zZ6@as&AeRGz`MY746${;3sM7Jjw94SH(Dj}Wuy^#)oz}jMq~_K$D>(^!Zs8{{c45K zKrsxDoHvZD97vYy2eJo23?vA85H}2qpVcsYUf&Slx##carpqOgv&wFvmV>i96_V4> z5${~ibqcvk4XVgHq7T2B^BqRssF>EQIYs}KzQmDGU;>E4B@h4Qksn%>ux?)2?x zN>`E#$;J0>s=MxFdYXwfaDg_Zfrn0{p$C{S2?jS3qlRb_nCqBkV9G`U*(YvMEPTFE z(;}Q$PSgruRy1p|+y#{0|U)VEQT$McfI4^6KjZkv5De z!k}%&mHQsEjsJjKEtSo{XNKiyUEWF561>2T__5)7` zfCTbr*(2GASO{^8uWw=1ic7|se%z}KX}YdYWRpBYyo3!SNEk+`Y*$^*rwrqZs_C{g zQ1o`$GK}yhWDKLDGlG=YCEdXZ&lBZw3c6aC!6L2;w*}KJAQd5bS5$_;E(p(np9S*l zTl6TRMAe5qNIyJxa;59gs+@Zw$D+M!-8i~yEe7N%kUkL*v3FCoM8SusmS2HcLTtT~ zX4bm^C|YBq570x5?-TrUnha;6k^yiN~Cx1MR+8rXZ)pBF;Hj!pbL}O`yH9vQ{8k z)rY=s`e4HwZvxtpHcM*U&hfZI!gL|bs(}KJKm{I+Kz005__9SDo0mqh>OtN)$L}{U z631`97^1cU$?+JZw;N8?S@BBAoF#^1QymnCxbh<)bLg>()XZ&V$4zC&vUE%7dmKaE zJ&XI7hOQ2+X7>El^TUas&-{31b?@*>W_U#%exPhw+<#5FHnv#5rR;kM#=Xr1>`A4Y z)}^=RM#JmcnP1*|CH{JR4$S|kf>dV)8n~Su$czGx#Av`vv>_J_5N_W=(9uCocnT^1 zf4Fcw9)ZfA-2ycA%{@_s20kX}Fc=+!pU(p{hwdrqj>z20>{{Nxd|@>+xS|d|NT!?q z;;GeS|BBq-ZV2K(V&Qu)ZhJjp>8DJ8nwLrlFD8IcUexq3kosOrKLMb)#rQa27(Y8P zF{JU1F`+fY9D0Hl!*$ti-WG~g_-=r6L?nV3t5qCt zD!?pI&cl}yKPQigh)$rKtyKto41|dI9TEj1B5@ss7n?sE&(&jLFB+jdK>RBEZv%NK zVT|vieSf0ecTxH->bZ}0+(!ey%UyHFFP{GTbkq7~bPhj_?Z$nN5RkQF8QlBifQ$!( G?|%T^NLr)- literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/blinker/__pycache__/base.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/blinker/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..864bd6ae6052111bf9f75363082537217679f7d0 GIT binary patch literal 21986 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/blinker/_utilities.py b/stripe_config/.venv/lib/python3.12/site-packages/blinker/_utilities.py new file mode 100644 index 0000000..000c902 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/blinker/_utilities.py @@ -0,0 +1,64 @@ +from __future__ import annotations + +import collections.abc as c +import inspect +import typing as t +from weakref import ref +from weakref import WeakMethod + +T = t.TypeVar("T") + + +class Symbol: + """A constant symbol, nicer than ``object()``. Repeated calls return the + same instance. + + >>> Symbol('foo') is Symbol('foo') + True + >>> Symbol('foo') + foo + """ + + symbols: t.ClassVar[dict[str, Symbol]] = {} + + def __new__(cls, name: str) -> Symbol: + if name in cls.symbols: + return cls.symbols[name] + + obj = super().__new__(cls) + cls.symbols[name] = obj + return obj + + def __init__(self, name: str) -> None: + self.name = name + + def __repr__(self) -> str: + return self.name + + def __getnewargs__(self) -> tuple[t.Any, ...]: + return (self.name,) + + +def make_id(obj: object) -> c.Hashable: + """Get a stable identifier for a receiver or sender, to be used as a dict + key or in a set. + """ + if inspect.ismethod(obj): + # The id of a bound method is not stable, but the id of the unbound + # function and instance are. + return id(obj.__func__), id(obj.__self__) + + if isinstance(obj, (str, int)): + # Instances with the same value always compare equal and have the same + # hash, even if the id may change. + return obj + + # Assume other types are not hashable but will always be the same instance. + return id(obj) + + +def make_ref(obj: T, callback: c.Callable[[ref[T]], None] | None = None) -> ref[T]: + if inspect.ismethod(obj): + return WeakMethod(obj, callback) # type: ignore[arg-type, return-value] + + return ref(obj, callback) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/blinker/base.py b/stripe_config/.venv/lib/python3.12/site-packages/blinker/base.py new file mode 100644 index 0000000..d051b94 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/blinker/base.py @@ -0,0 +1,512 @@ +from __future__ import annotations + +import collections.abc as c +import sys +import typing as t +import weakref +from collections import defaultdict +from contextlib import contextmanager +from functools import cached_property +from inspect import iscoroutinefunction + +from ._utilities import make_id +from ._utilities import make_ref +from ._utilities import Symbol + +F = t.TypeVar("F", bound=c.Callable[..., t.Any]) + +ANY = Symbol("ANY") +"""Symbol for "any sender".""" + +ANY_ID = 0 + + +class Signal: + """A notification emitter. + + :param doc: The docstring for the signal. + """ + + ANY = ANY + """An alias for the :data:`~blinker.ANY` sender symbol.""" + + set_class: type[set[t.Any]] = set + """The set class to use for tracking connected receivers and senders. + Python's ``set`` is unordered. If receivers must be dispatched in the order + they were connected, an ordered set implementation can be used. + + .. versionadded:: 1.7 + """ + + @cached_property + def receiver_connected(self) -> Signal: + """Emitted at the end of each :meth:`connect` call. + + The signal sender is the signal instance, and the :meth:`connect` + arguments are passed through: ``receiver``, ``sender``, and ``weak``. + + .. versionadded:: 1.2 + """ + return Signal(doc="Emitted after a receiver connects.") + + @cached_property + def receiver_disconnected(self) -> Signal: + """Emitted at the end of each :meth:`disconnect` call. + + The sender is the signal instance, and the :meth:`disconnect` arguments + are passed through: ``receiver`` and ``sender``. + + This signal is emitted **only** when :meth:`disconnect` is called + explicitly. This signal cannot be emitted by an automatic disconnect + when a weakly referenced receiver or sender goes out of scope, as the + instance is no longer be available to be used as the sender for this + signal. + + An alternative approach is available by subscribing to + :attr:`receiver_connected` and setting up a custom weakref cleanup + callback on weak receivers and senders. + + .. versionadded:: 1.2 + """ + return Signal(doc="Emitted after a receiver disconnects.") + + def __init__(self, doc: str | None = None) -> None: + if doc: + self.__doc__ = doc + + self.receivers: dict[ + t.Any, weakref.ref[c.Callable[..., t.Any]] | c.Callable[..., t.Any] + ] = {} + """The map of connected receivers. Useful to quickly check if any + receivers are connected to the signal: ``if s.receivers:``. The + structure and data is not part of the public API, but checking its + boolean value is. + """ + + self.is_muted: bool = False + self._by_receiver: dict[t.Any, set[t.Any]] = defaultdict(self.set_class) + self._by_sender: dict[t.Any, set[t.Any]] = defaultdict(self.set_class) + self._weak_senders: dict[t.Any, weakref.ref[t.Any]] = {} + + def connect(self, receiver: F, sender: t.Any = ANY, weak: bool = True) -> F: + """Connect ``receiver`` to be called when the signal is sent by + ``sender``. + + :param receiver: The callable to call when :meth:`send` is called with + the given ``sender``, passing ``sender`` as a positional argument + along with any extra keyword arguments. + :param sender: Any object or :data:`ANY`. ``receiver`` will only be + called when :meth:`send` is called with this sender. If ``ANY``, the + receiver will be called for any sender. A receiver may be connected + to multiple senders by calling :meth:`connect` multiple times. + :param weak: Track the receiver with a :mod:`weakref`. The receiver will + be automatically disconnected when it is garbage collected. When + connecting a receiver defined within a function, set to ``False``, + otherwise it will be disconnected when the function scope ends. + """ + receiver_id = make_id(receiver) + sender_id = ANY_ID if sender is ANY else make_id(sender) + + if weak: + self.receivers[receiver_id] = make_ref( + receiver, self._make_cleanup_receiver(receiver_id) + ) + else: + self.receivers[receiver_id] = receiver + + self._by_sender[sender_id].add(receiver_id) + self._by_receiver[receiver_id].add(sender_id) + + if sender is not ANY and sender_id not in self._weak_senders: + # store a cleanup for weakref-able senders + try: + self._weak_senders[sender_id] = make_ref( + sender, self._make_cleanup_sender(sender_id) + ) + except TypeError: + pass + + if "receiver_connected" in self.__dict__ and self.receiver_connected.receivers: + try: + self.receiver_connected.send( + self, receiver=receiver, sender=sender, weak=weak + ) + except TypeError: + # TODO no explanation or test for this + self.disconnect(receiver, sender) + raise + + return receiver + + def connect_via(self, sender: t.Any, weak: bool = False) -> c.Callable[[F], F]: + """Connect the decorated function to be called when the signal is sent + by ``sender``. + + The decorated function will be called when :meth:`send` is called with + the given ``sender``, passing ``sender`` as a positional argument along + with any extra keyword arguments. + + :param sender: Any object or :data:`ANY`. ``receiver`` will only be + called when :meth:`send` is called with this sender. If ``ANY``, the + receiver will be called for any sender. A receiver may be connected + to multiple senders by calling :meth:`connect` multiple times. + :param weak: Track the receiver with a :mod:`weakref`. The receiver will + be automatically disconnected when it is garbage collected. When + connecting a receiver defined within a function, set to ``False``, + otherwise it will be disconnected when the function scope ends.= + + .. versionadded:: 1.1 + """ + + def decorator(fn: F) -> F: + self.connect(fn, sender, weak) + return fn + + return decorator + + @contextmanager + def connected_to( + self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY + ) -> c.Generator[None, None, None]: + """A context manager that temporarily connects ``receiver`` to the + signal while a ``with`` block executes. When the block exits, the + receiver is disconnected. Useful for tests. + + :param receiver: The callable to call when :meth:`send` is called with + the given ``sender``, passing ``sender`` as a positional argument + along with any extra keyword arguments. + :param sender: Any object or :data:`ANY`. ``receiver`` will only be + called when :meth:`send` is called with this sender. If ``ANY``, the + receiver will be called for any sender. + + .. versionadded:: 1.1 + """ + self.connect(receiver, sender=sender, weak=False) + + try: + yield None + finally: + self.disconnect(receiver) + + @contextmanager + def muted(self) -> c.Generator[None, None, None]: + """A context manager that temporarily disables the signal. No receivers + will be called if the signal is sent, until the ``with`` block exits. + Useful for tests. + """ + self.is_muted = True + + try: + yield None + finally: + self.is_muted = False + + def send( + self, + sender: t.Any | None = None, + /, + *, + _async_wrapper: c.Callable[ + [c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]]], c.Callable[..., t.Any] + ] + | None = None, + **kwargs: t.Any, + ) -> list[tuple[c.Callable[..., t.Any], t.Any]]: + """Call all receivers that are connected to the given ``sender`` + or :data:`ANY`. Each receiver is called with ``sender`` as a positional + argument along with any extra keyword arguments. Return a list of + ``(receiver, return value)`` tuples. + + The order receivers are called is undefined, but can be influenced by + setting :attr:`set_class`. + + If a receiver raises an exception, that exception will propagate up. + This makes debugging straightforward, with an assumption that correctly + implemented receivers will not raise. + + :param sender: Call receivers connected to this sender, in addition to + those connected to :data:`ANY`. + :param _async_wrapper: Will be called on any receivers that are async + coroutines to turn them into sync callables. For example, could run + the receiver with an event loop. + :param kwargs: Extra keyword arguments to pass to each receiver. + + .. versionchanged:: 1.7 + Added the ``_async_wrapper`` argument. + """ + if self.is_muted: + return [] + + results = [] + + for receiver in self.receivers_for(sender): + if iscoroutinefunction(receiver): + if _async_wrapper is None: + raise RuntimeError("Cannot send to a coroutine function.") + + result = _async_wrapper(receiver)(sender, **kwargs) + else: + result = receiver(sender, **kwargs) + + results.append((receiver, result)) + + return results + + async def send_async( + self, + sender: t.Any | None = None, + /, + *, + _sync_wrapper: c.Callable[ + [c.Callable[..., t.Any]], c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]] + ] + | None = None, + **kwargs: t.Any, + ) -> list[tuple[c.Callable[..., t.Any], t.Any]]: + """Await all receivers that are connected to the given ``sender`` + or :data:`ANY`. Each receiver is called with ``sender`` as a positional + argument along with any extra keyword arguments. Return a list of + ``(receiver, return value)`` tuples. + + The order receivers are called is undefined, but can be influenced by + setting :attr:`set_class`. + + If a receiver raises an exception, that exception will propagate up. + This makes debugging straightforward, with an assumption that correctly + implemented receivers will not raise. + + :param sender: Call receivers connected to this sender, in addition to + those connected to :data:`ANY`. + :param _sync_wrapper: Will be called on any receivers that are sync + callables to turn them into async coroutines. For example, + could call the receiver in a thread. + :param kwargs: Extra keyword arguments to pass to each receiver. + + .. versionadded:: 1.7 + """ + if self.is_muted: + return [] + + results = [] + + for receiver in self.receivers_for(sender): + if not iscoroutinefunction(receiver): + if _sync_wrapper is None: + raise RuntimeError("Cannot send to a non-coroutine function.") + + result = await _sync_wrapper(receiver)(sender, **kwargs) + else: + result = await receiver(sender, **kwargs) + + results.append((receiver, result)) + + return results + + def has_receivers_for(self, sender: t.Any) -> bool: + """Check if there is at least one receiver that will be called with the + given ``sender``. A receiver connected to :data:`ANY` will always be + called, regardless of sender. Does not check if weakly referenced + receivers are still live. See :meth:`receivers_for` for a stronger + search. + + :param sender: Check for receivers connected to this sender, in addition + to those connected to :data:`ANY`. + """ + if not self.receivers: + return False + + if self._by_sender[ANY_ID]: + return True + + if sender is ANY: + return False + + return make_id(sender) in self._by_sender + + def receivers_for( + self, sender: t.Any + ) -> c.Generator[c.Callable[..., t.Any], None, None]: + """Yield each receiver to be called for ``sender``, in addition to those + to be called for :data:`ANY`. Weakly referenced receivers that are not + live will be disconnected and skipped. + + :param sender: Yield receivers connected to this sender, in addition + to those connected to :data:`ANY`. + """ + # TODO: test receivers_for(ANY) + if not self.receivers: + return + + sender_id = make_id(sender) + + if sender_id in self._by_sender: + ids = self._by_sender[ANY_ID] | self._by_sender[sender_id] + else: + ids = self._by_sender[ANY_ID].copy() + + for receiver_id in ids: + receiver = self.receivers.get(receiver_id) + + if receiver is None: + continue + + if isinstance(receiver, weakref.ref): + strong = receiver() + + if strong is None: + self._disconnect(receiver_id, ANY_ID) + continue + + yield strong + else: + yield receiver + + def disconnect(self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY) -> None: + """Disconnect ``receiver`` from being called when the signal is sent by + ``sender``. + + :param receiver: A connected receiver callable. + :param sender: Disconnect from only this sender. By default, disconnect + from all senders. + """ + sender_id: c.Hashable + + if sender is ANY: + sender_id = ANY_ID + else: + sender_id = make_id(sender) + + receiver_id = make_id(receiver) + self._disconnect(receiver_id, sender_id) + + if ( + "receiver_disconnected" in self.__dict__ + and self.receiver_disconnected.receivers + ): + self.receiver_disconnected.send(self, receiver=receiver, sender=sender) + + def _disconnect(self, receiver_id: c.Hashable, sender_id: c.Hashable) -> None: + if sender_id == ANY_ID: + if self._by_receiver.pop(receiver_id, None) is not None: + for bucket in self._by_sender.values(): + bucket.discard(receiver_id) + + self.receivers.pop(receiver_id, None) + else: + self._by_sender[sender_id].discard(receiver_id) + self._by_receiver[receiver_id].discard(sender_id) + + def _make_cleanup_receiver( + self, receiver_id: c.Hashable + ) -> c.Callable[[weakref.ref[c.Callable[..., t.Any]]], None]: + """Create a callback function to disconnect a weakly referenced + receiver when it is garbage collected. + """ + + def cleanup(ref: weakref.ref[c.Callable[..., t.Any]]) -> None: + # If the interpreter is shutting down, disconnecting can result in a + # weird ignored exception. Don't call it in that case. + if not sys.is_finalizing(): + self._disconnect(receiver_id, ANY_ID) + + return cleanup + + def _make_cleanup_sender( + self, sender_id: c.Hashable + ) -> c.Callable[[weakref.ref[t.Any]], None]: + """Create a callback function to disconnect all receivers for a weakly + referenced sender when it is garbage collected. + """ + assert sender_id != ANY_ID + + def cleanup(ref: weakref.ref[t.Any]) -> None: + self._weak_senders.pop(sender_id, None) + + for receiver_id in self._by_sender.pop(sender_id, ()): + self._by_receiver[receiver_id].discard(sender_id) + + return cleanup + + def _cleanup_bookkeeping(self) -> None: + """Prune unused sender/receiver bookkeeping. Not threadsafe. + + Connecting & disconnecting leaves behind a small amount of bookkeeping + data. Typical workloads using Blinker, for example in most web apps, + Flask, CLI scripts, etc., are not adversely affected by this + bookkeeping. + + With a long-running process performing dynamic signal routing with high + volume, e.g. connecting to function closures, senders are all unique + object instances. Doing all of this over and over may cause memory usage + to grow due to extraneous bookkeeping. (An empty ``set`` for each stale + sender/receiver pair.) + + This method will prune that bookkeeping away, with the caveat that such + pruning is not threadsafe. The risk is that cleanup of a fully + disconnected receiver/sender pair occurs while another thread is + connecting that same pair. If you are in the highly dynamic, unique + receiver/sender situation that has lead you to this method, that failure + mode is perhaps not a big deal for you. + """ + for mapping in (self._by_sender, self._by_receiver): + for ident, bucket in list(mapping.items()): + if not bucket: + mapping.pop(ident, None) + + def _clear_state(self) -> None: + """Disconnect all receivers and senders. Useful for tests.""" + self._weak_senders.clear() + self.receivers.clear() + self._by_sender.clear() + self._by_receiver.clear() + + +class NamedSignal(Signal): + """A named generic notification emitter. The name is not used by the signal + itself, but matches the key in the :class:`Namespace` that it belongs to. + + :param name: The name of the signal within the namespace. + :param doc: The docstring for the signal. + """ + + def __init__(self, name: str, doc: str | None = None) -> None: + super().__init__(doc) + + #: The name of this signal. + self.name: str = name + + def __repr__(self) -> str: + base = super().__repr__() + return f"{base[:-1]}; {self.name!r}>" # noqa: E702 + + +class Namespace(dict[str, NamedSignal]): + """A dict mapping names to signals.""" + + def signal(self, name: str, doc: str | None = None) -> NamedSignal: + """Return the :class:`NamedSignal` for the given ``name``, creating it + if required. Repeated calls with the same name return the same signal. + + :param name: The name of the signal. + :param doc: The docstring of the signal. + """ + if name not in self: + self[name] = NamedSignal(name, doc) + + return self[name] + + +class _PNamespaceSignal(t.Protocol): + def __call__(self, name: str, doc: str | None = None) -> NamedSignal: ... + + +default_namespace: Namespace = Namespace() +"""A default :class:`Namespace` for creating named signals. :func:`signal` +creates a :class:`NamedSignal` in this namespace. +""" + +signal: _PNamespaceSignal = default_namespace.signal +"""Return a :class:`NamedSignal` in :data:`default_namespace` with the given +``name``, creating it if required. Repeated calls with the same name return the +same signal. +""" diff --git a/stripe_config/.venv/lib/python3.12/site-packages/blinker/py.typed b/stripe_config/.venv/lib/python3.12/site-packages/blinker/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/INSTALLER b/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/METADATA b/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/METADATA new file mode 100644 index 0000000..3a7ea22 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/METADATA @@ -0,0 +1,77 @@ +Metadata-Version: 2.4 +Name: certifi +Version: 2025.8.3 +Summary: Python package for providing Mozilla's CA Bundle. +Home-page: https://github.com/certifi/python-certifi +Author: Kenneth Reitz +Author-email: me@kennethreitz.com +License: MPL-2.0 +Project-URL: Source, https://github.com/certifi/python-certifi +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Requires-Python: >=3.7 +License-File: LICENSE +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: description +Dynamic: home-page +Dynamic: license +Dynamic: license-file +Dynamic: project-url +Dynamic: requires-python +Dynamic: summary + +Certifi: Python SSL Certificates +================================ + +Certifi provides Mozilla's carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem' + +Or from the command line:: + + $ python -m certifi + /usr/local/lib/python3.7/site-packages/certifi/cacert.pem + +Enjoy! + +.. _`Requests`: https://requests.readthedocs.io/en/master/ + +Addition/Removal of Certificates +-------------------------------- + +Certifi does not support any addition/removal or other modification of the +CA trust store content. This project is intended to provide a reliable and +highly portable root of trust to python deployments. Look to upstream projects +for methods to use alternate trust. diff --git a/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/RECORD b/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/RECORD new file mode 100644 index 0000000..64c2430 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/RECORD @@ -0,0 +1,14 @@ +certifi-2025.8.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi-2025.8.3.dist-info/METADATA,sha256=z4sG3fosbP3nviub_TUpSb71z0bPmsp3Xa6ZIatGUe4,2422 +certifi-2025.8.3.dist-info/RECORD,, +certifi-2025.8.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 +certifi-2025.8.3.dist-info/licenses/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 +certifi-2025.8.3.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi/__init__.py,sha256=0a5ro4KTYep37Oo0Z8TycCPXaDlOEtvuj2pNWZ_1t8Y,94 +certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 +certifi/__pycache__/__init__.cpython-312.pyc,, +certifi/__pycache__/__main__.cpython-312.pyc,, +certifi/__pycache__/core.cpython-312.pyc,, +certifi/cacert.pem,sha256=kQLmo2RKBxumzb1KU2mPKRxKZLGEUKCLwEZUi221zIs,287634 +certifi/core.py,sha256=XFXycndG5pf37ayeF8N32HUuDafsyhkVMbO4BAPWHa0,3394 +certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/WHEEL b/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/WHEEL new file mode 100644 index 0000000..e7fa31b --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/licenses/LICENSE b/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/licenses/LICENSE new file mode 100644 index 0000000..62b076c --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/licenses/LICENSE @@ -0,0 +1,20 @@ +This package contains a modified version of ca-bundle.crt: + +ca-bundle.crt -- Bundle of CA Root Certificates + +This is a bundle of X.509 certificates of public Certificate Authorities +(CA). These were automatically extracted from Mozilla's root certificates +file (certdata.txt). This file can be found in the mozilla source tree: +https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt +It contains the certificates in PEM format and therefore +can be directly used with curl / libcurl / php_curl, or with +an Apache+mod_ssl webserver for SSL client authentication. +Just configure this file as the SSLCACertificateFile.# + +***** BEGIN LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public License, +v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain +one at http://mozilla.org/MPL/2.0/. + +***** END LICENSE BLOCK ***** +@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/top_level.txt b/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/top_level.txt new file mode 100644 index 0000000..963eac5 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/certifi-2025.8.3.dist-info/top_level.txt @@ -0,0 +1 @@ +certifi diff --git a/stripe_config/.venv/lib/python3.12/site-packages/certifi/__init__.py b/stripe_config/.venv/lib/python3.12/site-packages/certifi/__init__.py new file mode 100644 index 0000000..fe2a891 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/certifi/__init__.py @@ -0,0 +1,4 @@ +from .core import contents, where + +__all__ = ["contents", "where"] +__version__ = "2025.08.03" diff --git a/stripe_config/.venv/lib/python3.12/site-packages/certifi/__main__.py b/stripe_config/.venv/lib/python3.12/site-packages/certifi/__main__.py new file mode 100644 index 0000000..8945b5d --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/certifi/__main__.py @@ -0,0 +1,12 @@ +import argparse + +from certifi import contents, where + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--contents", action="store_true") +args = parser.parse_args() + +if args.contents: + print(contents()) +else: + print(where()) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04f9298ad2b087dcd2f81d3bb0f25b2eb7c7bf7e GIT binary patch literal 297 zcmYjLu};G<5Vf6zmPBPkNG!nEfjFc>VnFOHuxH?uCZ@4)?8r8$!UTW7#y9XSENq}G zAThBax^=>pK;jMW-rak5x~I`7L=NZQFV%&sAFJjMB9I zZ$>h&^fSK;#%rJ0#m1x`7D`$st?7e##Wd5Nn`__EO_(O>VVoSr$>eMt^nRiK+x-9_ z7XqM<09vLER}$b6E!-+vp3+Lyj222vJ8G=v4Wn_(WJ?8~(x$VOl9Tu#rG{I!-{i$r zK4XR!Oj~}*DFBz;0>n+X93I!IycX<4NAB|KZL{U*%flGIp}qHL^M3vu?%WPuH@5F0 Hz3#jpcyUh~ literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a674074860054e6bb5b5663c74831cf28e3b9c63 GIT binary patch literal 612 zcmZuu&r2IY6n?Y6cWG1%Lhuw?N*gg5v{w~`UV2fFC6{I0ohF;^FJ>o7#Df${TfBH{ z|AdzKpY+mTO48}Y(nIM@^yaBEF>5Xzn0ep(zVAKW%zQ1C91v^wdepuV@wZHhrBA`l zP=JpRK!74>%BVyrR+>tzHdO=)5a?J%(Jc0-u&EQhQ=0Jw3e-Rg^mC)H-Z2P-Z@y4x z@xG5mtd2J03qVBQumLX zdi|bua+Xr!GTJ3I#0}49VVcw&Zh5qoc{C^7^a*9*tB}h3P&p`{+or8xt`#9^d zcA7kEtgYibWTc*X{%fyAay%UeyKd}-iR(79-mSF}r$IL&TXa!$md}*G6vvf{5c&!8 zf8f!jU435}+0}tvy|5pi7-KL-P#!?}?D?nF&&S`OJcNz0SsIy@fmyjQmrt}y)qJ=4 bX7h(;e|UPj@?Bf{CD7y3CvSJ?f@uB^iXN1K literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6efd2b7669fcacad5a77119e8a2da02ee472deaa GIT binary patch literal 2044 zcmbVN&u<$=6rNe{#%ss!h9o3TUDcKm5c9(pY1D!OC~aD)kSIY(gs6qI+U`!`b#1RT zJ4s`ZP!1f*iQJk)g>vAKD*OTc6OiB#<07La2PBYCZUIL^%857Y-L+$K;z{$~+nM*q zv)}j4`iFQtiollsZWV9E5&E4!_$GKsdk>Pw$Up^TU_&V50(PTN5R8~1ekm401eavL zts4#L!KVn(38)?@OO=7bKqXuVV`K=L3?pKMNOVmw!mz`jm&=gH>H>5`pd((mR8b1b ze>$Q)9fO^YZ2U74)d^+hnwhKBqhACTjjk3=J6*AijWS77!Zv8tPO~COn^l`><+8?1 ztC}ubdMB~g(z?cX%GF3EZPB#J?6huG8L2Wm7d__hx9ALXHqyIqi;x5lAsFo`aE}oS z)=GS~&kO+6KnLCmMs<|Mi&?=LROfEa-C15$=T<*)WK|_wCR5d?sLlJ&?&OPBh2(Xs ze7~Nz88vGppW7tW&3xIspRd(f(W+j{y)~7$O-A0VY5D_go!EH~80ez}&~X%Z*UoFI zI@_XL1$@|};I`3`sIjNUsDE?zaPPBIra+@oP#$ ze%6g_*w6hA+{5GwdKy}E!XBPy(XLXmQ77h8_tDMOyOf`WUIORHCCjYVG*+bieVq{S z=0t#5kQ7x_XFy||4o9YB-LzrOWrK1YT-0fVcS#S6gc3Rd`HL{@d2rk4bO^-~hl8op zF_g@F`|^IInVD*3W*V89XA8~D2hGbLKAJyDUVZX;D>dCnO*d25o5>rG7LH=WUoU;N z^knII?2SK^0gGthJ?)>jOVjEl)NAHnm=q+HEenT|kkz+$DnoG9!O;d= zK{N>=iz%<{KPM;JWqTPCn`?-(o!Fh&TX=TkxiWVs&w0dBzTaYY$O)^eVd-$+LU!Hm zz`zl3Vw;58@DHGx)iui*F)KBTGWeS2D6y>#suR0=mE8;M0^C8A-$wTsG|jUNcNZM@ zOn$fX_wzoTgc5#}>@9F7A&l`~f`r9(4B^3FQM@f;{Q8NE#BeJ#(g=<0Jp3ti^-po? zx8bqv`CmrHw--*tap}s=wKjrqGKHlTyrZ8Y9{-6VX%_cZCOVZ6PNuPR+pD~dU1 None: + _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr] + + +if sys.version_info >= (3, 11): + + from importlib.resources import as_file, files + + _CACERT_CTX = None + _CACERT_PATH = None + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the file + # in cases where we're inside of a zipimport situation until someone + # actually calls where(), but we don't want to re-extract the file + # on every call of where(), so we'll do it once then store it in a + # global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you to + # manage the cleanup of this file, so it doesn't actually return a + # path, it returns a context manager that will give you the path + # when you enter it and will do any cleanup when you leave it. In + # the common case of not needing a temporary file, it will just + # return the file system location and the __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = as_file(files("certifi").joinpath("cacert.pem")) + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + atexit.register(exit_cacert_ctx) + + return _CACERT_PATH + + def contents() -> str: + return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii") + +else: + + from importlib.resources import path as get_path, read_text + + _CACERT_CTX = None + _CACERT_PATH = None + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the + # file in cases where we're inside of a zipimport situation until + # someone actually calls where(), but we don't want to re-extract + # the file on every call of where(), so we'll do it once then store + # it in a global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you + # to manage the cleanup of this file, so it doesn't actually + # return a path, it returns a context manager that will give + # you the path when you enter it and will do any cleanup when + # you leave it. In the common case of not needing a temporary + # file, it will just return the file system location and the + # __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = get_path("certifi", "cacert.pem") + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + atexit.register(exit_cacert_ctx) + + return _CACERT_PATH + + def contents() -> str: + return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/stripe_config/.venv/lib/python3.12/site-packages/certifi/py.typed b/stripe_config/.venv/lib/python3.12/site-packages/certifi/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/INSTALLER b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/METADATA b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/METADATA new file mode 100644 index 0000000..65b5577 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/METADATA @@ -0,0 +1,750 @@ +Metadata-Version: 2.4 +Name: charset-normalizer +Version: 3.4.3 +Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +Author-email: "Ahmed R. TAHRI" +Maintainer-email: "Ahmed R. TAHRI" +License: MIT +Project-URL: Changelog, https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md +Project-URL: Documentation, https://charset-normalizer.readthedocs.io/ +Project-URL: Code, https://github.com/jawah/charset_normalizer +Project-URL: Issue tracker, https://github.com/jawah/charset_normalizer/issues +Keywords: encoding,charset,charset-detector,detector,normalization,unicode,chardet,detect +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Text Processing :: Linguistic +Classifier: Topic :: Utilities +Classifier: Typing :: Typed +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: unicode-backport +Dynamic: license-file + +

Charset Detection, for Everyone 👋

+ +

+ The Real First Universal Charset Detector
+ + + + + Download Count Total + + + + +

+

+ Featured Packages
+ + Static Badge + + + Static Badge + +

+

+ In other language (unofficial port - by the community)
+ + Static Badge + +

+ +> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`, +> I'm trying to resolve the issue by taking a new approach. +> All IANA character set names for which the Python core library provides codecs are supported. + +

+ >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<< +

+ +This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**. + +| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) | +|--------------------------------------------------|:---------------------------------------------:|:--------------------------------------------------------------------------------------------------:|:-----------------------------------------------:| +| `Fast` | ❌ | ✅ | ✅ | +| `Universal**` | ❌ | ✅ | ❌ | +| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ | +| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ | +| `License` | LGPL-2.1
_restrictive_ | MIT | MPL-1.1
_restrictive_ | +| `Native Python` | ✅ | ✅ | ❌ | +| `Detect spoken language` | ❌ | ✅ | N/A | +| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ | +| `Whl Size (min)` | 193.6 kB | 42 kB | ~200 kB | +| `Supported Encoding` | 33 | 🎉 [99](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 | + +

+Reading Normalized TextCat Reading Text +

+ +*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
+ +## ⚡ Performance + +This package offer better performance than its counterpart Chardet. Here are some numbers. + +| Package | Accuracy | Mean per file (ms) | File per sec (est) | +|-----------------------------------------------|:--------:|:------------------:|:------------------:| +| [chardet](https://github.com/chardet/chardet) | 86 % | 63 ms | 16 file/sec | +| charset-normalizer | **98 %** | **10 ms** | 100 file/sec | + +| Package | 99th percentile | 95th percentile | 50th percentile | +|-----------------------------------------------|:---------------:|:---------------:|:---------------:| +| [chardet](https://github.com/chardet/chardet) | 265 ms | 71 ms | 7 ms | +| charset-normalizer | 100 ms | 50 ms | 5 ms | + +_updated as of december 2024 using CPython 3.12_ + +Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload. + +> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. +> And yes, these results might change at any time. The dataset can be updated to include more files. +> The actual delays heavily depends on your CPU capabilities. The factors should remain the same. +> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability +> (e.g. Supported Encoding) Challenge-them if you want. + +## ✨ Installation + +Using pip: + +```sh +pip install charset-normalizer -U +``` + +## 🚀 Basic Usage + +### CLI +This package comes with a CLI. + +``` +usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD] + file [file ...] + +The Real First Universal Charset Detector. Discover originating encoding used +on text file. Normalize text to unicode. + +positional arguments: + files File(s) to be analysed + +optional arguments: + -h, --help show this help message and exit + -v, --verbose Display complementary information about file if any. + Stdout will contain logs about the detection process. + -a, --with-alternative + Output complementary possibilities if any. Top-level + JSON WILL be a list. + -n, --normalize Permit to normalize input file. If not set, program + does not write anything. + -m, --minimal Only output the charset detected to STDOUT. Disabling + JSON output. + -r, --replace Replace file when trying to normalize it instead of + creating a new one. + -f, --force Replace file without asking if you are sure, use this + flag with caution. + -t THRESHOLD, --threshold THRESHOLD + Define a custom maximum amount of chaos allowed in + decoded content. 0. <= chaos <= 1. + --version Show version information and exit. +``` + +```bash +normalizer ./data/sample.1.fr.srt +``` + +or + +```bash +python -m charset_normalizer ./data/sample.1.fr.srt +``` + +🎉 Since version 1.4.0 the CLI produce easily usable stdout result in JSON format. + +```json +{ + "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt", + "encoding": "cp1252", + "encoding_aliases": [ + "1252", + "windows_1252" + ], + "alternative_encodings": [ + "cp1254", + "cp1256", + "cp1258", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + "mbcs" + ], + "language": "French", + "alphabets": [ + "Basic Latin", + "Latin-1 Supplement" + ], + "has_sig_or_bom": false, + "chaos": 0.149, + "coherence": 97.152, + "unicode_path": null, + "is_preferred": true +} +``` + +### Python +*Just print out normalized text* +```python +from charset_normalizer import from_path + +results = from_path('./my_subtitle.srt') + +print(str(results.best())) +``` + +*Upgrade your code without effort* +```python +from charset_normalizer import detect +``` + +The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible. + +See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/) + +## 😇 Why + +When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a +reliable alternative using a completely different method. Also! I never back down on a good challenge! + +I **don't care** about the **originating charset** encoding, because **two different tables** can +produce **two identical rendered string.** +What I want is to get readable text, the best I can. + +In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 + +Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair Unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. + +## 🍰 How + + - Discard all charset encoding table that could not fit the binary content. + - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding. + - Extract matches with the lowest mess detected. + - Additionally, we measure coherence / probe for a language. + +**Wait a minute**, what is noise/mess and coherence according to **YOU ?** + +*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then +**I established** some ground rules about **what is obvious** when **it seems like** a mess (aka. defining noise in rendered text). + I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to + improve or rewrite it. + +*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought +that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design. + +## ⚡ Known limitations + + - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters)) + - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content. + +## ⚠️ About Python EOLs + +**If you are running:** + +- Python >=2.7,<3.5: Unsupported +- Python 3.5: charset-normalizer < 2.1 +- Python 3.6: charset-normalizer < 3.1 +- Python 3.7: charset-normalizer < 4.0 + +Upgrade your Python interpreter as soon as possible. + +## 👤 Contributing + +Contributions, issues and feature requests are very much welcome.
+Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute. + +## 📝 License + +Copyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).
+This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed. + +Characters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/) + +## 💼 For Enterprise + +Professional support for charset-normalizer is available as part of the [Tidelift +Subscription][1]. Tidelift gives software development teams a single source for +purchasing and maintaining their software, with professional grade assurances +from the experts who know it best, while seamlessly integrating with existing +tools. + +[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme + +[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/7297/badge)](https://www.bestpractices.dev/projects/7297) + +# Changelog +All notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +## [3.4.3](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.3) (2025-08-09) + +### Changed +- mypy(c) is no longer a required dependency at build time if `CHARSET_NORMALIZER_USE_MYPYC` isn't set to `1`. (#595) (#583) +- automatically lower confidence on small bytes samples that are not Unicode in `detect` output legacy function. (#391) + +### Added +- Custom build backend to overcome inability to mark mypy as an optional dependency in the build phase. +- Support for Python 3.14 + +### Fixed +- sdist archive contained useless directories. +- automatically fallback on valid UTF-16 or UTF-32 even if the md says it's noisy. (#633) + +### Misc +- SBOM are automatically published to the relevant GitHub release to comply with regulatory changes. + Each published wheel comes with its SBOM. We choose CycloneDX as the format. +- Prebuilt optimized wheel are no longer distributed by default for CPython 3.7 due to a change in cibuildwheel. + +## [3.4.2](https://github.com/Ousret/charset_normalizer/compare/3.4.1...3.4.2) (2025-05-02) + +### Fixed +- Addressed the DeprecationWarning in our CLI regarding `argparse.FileType` by backporting the target class into the package. (#591) +- Improved the overall reliability of the detector with CJK Ideographs. (#605) (#587) + +### Changed +- Optional mypyc compilation upgraded to version 1.15 for Python >= 3.8 + +## [3.4.1](https://github.com/Ousret/charset_normalizer/compare/3.4.0...3.4.1) (2024-12-24) + +### Changed +- Project metadata are now stored using `pyproject.toml` instead of `setup.cfg` using setuptools as the build backend. +- Enforce annotation delayed loading for a simpler and consistent types in the project. +- Optional mypyc compilation upgraded to version 1.14 for Python >= 3.8 + +### Added +- pre-commit configuration. +- noxfile. + +### Removed +- `build-requirements.txt` as per using `pyproject.toml` native build configuration. +- `bin/integration.py` and `bin/serve.py` in favor of downstream integration test (see noxfile). +- `setup.cfg` in favor of `pyproject.toml` metadata configuration. +- Unused `utils.range_scan` function. + +### Fixed +- Converting content to Unicode bytes may insert `utf_8` instead of preferred `utf-8`. (#572) +- Deprecation warning "'count' is passed as positional argument" when converting to Unicode bytes on Python 3.13+ + +## [3.4.0](https://github.com/Ousret/charset_normalizer/compare/3.3.2...3.4.0) (2024-10-08) + +### Added +- Argument `--no-preemptive` in the CLI to prevent the detector to search for hints. +- Support for Python 3.13 (#512) + +### Fixed +- Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch. +- Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537) +- Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381) + +## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31) + +### Fixed +- Unintentional memory usage regression when using large payload that match several encoding (#376) +- Regression on some detection case showcased in the documentation (#371) + +### Added +- Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife) + +## [3.3.1](https://github.com/Ousret/charset_normalizer/compare/3.3.0...3.3.1) (2023-10-22) + +### Changed +- Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8 +- Improved the general detection reliability based on reports from the community + +## [3.3.0](https://github.com/Ousret/charset_normalizer/compare/3.2.0...3.3.0) (2023-09-30) + +### Added +- Allow to execute the CLI (e.g. normalizer) through `python -m charset_normalizer.cli` or `python -m charset_normalizer` +- Support for 9 forgotten encoding that are supported by Python but unlisted in `encoding.aliases` as they have no alias (#323) + +### Removed +- (internal) Redundant utils.is_ascii function and unused function is_private_use_only +- (internal) charset_normalizer.assets is moved inside charset_normalizer.constant + +### Changed +- (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection +- Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8 + +### Fixed +- Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in \_\_lt\_\_ (#350) + +## [3.2.0](https://github.com/Ousret/charset_normalizer/compare/3.1.0...3.2.0) (2023-06-07) + +### Changed +- Typehint for function `from_path` no longer enforce `PathLike` as its first argument +- Minor improvement over the global detection reliability + +### Added +- Introduce function `is_binary` that relies on main capabilities, and optimized to detect binaries +- Propagate `enable_fallback` argument throughout `from_bytes`, `from_path`, and `from_fp` that allow a deeper control over the detection (default True) +- Explicit support for Python 3.12 + +### Fixed +- Edge case detection failure where a file would contain 'very-long' camel cased word (Issue #289) + +## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06) + +### Added +- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262) + +### Removed +- Support for Python 3.6 (PR #260) + +### Changed +- Optional speedup provided by mypy/c 1.0.1 + +## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18) + +### Fixed +- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233) + +### Changed +- Speedup provided by mypy/c 0.990 on Python >= 3.7 + +## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20) + +### Added +- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results +- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES +- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio +- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) + +### Changed +- Build with static metadata using 'build' frontend +- Make the language detection stricter +- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 + +### Fixed +- CLI with opt --normalize fail when using full path for files +- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it +- Sphinx warnings when generating the documentation + +### Removed +- Coherence detector no longer return 'Simple English' instead return 'English' +- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' +- Breaking: Method `first()` and `best()` from CharsetMatch +- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) +- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches +- Breaking: Top-level function `normalize` +- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch +- Support for the backport `unicodedata2` + +## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18) + +### Added +- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results +- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES +- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio + +### Changed +- Build with static metadata using 'build' frontend +- Make the language detection stricter + +### Fixed +- CLI with opt --normalize fail when using full path for files +- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it + +### Removed +- Coherence detector no longer return 'Simple English' instead return 'English' +- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' + +## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21) + +### Added +- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) + +### Removed +- Breaking: Method `first()` and `best()` from CharsetMatch +- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) + +### Fixed +- Sphinx warnings when generating the documentation + +## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15) + +### Changed +- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 + +### Removed +- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches +- Breaking: Top-level function `normalize` +- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch +- Support for the backport `unicodedata2` + +## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19) + +### Deprecated +- Function `normalize` scheduled for removal in 3.0 + +### Changed +- Removed useless call to decode in fn is_unprintable (#206) + +### Fixed +- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204) + +## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19) + +### Added +- Output the Unicode table version when running the CLI with `--version` (PR #194) + +### Changed +- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175) +- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183) + +### Fixed +- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175) +- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181) + +### Removed +- Support for Python 3.5 (PR #192) + +### Deprecated +- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194) + +## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12) + +### Fixed +- ASCII miss-detection on rare cases (PR #170) + +## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30) + +### Added +- Explicit support for Python 3.11 (PR #164) + +### Changed +- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165) + +## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04) + +### Fixed +- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154) + +### Changed +- Skipping the language-detection (CD) on ASCII (PR #155) + +## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03) + +### Changed +- Moderating the logging impact (since 2.0.8) for specific environments (PR #147) + +### Fixed +- Wrong logging level applied when setting kwarg `explain` to True (PR #146) + +## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24) +### Changed +- Improvement over Vietnamese detection (PR #126) +- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124) +- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122) +- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129) +- Code style as refactored by Sourcery-AI (PR #131) +- Minor adjustment on the MD around european words (PR #133) +- Remove and replace SRTs from assets / tests (PR #139) +- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135) +- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135) + +### Fixed +- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137) +- Avoid using too insignificant chunk (PR #137) + +### Added +- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135) +- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141) + +## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11) +### Added +- Add support for Kazakh (Cyrillic) language detection (PR #109) + +### Changed +- Further, improve inferring the language from a given single-byte code page (PR #112) +- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116) +- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113) +- Various detection improvement (MD+CD) (PR #117) + +### Removed +- Remove redundant logging entry about detected language(s) (PR #115) + +### Fixed +- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102) + +## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18) +### Fixed +- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100) +- Fix CLI crash when using --minimal output in certain cases (PR #103) + +### Changed +- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101) + +## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14) +### Changed +- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81) +- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82) +- The Unicode detection is slightly improved (PR #93) +- Add syntax sugar \_\_bool\_\_ for results CharsetMatches list-container (PR #91) + +### Removed +- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92) + +### Fixed +- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95) +- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96) +- The MANIFEST.in was not exhaustive (PR #78) + +## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30) +### Fixed +- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70) +- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68) +- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72) +- Submatch factoring could be wrong in rare edge cases (PR #72) +- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72) +- Fix line endings from CRLF to LF for certain project files (PR #67) + +### Changed +- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76) +- Allow fallback on specified encoding if any (PR #71) + +## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16) +### Changed +- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63) +- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64) + +## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15) +### Fixed +- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) + +### Changed +- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57) + +## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13) +### Fixed +- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55) +- Using explain=False permanently disable the verbose output in the current runtime (PR #47) +- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47) +- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52) + +### Changed +- Public function normalize default args values were not aligned with from_bytes (PR #53) + +### Added +- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47) + +## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02) +### Changed +- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet. +- Accent has been made on UTF-8 detection, should perform rather instantaneous. +- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible. +- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time) +- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+ +- utf_7 detection has been reinstated. + +### Removed +- This package no longer require anything when used with Python 3.5 (Dropped cached_property) +- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian. +- The exception hook on UnicodeDecodeError has been removed. + +### Deprecated +- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0 + +### Fixed +- The CLI output used the relative path of the file(s). Should be absolute. + +## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28) +### Fixed +- Logger configuration/usage no longer conflict with others (PR #44) + +## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21) +### Removed +- Using standard logging instead of using the package loguru. +- Dropping nose test framework in favor of the maintained pytest. +- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text. +- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version. +- Stop support for UTF-7 that does not contain a SIG. +- Dropping PrettyTable, replaced with pure JSON output in CLI. + +### Fixed +- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process. +- Not searching properly for the BOM when trying utf32/16 parent codec. + +### Changed +- Improving the package final size by compressing frequencies.json. +- Huge improvement over the larges payload. + +### Added +- CLI now produces JSON consumable output. +- Return ASCII if given sequences fit. Given reasonable confidence. + +## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13) + +### Fixed +- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40) + +## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12) + +### Fixed +- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39) + +## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12) + +### Fixed +- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38) + +## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09) + +### Changed +- Amend the previous release to allow prettytable 2.0 (PR #35) + +## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08) + +### Fixed +- Fix error while using the package with a python pre-release interpreter (PR #33) + +### Changed +- Dependencies refactoring, constraints revised. + +### Added +- Add python 3.9 and 3.10 to the supported interpreters + +MIT License + +Copyright (c) 2025 TAHRI Ahmed R. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/RECORD b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/RECORD new file mode 100644 index 0000000..151b492 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/RECORD @@ -0,0 +1,35 @@ +../../../bin/normalizer,sha256=n3V02Bpo72_E9CJPUAvKEZEoRfPC5jueWpmsSbsI0WM,252 +charset_normalizer-3.4.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +charset_normalizer-3.4.3.dist-info/METADATA,sha256=nBNOskPUtcqHtaSPPaJafjXrlicPcPIgLFzpJQTgvaA,36700 +charset_normalizer-3.4.3.dist-info/RECORD,, +charset_normalizer-3.4.3.dist-info/WHEEL,sha256=DxRnWQz-Kp9-4a4hdDHsSv0KUC3H7sN9Nbef3-8RjXU,190 +charset_normalizer-3.4.3.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65 +charset_normalizer-3.4.3.dist-info/licenses/LICENSE,sha256=bQ1Bv-FwrGx9wkjJpj4lTQ-0WmDVCoJX0K-SxuJJuIc,1071 +charset_normalizer-3.4.3.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 +charset_normalizer/__init__.py,sha256=OKRxRv2Zhnqk00tqkN0c1BtJjm165fWXLydE52IKuHc,1590 +charset_normalizer/__main__.py,sha256=yzYxMR-IhKRHYwcSlavEv8oGdwxsR89mr2X09qXGdps,109 +charset_normalizer/__pycache__/__init__.cpython-312.pyc,, +charset_normalizer/__pycache__/__main__.cpython-312.pyc,, +charset_normalizer/__pycache__/api.cpython-312.pyc,, +charset_normalizer/__pycache__/cd.cpython-312.pyc,, +charset_normalizer/__pycache__/constant.cpython-312.pyc,, +charset_normalizer/__pycache__/legacy.cpython-312.pyc,, +charset_normalizer/__pycache__/md.cpython-312.pyc,, +charset_normalizer/__pycache__/models.cpython-312.pyc,, +charset_normalizer/__pycache__/utils.cpython-312.pyc,, +charset_normalizer/__pycache__/version.cpython-312.pyc,, +charset_normalizer/api.py,sha256=V07i8aVeCD8T2fSia3C-fn0i9t8qQguEBhsqszg32Ns,22668 +charset_normalizer/cd.py,sha256=WKTo1HDb-H9HfCDc3Bfwq5jzS25Ziy9SE2a74SgTq88,12522 +charset_normalizer/cli/__init__.py,sha256=D8I86lFk2-py45JvqxniTirSj_sFyE6sjaY_0-G1shc,136 +charset_normalizer/cli/__main__.py,sha256=dMaXG6IJXRvqq8z2tig7Qb83-BpWTln55ooiku5_uvg,12646 +charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc,, +charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc,, +charset_normalizer/constant.py,sha256=7UVY4ldYhmQMHUdgQ_sgZmzcQ0xxYxpBunqSZ-XJZ8U,42713 +charset_normalizer/legacy.py,sha256=sYBzSpzsRrg_wF4LP536pG64BItw7Tqtc3SMQAHvFLM,2731 +charset_normalizer/md.cpython-312-x86_64-linux-gnu.so,sha256=sZ7umtJLjKfA83NFJ7npkiDyr06zDT8cWtl6uIx2MsM,15912 +charset_normalizer/md.py,sha256=-_oN3h3_X99nkFfqamD3yu45DC_wfk5odH0Tr_CQiXs,20145 +charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so,sha256=froFxeWX3QD-u-6lU-1gyOZmEo6pgm3i-HdUWz2J8ro,289536 +charset_normalizer/models.py,sha256=lKXhOnIPtiakbK3i__J9wpOfzx3JDTKj7Dn3Rg0VaRI,12394 +charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/utils.py,sha256=sTejPgrdlNsKNucZfJCxJ95lMTLA0ShHLLE3n5wpT9Q,12170 +charset_normalizer/version.py,sha256=hBN3id1io4HMVPtyDn9IIRVShbBM0kgVs3haVtppZOE,115 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/WHEEL b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/WHEEL new file mode 100644 index 0000000..f3e8a97 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/WHEEL @@ -0,0 +1,7 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: false +Tag: cp312-cp312-manylinux_2_17_x86_64 +Tag: cp312-cp312-manylinux2014_x86_64 +Tag: cp312-cp312-manylinux_2_28_x86_64 + diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/entry_points.txt b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/entry_points.txt new file mode 100644 index 0000000..65619e7 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +normalizer = charset_normalizer.cli:cli_detect diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/licenses/LICENSE b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/licenses/LICENSE new file mode 100644 index 0000000..9725772 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 TAHRI Ahmed R. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/top_level.txt b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/top_level.txt new file mode 100644 index 0000000..66958f0 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.3.dist-info/top_level.txt @@ -0,0 +1 @@ +charset_normalizer diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__init__.py b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__init__.py new file mode 100644 index 0000000..0d3a379 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__init__.py @@ -0,0 +1,48 @@ +""" +Charset-Normalizer +~~~~~~~~~~~~~~ +The Real First Universal Charset Detector. +A library that helps you read text from an unknown charset encoding. +Motivated by chardet, This package is trying to resolve the issue by taking a new approach. +All IANA character set names for which the Python core library provides codecs are supported. + +Basic usage: + >>> from charset_normalizer import from_bytes + >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) + >>> best_guess = results.best() + >>> str(best_guess) + 'Bсеки човек има право на образование. Oбразованието!' + +Others methods and usages are available - see the full documentation +at . +:copyright: (c) 2021 by Ahmed TAHRI +:license: MIT, see LICENSE for more details. +""" + +from __future__ import annotations + +import logging + +from .api import from_bytes, from_fp, from_path, is_binary +from .legacy import detect +from .models import CharsetMatch, CharsetMatches +from .utils import set_logging_handler +from .version import VERSION, __version__ + +__all__ = ( + "from_fp", + "from_path", + "from_bytes", + "is_binary", + "detect", + "CharsetMatch", + "CharsetMatches", + "__version__", + "VERSION", + "set_logging_handler", +) + +# Attach a NullHandler to the top level logger by default +# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library + +logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__main__.py b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__main__.py new file mode 100644 index 0000000..e0e76f7 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__main__.py @@ -0,0 +1,6 @@ +from __future__ import annotations + +from .cli import cli_detect + +if __name__ == "__main__": + cli_detect() diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d3729bf3ba3cd49096011832420bb3f3f87be14 GIT binary patch literal 1763 zcmcIkPj4GV6rZ&nJ6^p8@p}kSZbs;RA44D?*W0s(R=F^;W2Q>4`VHc3jk6*~8oS-pqUN_x{Zv zv$HyaZ||QA_v11`Pn0nJN;#uFPk{LzImkqg<`kIb7tDgD_#!KsMW^IUv64S!PWffC z>{rZ+KW$FKdC4iWs;`@R##dO)pD}0rS#vg%r`eo;#k`X7RrZ!YZ_fJ*<^ssNxmZB7 zc&|PNGWk2T2U;%O`)HyabD7ohSepDFjM%ZQh6csPOnkqHkbcW0Tu`~v4!KX5_ci7E zH~;zc1DE1`N*LbqxRCg6;PojNAdgJ(=TuT#hTPCMF!MT`@Bx-Ck=Ugy5_k~Cm{a0l zNxzb~%R?WN0LQ^$5FQ2C&f{Ym*rDSEJwx9OrPn8tI=C~)jvXqO@qz0J91;7F^e6^a z@&Vk&G6dfuWPJ)D)q#kqvXkUc9TObTBTS-*hs1UPAY*uEqrH*&CAOp-L-IHvJ{7nd za(v`^wwt;7Vj$fR@P(XSW(98go_E42kCa3QZY7wd}1aA{_K^r`qItex5>lgm*f-=ze~=NpOk=;)8yCW z1Sh`_kCPM7o#Es+C7&ffW}2U~nokfs@xgZwl!XkC6_ecm*1q z&qg6d(oL(LusU7<8wVcB;1d?HQAlS- ztGP?0?WS|DN>sqjMHqUEg}ol^h~+}<80BDA`Eqmr&dy#ttyz}ZaVU{xHFORSBjOcB zrWBc0q^gK|J9$l!IYnj_nE{e6yk5J;+iAtJp#GMX>Xy}wWz4B%ad?DKS{Z>!izM>$ zD3hQnURq|fN9;isH!b_He@sl`r&FY5S_iflaLU56&ov4m_-FE@fV0TR%w>a?dUDpk7I8Wxb%Ymz~3PL6gwO7 zKoGkVJzaBSJtXlIq0J z5hZ}BOeco`zLNmb=l^R0byjDCtwpN`r0EH3T@XPzTP?_X*3Grz5(DO;>2Pj@vYcNH zvZl-V?KDh1a_(vLHZ(eY*0Sic!o7DheEpRd(rU+#x`79 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71c48abe7dd3d4f4c5c6e09b4f507a0a976b23b7 GIT binary patch literal 18174 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a8974eed70083cf4285eae02e3c4f8a29c42a16 GIT binary patch literal 13279 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b507e201fc181290093145a76bacc3c9ecaf2a45 GIT binary patch literal 40793 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99fa0c59cb7c3bc5263b6225f7ef3df260ef89ab GIT binary patch literal 2993 zcmZ`*O>7&-6`tiT$t6Wnf0iu8k}#f}rn)lXY94Hir8kXmVf zsM(<;vJ{{cE}%3(qqYaD`2ljs!GQ|Y?Ik_7NP)I!3rMzr5DOVK&=y629_UIZpZaE( zlnu+B1!mvOyubP0n>X{9csz=rP5k%E*-fDS!3V7t^a){a4Tu{^Lz-Y9Q^*Pervpa7 z6tki!WhHMc8bLFZ4FN4_K_hI+S=pmQM#PL}qh?#SO+ZAXogf=FVrD!W7f=AbhBWy) z(jp|jDf;%Zi3rkS5%lP%#kJ`5V79%|mP~xb*^+|WrdpQGRHoaOlMJ}=>1$Ur%IKxc z=#|Ukuess{s{%~Yl1i@zIRi zH9aw*Ouc#GjW?93%(rLw94LxRS4u>?sOMSUchm2iJ_~!NVSED-lod3T4a@*mMAQN= z!>lF(C3#d3s1Tz9$KIp3v4!N`XXy$4+sldV6K_1El&Pt;nt`YnBzJhYn#n+OK0oF`Pr zq}w$aI0g>OSD~tSHbS+~JE>Yoi_Cu?^d)PO7F`tR(;#*Hu$0zTM)c?-aX-M1;THEi zU`~UeF;<1WuY|yhUeFq!AA;>{~BS~PkL+;I47F7a*;5SXPC_r+&awIE_maj4hIYKB82%# zvx+HvnPF$vE*l!o5p3EHGb%U-hYV_$Hk`N35)`?dK~kRTOtUy(ex~t~ZW!29S$-Ce zHodWzEWAW@2CDJWEV0NUp}1r_j;8|;joS>{)lVzwzQAk>sv^TBsDc)lfN4yLX)mfqD(Z=xFR4^DJwz2i z^gNFYo(AN7jLAZomq_j#SyoNmYU0=w^MO|=@k*p0Nl-E6$76|rF%O_-j9bxkJky@3 z|J#8@*o#gfq?E^1BNSj?DC^)mY}^^~bX13$Wpwyq8O56JP^hF7P^Lu>CI>(JKsa3; zd={W-CEP(^APE8Hp=9;>%yJ1Rz{$>e$n&Iwi_62p!GIkHMWs}QXcTRB9*?`>8Ef8x zq;XNvKL(AF;@|$t+kZx0;dRXos!m?l-C&s&lyhUn4}QVhpGPP^xUQr)dNC8%Ia{|}$-TSc@%Eip zr|!Hoy>)hGYld#coP9A6iSElN*1JCYY5y-XTlj^YwllklqxHlH2z~F1#Ma2fR_yAY z7-)|+kk2f4tq*;4c_;kLZg<~C-_J+Z>f2=CAzeTd;ES)F;F1-RlcCmVUbQv%y=_tFJd=DAK(p zAFs!HH%{G-4c22v8Ue8*dS8^{(MA--6Ypo<&8*M7JH8uhUzgu|b7vrRJC?c!UgWps z{n_La1l3eq^BDi|>b}Sg3)dV90w1j3`nb#voLguB8 zmqc!-FRqYfMl6TFEh)eK{pSqN1KP_w@7=<4d7y*AN9kxQkBy z8$Ep&_5TYU`#XB|eh5jOcctg{B{6tn{n|c)Un7CeoNI{R6hiexxBq`G?f*x|y#Kvm L`+gACJ)8dnYc~%t literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b217b7c6987bec8c440f5af42e22b12fdadbd2b7 GIT binary patch literal 24330 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 C31dG1 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/api.py b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/api.py new file mode 100644 index 0000000..ebd9639 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/api.py @@ -0,0 +1,669 @@ +from __future__ import annotations + +import logging +from os import PathLike +from typing import BinaryIO + +from .cd import ( + coherence_ratio, + encoding_languages, + mb_encoding_languages, + merge_coherence_ratios, +) +from .constant import IANA_SUPPORTED, TOO_BIG_SEQUENCE, TOO_SMALL_SEQUENCE, TRACE +from .md import mess_ratio +from .models import CharsetMatch, CharsetMatches +from .utils import ( + any_specified_encoding, + cut_sequence_chunks, + iana_name, + identify_sig_or_bom, + is_cp_similar, + is_multi_byte_encoding, + should_strip_sig_or_bom, +) + +logger = logging.getLogger("charset_normalizer") +explain_handler = logging.StreamHandler() +explain_handler.setFormatter( + logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") +) + + +def from_bytes( + sequences: bytes | bytearray, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.2, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = True, +) -> CharsetMatches: + """ + Given a raw bytes sequence, return the best possibles charset usable to render str objects. + If there is no results, it is a strong indicator that the source is binary/not text. + By default, the process will extract 5 blocks of 512o each to assess the mess and coherence of a given sequence. + And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. + + The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page + but never take it for granted. Can improve the performance. + + You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that + purpose. + + This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. + By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain' + toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging. + Custom logging format and handler can be set manually. + """ + + if not isinstance(sequences, (bytearray, bytes)): + raise TypeError( + "Expected object of type bytes or bytearray, got: {}".format( + type(sequences) + ) + ) + + if explain: + previous_logger_level: int = logger.level + logger.addHandler(explain_handler) + logger.setLevel(TRACE) + + length: int = len(sequences) + + if length == 0: + logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level or logging.WARNING) + return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) + + if cp_isolation is not None: + logger.log( + TRACE, + "cp_isolation is set. use this flag for debugging purpose. " + "limited list of encoding allowed : %s.", + ", ".join(cp_isolation), + ) + cp_isolation = [iana_name(cp, False) for cp in cp_isolation] + else: + cp_isolation = [] + + if cp_exclusion is not None: + logger.log( + TRACE, + "cp_exclusion is set. use this flag for debugging purpose. " + "limited list of encoding excluded : %s.", + ", ".join(cp_exclusion), + ) + cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] + else: + cp_exclusion = [] + + if length <= (chunk_size * steps): + logger.log( + TRACE, + "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", + steps, + chunk_size, + length, + ) + steps = 1 + chunk_size = length + + if steps > 1 and length / steps < chunk_size: + chunk_size = int(length / steps) + + is_too_small_sequence: bool = len(sequences) < TOO_SMALL_SEQUENCE + is_too_large_sequence: bool = len(sequences) >= TOO_BIG_SEQUENCE + + if is_too_small_sequence: + logger.log( + TRACE, + "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( + length + ), + ) + elif is_too_large_sequence: + logger.log( + TRACE, + "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( + length + ), + ) + + prioritized_encodings: list[str] = [] + + specified_encoding: str | None = ( + any_specified_encoding(sequences) if preemptive_behaviour else None + ) + + if specified_encoding is not None: + prioritized_encodings.append(specified_encoding) + logger.log( + TRACE, + "Detected declarative mark in sequence. Priority +1 given for %s.", + specified_encoding, + ) + + tested: set[str] = set() + tested_but_hard_failure: list[str] = [] + tested_but_soft_failure: list[str] = [] + + fallback_ascii: CharsetMatch | None = None + fallback_u8: CharsetMatch | None = None + fallback_specified: CharsetMatch | None = None + + results: CharsetMatches = CharsetMatches() + + early_stop_results: CharsetMatches = CharsetMatches() + + sig_encoding, sig_payload = identify_sig_or_bom(sequences) + + if sig_encoding is not None: + prioritized_encodings.append(sig_encoding) + logger.log( + TRACE, + "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", + len(sig_payload), + sig_encoding, + ) + + prioritized_encodings.append("ascii") + + if "utf_8" not in prioritized_encodings: + prioritized_encodings.append("utf_8") + + for encoding_iana in prioritized_encodings + IANA_SUPPORTED: + if cp_isolation and encoding_iana not in cp_isolation: + continue + + if cp_exclusion and encoding_iana in cp_exclusion: + continue + + if encoding_iana in tested: + continue + + tested.add(encoding_iana) + + decoded_payload: str | None = None + bom_or_sig_available: bool = sig_encoding == encoding_iana + strip_sig_or_bom: bool = bom_or_sig_available and should_strip_sig_or_bom( + encoding_iana + ) + + if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available: + logger.log( + TRACE, + "Encoding %s won't be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", + encoding_iana, + ) + continue + if encoding_iana in {"utf_7"} and not bom_or_sig_available: + logger.log( + TRACE, + "Encoding %s won't be tested as-is because detection is unreliable without BOM/SIG.", + encoding_iana, + ) + continue + + try: + is_multi_byte_decoder: bool = is_multi_byte_encoding(encoding_iana) + except (ModuleNotFoundError, ImportError): + logger.log( + TRACE, + "Encoding %s does not provide an IncrementalDecoder", + encoding_iana, + ) + continue + + try: + if is_too_large_sequence and is_multi_byte_decoder is False: + str( + ( + sequences[: int(50e4)] + if strip_sig_or_bom is False + else sequences[len(sig_payload) : int(50e4)] + ), + encoding=encoding_iana, + ) + else: + decoded_payload = str( + ( + sequences + if strip_sig_or_bom is False + else sequences[len(sig_payload) :] + ), + encoding=encoding_iana, + ) + except (UnicodeDecodeError, LookupError) as e: + if not isinstance(e, LookupError): + logger.log( + TRACE, + "Code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + similar_soft_failure_test: bool = False + + for encoding_soft_failed in tested_but_soft_failure: + if is_cp_similar(encoding_iana, encoding_soft_failed): + similar_soft_failure_test = True + break + + if similar_soft_failure_test: + logger.log( + TRACE, + "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!", + encoding_iana, + encoding_soft_failed, + ) + continue + + r_ = range( + 0 if not bom_or_sig_available else len(sig_payload), + length, + int(length / steps), + ) + + multi_byte_bonus: bool = ( + is_multi_byte_decoder + and decoded_payload is not None + and len(decoded_payload) < length + ) + + if multi_byte_bonus: + logger.log( + TRACE, + "Code page %s is a multi byte encoding table and it appear that at least one character " + "was encoded using n-bytes.", + encoding_iana, + ) + + max_chunk_gave_up: int = int(len(r_) / 4) + + max_chunk_gave_up = max(max_chunk_gave_up, 2) + early_stop_count: int = 0 + lazy_str_hard_failure = False + + md_chunks: list[str] = [] + md_ratios = [] + + try: + for chunk in cut_sequence_chunks( + sequences, + encoding_iana, + r_, + chunk_size, + bom_or_sig_available, + strip_sig_or_bom, + sig_payload, + is_multi_byte_decoder, + decoded_payload, + ): + md_chunks.append(chunk) + + md_ratios.append( + mess_ratio( + chunk, + threshold, + explain is True and 1 <= len(cp_isolation) <= 2, + ) + ) + + if md_ratios[-1] >= threshold: + early_stop_count += 1 + + if (early_stop_count >= max_chunk_gave_up) or ( + bom_or_sig_available and strip_sig_or_bom is False + ): + break + except ( + UnicodeDecodeError + ) as e: # Lazy str loading may have missed something there + logger.log( + TRACE, + "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + early_stop_count = max_chunk_gave_up + lazy_str_hard_failure = True + + # We might want to check the sequence again with the whole content + # Only if initial MD tests passes + if ( + not lazy_str_hard_failure + and is_too_large_sequence + and not is_multi_byte_decoder + ): + try: + sequences[int(50e3) :].decode(encoding_iana, errors="strict") + except UnicodeDecodeError as e: + logger.log( + TRACE, + "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0 + if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: + tested_but_soft_failure.append(encoding_iana) + logger.log( + TRACE, + "%s was excluded because of initial chaos probing. Gave up %i time(s). " + "Computed mean chaos is %f %%.", + encoding_iana, + early_stop_count, + round(mean_mess_ratio * 100, ndigits=3), + ) + # Preparing those fallbacks in case we got nothing. + if ( + enable_fallback + and encoding_iana + in ["ascii", "utf_8", specified_encoding, "utf_16", "utf_32"] + and not lazy_str_hard_failure + ): + fallback_entry = CharsetMatch( + sequences, + encoding_iana, + threshold, + bom_or_sig_available, + [], + decoded_payload, + preemptive_declaration=specified_encoding, + ) + if encoding_iana == specified_encoding: + fallback_specified = fallback_entry + elif encoding_iana == "ascii": + fallback_ascii = fallback_entry + else: + fallback_u8 = fallback_entry + continue + + logger.log( + TRACE, + "%s passed initial chaos probing. Mean measured chaos is %f %%", + encoding_iana, + round(mean_mess_ratio * 100, ndigits=3), + ) + + if not is_multi_byte_decoder: + target_languages: list[str] = encoding_languages(encoding_iana) + else: + target_languages = mb_encoding_languages(encoding_iana) + + if target_languages: + logger.log( + TRACE, + "{} should target any language(s) of {}".format( + encoding_iana, str(target_languages) + ), + ) + + cd_ratios = [] + + # We shall skip the CD when its about ASCII + # Most of the time its not relevant to run "language-detection" on it. + if encoding_iana != "ascii": + for chunk in md_chunks: + chunk_languages = coherence_ratio( + chunk, + language_threshold, + ",".join(target_languages) if target_languages else None, + ) + + cd_ratios.append(chunk_languages) + + cd_ratios_merged = merge_coherence_ratios(cd_ratios) + + if cd_ratios_merged: + logger.log( + TRACE, + "We detected language {} using {}".format( + cd_ratios_merged, encoding_iana + ), + ) + + current_match = CharsetMatch( + sequences, + encoding_iana, + mean_mess_ratio, + bom_or_sig_available, + cd_ratios_merged, + ( + decoded_payload + if ( + is_too_large_sequence is False + or encoding_iana in [specified_encoding, "ascii", "utf_8"] + ) + else None + ), + preemptive_declaration=specified_encoding, + ) + + results.append(current_match) + + if ( + encoding_iana in [specified_encoding, "ascii", "utf_8"] + and mean_mess_ratio < 0.1 + ): + # If md says nothing to worry about, then... stop immediately! + if mean_mess_ratio == 0.0: + logger.debug( + "Encoding detection: %s is most likely the one.", + current_match.encoding, + ) + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([current_match]) + + early_stop_results.append(current_match) + + if ( + len(early_stop_results) + and (specified_encoding is None or specified_encoding in tested) + and "ascii" in tested + and "utf_8" in tested + ): + probable_result: CharsetMatch = early_stop_results.best() # type: ignore[assignment] + logger.debug( + "Encoding detection: %s is most likely the one.", + probable_result.encoding, + ) + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + + return CharsetMatches([probable_result]) + + if encoding_iana == sig_encoding: + logger.debug( + "Encoding detection: %s is most likely the one as we detected a BOM or SIG within " + "the beginning of the sequence.", + encoding_iana, + ) + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([results[encoding_iana]]) + + if len(results) == 0: + if fallback_u8 or fallback_ascii or fallback_specified: + logger.log( + TRACE, + "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.", + ) + + if fallback_specified: + logger.debug( + "Encoding detection: %s will be used as a fallback match", + fallback_specified.encoding, + ) + results.append(fallback_specified) + elif ( + (fallback_u8 and fallback_ascii is None) + or ( + fallback_u8 + and fallback_ascii + and fallback_u8.fingerprint != fallback_ascii.fingerprint + ) + or (fallback_u8 is not None) + ): + logger.debug("Encoding detection: utf_8 will be used as a fallback match") + results.append(fallback_u8) + elif fallback_ascii: + logger.debug("Encoding detection: ascii will be used as a fallback match") + results.append(fallback_ascii) + + if results: + logger.debug( + "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.", + results.best().encoding, # type: ignore + len(results) - 1, + ) + else: + logger.debug("Encoding detection: Unable to determine any suitable charset.") + + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + + return results + + +def from_fp( + fp: BinaryIO, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = True, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but using a file pointer that is already ready. + Will not close the file pointer. + """ + return from_bytes( + fp.read(), + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + language_threshold, + enable_fallback, + ) + + +def from_path( + path: str | bytes | PathLike, # type: ignore[type-arg] + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = True, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. + Can raise IOError. + """ + with open(path, "rb") as fp: + return from_fp( + fp, + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + language_threshold, + enable_fallback, + ) + + +def is_binary( + fp_or_path_or_payload: PathLike | str | BinaryIO | bytes, # type: ignore[type-arg] + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = False, +) -> bool: + """ + Detect if the given input (file, bytes, or path) points to a binary file. aka. not a string. + Based on the same main heuristic algorithms and default kwargs at the sole exception that fallbacks match + are disabled to be stricter around ASCII-compatible but unlikely to be a string. + """ + if isinstance(fp_or_path_or_payload, (str, PathLike)): + guesses = from_path( + fp_or_path_or_payload, + steps=steps, + chunk_size=chunk_size, + threshold=threshold, + cp_isolation=cp_isolation, + cp_exclusion=cp_exclusion, + preemptive_behaviour=preemptive_behaviour, + explain=explain, + language_threshold=language_threshold, + enable_fallback=enable_fallback, + ) + elif isinstance( + fp_or_path_or_payload, + ( + bytes, + bytearray, + ), + ): + guesses = from_bytes( + fp_or_path_or_payload, + steps=steps, + chunk_size=chunk_size, + threshold=threshold, + cp_isolation=cp_isolation, + cp_exclusion=cp_exclusion, + preemptive_behaviour=preemptive_behaviour, + explain=explain, + language_threshold=language_threshold, + enable_fallback=enable_fallback, + ) + else: + guesses = from_fp( + fp_or_path_or_payload, + steps=steps, + chunk_size=chunk_size, + threshold=threshold, + cp_isolation=cp_isolation, + cp_exclusion=cp_exclusion, + preemptive_behaviour=preemptive_behaviour, + explain=explain, + language_threshold=language_threshold, + enable_fallback=enable_fallback, + ) + + return not guesses diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cd.py b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cd.py new file mode 100644 index 0000000..71a3ed5 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cd.py @@ -0,0 +1,395 @@ +from __future__ import annotations + +import importlib +from codecs import IncrementalDecoder +from collections import Counter +from functools import lru_cache +from typing import Counter as TypeCounter + +from .constant import ( + FREQUENCIES, + KO_NAMES, + LANGUAGE_SUPPORTED_COUNT, + TOO_SMALL_SEQUENCE, + ZH_NAMES, +) +from .md import is_suspiciously_successive_range +from .models import CoherenceMatches +from .utils import ( + is_accentuated, + is_latin, + is_multi_byte_encoding, + is_unicode_range_secondary, + unicode_range, +) + + +def encoding_unicode_range(iana_name: str) -> list[str]: + """ + Return associated unicode ranges in a single byte code page. + """ + if is_multi_byte_encoding(iana_name): + raise OSError("Function not supported on multi-byte code page") + + decoder = importlib.import_module(f"encodings.{iana_name}").IncrementalDecoder + + p: IncrementalDecoder = decoder(errors="ignore") + seen_ranges: dict[str, int] = {} + character_count: int = 0 + + for i in range(0x40, 0xFF): + chunk: str = p.decode(bytes([i])) + + if chunk: + character_range: str | None = unicode_range(chunk) + + if character_range is None: + continue + + if is_unicode_range_secondary(character_range) is False: + if character_range not in seen_ranges: + seen_ranges[character_range] = 0 + seen_ranges[character_range] += 1 + character_count += 1 + + return sorted( + [ + character_range + for character_range in seen_ranges + if seen_ranges[character_range] / character_count >= 0.15 + ] + ) + + +def unicode_range_languages(primary_range: str) -> list[str]: + """ + Return inferred languages used with a unicode range. + """ + languages: list[str] = [] + + for language, characters in FREQUENCIES.items(): + for character in characters: + if unicode_range(character) == primary_range: + languages.append(language) + break + + return languages + + +@lru_cache() +def encoding_languages(iana_name: str) -> list[str]: + """ + Single-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + unicode_ranges: list[str] = encoding_unicode_range(iana_name) + primary_range: str | None = None + + for specified_range in unicode_ranges: + if "Latin" not in specified_range: + primary_range = specified_range + break + + if primary_range is None: + return ["Latin Based"] + + return unicode_range_languages(primary_range) + + +@lru_cache() +def mb_encoding_languages(iana_name: str) -> list[str]: + """ + Multi-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + if ( + iana_name.startswith("shift_") + or iana_name.startswith("iso2022_jp") + or iana_name.startswith("euc_j") + or iana_name == "cp932" + ): + return ["Japanese"] + if iana_name.startswith("gb") or iana_name in ZH_NAMES: + return ["Chinese"] + if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: + return ["Korean"] + + return [] + + +@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) +def get_target_features(language: str) -> tuple[bool, bool]: + """ + Determine main aspects from a supported language if it contains accents and if is pure Latin. + """ + target_have_accents: bool = False + target_pure_latin: bool = True + + for character in FREQUENCIES[language]: + if not target_have_accents and is_accentuated(character): + target_have_accents = True + if target_pure_latin and is_latin(character) is False: + target_pure_latin = False + + return target_have_accents, target_pure_latin + + +def alphabet_languages( + characters: list[str], ignore_non_latin: bool = False +) -> list[str]: + """ + Return associated languages associated to given characters. + """ + languages: list[tuple[str, float]] = [] + + source_have_accents = any(is_accentuated(character) for character in characters) + + for language, language_characters in FREQUENCIES.items(): + target_have_accents, target_pure_latin = get_target_features(language) + + if ignore_non_latin and target_pure_latin is False: + continue + + if target_have_accents is False and source_have_accents: + continue + + character_count: int = len(language_characters) + + character_match_count: int = len( + [c for c in language_characters if c in characters] + ) + + ratio: float = character_match_count / character_count + + if ratio >= 0.2: + languages.append((language, ratio)) + + languages = sorted(languages, key=lambda x: x[1], reverse=True) + + return [compatible_language[0] for compatible_language in languages] + + +def characters_popularity_compare( + language: str, ordered_characters: list[str] +) -> float: + """ + Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. + The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). + Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) + """ + if language not in FREQUENCIES: + raise ValueError(f"{language} not available") + + character_approved_count: int = 0 + FREQUENCIES_language_set = set(FREQUENCIES[language]) + + ordered_characters_count: int = len(ordered_characters) + target_language_characters_count: int = len(FREQUENCIES[language]) + + large_alphabet: bool = target_language_characters_count > 26 + + for character, character_rank in zip( + ordered_characters, range(0, ordered_characters_count) + ): + if character not in FREQUENCIES_language_set: + continue + + character_rank_in_language: int = FREQUENCIES[language].index(character) + expected_projection_ratio: float = ( + target_language_characters_count / ordered_characters_count + ) + character_rank_projection: int = int(character_rank * expected_projection_ratio) + + if ( + large_alphabet is False + and abs(character_rank_projection - character_rank_in_language) > 4 + ): + continue + + if ( + large_alphabet is True + and abs(character_rank_projection - character_rank_in_language) + < target_language_characters_count / 3 + ): + character_approved_count += 1 + continue + + characters_before_source: list[str] = FREQUENCIES[language][ + 0:character_rank_in_language + ] + characters_after_source: list[str] = FREQUENCIES[language][ + character_rank_in_language: + ] + characters_before: list[str] = ordered_characters[0:character_rank] + characters_after: list[str] = ordered_characters[character_rank:] + + before_match_count: int = len( + set(characters_before) & set(characters_before_source) + ) + + after_match_count: int = len( + set(characters_after) & set(characters_after_source) + ) + + if len(characters_before_source) == 0 and before_match_count <= 4: + character_approved_count += 1 + continue + + if len(characters_after_source) == 0 and after_match_count <= 4: + character_approved_count += 1 + continue + + if ( + before_match_count / len(characters_before_source) >= 0.4 + or after_match_count / len(characters_after_source) >= 0.4 + ): + character_approved_count += 1 + continue + + return character_approved_count / len(ordered_characters) + + +def alpha_unicode_split(decoded_sequence: str) -> list[str]: + """ + Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. + Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; + One containing the latin letters and the other hebrew. + """ + layers: dict[str, str] = {} + + for character in decoded_sequence: + if character.isalpha() is False: + continue + + character_range: str | None = unicode_range(character) + + if character_range is None: + continue + + layer_target_range: str | None = None + + for discovered_range in layers: + if ( + is_suspiciously_successive_range(discovered_range, character_range) + is False + ): + layer_target_range = discovered_range + break + + if layer_target_range is None: + layer_target_range = character_range + + if layer_target_range not in layers: + layers[layer_target_range] = character.lower() + continue + + layers[layer_target_range] += character.lower() + + return list(layers.values()) + + +def merge_coherence_ratios(results: list[CoherenceMatches]) -> CoherenceMatches: + """ + This function merge results previously given by the function coherence_ratio. + The return type is the same as coherence_ratio. + """ + per_language_ratios: dict[str, list[float]] = {} + for result in results: + for sub_result in result: + language, ratio = sub_result + if language not in per_language_ratios: + per_language_ratios[language] = [ratio] + continue + per_language_ratios[language].append(ratio) + + merge = [ + ( + language, + round( + sum(per_language_ratios[language]) / len(per_language_ratios[language]), + 4, + ), + ) + for language in per_language_ratios + ] + + return sorted(merge, key=lambda x: x[1], reverse=True) + + +def filter_alt_coherence_matches(results: CoherenceMatches) -> CoherenceMatches: + """ + We shall NOT return "English—" in CoherenceMatches because it is an alternative + of "English". This function only keeps the best match and remove the em-dash in it. + """ + index_results: dict[str, list[float]] = dict() + + for result in results: + language, ratio = result + no_em_name: str = language.replace("—", "") + + if no_em_name not in index_results: + index_results[no_em_name] = [] + + index_results[no_em_name].append(ratio) + + if any(len(index_results[e]) > 1 for e in index_results): + filtered_results: CoherenceMatches = [] + + for language in index_results: + filtered_results.append((language, max(index_results[language]))) + + return filtered_results + + return results + + +@lru_cache(maxsize=2048) +def coherence_ratio( + decoded_sequence: str, threshold: float = 0.1, lg_inclusion: str | None = None +) -> CoherenceMatches: + """ + Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. + A layer = Character extraction by alphabets/ranges. + """ + + results: list[tuple[str, float]] = [] + ignore_non_latin: bool = False + + sufficient_match_count: int = 0 + + lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else [] + if "Latin Based" in lg_inclusion_list: + ignore_non_latin = True + lg_inclusion_list.remove("Latin Based") + + for layer in alpha_unicode_split(decoded_sequence): + sequence_frequencies: TypeCounter[str] = Counter(layer) + most_common = sequence_frequencies.most_common() + + character_count: int = sum(o for c, o in most_common) + + if character_count <= TOO_SMALL_SEQUENCE: + continue + + popular_character_ordered: list[str] = [c for c, o in most_common] + + for language in lg_inclusion_list or alphabet_languages( + popular_character_ordered, ignore_non_latin + ): + ratio: float = characters_popularity_compare( + language, popular_character_ordered + ) + + if ratio < threshold: + continue + elif ratio >= 0.8: + sufficient_match_count += 1 + + results.append((language, round(ratio, 4))) + + if sufficient_match_count >= 3: + break + + return sorted( + filter_alt_coherence_matches(results), key=lambda x: x[1], reverse=True + ) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py new file mode 100644 index 0000000..543a5a4 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py @@ -0,0 +1,8 @@ +from __future__ import annotations + +from .__main__ import cli_detect, query_yes_no + +__all__ = ( + "cli_detect", + "query_yes_no", +) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py new file mode 100644 index 0000000..cb64156 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py @@ -0,0 +1,381 @@ +from __future__ import annotations + +import argparse +import sys +import typing +from json import dumps +from os.path import abspath, basename, dirname, join, realpath +from platform import python_version +from unicodedata import unidata_version + +import charset_normalizer.md as md_module +from charset_normalizer import from_fp +from charset_normalizer.models import CliDetectionResult +from charset_normalizer.version import __version__ + + +def query_yes_no(question: str, default: str = "yes") -> bool: + """Ask a yes/no question via input() and return their answer. + + "question" is a string that is presented to the user. + "default" is the presumed answer if the user just hits . + It must be "yes" (the default), "no" or None (meaning + an answer is required of the user). + + The "answer" return value is True for "yes" or False for "no". + + Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input + """ + valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} + if default is None: + prompt = " [y/n] " + elif default == "yes": + prompt = " [Y/n] " + elif default == "no": + prompt = " [y/N] " + else: + raise ValueError("invalid default answer: '%s'" % default) + + while True: + sys.stdout.write(question + prompt) + choice = input().lower() + if default is not None and choice == "": + return valid[default] + elif choice in valid: + return valid[choice] + else: + sys.stdout.write("Please respond with 'yes' or 'no' (or 'y' or 'n').\n") + + +class FileType: + """Factory for creating file object types + + Instances of FileType are typically passed as type= arguments to the + ArgumentParser add_argument() method. + + Keyword Arguments: + - mode -- A string indicating how the file is to be opened. Accepts the + same values as the builtin open() function. + - bufsize -- The file's desired buffer size. Accepts the same values as + the builtin open() function. + - encoding -- The file's encoding. Accepts the same values as the + builtin open() function. + - errors -- A string indicating how encoding and decoding errors are to + be handled. Accepts the same value as the builtin open() function. + + Backported from CPython 3.12 + """ + + def __init__( + self, + mode: str = "r", + bufsize: int = -1, + encoding: str | None = None, + errors: str | None = None, + ): + self._mode = mode + self._bufsize = bufsize + self._encoding = encoding + self._errors = errors + + def __call__(self, string: str) -> typing.IO: # type: ignore[type-arg] + # the special argument "-" means sys.std{in,out} + if string == "-": + if "r" in self._mode: + return sys.stdin.buffer if "b" in self._mode else sys.stdin + elif any(c in self._mode for c in "wax"): + return sys.stdout.buffer if "b" in self._mode else sys.stdout + else: + msg = f'argument "-" with mode {self._mode}' + raise ValueError(msg) + + # all other arguments are used as file names + try: + return open(string, self._mode, self._bufsize, self._encoding, self._errors) + except OSError as e: + message = f"can't open '{string}': {e}" + raise argparse.ArgumentTypeError(message) + + def __repr__(self) -> str: + args = self._mode, self._bufsize + kwargs = [("encoding", self._encoding), ("errors", self._errors)] + args_str = ", ".join( + [repr(arg) for arg in args if arg != -1] + + [f"{kw}={arg!r}" for kw, arg in kwargs if arg is not None] + ) + return f"{type(self).__name__}({args_str})" + + +def cli_detect(argv: list[str] | None = None) -> int: + """ + CLI assistant using ARGV and ArgumentParser + :param argv: + :return: 0 if everything is fine, anything else equal trouble + """ + parser = argparse.ArgumentParser( + description="The Real First Universal Charset Detector. " + "Discover originating encoding used on text file. " + "Normalize text to unicode." + ) + + parser.add_argument( + "files", type=FileType("rb"), nargs="+", help="File(s) to be analysed" + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + default=False, + dest="verbose", + help="Display complementary information about file if any. " + "Stdout will contain logs about the detection process.", + ) + parser.add_argument( + "-a", + "--with-alternative", + action="store_true", + default=False, + dest="alternatives", + help="Output complementary possibilities if any. Top-level JSON WILL be a list.", + ) + parser.add_argument( + "-n", + "--normalize", + action="store_true", + default=False, + dest="normalize", + help="Permit to normalize input file. If not set, program does not write anything.", + ) + parser.add_argument( + "-m", + "--minimal", + action="store_true", + default=False, + dest="minimal", + help="Only output the charset detected to STDOUT. Disabling JSON output.", + ) + parser.add_argument( + "-r", + "--replace", + action="store_true", + default=False, + dest="replace", + help="Replace file when trying to normalize it instead of creating a new one.", + ) + parser.add_argument( + "-f", + "--force", + action="store_true", + default=False, + dest="force", + help="Replace file without asking if you are sure, use this flag with caution.", + ) + parser.add_argument( + "-i", + "--no-preemptive", + action="store_true", + default=False, + dest="no_preemptive", + help="Disable looking at a charset declaration to hint the detector.", + ) + parser.add_argument( + "-t", + "--threshold", + action="store", + default=0.2, + type=float, + dest="threshold", + help="Define a custom maximum amount of noise allowed in decoded content. 0. <= noise <= 1.", + ) + parser.add_argument( + "--version", + action="version", + version="Charset-Normalizer {} - Python {} - Unicode {} - SpeedUp {}".format( + __version__, + python_version(), + unidata_version, + "OFF" if md_module.__file__.lower().endswith(".py") else "ON", + ), + help="Show version information and exit.", + ) + + args = parser.parse_args(argv) + + if args.replace is True and args.normalize is False: + if args.files: + for my_file in args.files: + my_file.close() + print("Use --replace in addition of --normalize only.", file=sys.stderr) + return 1 + + if args.force is True and args.replace is False: + if args.files: + for my_file in args.files: + my_file.close() + print("Use --force in addition of --replace only.", file=sys.stderr) + return 1 + + if args.threshold < 0.0 or args.threshold > 1.0: + if args.files: + for my_file in args.files: + my_file.close() + print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) + return 1 + + x_ = [] + + for my_file in args.files: + matches = from_fp( + my_file, + threshold=args.threshold, + explain=args.verbose, + preemptive_behaviour=args.no_preemptive is False, + ) + + best_guess = matches.best() + + if best_guess is None: + print( + 'Unable to identify originating encoding for "{}". {}'.format( + my_file.name, + ( + "Maybe try increasing maximum amount of chaos." + if args.threshold < 1.0 + else "" + ), + ), + file=sys.stderr, + ) + x_.append( + CliDetectionResult( + abspath(my_file.name), + None, + [], + [], + "Unknown", + [], + False, + 1.0, + 0.0, + None, + True, + ) + ) + else: + x_.append( + CliDetectionResult( + abspath(my_file.name), + best_guess.encoding, + best_guess.encoding_aliases, + [ + cp + for cp in best_guess.could_be_from_charset + if cp != best_guess.encoding + ], + best_guess.language, + best_guess.alphabets, + best_guess.bom, + best_guess.percent_chaos, + best_guess.percent_coherence, + None, + True, + ) + ) + + if len(matches) > 1 and args.alternatives: + for el in matches: + if el != best_guess: + x_.append( + CliDetectionResult( + abspath(my_file.name), + el.encoding, + el.encoding_aliases, + [ + cp + for cp in el.could_be_from_charset + if cp != el.encoding + ], + el.language, + el.alphabets, + el.bom, + el.percent_chaos, + el.percent_coherence, + None, + False, + ) + ) + + if args.normalize is True: + if best_guess.encoding.startswith("utf") is True: + print( + '"{}" file does not need to be normalized, as it already came from unicode.'.format( + my_file.name + ), + file=sys.stderr, + ) + if my_file.closed is False: + my_file.close() + continue + + dir_path = dirname(realpath(my_file.name)) + file_name = basename(realpath(my_file.name)) + + o_: list[str] = file_name.split(".") + + if args.replace is False: + o_.insert(-1, best_guess.encoding) + if my_file.closed is False: + my_file.close() + elif ( + args.force is False + and query_yes_no( + 'Are you sure to normalize "{}" by replacing it ?'.format( + my_file.name + ), + "no", + ) + is False + ): + if my_file.closed is False: + my_file.close() + continue + + try: + x_[0].unicode_path = join(dir_path, ".".join(o_)) + + with open(x_[0].unicode_path, "wb") as fp: + fp.write(best_guess.output()) + except OSError as e: + print(str(e), file=sys.stderr) + if my_file.closed is False: + my_file.close() + return 2 + + if my_file.closed is False: + my_file.close() + + if args.minimal is False: + print( + dumps( + [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, + ensure_ascii=True, + indent=4, + ) + ) + else: + for my_file in args.files: + print( + ", ".join( + [ + el.encoding or "undefined" + for el in x_ + if el.path == abspath(my_file.name) + ] + ) + ) + + return 0 + + +if __name__ == "__main__": + cli_detect() diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a56adb05cff4acd621968044200b8cffa430e5c GIT binary patch literal 326 zcmXw!zfQw25XS8|X{(kjJOX0rKrCQIJOZpJ%gId)vGAW@JC(x5#vAYqJPQwi6p4ue zb*tK~6Bi+Fxch#e?sRt_c|Io?x4X~g73=p1|B?I&x<5tnMru-1O$;q5C3R9WofuX! zla?tmE3-abW}9(jNr#27)6^J&Fezc-06WWW>$h2(6x_=Xe?iP*z2NqU{f}E92@;%WI$GqVa)njA_d# TrC;RahZNhCEs~e1U!eU9Q59S5 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcc4dbdf8ef642fb10d98c347ed98c4ea14f2a3b GIT binary patch literal 14387 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ðHO)^k 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 NKRE`w%TmXN{{QR!E4Kgu literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/constant.py b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/constant.py new file mode 100644 index 0000000..cc71a01 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/constant.py @@ -0,0 +1,2015 @@ +from __future__ import annotations + +from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE +from encodings.aliases import aliases +from re import IGNORECASE +from re import compile as re_compile + +# Contain for each eligible encoding a list of/item bytes SIG/BOM +ENCODING_MARKS: dict[str, bytes | list[bytes]] = { + "utf_8": BOM_UTF8, + "utf_7": [ + b"\x2b\x2f\x76\x38", + b"\x2b\x2f\x76\x39", + b"\x2b\x2f\x76\x2b", + b"\x2b\x2f\x76\x2f", + b"\x2b\x2f\x76\x38\x2d", + ], + "gb18030": b"\x84\x31\x95\x33", + "utf_32": [BOM_UTF32_BE, BOM_UTF32_LE], + "utf_16": [BOM_UTF16_BE, BOM_UTF16_LE], +} + +TOO_SMALL_SEQUENCE: int = 32 +TOO_BIG_SEQUENCE: int = int(10e6) + +UTF8_MAXIMAL_ALLOCATION: int = 1_112_064 + +# Up-to-date Unicode ucd/15.0.0 +UNICODE_RANGES_COMBINED: dict[str, range] = { + "Control character": range(32), + "Basic Latin": range(32, 128), + "Latin-1 Supplement": range(128, 256), + "Latin Extended-A": range(256, 384), + "Latin Extended-B": range(384, 592), + "IPA Extensions": range(592, 688), + "Spacing Modifier Letters": range(688, 768), + "Combining Diacritical Marks": range(768, 880), + "Greek and Coptic": range(880, 1024), + "Cyrillic": range(1024, 1280), + "Cyrillic Supplement": range(1280, 1328), + "Armenian": range(1328, 1424), + "Hebrew": range(1424, 1536), + "Arabic": range(1536, 1792), + "Syriac": range(1792, 1872), + "Arabic Supplement": range(1872, 1920), + "Thaana": range(1920, 1984), + "NKo": range(1984, 2048), + "Samaritan": range(2048, 2112), + "Mandaic": range(2112, 2144), + "Syriac Supplement": range(2144, 2160), + "Arabic Extended-B": range(2160, 2208), + "Arabic Extended-A": range(2208, 2304), + "Devanagari": range(2304, 2432), + "Bengali": range(2432, 2560), + "Gurmukhi": range(2560, 2688), + "Gujarati": range(2688, 2816), + "Oriya": range(2816, 2944), + "Tamil": range(2944, 3072), + "Telugu": range(3072, 3200), + "Kannada": range(3200, 3328), + "Malayalam": range(3328, 3456), + "Sinhala": range(3456, 3584), + "Thai": range(3584, 3712), + "Lao": range(3712, 3840), + "Tibetan": range(3840, 4096), + "Myanmar": range(4096, 4256), + "Georgian": range(4256, 4352), + "Hangul Jamo": range(4352, 4608), + "Ethiopic": range(4608, 4992), + "Ethiopic Supplement": range(4992, 5024), + "Cherokee": range(5024, 5120), + "Unified Canadian Aboriginal Syllabics": range(5120, 5760), + "Ogham": range(5760, 5792), + "Runic": range(5792, 5888), + "Tagalog": range(5888, 5920), + "Hanunoo": range(5920, 5952), + "Buhid": range(5952, 5984), + "Tagbanwa": range(5984, 6016), + "Khmer": range(6016, 6144), + "Mongolian": range(6144, 6320), + "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6400), + "Limbu": range(6400, 6480), + "Tai Le": range(6480, 6528), + "New Tai Lue": range(6528, 6624), + "Khmer Symbols": range(6624, 6656), + "Buginese": range(6656, 6688), + "Tai Tham": range(6688, 6832), + "Combining Diacritical Marks Extended": range(6832, 6912), + "Balinese": range(6912, 7040), + "Sundanese": range(7040, 7104), + "Batak": range(7104, 7168), + "Lepcha": range(7168, 7248), + "Ol Chiki": range(7248, 7296), + "Cyrillic Extended-C": range(7296, 7312), + "Georgian Extended": range(7312, 7360), + "Sundanese Supplement": range(7360, 7376), + "Vedic Extensions": range(7376, 7424), + "Phonetic Extensions": range(7424, 7552), + "Phonetic Extensions Supplement": range(7552, 7616), + "Combining Diacritical Marks Supplement": range(7616, 7680), + "Latin Extended Additional": range(7680, 7936), + "Greek Extended": range(7936, 8192), + "General Punctuation": range(8192, 8304), + "Superscripts and Subscripts": range(8304, 8352), + "Currency Symbols": range(8352, 8400), + "Combining Diacritical Marks for Symbols": range(8400, 8448), + "Letterlike Symbols": range(8448, 8528), + "Number Forms": range(8528, 8592), + "Arrows": range(8592, 8704), + "Mathematical Operators": range(8704, 8960), + "Miscellaneous Technical": range(8960, 9216), + "Control Pictures": range(9216, 9280), + "Optical Character Recognition": range(9280, 9312), + "Enclosed Alphanumerics": range(9312, 9472), + "Box Drawing": range(9472, 9600), + "Block Elements": range(9600, 9632), + "Geometric Shapes": range(9632, 9728), + "Miscellaneous Symbols": range(9728, 9984), + "Dingbats": range(9984, 10176), + "Miscellaneous Mathematical Symbols-A": range(10176, 10224), + "Supplemental Arrows-A": range(10224, 10240), + "Braille Patterns": range(10240, 10496), + "Supplemental Arrows-B": range(10496, 10624), + "Miscellaneous Mathematical Symbols-B": range(10624, 10752), + "Supplemental Mathematical Operators": range(10752, 11008), + "Miscellaneous Symbols and Arrows": range(11008, 11264), + "Glagolitic": range(11264, 11360), + "Latin Extended-C": range(11360, 11392), + "Coptic": range(11392, 11520), + "Georgian Supplement": range(11520, 11568), + "Tifinagh": range(11568, 11648), + "Ethiopic Extended": range(11648, 11744), + "Cyrillic Extended-A": range(11744, 11776), + "Supplemental Punctuation": range(11776, 11904), + "CJK Radicals Supplement": range(11904, 12032), + "Kangxi Radicals": range(12032, 12256), + "Ideographic Description Characters": range(12272, 12288), + "CJK Symbols and Punctuation": range(12288, 12352), + "Hiragana": range(12352, 12448), + "Katakana": range(12448, 12544), + "Bopomofo": range(12544, 12592), + "Hangul Compatibility Jamo": range(12592, 12688), + "Kanbun": range(12688, 12704), + "Bopomofo Extended": range(12704, 12736), + "CJK Strokes": range(12736, 12784), + "Katakana Phonetic Extensions": range(12784, 12800), + "Enclosed CJK Letters and Months": range(12800, 13056), + "CJK Compatibility": range(13056, 13312), + "CJK Unified Ideographs Extension A": range(13312, 19904), + "Yijing Hexagram Symbols": range(19904, 19968), + "CJK Unified Ideographs": range(19968, 40960), + "Yi Syllables": range(40960, 42128), + "Yi Radicals": range(42128, 42192), + "Lisu": range(42192, 42240), + "Vai": range(42240, 42560), + "Cyrillic Extended-B": range(42560, 42656), + "Bamum": range(42656, 42752), + "Modifier Tone Letters": range(42752, 42784), + "Latin Extended-D": range(42784, 43008), + "Syloti Nagri": range(43008, 43056), + "Common Indic Number Forms": range(43056, 43072), + "Phags-pa": range(43072, 43136), + "Saurashtra": range(43136, 43232), + "Devanagari Extended": range(43232, 43264), + "Kayah Li": range(43264, 43312), + "Rejang": range(43312, 43360), + "Hangul Jamo Extended-A": range(43360, 43392), + "Javanese": range(43392, 43488), + "Myanmar Extended-B": range(43488, 43520), + "Cham": range(43520, 43616), + "Myanmar Extended-A": range(43616, 43648), + "Tai Viet": range(43648, 43744), + "Meetei Mayek Extensions": range(43744, 43776), + "Ethiopic Extended-A": range(43776, 43824), + "Latin Extended-E": range(43824, 43888), + "Cherokee Supplement": range(43888, 43968), + "Meetei Mayek": range(43968, 44032), + "Hangul Syllables": range(44032, 55216), + "Hangul Jamo Extended-B": range(55216, 55296), + "High Surrogates": range(55296, 56192), + "High Private Use Surrogates": range(56192, 56320), + "Low Surrogates": range(56320, 57344), + "Private Use Area": range(57344, 63744), + "CJK Compatibility Ideographs": range(63744, 64256), + "Alphabetic Presentation Forms": range(64256, 64336), + "Arabic Presentation Forms-A": range(64336, 65024), + "Variation Selectors": range(65024, 65040), + "Vertical Forms": range(65040, 65056), + "Combining Half Marks": range(65056, 65072), + "CJK Compatibility Forms": range(65072, 65104), + "Small Form Variants": range(65104, 65136), + "Arabic Presentation Forms-B": range(65136, 65280), + "Halfwidth and Fullwidth Forms": range(65280, 65520), + "Specials": range(65520, 65536), + "Linear B Syllabary": range(65536, 65664), + "Linear B Ideograms": range(65664, 65792), + "Aegean Numbers": range(65792, 65856), + "Ancient Greek Numbers": range(65856, 65936), + "Ancient Symbols": range(65936, 66000), + "Phaistos Disc": range(66000, 66048), + "Lycian": range(66176, 66208), + "Carian": range(66208, 66272), + "Coptic Epact Numbers": range(66272, 66304), + "Old Italic": range(66304, 66352), + "Gothic": range(66352, 66384), + "Old Permic": range(66384, 66432), + "Ugaritic": range(66432, 66464), + "Old Persian": range(66464, 66528), + "Deseret": range(66560, 66640), + "Shavian": range(66640, 66688), + "Osmanya": range(66688, 66736), + "Osage": range(66736, 66816), + "Elbasan": range(66816, 66864), + "Caucasian Albanian": range(66864, 66928), + "Vithkuqi": range(66928, 67008), + "Linear A": range(67072, 67456), + "Latin Extended-F": range(67456, 67520), + "Cypriot Syllabary": range(67584, 67648), + "Imperial Aramaic": range(67648, 67680), + "Palmyrene": range(67680, 67712), + "Nabataean": range(67712, 67760), + "Hatran": range(67808, 67840), + "Phoenician": range(67840, 67872), + "Lydian": range(67872, 67904), + "Meroitic Hieroglyphs": range(67968, 68000), + "Meroitic Cursive": range(68000, 68096), + "Kharoshthi": range(68096, 68192), + "Old South Arabian": range(68192, 68224), + "Old North Arabian": range(68224, 68256), + "Manichaean": range(68288, 68352), + "Avestan": range(68352, 68416), + "Inscriptional Parthian": range(68416, 68448), + "Inscriptional Pahlavi": range(68448, 68480), + "Psalter Pahlavi": range(68480, 68528), + "Old Turkic": range(68608, 68688), + "Old Hungarian": range(68736, 68864), + "Hanifi Rohingya": range(68864, 68928), + "Rumi Numeral Symbols": range(69216, 69248), + "Yezidi": range(69248, 69312), + "Arabic Extended-C": range(69312, 69376), + "Old Sogdian": range(69376, 69424), + "Sogdian": range(69424, 69488), + "Old Uyghur": range(69488, 69552), + "Chorasmian": range(69552, 69600), + "Elymaic": range(69600, 69632), + "Brahmi": range(69632, 69760), + "Kaithi": range(69760, 69840), + "Sora Sompeng": range(69840, 69888), + "Chakma": range(69888, 69968), + "Mahajani": range(69968, 70016), + "Sharada": range(70016, 70112), + "Sinhala Archaic Numbers": range(70112, 70144), + "Khojki": range(70144, 70224), + "Multani": range(70272, 70320), + "Khudawadi": range(70320, 70400), + "Grantha": range(70400, 70528), + "Newa": range(70656, 70784), + "Tirhuta": range(70784, 70880), + "Siddham": range(71040, 71168), + "Modi": range(71168, 71264), + "Mongolian Supplement": range(71264, 71296), + "Takri": range(71296, 71376), + "Ahom": range(71424, 71504), + "Dogra": range(71680, 71760), + "Warang Citi": range(71840, 71936), + "Dives Akuru": range(71936, 72032), + "Nandinagari": range(72096, 72192), + "Zanabazar Square": range(72192, 72272), + "Soyombo": range(72272, 72368), + "Unified Canadian Aboriginal Syllabics Extended-A": range(72368, 72384), + "Pau Cin Hau": range(72384, 72448), + "Devanagari Extended-A": range(72448, 72544), + "Bhaiksuki": range(72704, 72816), + "Marchen": range(72816, 72896), + "Masaram Gondi": range(72960, 73056), + "Gunjala Gondi": range(73056, 73136), + "Makasar": range(73440, 73472), + "Kawi": range(73472, 73568), + "Lisu Supplement": range(73648, 73664), + "Tamil Supplement": range(73664, 73728), + "Cuneiform": range(73728, 74752), + "Cuneiform Numbers and Punctuation": range(74752, 74880), + "Early Dynastic Cuneiform": range(74880, 75088), + "Cypro-Minoan": range(77712, 77824), + "Egyptian Hieroglyphs": range(77824, 78896), + "Egyptian Hieroglyph Format Controls": range(78896, 78944), + "Anatolian Hieroglyphs": range(82944, 83584), + "Bamum Supplement": range(92160, 92736), + "Mro": range(92736, 92784), + "Tangsa": range(92784, 92880), + "Bassa Vah": range(92880, 92928), + "Pahawh Hmong": range(92928, 93072), + "Medefaidrin": range(93760, 93856), + "Miao": range(93952, 94112), + "Ideographic Symbols and Punctuation": range(94176, 94208), + "Tangut": range(94208, 100352), + "Tangut Components": range(100352, 101120), + "Khitan Small Script": range(101120, 101632), + "Tangut Supplement": range(101632, 101760), + "Kana Extended-B": range(110576, 110592), + "Kana Supplement": range(110592, 110848), + "Kana Extended-A": range(110848, 110896), + "Small Kana Extension": range(110896, 110960), + "Nushu": range(110960, 111360), + "Duployan": range(113664, 113824), + "Shorthand Format Controls": range(113824, 113840), + "Znamenny Musical Notation": range(118528, 118736), + "Byzantine Musical Symbols": range(118784, 119040), + "Musical Symbols": range(119040, 119296), + "Ancient Greek Musical Notation": range(119296, 119376), + "Kaktovik Numerals": range(119488, 119520), + "Mayan Numerals": range(119520, 119552), + "Tai Xuan Jing Symbols": range(119552, 119648), + "Counting Rod Numerals": range(119648, 119680), + "Mathematical Alphanumeric Symbols": range(119808, 120832), + "Sutton SignWriting": range(120832, 121520), + "Latin Extended-G": range(122624, 122880), + "Glagolitic Supplement": range(122880, 122928), + "Cyrillic Extended-D": range(122928, 123024), + "Nyiakeng Puachue Hmong": range(123136, 123216), + "Toto": range(123536, 123584), + "Wancho": range(123584, 123648), + "Nag Mundari": range(124112, 124160), + "Ethiopic Extended-B": range(124896, 124928), + "Mende Kikakui": range(124928, 125152), + "Adlam": range(125184, 125280), + "Indic Siyaq Numbers": range(126064, 126144), + "Ottoman Siyaq Numbers": range(126208, 126288), + "Arabic Mathematical Alphabetic Symbols": range(126464, 126720), + "Mahjong Tiles": range(126976, 127024), + "Domino Tiles": range(127024, 127136), + "Playing Cards": range(127136, 127232), + "Enclosed Alphanumeric Supplement": range(127232, 127488), + "Enclosed Ideographic Supplement": range(127488, 127744), + "Miscellaneous Symbols and Pictographs": range(127744, 128512), + "Emoticons range(Emoji)": range(128512, 128592), + "Ornamental Dingbats": range(128592, 128640), + "Transport and Map Symbols": range(128640, 128768), + "Alchemical Symbols": range(128768, 128896), + "Geometric Shapes Extended": range(128896, 129024), + "Supplemental Arrows-C": range(129024, 129280), + "Supplemental Symbols and Pictographs": range(129280, 129536), + "Chess Symbols": range(129536, 129648), + "Symbols and Pictographs Extended-A": range(129648, 129792), + "Symbols for Legacy Computing": range(129792, 130048), + "CJK Unified Ideographs Extension B": range(131072, 173792), + "CJK Unified Ideographs Extension C": range(173824, 177984), + "CJK Unified Ideographs Extension D": range(177984, 178208), + "CJK Unified Ideographs Extension E": range(178208, 183984), + "CJK Unified Ideographs Extension F": range(183984, 191472), + "CJK Compatibility Ideographs Supplement": range(194560, 195104), + "CJK Unified Ideographs Extension G": range(196608, 201552), + "CJK Unified Ideographs Extension H": range(201552, 205744), + "Tags": range(917504, 917632), + "Variation Selectors Supplement": range(917760, 918000), + "Supplementary Private Use Area-A": range(983040, 1048576), + "Supplementary Private Use Area-B": range(1048576, 1114112), +} + + +UNICODE_SECONDARY_RANGE_KEYWORD: list[str] = [ + "Supplement", + "Extended", + "Extensions", + "Modifier", + "Marks", + "Punctuation", + "Symbols", + "Forms", + "Operators", + "Miscellaneous", + "Drawing", + "Block", + "Shapes", + "Supplemental", + "Tags", +] + +RE_POSSIBLE_ENCODING_INDICATION = re_compile( + r"(?:(?:encoding)|(?:charset)|(?:coding))(?:[\:= ]{1,10})(?:[\"\']?)([a-zA-Z0-9\-_]+)(?:[\"\']?)", + IGNORECASE, +) + +IANA_NO_ALIASES = [ + "cp720", + "cp737", + "cp856", + "cp874", + "cp875", + "cp1006", + "koi8_r", + "koi8_t", + "koi8_u", +] + +IANA_SUPPORTED: list[str] = sorted( + filter( + lambda x: x.endswith("_codec") is False + and x not in {"rot_13", "tactis", "mbcs"}, + list(set(aliases.values())) + IANA_NO_ALIASES, + ) +) + +IANA_SUPPORTED_COUNT: int = len(IANA_SUPPORTED) + +# pre-computed code page that are similar using the function cp_similarity. +IANA_SUPPORTED_SIMILAR: dict[str, list[str]] = { + "cp037": ["cp1026", "cp1140", "cp273", "cp500"], + "cp1026": ["cp037", "cp1140", "cp273", "cp500"], + "cp1125": ["cp866"], + "cp1140": ["cp037", "cp1026", "cp273", "cp500"], + "cp1250": ["iso8859_2"], + "cp1251": ["kz1048", "ptcp154"], + "cp1252": ["iso8859_15", "iso8859_9", "latin_1"], + "cp1253": ["iso8859_7"], + "cp1254": ["iso8859_15", "iso8859_9", "latin_1"], + "cp1257": ["iso8859_13"], + "cp273": ["cp037", "cp1026", "cp1140", "cp500"], + "cp437": ["cp850", "cp858", "cp860", "cp861", "cp862", "cp863", "cp865"], + "cp500": ["cp037", "cp1026", "cp1140", "cp273"], + "cp850": ["cp437", "cp857", "cp858", "cp865"], + "cp857": ["cp850", "cp858", "cp865"], + "cp858": ["cp437", "cp850", "cp857", "cp865"], + "cp860": ["cp437", "cp861", "cp862", "cp863", "cp865"], + "cp861": ["cp437", "cp860", "cp862", "cp863", "cp865"], + "cp862": ["cp437", "cp860", "cp861", "cp863", "cp865"], + "cp863": ["cp437", "cp860", "cp861", "cp862", "cp865"], + "cp865": ["cp437", "cp850", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863"], + "cp866": ["cp1125"], + "iso8859_10": ["iso8859_14", "iso8859_15", "iso8859_4", "iso8859_9", "latin_1"], + "iso8859_11": ["tis_620"], + "iso8859_13": ["cp1257"], + "iso8859_14": [ + "iso8859_10", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_15": [ + "cp1252", + "cp1254", + "iso8859_10", + "iso8859_14", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_16": [ + "iso8859_14", + "iso8859_15", + "iso8859_2", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_2": ["cp1250", "iso8859_16", "iso8859_4"], + "iso8859_3": ["iso8859_14", "iso8859_15", "iso8859_16", "iso8859_9", "latin_1"], + "iso8859_4": ["iso8859_10", "iso8859_2", "iso8859_9", "latin_1"], + "iso8859_7": ["cp1253"], + "iso8859_9": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "latin_1", + ], + "kz1048": ["cp1251", "ptcp154"], + "latin_1": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "iso8859_9", + ], + "mac_iceland": ["mac_roman", "mac_turkish"], + "mac_roman": ["mac_iceland", "mac_turkish"], + "mac_turkish": ["mac_iceland", "mac_roman"], + "ptcp154": ["cp1251", "kz1048"], + "tis_620": ["iso8859_11"], +} + + +CHARDET_CORRESPONDENCE: dict[str, str] = { + "iso2022_kr": "ISO-2022-KR", + "iso2022_jp": "ISO-2022-JP", + "euc_kr": "EUC-KR", + "tis_620": "TIS-620", + "utf_32": "UTF-32", + "euc_jp": "EUC-JP", + "koi8_r": "KOI8-R", + "iso8859_1": "ISO-8859-1", + "iso8859_2": "ISO-8859-2", + "iso8859_5": "ISO-8859-5", + "iso8859_6": "ISO-8859-6", + "iso8859_7": "ISO-8859-7", + "iso8859_8": "ISO-8859-8", + "utf_16": "UTF-16", + "cp855": "IBM855", + "mac_cyrillic": "MacCyrillic", + "gb2312": "GB2312", + "gb18030": "GB18030", + "cp932": "CP932", + "cp866": "IBM866", + "utf_8": "utf-8", + "utf_8_sig": "UTF-8-SIG", + "shift_jis": "SHIFT_JIS", + "big5": "Big5", + "cp1250": "windows-1250", + "cp1251": "windows-1251", + "cp1252": "Windows-1252", + "cp1253": "windows-1253", + "cp1255": "windows-1255", + "cp1256": "windows-1256", + "cp1254": "Windows-1254", + "cp949": "CP949", +} + + +COMMON_SAFE_ASCII_CHARACTERS: set[str] = { + "<", + ">", + "=", + ":", + "/", + "&", + ";", + "{", + "}", + "[", + "]", + ",", + "|", + '"', + "-", + "(", + ")", +} + +# Sample character sets — replace with full lists if needed +COMMON_CHINESE_CHARACTERS = "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞" + +COMMON_JAPANESE_CHARACTERS = "日一国年大十二本中長出三時行見月分後前生五間上東四今金九入学高円子外八六下来気小七山話女北午百書先名川千水半男西電校語土木聞食車何南万毎白天母火右読友左休父雨" + +COMMON_KOREAN_CHARACTERS = "一二三四五六七八九十百千萬上下左右中人女子大小山川日月火水木金土父母天地國名年時文校學生" + +# Combine all into a set +COMMON_CJK_CHARACTERS = set( + "".join( + [ + COMMON_CHINESE_CHARACTERS, + COMMON_JAPANESE_CHARACTERS, + COMMON_KOREAN_CHARACTERS, + ] + ) +) + +KO_NAMES: set[str] = {"johab", "cp949", "euc_kr"} +ZH_NAMES: set[str] = {"big5", "cp950", "big5hkscs", "hz"} + +# Logging LEVEL below DEBUG +TRACE: int = 5 + + +# Language label that contain the em dash "—" +# character are to be considered alternative seq to origin +FREQUENCIES: dict[str, list[str]] = { + "English": [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "u", + "m", + "f", + "p", + "g", + "w", + "y", + "b", + "v", + "k", + "x", + "j", + "z", + "q", + ], + "English—": [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "m", + "u", + "f", + "p", + "g", + "w", + "b", + "y", + "v", + "k", + "j", + "x", + "z", + "q", + ], + "German": [ + "e", + "n", + "i", + "r", + "s", + "t", + "a", + "d", + "h", + "u", + "l", + "g", + "o", + "c", + "m", + "b", + "f", + "k", + "w", + "z", + "p", + "v", + "ü", + "ä", + "ö", + "j", + ], + "French": [ + "e", + "a", + "s", + "n", + "i", + "t", + "r", + "l", + "u", + "o", + "d", + "c", + "p", + "m", + "é", + "v", + "g", + "f", + "b", + "h", + "q", + "à", + "x", + "è", + "y", + "j", + ], + "Dutch": [ + "e", + "n", + "a", + "i", + "r", + "t", + "o", + "d", + "s", + "l", + "g", + "h", + "v", + "m", + "u", + "k", + "c", + "p", + "b", + "w", + "j", + "z", + "f", + "y", + "x", + "ë", + ], + "Italian": [ + "e", + "i", + "a", + "o", + "n", + "l", + "t", + "r", + "s", + "c", + "d", + "u", + "p", + "m", + "g", + "v", + "f", + "b", + "z", + "h", + "q", + "è", + "à", + "k", + "y", + "ò", + ], + "Polish": [ + "a", + "i", + "o", + "e", + "n", + "r", + "z", + "w", + "s", + "c", + "t", + "k", + "y", + "d", + "p", + "m", + "u", + "l", + "j", + "ł", + "g", + "b", + "h", + "ą", + "ę", + "ó", + ], + "Spanish": [ + "e", + "a", + "o", + "n", + "s", + "r", + "i", + "l", + "d", + "t", + "c", + "u", + "m", + "p", + "b", + "g", + "v", + "f", + "y", + "ó", + "h", + "q", + "í", + "j", + "z", + "á", + ], + "Russian": [ + "о", + "а", + "е", + "и", + "н", + "с", + "т", + "р", + "в", + "л", + "к", + "м", + "д", + "п", + "у", + "г", + "я", + "ы", + "з", + "б", + "й", + "ь", + "ч", + "х", + "ж", + "ц", + ], + # Jap-Kanji + "Japanese": [ + "人", + "一", + "大", + "亅", + "丁", + "丨", + "竹", + "笑", + "口", + "日", + "今", + "二", + "彳", + "行", + "十", + "土", + "丶", + "寸", + "寺", + "時", + "乙", + "丿", + "乂", + "气", + "気", + "冂", + "巾", + "亠", + "市", + "目", + "儿", + "見", + "八", + "小", + "凵", + "県", + "月", + "彐", + "門", + "間", + "木", + "東", + "山", + "出", + "本", + "中", + "刀", + "分", + "耳", + "又", + "取", + "最", + "言", + "田", + "心", + "思", + "刂", + "前", + "京", + "尹", + "事", + "生", + "厶", + "云", + "会", + "未", + "来", + "白", + "冫", + "楽", + "灬", + "馬", + "尸", + "尺", + "駅", + "明", + "耂", + "者", + "了", + "阝", + "都", + "高", + "卜", + "占", + "厂", + "广", + "店", + "子", + "申", + "奄", + "亻", + "俺", + "上", + "方", + "冖", + "学", + "衣", + "艮", + "食", + "自", + ], + # Jap-Katakana + "Japanese—": [ + "ー", + "ン", + "ス", + "・", + "ル", + "ト", + "リ", + "イ", + "ア", + "ラ", + "ッ", + "ク", + "ド", + "シ", + "レ", + "ジ", + "タ", + "フ", + "ロ", + "カ", + "テ", + "マ", + "ィ", + "グ", + "バ", + "ム", + "プ", + "オ", + "コ", + "デ", + "ニ", + "ウ", + "メ", + "サ", + "ビ", + "ナ", + "ブ", + "ャ", + "エ", + "ュ", + "チ", + "キ", + "ズ", + "ダ", + "パ", + "ミ", + "ェ", + "ョ", + "ハ", + "セ", + "ベ", + "ガ", + "モ", + "ツ", + "ネ", + "ボ", + "ソ", + "ノ", + "ァ", + "ヴ", + "ワ", + "ポ", + "ペ", + "ピ", + "ケ", + "ゴ", + "ギ", + "ザ", + "ホ", + "ゲ", + "ォ", + "ヤ", + "ヒ", + "ユ", + "ヨ", + "ヘ", + "ゼ", + "ヌ", + "ゥ", + "ゾ", + "ヶ", + "ヂ", + "ヲ", + "ヅ", + "ヵ", + "ヱ", + "ヰ", + "ヮ", + "ヽ", + "゠", + "ヾ", + "ヷ", + "ヿ", + "ヸ", + "ヹ", + "ヺ", + ], + # Jap-Hiragana + "Japanese——": [ + "の", + "に", + "る", + "た", + "と", + "は", + "し", + "い", + "を", + "で", + "て", + "が", + "な", + "れ", + "か", + "ら", + "さ", + "っ", + "り", + "す", + "あ", + "も", + "こ", + "ま", + "う", + "く", + "よ", + "き", + "ん", + "め", + "お", + "け", + "そ", + "つ", + "だ", + "や", + "え", + "ど", + "わ", + "ち", + "み", + "せ", + "じ", + "ば", + "へ", + "び", + "ず", + "ろ", + "ほ", + "げ", + "む", + "べ", + "ひ", + "ょ", + "ゆ", + "ぶ", + "ご", + "ゃ", + "ね", + "ふ", + "ぐ", + "ぎ", + "ぼ", + "ゅ", + "づ", + "ざ", + "ぞ", + "ぬ", + "ぜ", + "ぱ", + "ぽ", + "ぷ", + "ぴ", + "ぃ", + "ぁ", + "ぇ", + "ぺ", + "ゞ", + "ぢ", + "ぉ", + "ぅ", + "ゐ", + "ゝ", + "ゑ", + "゛", + "゜", + "ゎ", + "ゔ", + "゚", + "ゟ", + "゙", + "ゕ", + "ゖ", + ], + "Portuguese": [ + "a", + "e", + "o", + "s", + "i", + "r", + "d", + "n", + "t", + "m", + "u", + "c", + "l", + "p", + "g", + "v", + "b", + "f", + "h", + "ã", + "q", + "é", + "ç", + "á", + "z", + "í", + ], + "Swedish": [ + "e", + "a", + "n", + "r", + "t", + "s", + "i", + "l", + "d", + "o", + "m", + "k", + "g", + "v", + "h", + "f", + "u", + "p", + "ä", + "c", + "b", + "ö", + "å", + "y", + "j", + "x", + ], + "Chinese": [ + "的", + "一", + "是", + "不", + "了", + "在", + "人", + "有", + "我", + "他", + "这", + "个", + "们", + "中", + "来", + "上", + "大", + "为", + "和", + "国", + "地", + "到", + "以", + "说", + "时", + "要", + "就", + "出", + "会", + "可", + "也", + "你", + "对", + "生", + "能", + "而", + "子", + "那", + "得", + "于", + "着", + "下", + "自", + "之", + "年", + "过", + "发", + "后", + "作", + "里", + "用", + "道", + "行", + "所", + "然", + "家", + "种", + "事", + "成", + "方", + "多", + "经", + "么", + "去", + "法", + "学", + "如", + "都", + "同", + "现", + "当", + "没", + "动", + "面", + "起", + "看", + "定", + "天", + "分", + "还", + "进", + "好", + "小", + "部", + "其", + "些", + "主", + "样", + "理", + "心", + "她", + "本", + "前", + "开", + "但", + "因", + "只", + "从", + "想", + "实", + ], + "Ukrainian": [ + "о", + "а", + "н", + "і", + "и", + "р", + "в", + "т", + "е", + "с", + "к", + "л", + "у", + "д", + "м", + "п", + "з", + "я", + "ь", + "б", + "г", + "й", + "ч", + "х", + "ц", + "ї", + ], + "Norwegian": [ + "e", + "r", + "n", + "t", + "a", + "s", + "i", + "o", + "l", + "d", + "g", + "k", + "m", + "v", + "f", + "p", + "u", + "b", + "h", + "å", + "y", + "j", + "ø", + "c", + "æ", + "w", + ], + "Finnish": [ + "a", + "i", + "n", + "t", + "e", + "s", + "l", + "o", + "u", + "k", + "ä", + "m", + "r", + "v", + "j", + "h", + "p", + "y", + "d", + "ö", + "g", + "c", + "b", + "f", + "w", + "z", + ], + "Vietnamese": [ + "n", + "h", + "t", + "i", + "c", + "g", + "a", + "o", + "u", + "m", + "l", + "r", + "à", + "đ", + "s", + "e", + "v", + "p", + "b", + "y", + "ư", + "d", + "á", + "k", + "ộ", + "ế", + ], + "Czech": [ + "o", + "e", + "a", + "n", + "t", + "s", + "i", + "l", + "v", + "r", + "k", + "d", + "u", + "m", + "p", + "í", + "c", + "h", + "z", + "á", + "y", + "j", + "b", + "ě", + "é", + "ř", + ], + "Hungarian": [ + "e", + "a", + "t", + "l", + "s", + "n", + "k", + "r", + "i", + "o", + "z", + "á", + "é", + "g", + "m", + "b", + "y", + "v", + "d", + "h", + "u", + "p", + "j", + "ö", + "f", + "c", + ], + "Korean": [ + "이", + "다", + "에", + "의", + "는", + "로", + "하", + "을", + "가", + "고", + "지", + "서", + "한", + "은", + "기", + "으", + "년", + "대", + "사", + "시", + "를", + "리", + "도", + "인", + "스", + "일", + ], + "Indonesian": [ + "a", + "n", + "e", + "i", + "r", + "t", + "u", + "s", + "d", + "k", + "m", + "l", + "g", + "p", + "b", + "o", + "h", + "y", + "j", + "c", + "w", + "f", + "v", + "z", + "x", + "q", + ], + "Turkish": [ + "a", + "e", + "i", + "n", + "r", + "l", + "ı", + "k", + "d", + "t", + "s", + "m", + "y", + "u", + "o", + "b", + "ü", + "ş", + "v", + "g", + "z", + "h", + "c", + "p", + "ç", + "ğ", + ], + "Romanian": [ + "e", + "i", + "a", + "r", + "n", + "t", + "u", + "l", + "o", + "c", + "s", + "d", + "p", + "m", + "ă", + "f", + "v", + "î", + "g", + "b", + "ș", + "ț", + "z", + "h", + "â", + "j", + ], + "Farsi": [ + "ا", + "ی", + "ر", + "د", + "ن", + "ه", + "و", + "م", + "ت", + "ب", + "س", + "ل", + "ک", + "ش", + "ز", + "ف", + "گ", + "ع", + "خ", + "ق", + "ج", + "آ", + "پ", + "ح", + "ط", + "ص", + ], + "Arabic": [ + "ا", + "ل", + "ي", + "م", + "و", + "ن", + "ر", + "ت", + "ب", + "ة", + "ع", + "د", + "س", + "ف", + "ه", + "ك", + "ق", + "أ", + "ح", + "ج", + "ش", + "ط", + "ص", + "ى", + "خ", + "إ", + ], + "Danish": [ + "e", + "r", + "n", + "t", + "a", + "i", + "s", + "d", + "l", + "o", + "g", + "m", + "k", + "f", + "v", + "u", + "b", + "h", + "p", + "å", + "y", + "ø", + "æ", + "c", + "j", + "w", + ], + "Serbian": [ + "а", + "и", + "о", + "е", + "н", + "р", + "с", + "у", + "т", + "к", + "ј", + "в", + "д", + "м", + "п", + "л", + "г", + "з", + "б", + "a", + "i", + "e", + "o", + "n", + "ц", + "ш", + ], + "Lithuanian": [ + "i", + "a", + "s", + "o", + "r", + "e", + "t", + "n", + "u", + "k", + "m", + "l", + "p", + "v", + "d", + "j", + "g", + "ė", + "b", + "y", + "ų", + "š", + "ž", + "c", + "ą", + "į", + ], + "Slovene": [ + "e", + "a", + "i", + "o", + "n", + "r", + "s", + "l", + "t", + "j", + "v", + "k", + "d", + "p", + "m", + "u", + "z", + "b", + "g", + "h", + "č", + "c", + "š", + "ž", + "f", + "y", + ], + "Slovak": [ + "o", + "a", + "e", + "n", + "i", + "r", + "v", + "t", + "s", + "l", + "k", + "d", + "m", + "p", + "u", + "c", + "h", + "j", + "b", + "z", + "á", + "y", + "ý", + "í", + "č", + "é", + ], + "Hebrew": [ + "י", + "ו", + "ה", + "ל", + "ר", + "ב", + "ת", + "מ", + "א", + "ש", + "נ", + "ע", + "ם", + "ד", + "ק", + "ח", + "פ", + "ס", + "כ", + "ג", + "ט", + "צ", + "ן", + "ז", + "ך", + ], + "Bulgarian": [ + "а", + "и", + "о", + "е", + "н", + "т", + "р", + "с", + "в", + "л", + "к", + "д", + "п", + "м", + "з", + "г", + "я", + "ъ", + "у", + "б", + "ч", + "ц", + "й", + "ж", + "щ", + "х", + ], + "Croatian": [ + "a", + "i", + "o", + "e", + "n", + "r", + "j", + "s", + "t", + "u", + "k", + "l", + "v", + "d", + "m", + "p", + "g", + "z", + "b", + "c", + "č", + "h", + "š", + "ž", + "ć", + "f", + ], + "Hindi": [ + "क", + "र", + "स", + "न", + "त", + "म", + "ह", + "प", + "य", + "ल", + "व", + "ज", + "द", + "ग", + "ब", + "श", + "ट", + "अ", + "ए", + "थ", + "भ", + "ड", + "च", + "ध", + "ष", + "इ", + ], + "Estonian": [ + "a", + "i", + "e", + "s", + "t", + "l", + "u", + "n", + "o", + "k", + "r", + "d", + "m", + "v", + "g", + "p", + "j", + "h", + "ä", + "b", + "õ", + "ü", + "f", + "c", + "ö", + "y", + ], + "Thai": [ + "า", + "น", + "ร", + "อ", + "ก", + "เ", + "ง", + "ม", + "ย", + "ล", + "ว", + "ด", + "ท", + "ส", + "ต", + "ะ", + "ป", + "บ", + "ค", + "ห", + "แ", + "จ", + "พ", + "ช", + "ข", + "ใ", + ], + "Greek": [ + "α", + "τ", + "ο", + "ι", + "ε", + "ν", + "ρ", + "σ", + "κ", + "η", + "π", + "ς", + "υ", + "μ", + "λ", + "ί", + "ό", + "ά", + "γ", + "έ", + "δ", + "ή", + "ω", + "χ", + "θ", + "ύ", + ], + "Tamil": [ + "க", + "த", + "ப", + "ட", + "ர", + "ம", + "ல", + "ன", + "வ", + "ற", + "ய", + "ள", + "ச", + "ந", + "இ", + "ண", + "அ", + "ஆ", + "ழ", + "ங", + "எ", + "உ", + "ஒ", + "ஸ", + ], + "Kazakh": [ + "а", + "ы", + "е", + "н", + "т", + "р", + "л", + "і", + "д", + "с", + "м", + "қ", + "к", + "о", + "б", + "и", + "у", + "ғ", + "ж", + "ң", + "з", + "ш", + "й", + "п", + "г", + "ө", + ], +} + +LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/legacy.py b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/legacy.py new file mode 100644 index 0000000..360a310 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/legacy.py @@ -0,0 +1,80 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any +from warnings import warn + +from .api import from_bytes +from .constant import CHARDET_CORRESPONDENCE, TOO_SMALL_SEQUENCE + +# TODO: remove this check when dropping Python 3.7 support +if TYPE_CHECKING: + from typing_extensions import TypedDict + + class ResultDict(TypedDict): + encoding: str | None + language: str + confidence: float | None + + +def detect( + byte_str: bytes, should_rename_legacy: bool = False, **kwargs: Any +) -> ResultDict: + """ + chardet legacy method + Detect the encoding of the given byte string. It should be mostly backward-compatible. + Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) + This function is deprecated and should be used to migrate your project easily, consult the documentation for + further information. Not planned for removal. + + :param byte_str: The byte sequence to examine. + :param should_rename_legacy: Should we rename legacy encodings + to their more modern equivalents? + """ + if len(kwargs): + warn( + f"charset-normalizer disregard arguments '{','.join(list(kwargs.keys()))}' in legacy function detect()" + ) + + if not isinstance(byte_str, (bytearray, bytes)): + raise TypeError( # pragma: nocover + f"Expected object of type bytes or bytearray, got: {type(byte_str)}" + ) + + if isinstance(byte_str, bytearray): + byte_str = bytes(byte_str) + + r = from_bytes(byte_str).best() + + encoding = r.encoding if r is not None else None + language = r.language if r is not None and r.language != "Unknown" else "" + confidence = 1.0 - r.chaos if r is not None else None + + # automatically lower confidence + # on small bytes samples. + # https://github.com/jawah/charset_normalizer/issues/391 + if ( + confidence is not None + and confidence >= 0.9 + and encoding + not in { + "utf_8", + "ascii", + } + and r.bom is False # type: ignore[union-attr] + and len(byte_str) < TOO_SMALL_SEQUENCE + ): + confidence -= 0.2 + + # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process + # but chardet does return 'utf-8-sig' and it is a valid codec name. + if r is not None and encoding == "utf_8" and r.bom: + encoding += "_sig" + + if should_rename_legacy is False and encoding in CHARDET_CORRESPONDENCE: + encoding = CHARDET_CORRESPONDENCE[encoding] + + return { + "encoding": encoding, + "language": language, + "confidence": confidence, + } diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..857d7474b7a5a0c5b81989346cf9d845174eed68 GIT binary patch literal 15912 zcmeHOYit}>6~4QU>E?m$LY@oYG8fH%?PpH|zK{20L*b8?}nUc)T;Vx7vp_ zJDb`eKqMy>CXHA{LZ}r#0^~&LRv*U3__xR5SCETnl^2!0!op{a?ZWy ztjCjenjZ)um}~8vbH4MsbLP(Y&hEWm?iuKfMk0b+m3Ts|NJ7L((fkNoAht)WhvQb! zC~eoRsBYnk)e2%N>XeK*q>5z5nbt>@9aF~9Pv+BMFr zKkVn7HZJ=xClVVaZaY{txamg||OF#AUa zP1|vu$z;xR+>ybqR5s&`SmP;2=_+f?#EfN5Br{ejdDIa@v;CQ*XQplB($iUptjJ*2 z&O@M~*#qOxI0?_}bG%N^a}RoMGBXKqmo=RO1H^~2$qaNrm_xH>w_~MJ*#yTm%_N35 zMJhQy?M=CkW$U@D-hy%hx!s~~pnqSN*`~MY?RdJ8Rew<_sXCzMm%#Eh$!|%*@QI4w zE4ASJmhZDT)wM|XCF6qd>j9kQH}MAg@=SNPA+)S(xNeUDRxm-rqq4~;L`SAz_E5) z95|GxP`A8Pg0}rNlyM5ZyeQ?Lpo~-AfdJQZ6(CkxnyB5@z2cAOf4pNm_=^0eMvb|SD_|*%`K#V02>mN~-77u~ z-74B}xLo~DP(}_z?s9(gUw#&p)SprCI$tBiK`3fN@tvD+M$qpG<8=EE05#@cH|8%E ze~j?_&y7=6Cl_Yc8*{~oF<<5FGEQFe9tTVGH|F0hE~43~QE~FOGaHP#zkt!G@N|r~ z87@%6p~I!6f-(Qc;*894Eq@8o)`dfdFHY#S+fHDaFpe?b-4rVxl)->|>t_=y>ca9N zz`?FO4$4wGYDU0$LEso@OtO6~HQMy85`Z}8;4_mFGK(Uxsvf%~5o5{A4 z4Ufe-8k3c5I7dIN2d-pO&1|BT~yj)>SSTH*@faoZ*Fy9M93N-M-Oz+m3;^Mn*fq++snE+)5_0?L^eI0ay-X|T>}*@a5F>Fv|QJkHJyy-&WZ`wN;{^VPp4%{9@l0J=im1j&$xD=z)OvW#?_TYpk)$!oQ&+u=!)H-5UKXyE){> z3*LWGdBX|Ihi`9uRQO#Qr?5Vj6?{85`zB zmi>9Y69)`qvp>(%nBsHM-zZ!eGJwN568rPKi0NjsfAQ`|>|b1s&7-o;cS|6uvpc06xnTJZVT10VFC0Ss%x^V;&mpZ*E({F%bYzA}## z2cq9!BR{6oeq-QCU8Y|O`1AaMX+Chl*q_6m2>A2=U8ekg!1h>cfBPy3n4*nAjToXw z87Ip1<8GY+9C^Ne$24Wgv`LBOV=(_&(D?n&YRZ&pL5bxf=V#z0U~rDb_6w{`OWnY@#lEI1_s9-`|~`A_qFo=RjwQ7 z<#F&P`1Te z=8?VyAIwkY2+79&_I>1=QG3!MEJMsOGUtCXyU)Rnj6U u@x2+}Rr$R6`HSzLeD2Ca9f$A-PH3+O@&`mY{jcPI?{4M4A>a@Y#lHYyFIRj3 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/md.py b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/md.py new file mode 100644 index 0000000..12ce024 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/md.py @@ -0,0 +1,635 @@ +from __future__ import annotations + +from functools import lru_cache +from logging import getLogger + +from .constant import ( + COMMON_SAFE_ASCII_CHARACTERS, + TRACE, + UNICODE_SECONDARY_RANGE_KEYWORD, +) +from .utils import ( + is_accentuated, + is_arabic, + is_arabic_isolated_form, + is_case_variable, + is_cjk, + is_emoticon, + is_hangul, + is_hiragana, + is_katakana, + is_latin, + is_punctuation, + is_separator, + is_symbol, + is_thai, + is_unprintable, + remove_accent, + unicode_range, + is_cjk_uncommon, +) + + +class MessDetectorPlugin: + """ + Base abstract class used for mess detection plugins. + All detectors MUST extend and implement given methods. + """ + + def eligible(self, character: str) -> bool: + """ + Determine if given character should be fed in. + """ + raise NotImplementedError # pragma: nocover + + def feed(self, character: str) -> None: + """ + The main routine to be executed upon character. + Insert the logic in witch the text would be considered chaotic. + """ + raise NotImplementedError # pragma: nocover + + def reset(self) -> None: # pragma: no cover + """ + Permit to reset the plugin to the initial state. + """ + raise NotImplementedError + + @property + def ratio(self) -> float: + """ + Compute the chaos ratio based on what your feed() has seen. + Must NOT be lower than 0.; No restriction gt 0. + """ + raise NotImplementedError # pragma: nocover + + +class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._punctuation_count: int = 0 + self._symbol_count: int = 0 + self._character_count: int = 0 + + self._last_printable_char: str | None = None + self._frenzy_symbol_in_word: bool = False + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character != self._last_printable_char + and character not in COMMON_SAFE_ASCII_CHARACTERS + ): + if is_punctuation(character): + self._punctuation_count += 1 + elif ( + character.isdigit() is False + and is_symbol(character) + and is_emoticon(character) is False + ): + self._symbol_count += 2 + + self._last_printable_char = character + + def reset(self) -> None: # Abstract + self._punctuation_count = 0 + self._character_count = 0 + self._symbol_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + ratio_of_punctuation: float = ( + self._punctuation_count + self._symbol_count + ) / self._character_count + + return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 + + +class TooManyAccentuatedPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._character_count: int = 0 + self._accentuated_count: int = 0 + + def eligible(self, character: str) -> bool: + return character.isalpha() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_accentuated(character): + self._accentuated_count += 1 + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._accentuated_count = 0 + + @property + def ratio(self) -> float: + if self._character_count < 8: + return 0.0 + + ratio_of_accentuation: float = self._accentuated_count / self._character_count + return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 + + +class UnprintablePlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._unprintable_count: int = 0 + self._character_count: int = 0 + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if is_unprintable(character): + self._unprintable_count += 1 + self._character_count += 1 + + def reset(self) -> None: # Abstract + self._unprintable_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._unprintable_count * 8) / self._character_count + + +class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._successive_count: int = 0 + self._character_count: int = 0 + + self._last_latin_character: str | None = None + + def eligible(self, character: str) -> bool: + return character.isalpha() and is_latin(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + if ( + self._last_latin_character is not None + and is_accentuated(character) + and is_accentuated(self._last_latin_character) + ): + if character.isupper() and self._last_latin_character.isupper(): + self._successive_count += 1 + # Worse if its the same char duplicated with different accent. + if remove_accent(character) == remove_accent(self._last_latin_character): + self._successive_count += 1 + self._last_latin_character = character + + def reset(self) -> None: # Abstract + self._successive_count = 0 + self._character_count = 0 + self._last_latin_character = None + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._successive_count * 2) / self._character_count + + +class SuspiciousRange(MessDetectorPlugin): + def __init__(self) -> None: + self._suspicious_successive_range_count: int = 0 + self._character_count: int = 0 + self._last_printable_seen: str | None = None + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character.isspace() + or is_punctuation(character) + or character in COMMON_SAFE_ASCII_CHARACTERS + ): + self._last_printable_seen = None + return + + if self._last_printable_seen is None: + self._last_printable_seen = character + return + + unicode_range_a: str | None = unicode_range(self._last_printable_seen) + unicode_range_b: str | None = unicode_range(character) + + if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): + self._suspicious_successive_range_count += 1 + + self._last_printable_seen = character + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._suspicious_successive_range_count = 0 + self._last_printable_seen = None + + @property + def ratio(self) -> float: + if self._character_count <= 13: + return 0.0 + + ratio_of_suspicious_range_usage: float = ( + self._suspicious_successive_range_count * 2 + ) / self._character_count + + return ratio_of_suspicious_range_usage + + +class SuperWeirdWordPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._word_count: int = 0 + self._bad_word_count: int = 0 + self._foreign_long_count: int = 0 + + self._is_current_word_bad: bool = False + self._foreign_long_watch: bool = False + + self._character_count: int = 0 + self._bad_character_count: int = 0 + + self._buffer: str = "" + self._buffer_accent_count: int = 0 + self._buffer_glyph_count: int = 0 + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character.isalpha(): + self._buffer += character + if is_accentuated(character): + self._buffer_accent_count += 1 + if ( + self._foreign_long_watch is False + and (is_latin(character) is False or is_accentuated(character)) + and is_cjk(character) is False + and is_hangul(character) is False + and is_katakana(character) is False + and is_hiragana(character) is False + and is_thai(character) is False + ): + self._foreign_long_watch = True + if ( + is_cjk(character) + or is_hangul(character) + or is_katakana(character) + or is_hiragana(character) + or is_thai(character) + ): + self._buffer_glyph_count += 1 + return + if not self._buffer: + return + if ( + character.isspace() or is_punctuation(character) or is_separator(character) + ) and self._buffer: + self._word_count += 1 + buffer_length: int = len(self._buffer) + + self._character_count += buffer_length + + if buffer_length >= 4: + if self._buffer_accent_count / buffer_length >= 0.5: + self._is_current_word_bad = True + # Word/Buffer ending with an upper case accentuated letter are so rare, + # that we will consider them all as suspicious. Same weight as foreign_long suspicious. + elif ( + is_accentuated(self._buffer[-1]) + and self._buffer[-1].isupper() + and all(_.isupper() for _ in self._buffer) is False + ): + self._foreign_long_count += 1 + self._is_current_word_bad = True + elif self._buffer_glyph_count == 1: + self._is_current_word_bad = True + self._foreign_long_count += 1 + if buffer_length >= 24 and self._foreign_long_watch: + camel_case_dst = [ + i + for c, i in zip(self._buffer, range(0, buffer_length)) + if c.isupper() + ] + probable_camel_cased: bool = False + + if camel_case_dst and (len(camel_case_dst) / buffer_length <= 0.3): + probable_camel_cased = True + + if not probable_camel_cased: + self._foreign_long_count += 1 + self._is_current_word_bad = True + + if self._is_current_word_bad: + self._bad_word_count += 1 + self._bad_character_count += len(self._buffer) + self._is_current_word_bad = False + + self._foreign_long_watch = False + self._buffer = "" + self._buffer_accent_count = 0 + self._buffer_glyph_count = 0 + elif ( + character not in {"<", ">", "-", "=", "~", "|", "_"} + and character.isdigit() is False + and is_symbol(character) + ): + self._is_current_word_bad = True + self._buffer += character + + def reset(self) -> None: # Abstract + self._buffer = "" + self._is_current_word_bad = False + self._foreign_long_watch = False + self._bad_word_count = 0 + self._word_count = 0 + self._character_count = 0 + self._bad_character_count = 0 + self._foreign_long_count = 0 + + @property + def ratio(self) -> float: + if self._word_count <= 10 and self._foreign_long_count == 0: + return 0.0 + + return self._bad_character_count / self._character_count + + +class CjkUncommonPlugin(MessDetectorPlugin): + """ + Detect messy CJK text that probably means nothing. + """ + + def __init__(self) -> None: + self._character_count: int = 0 + self._uncommon_count: int = 0 + + def eligible(self, character: str) -> bool: + return is_cjk(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_cjk_uncommon(character): + self._uncommon_count += 1 + return + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._uncommon_count = 0 + + @property + def ratio(self) -> float: + if self._character_count < 8: + return 0.0 + + uncommon_form_usage: float = self._uncommon_count / self._character_count + + # we can be pretty sure it's garbage when uncommon characters are widely + # used. otherwise it could just be traditional chinese for example. + return uncommon_form_usage / 10 if uncommon_form_usage > 0.5 else 0.0 + + +class ArchaicUpperLowerPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._buf: bool = False + + self._character_count_since_last_sep: int = 0 + + self._successive_upper_lower_count: int = 0 + self._successive_upper_lower_count_final: int = 0 + + self._character_count: int = 0 + + self._last_alpha_seen: str | None = None + self._current_ascii_only: bool = True + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + is_concerned = character.isalpha() and is_case_variable(character) + chunk_sep = is_concerned is False + + if chunk_sep and self._character_count_since_last_sep > 0: + if ( + self._character_count_since_last_sep <= 64 + and character.isdigit() is False + and self._current_ascii_only is False + ): + self._successive_upper_lower_count_final += ( + self._successive_upper_lower_count + ) + + self._successive_upper_lower_count = 0 + self._character_count_since_last_sep = 0 + self._last_alpha_seen = None + self._buf = False + self._character_count += 1 + self._current_ascii_only = True + + return + + if self._current_ascii_only is True and character.isascii() is False: + self._current_ascii_only = False + + if self._last_alpha_seen is not None: + if (character.isupper() and self._last_alpha_seen.islower()) or ( + character.islower() and self._last_alpha_seen.isupper() + ): + if self._buf is True: + self._successive_upper_lower_count += 2 + self._buf = False + else: + self._buf = True + else: + self._buf = False + + self._character_count += 1 + self._character_count_since_last_sep += 1 + self._last_alpha_seen = character + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._character_count_since_last_sep = 0 + self._successive_upper_lower_count = 0 + self._successive_upper_lower_count_final = 0 + self._last_alpha_seen = None + self._buf = False + self._current_ascii_only = True + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return self._successive_upper_lower_count_final / self._character_count + + +class ArabicIsolatedFormPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._character_count: int = 0 + self._isolated_form_count: int = 0 + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._isolated_form_count = 0 + + def eligible(self, character: str) -> bool: + return is_arabic(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_arabic_isolated_form(character): + self._isolated_form_count += 1 + + @property + def ratio(self) -> float: + if self._character_count < 8: + return 0.0 + + isolated_form_usage: float = self._isolated_form_count / self._character_count + + return isolated_form_usage + + +@lru_cache(maxsize=1024) +def is_suspiciously_successive_range( + unicode_range_a: str | None, unicode_range_b: str | None +) -> bool: + """ + Determine if two Unicode range seen next to each other can be considered as suspicious. + """ + if unicode_range_a is None or unicode_range_b is None: + return True + + if unicode_range_a == unicode_range_b: + return False + + if "Latin" in unicode_range_a and "Latin" in unicode_range_b: + return False + + if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: + return False + + # Latin characters can be accompanied with a combining diacritical mark + # eg. Vietnamese. + if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and ( + "Combining" in unicode_range_a or "Combining" in unicode_range_b + ): + return False + + keywords_range_a, keywords_range_b = ( + unicode_range_a.split(" "), + unicode_range_b.split(" "), + ) + + for el in keywords_range_a: + if el in UNICODE_SECONDARY_RANGE_KEYWORD: + continue + if el in keywords_range_b: + return False + + # Japanese Exception + range_a_jp_chars, range_b_jp_chars = ( + unicode_range_a + in ( + "Hiragana", + "Katakana", + ), + unicode_range_b in ("Hiragana", "Katakana"), + ) + if (range_a_jp_chars or range_b_jp_chars) and ( + "CJK" in unicode_range_a or "CJK" in unicode_range_b + ): + return False + if range_a_jp_chars and range_b_jp_chars: + return False + + if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: + if "CJK" in unicode_range_a or "CJK" in unicode_range_b: + return False + if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": + return False + + # Chinese/Japanese use dedicated range for punctuation and/or separators. + if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( + unicode_range_a in ["Katakana", "Hiragana"] + and unicode_range_b in ["Katakana", "Hiragana"] + ): + if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: + return False + if "Forms" in unicode_range_a or "Forms" in unicode_range_b: + return False + if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": + return False + + return True + + +@lru_cache(maxsize=2048) +def mess_ratio( + decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False +) -> float: + """ + Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. + """ + + detectors: list[MessDetectorPlugin] = [ + md_class() for md_class in MessDetectorPlugin.__subclasses__() + ] + + length: int = len(decoded_sequence) + 1 + + mean_mess_ratio: float = 0.0 + + if length < 512: + intermediary_mean_mess_ratio_calc: int = 32 + elif length <= 1024: + intermediary_mean_mess_ratio_calc = 64 + else: + intermediary_mean_mess_ratio_calc = 128 + + for character, index in zip(decoded_sequence + "\n", range(length)): + for detector in detectors: + if detector.eligible(character): + detector.feed(character) + + if ( + index > 0 and index % intermediary_mean_mess_ratio_calc == 0 + ) or index == length - 1: + mean_mess_ratio = sum(dt.ratio for dt in detectors) + + if mean_mess_ratio >= maximum_threshold: + break + + if debug: + logger = getLogger("charset_normalizer") + + logger.log( + TRACE, + "Mess-detector extended-analysis start. " + f"intermediary_mean_mess_ratio_calc={intermediary_mean_mess_ratio_calc} mean_mess_ratio={mean_mess_ratio} " + f"maximum_threshold={maximum_threshold}", + ) + + if len(decoded_sequence) > 16: + logger.log(TRACE, f"Starting with: {decoded_sequence[:16]}") + logger.log(TRACE, f"Ending with: {decoded_sequence[-16::]}") + + for dt in detectors: + logger.log(TRACE, f"{dt.__class__}: {dt.ratio}") + + return round(mean_mess_ratio, 3) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..d5091af73cad757a944ce9aa10a8c4415403bccd GIT binary patch literal 289536 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

0%pXj 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ɟL4Py)Kxm$#rc_ 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 z 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 b-|h836Xfu312^^mqa*46=tPH!$Kd|~T_KC7 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/models.py b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/models.py new file mode 100644 index 0000000..1042758 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/models.py @@ -0,0 +1,360 @@ +from __future__ import annotations + +from encodings.aliases import aliases +from hashlib import sha256 +from json import dumps +from re import sub +from typing import Any, Iterator, List, Tuple + +from .constant import RE_POSSIBLE_ENCODING_INDICATION, TOO_BIG_SEQUENCE +from .utils import iana_name, is_multi_byte_encoding, unicode_range + + +class CharsetMatch: + def __init__( + self, + payload: bytes, + guessed_encoding: str, + mean_mess_ratio: float, + has_sig_or_bom: bool, + languages: CoherenceMatches, + decoded_payload: str | None = None, + preemptive_declaration: str | None = None, + ): + self._payload: bytes = payload + + self._encoding: str = guessed_encoding + self._mean_mess_ratio: float = mean_mess_ratio + self._languages: CoherenceMatches = languages + self._has_sig_or_bom: bool = has_sig_or_bom + self._unicode_ranges: list[str] | None = None + + self._leaves: list[CharsetMatch] = [] + self._mean_coherence_ratio: float = 0.0 + + self._output_payload: bytes | None = None + self._output_encoding: str | None = None + + self._string: str | None = decoded_payload + + self._preemptive_declaration: str | None = preemptive_declaration + + def __eq__(self, other: object) -> bool: + if not isinstance(other, CharsetMatch): + if isinstance(other, str): + return iana_name(other) == self.encoding + return False + return self.encoding == other.encoding and self.fingerprint == other.fingerprint + + def __lt__(self, other: object) -> bool: + """ + Implemented to make sorted available upon CharsetMatches items. + """ + if not isinstance(other, CharsetMatch): + raise ValueError + + chaos_difference: float = abs(self.chaos - other.chaos) + coherence_difference: float = abs(self.coherence - other.coherence) + + # Below 1% difference --> Use Coherence + if chaos_difference < 0.01 and coherence_difference > 0.02: + return self.coherence > other.coherence + elif chaos_difference < 0.01 and coherence_difference <= 0.02: + # When having a difficult decision, use the result that decoded as many multi-byte as possible. + # preserve RAM usage! + if len(self._payload) >= TOO_BIG_SEQUENCE: + return self.chaos < other.chaos + return self.multi_byte_usage > other.multi_byte_usage + + return self.chaos < other.chaos + + @property + def multi_byte_usage(self) -> float: + return 1.0 - (len(str(self)) / len(self.raw)) + + def __str__(self) -> str: + # Lazy Str Loading + if self._string is None: + self._string = str(self._payload, self._encoding, "strict") + return self._string + + def __repr__(self) -> str: + return f"" + + def add_submatch(self, other: CharsetMatch) -> None: + if not isinstance(other, CharsetMatch) or other == self: + raise ValueError( + "Unable to add instance <{}> as a submatch of a CharsetMatch".format( + other.__class__ + ) + ) + + other._string = None # Unload RAM usage; dirty trick. + self._leaves.append(other) + + @property + def encoding(self) -> str: + return self._encoding + + @property + def encoding_aliases(self) -> list[str]: + """ + Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. + """ + also_known_as: list[str] = [] + for u, p in aliases.items(): + if self.encoding == u: + also_known_as.append(p) + elif self.encoding == p: + also_known_as.append(u) + return also_known_as + + @property + def bom(self) -> bool: + return self._has_sig_or_bom + + @property + def byte_order_mark(self) -> bool: + return self._has_sig_or_bom + + @property + def languages(self) -> list[str]: + """ + Return the complete list of possible languages found in decoded sequence. + Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. + """ + return [e[0] for e in self._languages] + + @property + def language(self) -> str: + """ + Most probable language found in decoded sequence. If none were detected or inferred, the property will return + "Unknown". + """ + if not self._languages: + # Trying to infer the language based on the given encoding + # Its either English or we should not pronounce ourselves in certain cases. + if "ascii" in self.could_be_from_charset: + return "English" + + # doing it there to avoid circular import + from charset_normalizer.cd import encoding_languages, mb_encoding_languages + + languages = ( + mb_encoding_languages(self.encoding) + if is_multi_byte_encoding(self.encoding) + else encoding_languages(self.encoding) + ) + + if len(languages) == 0 or "Latin Based" in languages: + return "Unknown" + + return languages[0] + + return self._languages[0][0] + + @property + def chaos(self) -> float: + return self._mean_mess_ratio + + @property + def coherence(self) -> float: + if not self._languages: + return 0.0 + return self._languages[0][1] + + @property + def percent_chaos(self) -> float: + return round(self.chaos * 100, ndigits=3) + + @property + def percent_coherence(self) -> float: + return round(self.coherence * 100, ndigits=3) + + @property + def raw(self) -> bytes: + """ + Original untouched bytes. + """ + return self._payload + + @property + def submatch(self) -> list[CharsetMatch]: + return self._leaves + + @property + def has_submatch(self) -> bool: + return len(self._leaves) > 0 + + @property + def alphabets(self) -> list[str]: + if self._unicode_ranges is not None: + return self._unicode_ranges + # list detected ranges + detected_ranges: list[str | None] = [unicode_range(char) for char in str(self)] + # filter and sort + self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) + return self._unicode_ranges + + @property + def could_be_from_charset(self) -> list[str]: + """ + The complete list of encoding that output the exact SAME str result and therefore could be the originating + encoding. + This list does include the encoding available in property 'encoding'. + """ + return [self._encoding] + [m.encoding for m in self._leaves] + + def output(self, encoding: str = "utf_8") -> bytes: + """ + Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. + Any errors will be simply ignored by the encoder NOT replaced. + """ + if self._output_encoding is None or self._output_encoding != encoding: + self._output_encoding = encoding + decoded_string = str(self) + if ( + self._preemptive_declaration is not None + and self._preemptive_declaration.lower() + not in ["utf-8", "utf8", "utf_8"] + ): + patched_header = sub( + RE_POSSIBLE_ENCODING_INDICATION, + lambda m: m.string[m.span()[0] : m.span()[1]].replace( + m.groups()[0], + iana_name(self._output_encoding).replace("_", "-"), # type: ignore[arg-type] + ), + decoded_string[:8192], + count=1, + ) + + decoded_string = patched_header + decoded_string[8192:] + + self._output_payload = decoded_string.encode(encoding, "replace") + + return self._output_payload # type: ignore + + @property + def fingerprint(self) -> str: + """ + Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one. + """ + return sha256(self.output()).hexdigest() + + +class CharsetMatches: + """ + Container with every CharsetMatch items ordered by default from most probable to the less one. + Act like a list(iterable) but does not implements all related methods. + """ + + def __init__(self, results: list[CharsetMatch] | None = None): + self._results: list[CharsetMatch] = sorted(results) if results else [] + + def __iter__(self) -> Iterator[CharsetMatch]: + yield from self._results + + def __getitem__(self, item: int | str) -> CharsetMatch: + """ + Retrieve a single item either by its position or encoding name (alias may be used here). + Raise KeyError upon invalid index or encoding not present in results. + """ + if isinstance(item, int): + return self._results[item] + if isinstance(item, str): + item = iana_name(item, False) + for result in self._results: + if item in result.could_be_from_charset: + return result + raise KeyError + + def __len__(self) -> int: + return len(self._results) + + def __bool__(self) -> bool: + return len(self._results) > 0 + + def append(self, item: CharsetMatch) -> None: + """ + Insert a single match. Will be inserted accordingly to preserve sort. + Can be inserted as a submatch. + """ + if not isinstance(item, CharsetMatch): + raise ValueError( + "Cannot append instance '{}' to CharsetMatches".format( + str(item.__class__) + ) + ) + # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) + if len(item.raw) < TOO_BIG_SEQUENCE: + for match in self._results: + if match.fingerprint == item.fingerprint and match.chaos == item.chaos: + match.add_submatch(item) + return + self._results.append(item) + self._results = sorted(self._results) + + def best(self) -> CharsetMatch | None: + """ + Simply return the first match. Strict equivalent to matches[0]. + """ + if not self._results: + return None + return self._results[0] + + def first(self) -> CharsetMatch | None: + """ + Redundant method, call the method best(). Kept for BC reasons. + """ + return self.best() + + +CoherenceMatch = Tuple[str, float] +CoherenceMatches = List[CoherenceMatch] + + +class CliDetectionResult: + def __init__( + self, + path: str, + encoding: str | None, + encoding_aliases: list[str], + alternative_encodings: list[str], + language: str, + alphabets: list[str], + has_sig_or_bom: bool, + chaos: float, + coherence: float, + unicode_path: str | None, + is_preferred: bool, + ): + self.path: str = path + self.unicode_path: str | None = unicode_path + self.encoding: str | None = encoding + self.encoding_aliases: list[str] = encoding_aliases + self.alternative_encodings: list[str] = alternative_encodings + self.language: str = language + self.alphabets: list[str] = alphabets + self.has_sig_or_bom: bool = has_sig_or_bom + self.chaos: float = chaos + self.coherence: float = coherence + self.is_preferred: bool = is_preferred + + @property + def __dict__(self) -> dict[str, Any]: # type: ignore + return { + "path": self.path, + "encoding": self.encoding, + "encoding_aliases": self.encoding_aliases, + "alternative_encodings": self.alternative_encodings, + "language": self.language, + "alphabets": self.alphabets, + "has_sig_or_bom": self.has_sig_or_bom, + "chaos": self.chaos, + "coherence": self.coherence, + "unicode_path": self.unicode_path, + "is_preferred": self.is_preferred, + } + + def to_json(self) -> str: + return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/py.typed b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/utils.py b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/utils.py new file mode 100644 index 0000000..6bf0384 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/utils.py @@ -0,0 +1,414 @@ +from __future__ import annotations + +import importlib +import logging +import unicodedata +from codecs import IncrementalDecoder +from encodings.aliases import aliases +from functools import lru_cache +from re import findall +from typing import Generator + +from _multibytecodec import ( # type: ignore[import-not-found,import] + MultibyteIncrementalDecoder, +) + +from .constant import ( + ENCODING_MARKS, + IANA_SUPPORTED_SIMILAR, + RE_POSSIBLE_ENCODING_INDICATION, + UNICODE_RANGES_COMBINED, + UNICODE_SECONDARY_RANGE_KEYWORD, + UTF8_MAXIMAL_ALLOCATION, + COMMON_CJK_CHARACTERS, +) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_accentuated(character: str) -> bool: + try: + description: str = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + return ( + "WITH GRAVE" in description + or "WITH ACUTE" in description + or "WITH CEDILLA" in description + or "WITH DIAERESIS" in description + or "WITH CIRCUMFLEX" in description + or "WITH TILDE" in description + or "WITH MACRON" in description + or "WITH RING ABOVE" in description + ) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def remove_accent(character: str) -> str: + decomposed: str = unicodedata.decomposition(character) + if not decomposed: + return character + + codes: list[str] = decomposed.split(" ") + + return chr(int(codes[0], 16)) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def unicode_range(character: str) -> str | None: + """ + Retrieve the Unicode range official name from a single character. + """ + character_ord: int = ord(character) + + for range_name, ord_range in UNICODE_RANGES_COMBINED.items(): + if character_ord in ord_range: + return range_name + + return None + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_latin(character: str) -> bool: + try: + description: str = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + return "LATIN" in description + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_punctuation(character: str) -> bool: + character_category: str = unicodedata.category(character) + + if "P" in character_category: + return True + + character_range: str | None = unicode_range(character) + + if character_range is None: + return False + + return "Punctuation" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_symbol(character: str) -> bool: + character_category: str = unicodedata.category(character) + + if "S" in character_category or "N" in character_category: + return True + + character_range: str | None = unicode_range(character) + + if character_range is None: + return False + + return "Forms" in character_range and character_category != "Lo" + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_emoticon(character: str) -> bool: + character_range: str | None = unicode_range(character) + + if character_range is None: + return False + + return "Emoticons" in character_range or "Pictographs" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_separator(character: str) -> bool: + if character.isspace() or character in {"|", "+", "<", ">"}: + return True + + character_category: str = unicodedata.category(character) + + return "Z" in character_category or character_category in {"Po", "Pd", "Pc"} + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_case_variable(character: str) -> bool: + return character.islower() != character.isupper() + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_cjk(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "CJK" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hiragana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "HIRAGANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_katakana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "KATAKANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hangul(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "HANGUL" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_thai(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "THAI" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_arabic(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "ARABIC" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_arabic_isolated_form(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "ARABIC" in character_name and "ISOLATED FORM" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_cjk_uncommon(character: str) -> bool: + return character not in COMMON_CJK_CHARACTERS + + +@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) +def is_unicode_range_secondary(range_name: str) -> bool: + return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_unprintable(character: str) -> bool: + return ( + character.isspace() is False # includes \n \t \r \v + and character.isprintable() is False + and character != "\x1a" # Why? Its the ASCII substitute character. + and character != "\ufeff" # bug discovered in Python, + # Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space. + ) + + +def any_specified_encoding(sequence: bytes, search_zone: int = 8192) -> str | None: + """ + Extract using ASCII-only decoder any specified encoding in the first n-bytes. + """ + if not isinstance(sequence, bytes): + raise TypeError + + seq_len: int = len(sequence) + + results: list[str] = findall( + RE_POSSIBLE_ENCODING_INDICATION, + sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"), + ) + + if len(results) == 0: + return None + + for specified_encoding in results: + specified_encoding = specified_encoding.lower().replace("-", "_") + + encoding_alias: str + encoding_iana: str + + for encoding_alias, encoding_iana in aliases.items(): + if encoding_alias == specified_encoding: + return encoding_iana + if encoding_iana == specified_encoding: + return encoding_iana + + return None + + +@lru_cache(maxsize=128) +def is_multi_byte_encoding(name: str) -> bool: + """ + Verify is a specific encoding is a multi byte one based on it IANA name + """ + return name in { + "utf_8", + "utf_8_sig", + "utf_16", + "utf_16_be", + "utf_16_le", + "utf_32", + "utf_32_le", + "utf_32_be", + "utf_7", + } or issubclass( + importlib.import_module(f"encodings.{name}").IncrementalDecoder, + MultibyteIncrementalDecoder, + ) + + +def identify_sig_or_bom(sequence: bytes) -> tuple[str | None, bytes]: + """ + Identify and extract SIG/BOM in given sequence. + """ + + for iana_encoding in ENCODING_MARKS: + marks: bytes | list[bytes] = ENCODING_MARKS[iana_encoding] + + if isinstance(marks, bytes): + marks = [marks] + + for mark in marks: + if sequence.startswith(mark): + return iana_encoding, mark + + return None, b"" + + +def should_strip_sig_or_bom(iana_encoding: str) -> bool: + return iana_encoding not in {"utf_16", "utf_32"} + + +def iana_name(cp_name: str, strict: bool = True) -> str: + """Returns the Python normalized encoding name (Not the IANA official name).""" + cp_name = cp_name.lower().replace("-", "_") + + encoding_alias: str + encoding_iana: str + + for encoding_alias, encoding_iana in aliases.items(): + if cp_name in [encoding_alias, encoding_iana]: + return encoding_iana + + if strict: + raise ValueError(f"Unable to retrieve IANA for '{cp_name}'") + + return cp_name + + +def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: + if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): + return 0.0 + + decoder_a = importlib.import_module(f"encodings.{iana_name_a}").IncrementalDecoder + decoder_b = importlib.import_module(f"encodings.{iana_name_b}").IncrementalDecoder + + id_a: IncrementalDecoder = decoder_a(errors="ignore") + id_b: IncrementalDecoder = decoder_b(errors="ignore") + + character_match_count: int = 0 + + for i in range(255): + to_be_decoded: bytes = bytes([i]) + if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded): + character_match_count += 1 + + return character_match_count / 254 + + +def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool: + """ + Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using + the function cp_similarity. + """ + return ( + iana_name_a in IANA_SUPPORTED_SIMILAR + and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a] + ) + + +def set_logging_handler( + name: str = "charset_normalizer", + level: int = logging.INFO, + format_string: str = "%(asctime)s | %(levelname)s | %(message)s", +) -> None: + logger = logging.getLogger(name) + logger.setLevel(level) + + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter(format_string)) + logger.addHandler(handler) + + +def cut_sequence_chunks( + sequences: bytes, + encoding_iana: str, + offsets: range, + chunk_size: int, + bom_or_sig_available: bool, + strip_sig_or_bom: bool, + sig_payload: bytes, + is_multi_byte_decoder: bool, + decoded_payload: str | None = None, +) -> Generator[str, None, None]: + if decoded_payload and is_multi_byte_decoder is False: + for i in offsets: + chunk = decoded_payload[i : i + chunk_size] + if not chunk: + break + yield chunk + else: + for i in offsets: + chunk_end = i + chunk_size + if chunk_end > len(sequences) + 8: + continue + + cut_sequence = sequences[i : i + chunk_size] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode( + encoding_iana, + errors="ignore" if is_multi_byte_decoder else "strict", + ) + + # multi-byte bad cutting detector and adjustment + # not the cleanest way to perform that fix but clever enough for now. + if is_multi_byte_decoder and i > 0: + chunk_partial_size_chk: int = min(chunk_size, 16) + + if ( + decoded_payload + and chunk[:chunk_partial_size_chk] not in decoded_payload + ): + for j in range(i, i - 4, -1): + cut_sequence = sequences[j:chunk_end] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode(encoding_iana, errors="ignore") + + if chunk[:chunk_partial_size_chk] in decoded_payload: + break + + yield chunk diff --git a/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/version.py b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/version.py new file mode 100644 index 0000000..71350e5 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/charset_normalizer/version.py @@ -0,0 +1,8 @@ +""" +Expose version +""" + +from __future__ import annotations + +__version__ = "3.4.3" +VERSION = __version__.split(".") diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/INSTALLER b/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/METADATA b/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/METADATA new file mode 100644 index 0000000..534eb57 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/METADATA @@ -0,0 +1,84 @@ +Metadata-Version: 2.4 +Name: click +Version: 8.3.0 +Summary: Composable command line interface toolkit +Maintainer-email: Pallets +Requires-Python: >=3.10 +Description-Content-Type: text/markdown +License-Expression: BSD-3-Clause +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Typing :: Typed +License-File: LICENSE.txt +Requires-Dist: colorama; platform_system == 'Windows' +Project-URL: Changes, https://click.palletsprojects.com/page/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/click/ + +

+ +# Click + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +## A Simple Example + +```python +import click + +@click.command() +@click.option("--count", default=1, help="Number of greetings.") +@click.option("--name", prompt="Your name", help="The person to greet.") +def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo(f"Hello, {name}!") + +if __name__ == '__main__': + hello() +``` + +``` +$ python hello.py --count=3 +Your name: Click +Hello, Click! +Hello, Click! +Hello, Click! +``` + + +## Donate + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, [please +donate today][]. + +[please donate today]: https://palletsprojects.com/donate + +## Contributing + +See our [detailed contributing documentation][contrib] for many ways to +contribute, including reporting issues, requesting features, asking or answering +questions, and making PRs. + +[contrib]: https://palletsprojects.com/contributing/ + diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/RECORD b/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/RECORD new file mode 100644 index 0000000..dc3c2be --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/RECORD @@ -0,0 +1,40 @@ +click-8.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-8.3.0.dist-info/METADATA,sha256=P6vpEHZ_MLBt4SO2eB-QaadcOdiznkzaZtJImRo7_V4,2621 +click-8.3.0.dist-info/RECORD,, +click-8.3.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 +click-8.3.0.dist-info/licenses/LICENSE.txt,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click/__init__.py,sha256=6YyS1aeyknZ0LYweWozNZy0A9nZ_11wmYIhv3cbQrYo,4473 +click/__pycache__/__init__.cpython-312.pyc,, +click/__pycache__/_compat.cpython-312.pyc,, +click/__pycache__/_termui_impl.cpython-312.pyc,, +click/__pycache__/_textwrap.cpython-312.pyc,, +click/__pycache__/_utils.cpython-312.pyc,, +click/__pycache__/_winconsole.cpython-312.pyc,, +click/__pycache__/core.cpython-312.pyc,, +click/__pycache__/decorators.cpython-312.pyc,, +click/__pycache__/exceptions.cpython-312.pyc,, +click/__pycache__/formatting.cpython-312.pyc,, +click/__pycache__/globals.cpython-312.pyc,, +click/__pycache__/parser.cpython-312.pyc,, +click/__pycache__/shell_completion.cpython-312.pyc,, +click/__pycache__/termui.cpython-312.pyc,, +click/__pycache__/testing.cpython-312.pyc,, +click/__pycache__/types.cpython-312.pyc,, +click/__pycache__/utils.cpython-312.pyc,, +click/_compat.py,sha256=v3xBZkFbvA1BXPRkFfBJc6-pIwPI7345m-kQEnpVAs4,18693 +click/_termui_impl.py,sha256=ktpAHyJtNkhyR-x64CQFD6xJQI11fTA3qg2AV3iCToU,26799 +click/_textwrap.py,sha256=BOae0RQ6vg3FkNgSJyOoGzG1meGMxJ_ukWVZKx_v-0o,1400 +click/_utils.py,sha256=kZwtTf5gMuCilJJceS2iTCvRvCY-0aN5rJq8gKw7p8g,943 +click/_winconsole.py,sha256=_vxUuUaxwBhoR0vUWCNuHY8VUefiMdCIyU2SXPqoF-A,8465 +click/core.py,sha256=1A5T8UoAXklIGPTJ83_DJbVi35ehtJS2FTkP_wQ7es0,128855 +click/decorators.py,sha256=5P7abhJtAQYp_KHgjUvhMv464ERwOzrv2enNknlwHyQ,18461 +click/exceptions.py,sha256=8utf8w6V5hJXMnO_ic1FNrtbwuEn1NUu1aDwV8UqnG4,9954 +click/formatting.py,sha256=RVfwwr0rwWNpgGr8NaHodPzkIr7_tUyVh_nDdanLMNc,9730 +click/globals.py,sha256=gM-Nh6A4M0HB_SgkaF5M4ncGGMDHc_flHXu9_oh4GEU,1923 +click/parser.py,sha256=Q31pH0FlQZEq-UXE_ABRzlygEfvxPTuZbWNh4xfXmzw,19010 +click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click/shell_completion.py,sha256=Cc4GQUFuWpfQBa9sF5qXeeYI7n3tI_1k6ZdSn4BZbT0,20994 +click/termui.py,sha256=vAYrKC2a7f_NfEIhAThEVYfa__ib5XQbTSCGtJlABRA,30847 +click/testing.py,sha256=EERbzcl1br0mW0qBS9EqkknfNfXB9WQEW0ELIpkvuSs,19102 +click/types.py,sha256=ek54BNSFwPKsqtfT7jsqcc4WHui8AIFVMKM4oVZIXhc,39927 +click/utils.py,sha256=gCUoewdAhA-QLBUUHxrLh4uj6m7T1WjZZMNPvR0I7YA,20257 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/WHEEL b/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/WHEEL new file mode 100644 index 0000000..d8b9936 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.12.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/licenses/LICENSE.txt b/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/licenses/LICENSE.txt new file mode 100644 index 0000000..d12a849 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click-8.3.0.dist-info/licenses/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2014 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/__init__.py b/stripe_config/.venv/lib/python3.12/site-packages/click/__init__.py new file mode 100644 index 0000000..1aa547c --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/__init__.py @@ -0,0 +1,123 @@ +""" +Click is a simple Python module inspired by the stdlib optparse to make +writing command line scripts fun. Unlike other modules, it's based +around a simple API that does not come with too much magic and is +composable. +""" + +from __future__ import annotations + +from .core import Argument as Argument +from .core import Command as Command +from .core import CommandCollection as CommandCollection +from .core import Context as Context +from .core import Group as Group +from .core import Option as Option +from .core import Parameter as Parameter +from .decorators import argument as argument +from .decorators import command as command +from .decorators import confirmation_option as confirmation_option +from .decorators import group as group +from .decorators import help_option as help_option +from .decorators import make_pass_decorator as make_pass_decorator +from .decorators import option as option +from .decorators import pass_context as pass_context +from .decorators import pass_obj as pass_obj +from .decorators import password_option as password_option +from .decorators import version_option as version_option +from .exceptions import Abort as Abort +from .exceptions import BadArgumentUsage as BadArgumentUsage +from .exceptions import BadOptionUsage as BadOptionUsage +from .exceptions import BadParameter as BadParameter +from .exceptions import ClickException as ClickException +from .exceptions import FileError as FileError +from .exceptions import MissingParameter as MissingParameter +from .exceptions import NoSuchOption as NoSuchOption +from .exceptions import UsageError as UsageError +from .formatting import HelpFormatter as HelpFormatter +from .formatting import wrap_text as wrap_text +from .globals import get_current_context as get_current_context +from .termui import clear as clear +from .termui import confirm as confirm +from .termui import echo_via_pager as echo_via_pager +from .termui import edit as edit +from .termui import getchar as getchar +from .termui import launch as launch +from .termui import pause as pause +from .termui import progressbar as progressbar +from .termui import prompt as prompt +from .termui import secho as secho +from .termui import style as style +from .termui import unstyle as unstyle +from .types import BOOL as BOOL +from .types import Choice as Choice +from .types import DateTime as DateTime +from .types import File as File +from .types import FLOAT as FLOAT +from .types import FloatRange as FloatRange +from .types import INT as INT +from .types import IntRange as IntRange +from .types import ParamType as ParamType +from .types import Path as Path +from .types import STRING as STRING +from .types import Tuple as Tuple +from .types import UNPROCESSED as UNPROCESSED +from .types import UUID as UUID +from .utils import echo as echo +from .utils import format_filename as format_filename +from .utils import get_app_dir as get_app_dir +from .utils import get_binary_stream as get_binary_stream +from .utils import get_text_stream as get_text_stream +from .utils import open_file as open_file + + +def __getattr__(name: str) -> object: + import warnings + + if name == "BaseCommand": + from .core import _BaseCommand + + warnings.warn( + "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Command' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _BaseCommand + + if name == "MultiCommand": + from .core import _MultiCommand + + warnings.warn( + "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Group' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _MultiCommand + + if name == "OptionParser": + from .parser import _OptionParser + + warnings.warn( + "'OptionParser' is deprecated and will be removed in Click 9.0. The" + " old parser is available in 'optparse'.", + DeprecationWarning, + stacklevel=2, + ) + return _OptionParser + + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " Click 9.1. Use feature detection or" + " 'importlib.metadata.version(\"click\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("click") + + raise AttributeError(name) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d4b75b4479ca298addca8f5be081034ee0ed974 GIT binary patch literal 4054 zcmbW4OK%&=5yyuT-w#m_KV(~vkz|{qEs>IJ%a$!a^t83vl?+S9BAvrv$Qg-a4`&8F zLuqBK7D13ha>^lxbsZb$4}l z^{{I6*Gwj<;Is9wSCzv)Mfr{z?N3(|Lhr)eit-1=P=sQHj4nG=?Gjxf#ppJ|c6T)_ z!psqHL`0aQ;HZc)$G|ZWV~&I4BF>xuCq#ld2~LV6bIMLt(<05B24_TuIRowyJuvA}#Cd|TXRz5%`??l8}T7sVp;P4HcDm-!a>p18-n0KPBoGv5Y35D%E| zfS1G)^P;_6T@fqHcfqS-mH8fcO{_8B2d|5D<_F-1;vw@A_>p)7UNx3~9TpphEBUn- z_2i0em7lAYuj;CARXy8OA0Gx4*HNpkQA5jee9w}mp_UHSpkk_iVAxhkb-lpTrEjW% zt5)^rX7WH-cX%O5u^D`P6d59f) zfasRj>PrCv1yQ^FkAJKSO~6bP6H%C56($tv$bL*$x{BYQ1xsfuZPC-wn~r{?Lt zuNh|9m3rWk^XT!!H21-2Yg=({yQOCsl_frKrE%h~XWx`QmOQaUmP)Rq1NAQJMmrQw zeSOb_tp~Q|@!FO&ES<;f;b&&;v$EMfN@Crz%{3``qrIP4zK=(tb4q&C-NtPlhb_sz z+cPqc5P)@;BGe3I;y~)2);iw6o*8K6nv}RN?c~&vvTf=Vm{=>kw0E;yakYI*NBH*m zO2VdL@h!tixx(Y4wqA3}6%3Dfdd;UZr#$KINz?aB%@Jr;J-%_DJkn4a zyu7vbF-*~wiffgrGrp<^=8jb*4pU6<9a;Z)YiS3NT(@04c%nNT=I)J6GR8NYV^i~4 z+Bx)i`eQwyJw~^8o@{JBBu6_n{5%1vr<;$TY^|(qZ?CPQ8Gib7gTGr_&F*p}wOy?5 z;Mt@Z6hhteG{d5Z^-;5AIl4U5{6Ly|6~-(XDdZ=ngzK3O`zg~8r~QclP(nlRzJL{l zG-N2YauoVpF}j{lDvDIOl%lL2p{#x$dKPO>Joz>vLA>2EqJN2f34ip#_^xdQp5n)z z5-8A-qwWuSN`BB&H+xDQdrI5UYU~K*{R4Z-e9%*vJ@v4sJAB^wQRMjCKYqgO2fam} z^*2x3sn1S#wwi48e%Xrqwi29e_kXUmt-lK8`!*%L*VI$XNTIFtCBv}bM$=k{@x@NA zqm`qKZ|G5!P#3$RRr<<7tDaYrZeMajvys&be z&7Z#J4ho-Z8>+|txmxb)mQ96*!jyAc)i776r!=jdZ?zY{r-``^OHM_KlUAt~VB$}? zf!XE_?3#K|lP0b%Xcj2dm1+)k8~Ge%xqwQf8+xD@T6>rrFH?OV&v(QMi4&%Lx*k8! zrGrH6*TX0?rd*>3DNM$C|7z>mK;8JXIZAF&ceEJ-`7>(t|M$Z6czX-=SZfdUo~8Dg zn+ZQ!4^v)}oAAMlvg@YH#IZ|1if)xZKRhf}Q2C2x*Df6vk+Ce#EaHgHei4T*di=t2 ztuQ-R^sT_0_V6eo{rg2eXi?KF#|kv9;2qNKAkEPoXqpsQ;3NF^zk~czc^w}3HkSI$ z(but|M*Q-(@!sEMew%sQ70Qf%pC0-9*}=C7C2{7x5=kWArj_2Im+=cU{EM$+!;N^Z zW4QWb!-rqShfap)JBH8yui>x-t(!@1sg)l(v-OEk&`V9;Nr(tL)fU z*|AsI{8!ohpK{-1=U&F=zE2MR@zgiTk(c3-cQ~f9nGefP@m=pm9P3eO;(2oLa#4DQ z2P*$jJ*H`fTh_FCQqy*8^spgPl%3@k3FUrCHzO&lOG@H0K|+6b$rPlXJbr8OWtyxR zk{*&QNiPZhI8!90K{-Hjii9$tJOimG&GyTMFDdWIL6UPM=SeP*43P|zjF5~%>d9v9 zqc>5hl68!%u|3-@>9#M&sTIXLMzvIZ@WXG&_BB(q42+Zl+eUKl*V-4kMLmB2~zTE}mG&4rtU|wLzzmLv_M)|z|0WM-=0ssI2 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3e29c96ad8640489f8a7912c99531b63a565d2f GIT binary patch literal 24176 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e93a0b456e8bcb216e427abfca0b563d2e460d5 GIT binary patch literal 31593 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..383a4796dcdf90f6e0d82fadfecb452c50c0d1e1 GIT binary patch literal 1182 zcmZ`&O-~a+7@paWwv>WU1fm9Axvha+@B;`EA_*&!kV;Y@VK2k7JJ6QxZr#}uOFVEO zM&bd92M)wLgad!Tf8eE@z%?c$oV;^a)XH8sRZ_MPYb+~=Kn=UY=#9MJXp_i^Ts z2jGk;wIzlCUVf!u2Ux&@HpoLALWVh;)49sd>jDQRfW>bBOTb*NQn6Mf+z)7Nw)6;& zFlaO!$Mp?A>pCQ5 z*4N}h1ztX-UBmSAxkf*vjLvKYkD*zvOtw%6WkPBAYP z3AQBPl`OnOtrDqvrB%Z&Vxq+35?zWy9oVpmJ3Jg(m~~-Vo0bL!`lVi}R#cj+q)8(g z-!G71RW0BGQ3@qL<2s7#Ei=8hkLIYO3rMNdHep?h>Y7H>KZCCA2c9j+6EyA1u=viBabN(*iMgLAlP0ajF5D#sTntq zRnxT>ODgfbYyqpvDt1;?JG-ccEj>~CAFCwmp-{lvos z523Zz+94@56B`)PO~pDmNp|cg+sbiLK1#~v)<=5}_r?z=_b2zBmv0T0V}qBhnUu^0 z5fA%C&k1-+Nsf69)EvYS%DYz4X00R;dQ&v)YGYA^EZ3ywh`X4>rXPs2skAl|w7i@e zn?NZ|8&9LTv8h?jYodkrfyd_FOEAG+Rz*Z9AYD{!fD29(V;9Y!sqN#db?tj+*XOro z;r5jP#i1~hCCLd!XsJkPQbHcP(m=p;)`Ey%DrBAI0Q!NzhA;d_I}PwUSX6Y19;Ij4 zL39R%Jd-o%2GdR!|Ci@=Y$WV`)RU-#-5p_%=A4HR{si4;pz#MtUPTgc=!3si+ALiG z3eWF@hSsg-&E|FS1PqP5F~{6u-M3Jps>7+dFpV Ux97_b)T8#kGDx0)7ZnnJ03J;fCIA2c literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc9c929d4cdfe870a6202c81c7f577eec7e1fc6d GIT binary patch literal 11752 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%0A2_(w_$Y_}it)}vMA$1dy9 aR`PC@^XOXhyDc2jR@>1n=65%9K>r7Ms~8Ia literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8392008728343e1dd974b77983f7171a84c99979 GIT binary patch literal 133413 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�N1oU+2hjuUW%1XbB61trnRnW>?ozq{+IgC=l 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

l)_6W(I<5k(iIZ#?r_$RMzLg5YR4J=g15*gCO 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⋘>vDM+vg!JtvdhF((3r) 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 KCaj8y!+!x}63}q~ literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..687663d3f33ae4ba2e2a9630c9a399d52c23b9dd GIT binary patch literal 20424 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bfdbab1006063754f19cf6d75c780f5efaa3e87 GIT binary patch literal 23319 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⪚@B*MD>F9Q3+H*w|CvoNBmqcS?npCUxNj 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 ZMd|y(*RHl*zu&Fa{5;gDwy|vSe*juy(y9Oe literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fb14e3bd0fcae8eacf52ca33d3106d32d756c2a GIT binary patch literal 27391 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

i1=Bjx|btzhVAc5bE_Ns90{N2No zjXT7l$X}_clZ8h^^*|dMU*#k|F&iNf8J#INit40%S0WNlCAC9rkR@oB^S935Y215Nmvy!XRUO{ymlGkbmIDQT%|gednqWss0lYRT;D}pq zpdl_Mk^Hdj!ZuWP1GoiU|E!lN8RAkn^tQmbow^2BDfa~IvPXA0a1DoW8z;8NlHt5y z)H-VEvjFWn4S_pKH^WR(2$px$@x3yw%!N}O=-Ann>3kLf95$R75vUb186Xb@=as?J zE-XvPdV|xj&BaLQGOR$@C2vRO!C(7ZU{m#D9FFVMO3u3|#Q7`#2(>R*Z-fDOy=_O} zI~IM#RT)Q?1N6ZS+%?-ZtJYd|&G`$~9Pb8(iRm9ABVKXJXB5(@{S*x$ApTVqru`9q zWy-}Ti^2OgUaJU$(ula#Bf zaU_kuetgx9*4uG%^{_`hHQb9+!{;SuMdf@z@&)08DOi4YZO6^@TbWy#cej2JytDQ= zEX#xCkRbTVXURpAV0CP~#xtu5&y*otZ15@UHsBPZP77{Ax3(4gu}@KF?Z>UnU6Q$A z=SV9k(UWvzaU{VIabiYEMuOOPg>EaT$9j>N9VWT$&bbEJenS4#0i#sV|BlK}EV6yq z92_lF&Qb{Ex`#0-cI1IDt;5e8`t4A-54w zGgr?I%U|v@LnGse07Jjrr<o57T!O(aca4bzwlrJ1Y zpu!v-N=k`Z(^e$iT4e;T{7vz?E_wvsmka2(QVx*Z2IMn50Aq8I(GJNtc}uI2aGL~& zO1ijy5ZD#H=SUN-;ETlXX|g%z3p#X1ns6y!{H{j(#qUUs%@@DZRd4)`NI>nK1^JlD zAcn}KYAjV(Z+fZrJ^3(ZAH{m#eFYvX(u9loGWP&B0xi?xp^T`YGv7+5)P?wt%uBlG zb!LyiT*33SLL04h4n<#aVqYs!=;Ba&VGUOf_{c=P?y`v%EI6seYPd;Nl9%9N6i7qe zdJYZ-TnM(>5Vxcx2SQ zjT#nkf-7vzSlT+;{K7jD0Zrvk>Gn_QMjH%xH7lfD7ANkGP>2jn6cQ7#w@bxKp}(ZK z4G87SVX!-R1|AAhseI+$6gC6Xo?fwyC_qVn3rQg``35B}Q+e3D=jSs~TJOJFz=uO?Tnl^u#xYus2l1#qX4broB}F{$;Ljp8WFA z*uJr&cfG;U3ibD0Z}n(7g`fEHv-oz@L*Y|j&fN9-N8LXw^Q&onvz9Vf)m?A>#Ijf7 zcf754YgSCx9Qk0`2Z0YxWCM@EcTjCLKtIIvR>{`}4}RDXRh@G;Wo=EL&%0ongCi4M zRWlynNA5c9#jFca_foV*|GZ_%0hja_F4uu2*1u?xagQKYzpNr8&pm)Zp+7n8+$}i2 zfd4q+dN^d)L+nXzs0`jZy~lBSYclaL+_@jTl2*bQZ<<6EPeTgU9_r}mIGrzxB`#fp z8woLwCTJr3TjZ#`h8y`DBAWt*7**vFy79IP_CP`_Sj>P|=p(xQ6Pf{pi{SXDqA6!< z!Zy>d9-DSoe)Z^dW!3YK3amgWK`VeoO{T;BnuzWIWw#HvOno}mLFn=DAUquaZR(ru zPK#3?9Xv(vdD0zwA^BB3g>%JUrHW71Hdkz_wf1K4ss zd?u2&(hb}7&P0@N(1#CG78$x-q4W+w0+^Tz77?w3%V@g&0o@3h<;!r6IA0}7>VeOF9GO5L zgJFkPAvjNtDP-TI5D3ou3S_cKCXO*LqYi^%zXG;dv|c$*AzIVQ1-hki%aXQF=e5mwCFeN9=NHIsmV5u*i;+*bxkGDdBA$ERhuOhnIemzGe8spogIj0UUN# zBiv_34`4$Q&k*6fMxQ$OoI9Z;9PE$nR&L`H{KuKvxMRPZEdNwm_SaI&PbBwGBp2Vy zeK&Z_B)x=dR0t<8 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23322d558a59f1fe38522c793ab6c38666a407ef GIT binary patch literal 24861 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 t.TextIO: + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = "replace" + return _NonClosingTextIOWrapper( + stream, + encoding, + errors, + line_buffering=True, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def is_ascii_encoding(encoding: str) -> bool: + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +def get_best_encoding(stream: t.IO[t.Any]) -> str: + """Returns the default stream encoding if not found.""" + rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() + if is_ascii_encoding(rv): + return "utf-8" + return rv + + +class _NonClosingTextIOWrapper(io.TextIOWrapper): + def __init__( + self, + stream: t.BinaryIO, + encoding: str | None, + errors: str | None, + force_readable: bool = False, + force_writable: bool = False, + **extra: t.Any, + ) -> None: + self._stream = stream = t.cast( + t.BinaryIO, _FixupStream(stream, force_readable, force_writable) + ) + super().__init__(stream, encoding, errors, **extra) + + def __del__(self) -> None: + try: + self.detach() + except Exception: + pass + + def isatty(self) -> bool: + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream: + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + + The forcing of readable and writable flags are there because some tools + put badly patched objects on sys (one such offender are certain version + of jupyter notebook). + """ + + def __init__( + self, + stream: t.BinaryIO, + force_readable: bool = False, + force_writable: bool = False, + ): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._stream, name) + + def read1(self, size: int) -> bytes: + f = getattr(self._stream, "read1", None) + + if f is not None: + return t.cast(bytes, f(size)) + + return self._stream.read(size) + + def readable(self) -> bool: + if self._force_readable: + return True + x = getattr(self._stream, "readable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self) -> bool: + if self._force_writable: + return True + x = getattr(self._stream, "writable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.write(b"") + except Exception: + try: + self._stream.write(b"") + except Exception: + return False + return True + + def seekable(self) -> bool: + x = getattr(self._stream, "seekable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +def _is_binary_reader(stream: t.IO[t.Any], default: bool = False) -> bool: + try: + return isinstance(stream.read(0), bytes) + except Exception: + return default + # This happens in some cases where the stream was already + # closed. In this case, we assume the default. + + +def _is_binary_writer(stream: t.IO[t.Any], default: bool = False) -> bool: + try: + stream.write(b"") + except Exception: + try: + stream.write("") + return False + except Exception: + pass + return default + return True + + +def _find_binary_reader(stream: t.IO[t.Any]) -> t.BinaryIO | None: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_reader(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_reader(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _find_binary_writer(stream: t.IO[t.Any]) -> t.BinaryIO | None: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_writer(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_writer(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _stream_is_misconfigured(stream: t.TextIO) -> bool: + """A stream is misconfigured if its encoding is ASCII.""" + # If the stream does not have an encoding set, we assume it's set + # to ASCII. This appears to happen in certain unittest + # environments. It's not quite clear what the correct behavior is + # but this at least will force Click to recover somehow. + return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") + + +def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: str | None) -> bool: + """A stream attribute is compatible if it is equal to the + desired value or the desired value is unset and the attribute + has a value. + """ + stream_value = getattr(stream, attr, None) + return stream_value == value or (value is None and stream_value is not None) + + +def _is_compatible_text_stream( + stream: t.TextIO, encoding: str | None, errors: str | None +) -> bool: + """Check if a stream's encoding and errors attributes are + compatible with the desired values. + """ + return _is_compat_stream_attr( + stream, "encoding", encoding + ) and _is_compat_stream_attr(stream, "errors", errors) + + +def _force_correct_text_stream( + text_stream: t.IO[t.Any], + encoding: str | None, + errors: str | None, + is_binary: t.Callable[[t.IO[t.Any], bool], bool], + find_binary: t.Callable[[t.IO[t.Any]], t.BinaryIO | None], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if is_binary(text_stream, False): + binary_reader = t.cast(t.BinaryIO, text_stream) + else: + text_stream = t.cast(t.TextIO, text_stream) + # If the stream looks compatible, and won't default to a + # misconfigured ascii encoding, return it as-is. + if _is_compatible_text_stream(text_stream, encoding, errors) and not ( + encoding is None and _stream_is_misconfigured(text_stream) + ): + return text_stream + + # Otherwise, get the underlying binary reader. + possible_binary_reader = find_binary(text_stream) + + # If that's not possible, silently use the original reader + # and get mojibake instead of exceptions. + if possible_binary_reader is None: + return text_stream + + binary_reader = possible_binary_reader + + # Default errors to replace instead of strict in order to get + # something that works. + if errors is None: + errors = "replace" + + # Wrap the binary stream in a text stream with the correct + # encoding parameters. + return _make_text_stream( + binary_reader, + encoding, + errors, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def _force_correct_text_reader( + text_reader: t.IO[t.Any], + encoding: str | None, + errors: str | None, + force_readable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_reader, + encoding, + errors, + _is_binary_reader, + _find_binary_reader, + force_readable=force_readable, + ) + + +def _force_correct_text_writer( + text_writer: t.IO[t.Any], + encoding: str | None, + errors: str | None, + force_writable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_writer, + encoding, + errors, + _is_binary_writer, + _find_binary_writer, + force_writable=force_writable, + ) + + +def get_binary_stdin() -> t.BinaryIO: + reader = _find_binary_reader(sys.stdin) + if reader is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdin.") + return reader + + +def get_binary_stdout() -> t.BinaryIO: + writer = _find_binary_writer(sys.stdout) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdout.") + return writer + + +def get_binary_stderr() -> t.BinaryIO: + writer = _find_binary_writer(sys.stderr) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stderr.") + return writer + + +def get_text_stdin(encoding: str | None = None, errors: str | None = None) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) + + +def get_text_stdout(encoding: str | None = None, errors: str | None = None) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) + + +def get_text_stderr(encoding: str | None = None, errors: str | None = None) -> t.TextIO: + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) + + +def _wrap_io_open( + file: str | os.PathLike[str] | int, + mode: str, + encoding: str | None, + errors: str | None, +) -> t.IO[t.Any]: + """Handles not passing ``encoding`` and ``errors`` in binary mode.""" + if "b" in mode: + return open(file, mode) + + return open(file, mode, encoding=encoding, errors=errors) + + +def open_stream( + filename: str | os.PathLike[str], + mode: str = "r", + encoding: str | None = None, + errors: str | None = "strict", + atomic: bool = False, +) -> tuple[t.IO[t.Any], bool]: + binary = "b" in mode + filename = os.fspath(filename) + + # Standard streams first. These are simple because they ignore the + # atomic flag. Use fsdecode to handle Path("-"). + if os.fsdecode(filename) == "-": + if any(m in mode for m in ["w", "a", "x"]): + if binary: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if binary: + return get_binary_stdin(), False + return get_text_stdin(encoding=encoding, errors=errors), False + + # Non-atomic writes directly go out through the regular open functions. + if not atomic: + return _wrap_io_open(filename, mode, encoding, errors), True + + # Some usability stuff for atomic writes + if "a" in mode: + raise ValueError( + "Appending to an existing file is not supported, because that" + " would involve an expensive `copy`-operation to a temporary" + " file. Open the file in normal `w`-mode and copy explicitly" + " if that's what you're after." + ) + if "x" in mode: + raise ValueError("Use the `overwrite`-parameter instead.") + if "w" not in mode: + raise ValueError("Atomic writes only make sense with `w`-mode.") + + # Atomic writes are more complicated. They work by opening a file + # as a proxy in the same folder and then using the fdopen + # functionality to wrap it in a Python file. Then we wrap it in an + # atomic file that moves the file over on close. + import errno + import random + + try: + perm: int | None = os.stat(filename).st_mode + except OSError: + perm = None + + flags = os.O_RDWR | os.O_CREAT | os.O_EXCL + + if binary: + flags |= getattr(os, "O_BINARY", 0) + + while True: + tmp_filename = os.path.join( + os.path.dirname(filename), + f".__atomic-write{random.randrange(1 << 32):08x}", + ) + try: + fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) + break + except OSError as e: + if e.errno == errno.EEXIST or ( + os.name == "nt" + and e.errno == errno.EACCES + and os.path.isdir(e.filename) + and os.access(e.filename, os.W_OK) + ): + continue + raise + + if perm is not None: + os.chmod(tmp_filename, perm) # in case perm includes bits in umask + + f = _wrap_io_open(fd, mode, encoding, errors) + af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) + return t.cast(t.IO[t.Any], af), True + + +class _AtomicFile: + def __init__(self, f: t.IO[t.Any], tmp_filename: str, real_filename: str) -> None: + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self) -> str: + return self._real_filename + + def close(self, delete: bool = False) -> None: + if self.closed: + return + self._f.close() + os.replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._f, name) + + def __enter__(self) -> _AtomicFile: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.close(delete=exc_type is not None) + + def __repr__(self) -> str: + return repr(self._f) + + +def strip_ansi(value: str) -> str: + return _ansi_re.sub("", value) + + +def _is_jupyter_kernel_output(stream: t.IO[t.Any]) -> bool: + while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): + stream = stream._stream + + return stream.__class__.__module__.startswith("ipykernel.") + + +def should_strip_ansi( + stream: t.IO[t.Any] | None = None, color: bool | None = None +) -> bool: + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) and not _is_jupyter_kernel_output(stream) + return not color + + +# On Windows, wrap the output streams with colorama to support ANSI +# color codes. +# NOTE: double check is needed so mypy does not analyze this on Linux +if sys.platform.startswith("win") and WIN: + from ._winconsole import _get_windows_console_stream + + def _get_argv_encoding() -> str: + import locale + + return locale.getpreferredencoding() + + _ansi_stream_wrappers: cabc.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def auto_wrap_for_ansi(stream: t.TextIO, color: bool | None = None) -> t.TextIO: + """Support ANSI color and style codes on Windows by wrapping a + stream with colorama. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + + if cached is not None: + return cached + + import colorama + + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = t.cast(t.TextIO, ansi_wrapper.stream) + _write = rv.write + + def _safe_write(s: str) -> int: + try: + return _write(s) + except BaseException: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write # type: ignore[method-assign] + + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + + return rv + +else: + + def _get_argv_encoding() -> str: + return getattr(sys.stdin, "encoding", None) or sys.getfilesystemencoding() + + def _get_windows_console_stream( + f: t.TextIO, encoding: str | None, errors: str | None + ) -> t.TextIO | None: + return None + + +def term_len(x: str) -> int: + return len(strip_ansi(x)) + + +def isatty(stream: t.IO[t.Any]) -> bool: + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func( + src_func: t.Callable[[], t.TextIO | None], + wrapper_func: t.Callable[[], t.TextIO], +) -> t.Callable[[], t.TextIO | None]: + cache: cabc.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def func() -> t.TextIO | None: + stream = src_func() + + if stream is None: + return None + + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + cache[stream] = rv + except Exception: + pass + return rv + + return func + + +_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) +_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) +_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) + + +binary_streams: cabc.Mapping[str, t.Callable[[], t.BinaryIO]] = { + "stdin": get_binary_stdin, + "stdout": get_binary_stdout, + "stderr": get_binary_stderr, +} + +text_streams: cabc.Mapping[str, t.Callable[[str | None, str | None], t.TextIO]] = { + "stdin": get_text_stdin, + "stdout": get_text_stdout, + "stderr": get_text_stderr, +} diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/_termui_impl.py b/stripe_config/.venv/lib/python3.12/site-packages/click/_termui_impl.py new file mode 100644 index 0000000..47f87b8 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/_termui_impl.py @@ -0,0 +1,847 @@ +""" +This module contains implementations for the termui module. To keep the +import time of Click down, some infrequently used functionality is +placed in this module and only imported as needed. +""" + +from __future__ import annotations + +import collections.abc as cabc +import contextlib +import math +import os +import shlex +import sys +import time +import typing as t +from gettext import gettext as _ +from io import StringIO +from pathlib import Path +from types import TracebackType + +from ._compat import _default_text_stdout +from ._compat import CYGWIN +from ._compat import get_best_encoding +from ._compat import isatty +from ._compat import open_stream +from ._compat import strip_ansi +from ._compat import term_len +from ._compat import WIN +from .exceptions import ClickException +from .utils import echo + +V = t.TypeVar("V") + +if os.name == "nt": + BEFORE_BAR = "\r" + AFTER_BAR = "\n" +else: + BEFORE_BAR = "\r\033[?25l" + AFTER_BAR = "\033[?25h\n" + + +class ProgressBar(t.Generic[V]): + def __init__( + self, + iterable: cabc.Iterable[V] | None, + length: int | None = None, + fill_char: str = "#", + empty_char: str = " ", + bar_template: str = "%(bar)s", + info_sep: str = " ", + hidden: bool = False, + show_eta: bool = True, + show_percent: bool | None = None, + show_pos: bool = False, + item_show_func: t.Callable[[V | None], str | None] | None = None, + label: str | None = None, + file: t.TextIO | None = None, + color: bool | None = None, + update_min_steps: int = 1, + width: int = 30, + ) -> None: + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.hidden = hidden + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label: str = label or "" + + if file is None: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + file = StringIO() + + self.file = file + self.color = color + self.update_min_steps = update_min_steps + self._completed_intervals = 0 + self.width: int = width + self.autowidth: bool = width == 0 + + if length is None: + from operator import length_hint + + length = length_hint(iterable, -1) + + if length == -1: + length = None + if iterable is None: + if length is None: + raise TypeError("iterable or length is required") + iterable = t.cast("cabc.Iterable[V]", range(length)) + self.iter: cabc.Iterable[V] = iter(iterable) + self.length = length + self.pos: int = 0 + self.avg: list[float] = [] + self.last_eta: float + self.start: float + self.start = self.last_eta = time.time() + self.eta_known: bool = False + self.finished: bool = False + self.max_width: int | None = None + self.entered: bool = False + self.current_item: V | None = None + self._is_atty = isatty(self.file) + self._last_line: str | None = None + + def __enter__(self) -> ProgressBar[V]: + self.entered = True + self.render_progress() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.render_finish() + + def __iter__(self) -> cabc.Iterator[V]: + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + self.render_progress() + return self.generator() + + def __next__(self) -> V: + # Iteration is defined in terms of a generator function, + # returned by iter(self); use that to define next(). This works + # because `self.iter` is an iterable consumed by that generator, + # so it is re-entry safe. Calling `next(self.generator())` + # twice works and does "what you want". + return next(iter(self)) + + def render_finish(self) -> None: + if self.hidden or not self._is_atty: + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self) -> float: + if self.finished: + return 1.0 + return min(self.pos / (float(self.length or 1) or 1), 1.0) + + @property + def time_per_iteration(self) -> float: + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self) -> float: + if self.length is not None and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self) -> str: + if self.eta_known: + t = int(self.eta) + seconds = t % 60 + t //= 60 + minutes = t % 60 + t //= 60 + hours = t % 24 + t //= 24 + if t > 0: + return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" + else: + return f"{hours:02}:{minutes:02}:{seconds:02}" + return "" + + def format_pos(self) -> str: + pos = str(self.pos) + if self.length is not None: + pos += f"/{self.length}" + return pos + + def format_pct(self) -> str: + return f"{int(self.pct * 100): 4}%"[1:] + + def format_bar(self) -> str: + if self.length is not None: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + elif self.finished: + bar = self.fill_char * self.width + else: + chars = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + chars[ + int( + (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) + * self.width + ) + ] = self.fill_char + bar = "".join(chars) + return bar + + def format_progress_line(self) -> str: + show_percent = self.show_percent + + info_bits = [] + if self.length is not None and show_percent is None: + show_percent = not self.show_pos + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return ( + self.bar_template + % { + "label": self.label, + "bar": self.format_bar(), + "info": self.info_sep.join(info_bits), + } + ).rstrip() + + def render_progress(self) -> None: + if self.hidden: + return + + if not self._is_atty: + # Only output the label once if the output is not a TTY. + if self._last_line != self.label: + self._last_line = self.label + echo(self.label, file=self.file, color=self.color) + return + + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + import shutil + + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, shutil.get_terminal_size().columns - clutter_length) + if new_width < old_width and self.max_width is not None: + buf.append(BEFORE_BAR) + buf.append(" " * self.max_width) + self.max_width = new_width + self.width = new_width + + clear_width = self.width + if self.max_width is not None: + clear_width = self.max_width + + buf.append(BEFORE_BAR) + line = self.format_progress_line() + line_len = term_len(line) + if self.max_width is None or self.max_width < line_len: + self.max_width = line_len + + buf.append(line) + buf.append(" " * (clear_width - line_len)) + line = "".join(buf) + # Render the line only if it changed. + + if line != self._last_line: + self._last_line = line + echo(line, file=self.file, color=self.color, nl=False) + self.file.flush() + + def make_step(self, n_steps: int) -> None: + self.pos += n_steps + if self.length is not None and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + + # self.avg is a rolling list of length <= 7 of steps where steps are + # defined as time elapsed divided by the total progress through + # self.length. + if self.pos: + step = (time.time() - self.start) / self.pos + else: + step = time.time() - self.start + + self.avg = self.avg[-6:] + [step] + + self.eta_known = self.length is not None + + def update(self, n_steps: int, current_item: V | None = None) -> None: + """Update the progress bar by advancing a specified number of + steps, and optionally set the ``current_item`` for this new + position. + + :param n_steps: Number of steps to advance. + :param current_item: Optional item to set as ``current_item`` + for the updated position. + + .. versionchanged:: 8.0 + Added the ``current_item`` optional parameter. + + .. versionchanged:: 8.0 + Only render when the number of steps meets the + ``update_min_steps`` threshold. + """ + if current_item is not None: + self.current_item = current_item + + self._completed_intervals += n_steps + + if self._completed_intervals >= self.update_min_steps: + self.make_step(self._completed_intervals) + self.render_progress() + self._completed_intervals = 0 + + def finish(self) -> None: + self.eta_known = False + self.current_item = None + self.finished = True + + def generator(self) -> cabc.Iterator[V]: + """Return a generator which yields the items added to the bar + during construction, and updates the progress bar *after* the + yielded block returns. + """ + # WARNING: the iterator interface for `ProgressBar` relies on + # this and only works because this is a simple generator which + # doesn't create or manage additional state. If this function + # changes, the impact should be evaluated both against + # `iter(bar)` and `next(bar)`. `next()` in particular may call + # `self.generator()` repeatedly, and this must remain safe in + # order for that interface to work. + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + + if not self._is_atty: + yield from self.iter + else: + for rv in self.iter: + self.current_item = rv + + # This allows show_item_func to be updated before the + # item is processed. Only trigger at the beginning of + # the update interval. + if self._completed_intervals == 0: + self.render_progress() + + yield rv + self.update(1) + + self.finish() + self.render_progress() + + +def pager(generator: cabc.Iterable[str], color: bool | None = None) -> None: + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if stdout is None: + stdout = StringIO() + + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + + # Split and normalize the pager command into parts. + pager_cmd_parts = shlex.split(os.environ.get("PAGER", ""), posix=False) + if pager_cmd_parts: + if WIN: + if _tempfilepager(generator, pager_cmd_parts, color): + return + elif _pipepager(generator, pager_cmd_parts, color): + return + + if os.environ.get("TERM") in ("dumb", "emacs"): + return _nullpager(stdout, generator, color) + if (WIN or sys.platform.startswith("os2")) and _tempfilepager( + generator, ["more"], color + ): + return + if _pipepager(generator, ["less"], color): + return + + import tempfile + + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if _pipepager(generator, ["more"], color): + return + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager( + generator: cabc.Iterable[str], cmd_parts: list[str], color: bool | None +) -> bool: + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + + Returns `True` if the command was found, `False` otherwise and thus another + pager should be attempted. + """ + # Split the command into the invoked CLI and its parameters. + if not cmd_parts: + return False + + import shutil + + cmd = cmd_parts[0] + cmd_params = cmd_parts[1:] + + cmd_filepath = shutil.which(cmd) + if not cmd_filepath: + return False + # Resolves symlinks and produces a normalized absolute path string. + cmd_path = Path(cmd_filepath).resolve() + cmd_name = cmd_path.name + + import subprocess + + # Make a local copy of the environment to not affect the global one. + env = dict(os.environ) + + # If we're piping to less and the user hasn't decided on colors, we enable + # them by default we find the -R flag in the command line arguments. + if color is None and cmd_name == "less": + less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_params)}" + if not less_flags: + env["LESS"] = "-R" + color = True + elif "r" in less_flags or "R" in less_flags: + color = True + + c = subprocess.Popen( + [str(cmd_path)] + cmd_params, + shell=True, + stdin=subprocess.PIPE, + env=env, + errors="replace", + text=True, + ) + assert c.stdin is not None + try: + for text in generator: + if not color: + text = strip_ansi(text) + + c.stdin.write(text) + except BrokenPipeError: + # In case the pager exited unexpectedly, ignore the broken pipe error. + pass + except Exception as e: + # In case there is an exception we want to close the pager immediately + # and let the caller handle it. + # Otherwise the pager will keep running, and the user may not notice + # the error message, or worse yet it may leave the terminal in a broken state. + c.terminate() + raise e + finally: + # We must close stdin and wait for the pager to exit before we continue + try: + c.stdin.close() + # Close implies flush, so it might throw a BrokenPipeError if the pager + # process exited already. + except BrokenPipeError: + pass + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + return True + + +def _tempfilepager( + generator: cabc.Iterable[str], cmd_parts: list[str], color: bool | None +) -> bool: + """Page through text by invoking a program on a temporary file. + + Returns `True` if the command was found, `False` otherwise and thus another + pager should be attempted. + """ + # Split the command into the invoked CLI and its parameters. + if not cmd_parts: + return False + + import shutil + + cmd = cmd_parts[0] + + cmd_filepath = shutil.which(cmd) + if not cmd_filepath: + return False + # Resolves symlinks and produces a normalized absolute path string. + cmd_path = Path(cmd_filepath).resolve() + + import subprocess + import tempfile + + fd, filename = tempfile.mkstemp() + # TODO: This never terminates if the passed generator never terminates. + text = "".join(generator) + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, "wb")[0] as f: + f.write(text.encode(encoding)) + try: + subprocess.call([str(cmd_path), filename]) + except OSError: + # Command not found + pass + finally: + os.close(fd) + os.unlink(filename) + + return True + + +def _nullpager( + stream: t.TextIO, generator: cabc.Iterable[str], color: bool | None +) -> None: + """Simply print unformatted text. This is the ultimate fallback.""" + for text in generator: + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor: + def __init__( + self, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = True, + extension: str = ".txt", + ) -> None: + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self) -> str: + if self.editor is not None: + return self.editor + for key in "VISUAL", "EDITOR": + rv = os.environ.get(key) + if rv: + return rv + if WIN: + return "notepad" + + from shutil import which + + for editor in "sensible-editor", "vim", "nano": + if which(editor) is not None: + return editor + return "vi" + + def edit_files(self, filenames: cabc.Iterable[str]) -> None: + import subprocess + + editor = self.get_editor() + environ: dict[str, str] | None = None + + if self.env: + environ = os.environ.copy() + environ.update(self.env) + + exc_filename = " ".join(f'"{filename}"' for filename in filenames) + + try: + c = subprocess.Popen( + args=f"{editor} {exc_filename}", env=environ, shell=True + ) + exit_code = c.wait() + if exit_code != 0: + raise ClickException( + _("{editor}: Editing failed").format(editor=editor) + ) + except OSError as e: + raise ClickException( + _("{editor}: Editing failed: {e}").format(editor=editor, e=e) + ) from e + + @t.overload + def edit(self, text: bytes | bytearray) -> bytes | None: ... + + # We cannot know whether or not the type expected is str or bytes when None + # is passed, so str is returned as that was what was done before. + @t.overload + def edit(self, text: str | None) -> str | None: ... + + def edit(self, text: str | bytes | bytearray | None) -> str | bytes | None: + import tempfile + + if text is None: + data: bytes | bytearray = b"" + elif isinstance(text, (bytes, bytearray)): + data = text + else: + if text and not text.endswith("\n"): + text += "\n" + + if WIN: + data = text.replace("\n", "\r\n").encode("utf-8-sig") + else: + data = text.encode("utf-8") + + fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) + f: t.BinaryIO + + try: + with os.fdopen(fd, "wb") as f: + f.write(data) + + # If the filesystem resolution is 1 second, like Mac OS + # 10.12 Extended, or 2 seconds, like FAT32, and the editor + # closes very fast, require_save can fail. Set the modified + # time to be 2 seconds in the past to work around this. + os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) + # Depending on the resolution, the exact value might not be + # recorded, so get the new recorded value. + timestamp = os.path.getmtime(name) + + self.edit_files((name,)) + + if self.require_save and os.path.getmtime(name) == timestamp: + return None + + with open(name, "rb") as f: + rv = f.read() + + if isinstance(text, (bytes, bytearray)): + return rv + + return rv.decode("utf-8-sig").replace("\r\n", "\n") + finally: + os.unlink(name) + + +def open_url(url: str, wait: bool = False, locate: bool = False) -> int: + import subprocess + + def _unquote_file(url: str) -> str: + from urllib.parse import unquote + + if url.startswith("file://"): + url = unquote(url[7:]) + + return url + + if sys.platform == "darwin": + args = ["open"] + if wait: + args.append("-W") + if locate: + args.append("-R") + args.append(_unquote_file(url)) + null = open("/dev/null", "w") + try: + return subprocess.Popen(args, stderr=null).wait() + finally: + null.close() + elif WIN: + if locate: + url = _unquote_file(url) + args = ["explorer", f"/select,{url}"] + else: + args = ["start"] + if wait: + args.append("/WAIT") + args.append("") + args.append(url) + try: + return subprocess.call(args) + except OSError: + # Command not found + return 127 + elif CYGWIN: + if locate: + url = _unquote_file(url) + args = ["cygstart", os.path.dirname(url)] + else: + args = ["cygstart"] + if wait: + args.append("-w") + args.append(url) + try: + return subprocess.call(args) + except OSError: + # Command not found + return 127 + + try: + if locate: + url = os.path.dirname(_unquote_file(url)) or "." + else: + url = _unquote_file(url) + c = subprocess.Popen(["xdg-open", url]) + if wait: + return c.wait() + return 0 + except OSError: + if url.startswith(("http://", "https://")) and not locate and not wait: + import webbrowser + + webbrowser.open(url) + return 0 + return 1 + + +def _translate_ch_to_exc(ch: str) -> None: + if ch == "\x03": + raise KeyboardInterrupt() + + if ch == "\x04" and not WIN: # Unix-like, Ctrl+D + raise EOFError() + + if ch == "\x1a" and WIN: # Windows, Ctrl+Z + raise EOFError() + + return None + + +if sys.platform == "win32": + import msvcrt + + @contextlib.contextmanager + def raw_terminal() -> cabc.Iterator[int]: + yield -1 + + def getchar(echo: bool) -> str: + # The function `getch` will return a bytes object corresponding to + # the pressed character. Since Windows 10 build 1803, it will also + # return \x00 when called a second time after pressing a regular key. + # + # `getwch` does not share this probably-bugged behavior. Moreover, it + # returns a Unicode object by default, which is what we want. + # + # Either of these functions will return \x00 or \xe0 to indicate + # a special key, and you need to call the same function again to get + # the "rest" of the code. The fun part is that \u00e0 is + # "latin small letter a with grave", so if you type that on a French + # keyboard, you _also_ get a \xe0. + # E.g., consider the Up arrow. This returns \xe0 and then \x48. The + # resulting Unicode string reads as "a with grave" + "capital H". + # This is indistinguishable from when the user actually types + # "a with grave" and then "capital H". + # + # When \xe0 is returned, we assume it's part of a special-key sequence + # and call `getwch` again, but that means that when the user types + # the \u00e0 character, `getchar` doesn't return until a second + # character is typed. + # The alternative is returning immediately, but that would mess up + # cross-platform handling of arrow keys and others that start with + # \xe0. Another option is using `getch`, but then we can't reliably + # read non-ASCII characters, because return values of `getch` are + # limited to the current 8-bit codepage. + # + # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` + # is doing the right thing in more situations than with `getch`. + + if echo: + func = t.cast(t.Callable[[], str], msvcrt.getwche) + else: + func = t.cast(t.Callable[[], str], msvcrt.getwch) + + rv = func() + + if rv in ("\x00", "\xe0"): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + + _translate_ch_to_exc(rv) + return rv + +else: + import termios + import tty + + @contextlib.contextmanager + def raw_terminal() -> cabc.Iterator[int]: + f: t.TextIO | None + fd: int + + if not isatty(sys.stdin): + f = open("/dev/tty") + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + + try: + old_settings = termios.tcgetattr(fd) + + try: + tty.setraw(fd) + yield fd + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + + if f is not None: + f.close() + except termios.error: + pass + + def getchar(echo: bool) -> str: + with raw_terminal() as fd: + ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") + + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + + _translate_ch_to_exc(ch) + return ch diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/_textwrap.py b/stripe_config/.venv/lib/python3.12/site-packages/click/_textwrap.py new file mode 100644 index 0000000..97fbee3 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/_textwrap.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +import collections.abc as cabc +import textwrap +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + def _handle_long_word( + self, + reversed_chunks: list[str], + cur_line: list[str], + cur_len: int, + width: int, + ) -> None: + space_left = max(width - cur_len, 1) + + if self.break_long_words: + last = reversed_chunks[-1] + cut = last[:space_left] + res = last[space_left:] + cur_line.append(cut) + reversed_chunks[-1] = res + elif not cur_line: + cur_line.append(reversed_chunks.pop()) + + @contextmanager + def extra_indent(self, indent: str) -> cabc.Iterator[None]: + old_initial_indent = self.initial_indent + old_subsequent_indent = self.subsequent_indent + self.initial_indent += indent + self.subsequent_indent += indent + + try: + yield + finally: + self.initial_indent = old_initial_indent + self.subsequent_indent = old_subsequent_indent + + def indent_only(self, text: str) -> str: + rv = [] + + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + + if idx > 0: + indent = self.subsequent_indent + + rv.append(f"{indent}{line}") + + return "\n".join(rv) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/_utils.py b/stripe_config/.venv/lib/python3.12/site-packages/click/_utils.py new file mode 100644 index 0000000..09fb008 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/_utils.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +import enum +import typing as t + + +class Sentinel(enum.Enum): + """Enum used to define sentinel values. + + .. seealso:: + + `PEP 661 - Sentinel Values `_. + """ + + UNSET = object() + FLAG_NEEDS_VALUE = object() + + def __repr__(self) -> str: + return f"{self.__class__.__name__}.{self.name}" + + +UNSET = Sentinel.UNSET +"""Sentinel used to indicate that a value is not set.""" + +FLAG_NEEDS_VALUE = Sentinel.FLAG_NEEDS_VALUE +"""Sentinel used to indicate an option was passed as a flag without a +value but is not a flag option. + +``Option.consume_value`` uses this to prompt or use the ``flag_value``. +""" + +T_UNSET = t.Literal[UNSET] # type: ignore[valid-type] +"""Type hint for the :data:`UNSET` sentinel value.""" + +T_FLAG_NEEDS_VALUE = t.Literal[FLAG_NEEDS_VALUE] # type: ignore[valid-type] +"""Type hint for the :data:`FLAG_NEEDS_VALUE` sentinel value.""" diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/_winconsole.py b/stripe_config/.venv/lib/python3.12/site-packages/click/_winconsole.py new file mode 100644 index 0000000..e56c7c6 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/_winconsole.py @@ -0,0 +1,296 @@ +# This module is based on the excellent work by Adam Bartoš who +# provided a lot of what went into the implementation here in +# the discussion to issue1602 in the Python bug tracker. +# +# There are some general differences in regards to how this works +# compared to the original patches as we do not need to patch +# the entire interpreter but just work in our little world of +# echo and prompt. +from __future__ import annotations + +import collections.abc as cabc +import io +import sys +import time +import typing as t +from ctypes import Array +from ctypes import byref +from ctypes import c_char +from ctypes import c_char_p +from ctypes import c_int +from ctypes import c_ssize_t +from ctypes import c_ulong +from ctypes import c_void_p +from ctypes import POINTER +from ctypes import py_object +from ctypes import Structure +from ctypes.wintypes import DWORD +from ctypes.wintypes import HANDLE +from ctypes.wintypes import LPCWSTR +from ctypes.wintypes import LPWSTR + +from ._compat import _NonClosingTextIOWrapper + +assert sys.platform == "win32" +import msvcrt # noqa: E402 +from ctypes import windll # noqa: E402 +from ctypes import WINFUNCTYPE # noqa: E402 + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetConsoleMode = kernel32.GetConsoleMode +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ("CommandLineToArgvW", windll.shell32) +) +LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) + +STDIN_HANDLE = GetStdHandle(-10) +STDOUT_HANDLE = GetStdHandle(-11) +STDERR_HANDLE = GetStdHandle(-12) + +PyBUF_SIMPLE = 0 +PyBUF_WRITABLE = 1 + +ERROR_SUCCESS = 0 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_OPERATION_ABORTED = 995 + +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 + +EOF = b"\x1a" +MAX_BYTES_WRITTEN = 32767 + +if t.TYPE_CHECKING: + try: + # Using `typing_extensions.Buffer` instead of `collections.abc` + # on Windows for some reason does not have `Sized` implemented. + from collections.abc import Buffer # type: ignore + except ImportError: + from typing_extensions import Buffer + +try: + from ctypes import pythonapi +except ImportError: + # On PyPy we cannot get buffers so our ability to operate here is + # severely limited. + get_buffer = None +else: + + class Py_buffer(Structure): + _fields_ = [ # noqa: RUF012 + ("buf", c_void_p), + ("obj", py_object), + ("len", c_ssize_t), + ("itemsize", c_ssize_t), + ("readonly", c_int), + ("ndim", c_int), + ("format", c_char_p), + ("shape", c_ssize_p), + ("strides", c_ssize_p), + ("suboffsets", c_ssize_p), + ("internal", c_void_p), + ] + + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release + + def get_buffer(obj: Buffer, writable: bool = False) -> Array[c_char]: + buf = Py_buffer() + flags: int = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + + try: + buffer_type = c_char * buf.len + out: Array[c_char] = buffer_type.from_address(buf.buf) + return out + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + def __init__(self, handle: int | None) -> None: + self.handle = handle + + def isatty(self) -> t.Literal[True]: + super().isatty() + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + def readable(self) -> t.Literal[True]: + return True + + def readinto(self, b: Buffer) -> int: + bytes_to_be_read = len(b) + if not bytes_to_be_read: + return 0 + elif bytes_to_be_read % 2: + raise ValueError( + "cannot read odd number of bytes from UTF-16-LE encoded console" + ) + + buffer = get_buffer(b, writable=True) + code_units_to_be_read = bytes_to_be_read // 2 + code_units_read = c_ulong() + + rv = ReadConsoleW( + HANDLE(self.handle), + buffer, + code_units_to_be_read, + byref(code_units_read), + None, + ) + if GetLastError() == ERROR_OPERATION_ABORTED: + # wait for KeyboardInterrupt + time.sleep(0.1) + if not rv: + raise OSError(f"Windows error: {GetLastError()}") + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + def writable(self) -> t.Literal[True]: + return True + + @staticmethod + def _get_error_message(errno: int) -> str: + if errno == ERROR_SUCCESS: + return "ERROR_SUCCESS" + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return "ERROR_NOT_ENOUGH_MEMORY" + return f"Windows error {errno}" + + def write(self, b: Buffer) -> int: + bytes_to_be_written = len(b) + buf = get_buffer(b) + code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 + code_units_written = c_ulong() + + WriteConsoleW( + HANDLE(self.handle), + buf, + code_units_to_be_written, + byref(code_units_written), + None, + ) + bytes_written = 2 * code_units_written.value + + if bytes_written == 0 and bytes_to_be_written > 0: + raise OSError(self._get_error_message(GetLastError())) + return bytes_written + + +class ConsoleStream: + def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self) -> str: + return self.buffer.name + + def write(self, x: t.AnyStr) -> int: + if isinstance(x, str): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines: cabc.Iterable[t.AnyStr]) -> None: + for line in lines: + self.write(line) + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._text_stream, name) + + def isatty(self) -> bool: + return self.buffer.isatty() + + def __repr__(self) -> str: + return f"" + + +def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +_stream_factories: cabc.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _is_console(f: t.TextIO) -> bool: + if not hasattr(f, "fileno"): + return False + + try: + fileno = f.fileno() + except (OSError, io.UnsupportedOperation): + return False + + handle = msvcrt.get_osfhandle(fileno) + return bool(GetConsoleMode(handle, byref(DWORD()))) + + +def _get_windows_console_stream( + f: t.TextIO, encoding: str | None, errors: str | None +) -> t.TextIO | None: + if ( + get_buffer is None + or encoding not in {"utf-16-le", None} + or errors not in {"strict", None} + or not _is_console(f) + ): + return None + + func = _stream_factories.get(f.fileno()) + if func is None: + return None + + b = getattr(f, "buffer", None) + + if b is None: + return None + + return func(b) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/core.py b/stripe_config/.venv/lib/python3.12/site-packages/click/core.py new file mode 100644 index 0000000..ff2f74a --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/core.py @@ -0,0 +1,3347 @@ +from __future__ import annotations + +import collections.abc as cabc +import enum +import errno +import inspect +import os +import sys +import typing as t +from collections import abc +from collections import Counter +from contextlib import AbstractContextManager +from contextlib import contextmanager +from contextlib import ExitStack +from functools import update_wrapper +from gettext import gettext as _ +from gettext import ngettext +from itertools import repeat +from types import TracebackType + +from . import types +from ._utils import FLAG_NEEDS_VALUE +from ._utils import UNSET +from .exceptions import Abort +from .exceptions import BadParameter +from .exceptions import ClickException +from .exceptions import Exit +from .exceptions import MissingParameter +from .exceptions import NoArgsIsHelpError +from .exceptions import UsageError +from .formatting import HelpFormatter +from .formatting import join_options +from .globals import pop_context +from .globals import push_context +from .parser import _OptionParser +from .parser import _split_opt +from .termui import confirm +from .termui import prompt +from .termui import style +from .utils import _detect_program_name +from .utils import _expand_args +from .utils import echo +from .utils import make_default_short_help +from .utils import make_str +from .utils import PacifyFlushWrapper + +if t.TYPE_CHECKING: + from .shell_completion import CompletionItem + +F = t.TypeVar("F", bound="t.Callable[..., t.Any]") +V = t.TypeVar("V") + + +def _complete_visible_commands( + ctx: Context, incomplete: str +) -> cabc.Iterator[tuple[str, Command]]: + """List all the subcommands of a group that start with the + incomplete value and aren't hidden. + + :param ctx: Invocation context for the group. + :param incomplete: Value being completed. May be empty. + """ + multi = t.cast(Group, ctx.command) + + for name in multi.list_commands(ctx): + if name.startswith(incomplete): + command = multi.get_command(ctx, name) + + if command is not None and not command.hidden: + yield name, command + + +def _check_nested_chain( + base_command: Group, cmd_name: str, cmd: Command, register: bool = False +) -> None: + if not base_command.chain or not isinstance(cmd, Group): + return + + if register: + message = ( + f"It is not possible to add the group {cmd_name!r} to another" + f" group {base_command.name!r} that is in chain mode." + ) + else: + message = ( + f"Found the group {cmd_name!r} as subcommand to another group " + f" {base_command.name!r} that is in chain mode. This is not supported." + ) + + raise RuntimeError(message) + + +def batch(iterable: cabc.Iterable[V], batch_size: int) -> list[tuple[V, ...]]: + return list(zip(*repeat(iter(iterable), batch_size), strict=False)) + + +@contextmanager +def augment_usage_errors( + ctx: Context, param: Parameter | None = None +) -> cabc.Iterator[None]: + """Context manager that attaches extra information to exceptions.""" + try: + yield + except BadParameter as e: + if e.ctx is None: + e.ctx = ctx + if param is not None and e.param is None: + e.param = param + raise + except UsageError as e: + if e.ctx is None: + e.ctx = ctx + raise + + +def iter_params_for_processing( + invocation_order: cabc.Sequence[Parameter], + declaration_order: cabc.Sequence[Parameter], +) -> list[Parameter]: + """Returns all declared parameters in the order they should be processed. + + The declared parameters are re-shuffled depending on the order in which + they were invoked, as well as the eagerness of each parameters. + + The invocation order takes precedence over the declaration order. I.e. the + order in which the user provided them to the CLI is respected. + + This behavior and its effect on callback evaluation is detailed at: + https://click.palletsprojects.com/en/stable/advanced/#callback-evaluation-order + """ + + def sort_key(item: Parameter) -> tuple[bool, float]: + try: + idx: float = invocation_order.index(item) + except ValueError: + idx = float("inf") + + return not item.is_eager, idx + + return sorted(declaration_order, key=sort_key) + + +class ParameterSource(enum.Enum): + """This is an :class:`~enum.Enum` that indicates the source of a + parameter's value. + + Use :meth:`click.Context.get_parameter_source` to get the + source for a parameter by name. + + .. versionchanged:: 8.0 + Use :class:`~enum.Enum` and drop the ``validate`` method. + + .. versionchanged:: 8.0 + Added the ``PROMPT`` value. + """ + + COMMANDLINE = enum.auto() + """The value was provided by the command line args.""" + ENVIRONMENT = enum.auto() + """The value was provided with an environment variable.""" + DEFAULT = enum.auto() + """Used the default specified by the parameter.""" + DEFAULT_MAP = enum.auto() + """Used a default provided by :attr:`Context.default_map`.""" + PROMPT = enum.auto() + """Used a prompt to confirm a default or provide a value.""" + + +class Context: + """The context is a special internal object that holds state relevant + for the script execution at every single level. It's normally invisible + to commands unless they opt-in to getting access to it. + + The context is useful as it can pass internal objects around and can + control special execution features such as reading data from + environment variables. + + A context can be used as context manager in which case it will call + :meth:`close` on teardown. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. Default values will also be + ignored. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + :param show_default: Show the default value for commands. If this + value is not set, it defaults to the value from the parent + context. ``Command.show_default`` overrides this default for the + specific command. + + .. versionchanged:: 8.2 + The ``protected_args`` attribute is deprecated and will be removed in + Click 9.0. ``args`` will contain remaining unparsed tokens. + + .. versionchanged:: 8.1 + The ``show_default`` parameter is overridden by + ``Command.show_default``, instead of the other way around. + + .. versionchanged:: 8.0 + The ``show_default`` parameter defaults to the value from the + parent context. + + .. versionchanged:: 7.1 + Added the ``show_default`` parameter. + + .. versionchanged:: 4.0 + Added the ``color``, ``ignore_unknown_options``, and + ``max_content_width`` parameters. + + .. versionchanged:: 3.0 + Added the ``allow_extra_args`` and ``allow_interspersed_args`` + parameters. + + .. versionchanged:: 2.0 + Added the ``resilient_parsing``, ``help_option_names``, and + ``token_normalize_func`` parameters. + """ + + #: The formatter class to create with :meth:`make_formatter`. + #: + #: .. versionadded:: 8.0 + formatter_class: type[HelpFormatter] = HelpFormatter + + def __init__( + self, + command: Command, + parent: Context | None = None, + info_name: str | None = None, + obj: t.Any | None = None, + auto_envvar_prefix: str | None = None, + default_map: cabc.MutableMapping[str, t.Any] | None = None, + terminal_width: int | None = None, + max_content_width: int | None = None, + resilient_parsing: bool = False, + allow_extra_args: bool | None = None, + allow_interspersed_args: bool | None = None, + ignore_unknown_options: bool | None = None, + help_option_names: list[str] | None = None, + token_normalize_func: t.Callable[[str], str] | None = None, + color: bool | None = None, + show_default: bool | None = None, + ) -> None: + #: the parent context or `None` if none exists. + self.parent = parent + #: the :class:`Command` for this context. + self.command = command + #: the descriptive information name + self.info_name = info_name + #: Map of parameter names to their parsed values. Parameters + #: with ``expose_value=False`` are not stored. + self.params: dict[str, t.Any] = {} + #: the leftover arguments. + self.args: list[str] = [] + #: protected arguments. These are arguments that are prepended + #: to `args` when certain parsing scenarios are encountered but + #: must be never propagated to another arguments. This is used + #: to implement nested parsing. + self._protected_args: list[str] = [] + #: the collected prefixes of the command's options. + self._opt_prefixes: set[str] = set(parent._opt_prefixes) if parent else set() + + if obj is None and parent is not None: + obj = parent.obj + + #: the user object stored. + self.obj: t.Any = obj + self._meta: dict[str, t.Any] = getattr(parent, "meta", {}) + + #: A dictionary (-like object) with defaults for parameters. + if ( + default_map is None + and info_name is not None + and parent is not None + and parent.default_map is not None + ): + default_map = parent.default_map.get(info_name) + + self.default_map: cabc.MutableMapping[str, t.Any] | None = default_map + + #: This flag indicates if a subcommand is going to be executed. A + #: group callback can use this information to figure out if it's + #: being executed directly or because the execution flow passes + #: onwards to a subcommand. By default it's None, but it can be + #: the name of the subcommand to execute. + #: + #: If chaining is enabled this will be set to ``'*'`` in case + #: any commands are executed. It is however not possible to + #: figure out which ones. If you require this knowledge you + #: should use a :func:`result_callback`. + self.invoked_subcommand: str | None = None + + if terminal_width is None and parent is not None: + terminal_width = parent.terminal_width + + #: The width of the terminal (None is autodetection). + self.terminal_width: int | None = terminal_width + + if max_content_width is None and parent is not None: + max_content_width = parent.max_content_width + + #: The maximum width of formatted content (None implies a sensible + #: default which is 80 for most things). + self.max_content_width: int | None = max_content_width + + if allow_extra_args is None: + allow_extra_args = command.allow_extra_args + + #: Indicates if the context allows extra args or if it should + #: fail on parsing. + #: + #: .. versionadded:: 3.0 + self.allow_extra_args = allow_extra_args + + if allow_interspersed_args is None: + allow_interspersed_args = command.allow_interspersed_args + + #: Indicates if the context allows mixing of arguments and + #: options or not. + #: + #: .. versionadded:: 3.0 + self.allow_interspersed_args: bool = allow_interspersed_args + + if ignore_unknown_options is None: + ignore_unknown_options = command.ignore_unknown_options + + #: Instructs click to ignore options that a command does not + #: understand and will store it on the context for later + #: processing. This is primarily useful for situations where you + #: want to call into external programs. Generally this pattern is + #: strongly discouraged because it's not possibly to losslessly + #: forward all arguments. + #: + #: .. versionadded:: 4.0 + self.ignore_unknown_options: bool = ignore_unknown_options + + if help_option_names is None: + if parent is not None: + help_option_names = parent.help_option_names + else: + help_option_names = ["--help"] + + #: The names for the help options. + self.help_option_names: list[str] = help_option_names + + if token_normalize_func is None and parent is not None: + token_normalize_func = parent.token_normalize_func + + #: An optional normalization function for tokens. This is + #: options, choices, commands etc. + self.token_normalize_func: t.Callable[[str], str] | None = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures and default values + #: will be ignored. Useful for completion. + self.resilient_parsing: bool = resilient_parsing + + # If there is no envvar prefix yet, but the parent has one and + # the command on this level has a name, we can expand the envvar + # prefix automatically. + if auto_envvar_prefix is None: + if ( + parent is not None + and parent.auto_envvar_prefix is not None + and self.info_name is not None + ): + auto_envvar_prefix = ( + f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" + ) + else: + auto_envvar_prefix = auto_envvar_prefix.upper() + + if auto_envvar_prefix is not None: + auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") + + self.auto_envvar_prefix: str | None = auto_envvar_prefix + + if color is None and parent is not None: + color = parent.color + + #: Controls if styling output is wanted or not. + self.color: bool | None = color + + if show_default is None and parent is not None: + show_default = parent.show_default + + #: Show option default values when formatting help text. + self.show_default: bool | None = show_default + + self._close_callbacks: list[t.Callable[[], t.Any]] = [] + self._depth = 0 + self._parameter_source: dict[str, ParameterSource] = {} + self._exit_stack = ExitStack() + + @property + def protected_args(self) -> list[str]: + import warnings + + warnings.warn( + "'protected_args' is deprecated and will be removed in Click 9.0." + " 'args' will contain remaining unparsed tokens.", + DeprecationWarning, + stacklevel=2, + ) + return self._protected_args + + def to_info_dict(self) -> dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire CLI + structure. + + .. code-block:: python + + with Context(cli) as ctx: + info = ctx.to_info_dict() + + .. versionadded:: 8.0 + """ + return { + "command": self.command.to_info_dict(self), + "info_name": self.info_name, + "allow_extra_args": self.allow_extra_args, + "allow_interspersed_args": self.allow_interspersed_args, + "ignore_unknown_options": self.ignore_unknown_options, + "auto_envvar_prefix": self.auto_envvar_prefix, + } + + def __enter__(self) -> Context: + self._depth += 1 + push_context(self) + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> bool | None: + self._depth -= 1 + exit_result: bool | None = None + if self._depth == 0: + exit_result = self._close_with_exception_info(exc_type, exc_value, tb) + pop_context() + + return exit_result + + @contextmanager + def scope(self, cleanup: bool = True) -> cabc.Iterator[Context]: + """This helper method can be used with the context object to promote + it to the current thread local (see :func:`get_current_context`). + The default behavior of this is to invoke the cleanup functions which + can be disabled by setting `cleanup` to `False`. The cleanup + functions are typically used for things such as closing file handles. + + If the cleanup is intended the context object can also be directly + used as a context manager. + + Example usage:: + + with ctx.scope(): + assert get_current_context() is ctx + + This is equivalent:: + + with ctx: + assert get_current_context() is ctx + + .. versionadded:: 5.0 + + :param cleanup: controls if the cleanup functions should be run or + not. The default is to run these functions. In + some situations the context only wants to be + temporarily pushed in which case this can be disabled. + Nested pushes automatically defer the cleanup. + """ + if not cleanup: + self._depth += 1 + try: + with self as rv: + yield rv + finally: + if not cleanup: + self._depth -= 1 + + @property + def meta(self) -> dict[str, t.Any]: + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utilities can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = f'{__name__}.lang' + + def set_language(value): + ctx = get_current_context() + ctx.meta[LANG_KEY] = value + + def get_language(): + return get_current_context().meta.get(LANG_KEY, 'en_US') + + .. versionadded:: 5.0 + """ + return self._meta + + def make_formatter(self) -> HelpFormatter: + """Creates the :class:`~click.HelpFormatter` for the help and + usage output. + + To quickly customize the formatter class used without overriding + this method, set the :attr:`formatter_class` attribute. + + .. versionchanged:: 8.0 + Added the :attr:`formatter_class` attribute. + """ + return self.formatter_class( + width=self.terminal_width, max_width=self.max_content_width + ) + + def with_resource(self, context_manager: AbstractContextManager[V]) -> V: + """Register a resource as if it were used in a ``with`` + statement. The resource will be cleaned up when the context is + popped. + + Uses :meth:`contextlib.ExitStack.enter_context`. It calls the + resource's ``__enter__()`` method and returns the result. When + the context is popped, it closes the stack, which calls the + resource's ``__exit__()`` method. + + To register a cleanup function for something that isn't a + context manager, use :meth:`call_on_close`. Or use something + from :mod:`contextlib` to turn it into a context manager first. + + .. code-block:: python + + @click.group() + @click.option("--name") + @click.pass_context + def cli(ctx): + ctx.obj = ctx.with_resource(connect_db(name)) + + :param context_manager: The context manager to enter. + :return: Whatever ``context_manager.__enter__()`` returns. + + .. versionadded:: 8.0 + """ + return self._exit_stack.enter_context(context_manager) + + def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: + """Register a function to be called when the context tears down. + + This can be used to close resources opened during the script + execution. Resources that support Python's context manager + protocol which would be used in a ``with`` statement should be + registered with :meth:`with_resource` instead. + + :param f: The function to execute on teardown. + """ + return self._exit_stack.callback(f) + + def close(self) -> None: + """Invoke all close callbacks registered with + :meth:`call_on_close`, and exit all context managers entered + with :meth:`with_resource`. + """ + self._close_with_exception_info(None, None, None) + + def _close_with_exception_info( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> bool | None: + """Unwind the exit stack by calling its :meth:`__exit__` providing the exception + information to allow for exception handling by the various resources registered + using :meth;`with_resource` + + :return: Whatever ``exit_stack.__exit__()`` returns. + """ + exit_result = self._exit_stack.__exit__(exc_type, exc_value, tb) + # In case the context is reused, create a new exit stack. + self._exit_stack = ExitStack() + + return exit_result + + @property + def command_path(self) -> str: + """The computed command path. This is used for the ``usage`` + information on the help page. It's automatically created by + combining the info names of the chain of contexts to the root. + """ + rv = "" + if self.info_name is not None: + rv = self.info_name + if self.parent is not None: + parent_command_path = [self.parent.command_path] + + if isinstance(self.parent.command, Command): + for param in self.parent.command.get_params(self): + parent_command_path.extend(param.get_usage_pieces(self)) + + rv = f"{' '.join(parent_command_path)} {rv}" + return rv.lstrip() + + def find_root(self) -> Context: + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type: type[V]) -> V | None: + """Finds the closest object of a given type.""" + node: Context | None = self + + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + + node = node.parent + + return None + + def ensure_object(self, object_type: type[V]) -> V: + """Like :meth:`find_object` but sets the innermost object to a + new instance of `object_type` if it does not exist. + """ + rv = self.find_object(object_type) + if rv is None: + self.obj = rv = object_type() + return rv + + @t.overload + def lookup_default( + self, name: str, call: t.Literal[True] = True + ) -> t.Any | None: ... + + @t.overload + def lookup_default( + self, name: str, call: t.Literal[False] = ... + ) -> t.Any | t.Callable[[], t.Any] | None: ... + + def lookup_default(self, name: str, call: bool = True) -> t.Any | None: + """Get the default for a parameter from :attr:`default_map`. + + :param name: Name of the parameter. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + if self.default_map is not None: + value = self.default_map.get(name, UNSET) + + if call and callable(value): + return value() + + return value + + return UNSET + + def fail(self, message: str) -> t.NoReturn: + """Aborts the execution of the program with a specific error + message. + + :param message: the error message to fail with. + """ + raise UsageError(message, self) + + def abort(self) -> t.NoReturn: + """Aborts the script.""" + raise Abort() + + def exit(self, code: int = 0) -> t.NoReturn: + """Exits the application with a given exit code. + + .. versionchanged:: 8.2 + Callbacks and context managers registered with :meth:`call_on_close` + and :meth:`with_resource` are closed before exiting. + """ + self.close() + raise Exit(code) + + def get_usage(self) -> str: + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self) -> str: + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def _make_sub_context(self, command: Command) -> Context: + """Create a new context of the same type as this context, but + for a new command. + + :meta private: + """ + return type(self)(command, info_name=command.name, parent=self) + + @t.overload + def invoke( + self, callback: t.Callable[..., V], /, *args: t.Any, **kwargs: t.Any + ) -> V: ... + + @t.overload + def invoke(self, callback: Command, /, *args: t.Any, **kwargs: t.Any) -> t.Any: ... + + def invoke( + self, callback: Command | t.Callable[..., V], /, *args: t.Any, **kwargs: t.Any + ) -> t.Any | V: + """Invokes a command callback in exactly the way it expects. There + are two ways to invoke this method: + + 1. the first argument can be a callback and all other arguments and + keyword arguments are forwarded directly to the function. + 2. the first argument is a click command object. In that case all + arguments are forwarded as well but proper click parameters + (options and click arguments) must be keyword arguments and Click + will fill in defaults. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if :meth:`forward` is called at multiple levels. + + .. versionchanged:: 3.2 + A new context is created, and missing arguments use default values. + """ + if isinstance(callback, Command): + other_cmd = callback + + if other_cmd.callback is None: + raise TypeError( + "The given command does not have a callback that can be invoked." + ) + else: + callback = t.cast("t.Callable[..., V]", other_cmd.callback) + + ctx = self._make_sub_context(other_cmd) + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.type_cast_value( # type: ignore + ctx, param.get_default(ctx) + ) + + # Track all kwargs as params, so that forward() will pass + # them on in subsequent calls. + ctx.params.update(kwargs) + else: + ctx = self + + with augment_usage_errors(self): + with ctx: + return callback(*args, **kwargs) + + def forward(self, cmd: Command, /, *args: t.Any, **kwargs: t.Any) -> t.Any: + """Similar to :meth:`invoke` but fills in default keyword + arguments from the current context if the other command expects + it. This cannot invoke callbacks directly, only other commands. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if ``forward`` is called at multiple levels. + """ + # Can only forward to other commands, not direct callbacks. + if not isinstance(cmd, Command): + raise TypeError("Callback is not a command.") + + for param in self.params: + if param not in kwargs: + kwargs[param] = self.params[param] + + return self.invoke(cmd, *args, **kwargs) + + def set_parameter_source(self, name: str, source: ParameterSource) -> None: + """Set the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + :param name: The name of the parameter. + :param source: A member of :class:`~click.core.ParameterSource`. + """ + self._parameter_source[name] = source + + def get_parameter_source(self, name: str) -> ParameterSource | None: + """Get the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + This can be useful for determining when a user specified a value + on the command line that is the same as the default value. It + will be :attr:`~click.core.ParameterSource.DEFAULT` only if the + value was actually taken from the default. + + :param name: The name of the parameter. + :rtype: ParameterSource + + .. versionchanged:: 8.0 + Returns ``None`` if the parameter was not provided from any + source. + """ + return self._parameter_source.get(name) + + +class Command: + """Commands are the basic building block of command line interfaces in + Click. A basic command handles command line parsing and might dispatch + more parsing to commands nested below it. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is disabled by default. + If enabled this will add ``--help`` as argument + if no arguments are passed + :param hidden: hide this command from help outputs. + :param deprecated: If ``True`` or non-empty string, issues a message + indicating that the command is deprecated and highlights + its deprecation in --help. The message can be customized + by using a string as the value. + + .. versionchanged:: 8.2 + This is the base class for all commands, not ``BaseCommand``. + ``deprecated`` can be set to a string as well to customize the + deprecation message. + + .. versionchanged:: 8.1 + ``help``, ``epilog``, and ``short_help`` are stored unprocessed, + all formatting is done when outputting help text, not at init, + and is done even if not using the ``@command`` decorator. + + .. versionchanged:: 8.0 + Added a ``repr`` showing the command name. + + .. versionchanged:: 7.1 + Added the ``no_args_is_help`` parameter. + + .. versionchanged:: 2.0 + Added the ``context_settings`` parameter. + """ + + #: The context class to create with :meth:`make_context`. + #: + #: .. versionadded:: 8.0 + context_class: type[Context] = Context + + #: the default for the :attr:`Context.allow_extra_args` flag. + allow_extra_args = False + + #: the default for the :attr:`Context.allow_interspersed_args` flag. + allow_interspersed_args = True + + #: the default for the :attr:`Context.ignore_unknown_options` flag. + ignore_unknown_options = False + + def __init__( + self, + name: str | None, + context_settings: cabc.MutableMapping[str, t.Any] | None = None, + callback: t.Callable[..., t.Any] | None = None, + params: list[Parameter] | None = None, + help: str | None = None, + epilog: str | None = None, + short_help: str | None = None, + options_metavar: str | None = "[OPTIONS]", + add_help_option: bool = True, + no_args_is_help: bool = False, + hidden: bool = False, + deprecated: bool | str = False, + ) -> None: + #: the name the command thinks it has. Upon registering a command + #: on a :class:`Group` the group will default the command name + #: with this information. You should instead use the + #: :class:`Context`\'s :attr:`~Context.info_name` attribute. + self.name = name + + if context_settings is None: + context_settings = {} + + #: an optional dictionary with defaults passed to the context. + self.context_settings: cabc.MutableMapping[str, t.Any] = context_settings + + #: the callback to execute when the command fires. This might be + #: `None` in which case nothing happens. + self.callback = callback + #: the list of parameters for this command in the order they + #: should show up in the help page and execute. Eager parameters + #: will automatically be handled before non eager ones. + self.params: list[Parameter] = params or [] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self._help_option = None + self.no_args_is_help = no_args_is_help + self.hidden = hidden + self.deprecated = deprecated + + def to_info_dict(self, ctx: Context) -> dict[str, t.Any]: + return { + "name": self.name, + "params": [param.to_info_dict() for param in self.get_params(ctx)], + "help": self.help, + "epilog": self.epilog, + "short_help": self.short_help, + "hidden": self.hidden, + "deprecated": self.deprecated, + } + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def get_usage(self, ctx: Context) -> str: + """Formats the usage line into a string and returns it. + + Calls :meth:`format_usage` internally. + """ + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_params(self, ctx: Context) -> list[Parameter]: + params = self.params + help_option = self.get_help_option(ctx) + + if help_option is not None: + params = [*params, help_option] + + if __debug__: + import warnings + + opts = [opt for param in params for opt in param.opts] + opts_counter = Counter(opts) + duplicate_opts = (opt for opt, count in opts_counter.items() if count > 1) + + for duplicate_opt in duplicate_opts: + warnings.warn( + ( + f"The parameter {duplicate_opt} is used more than once. " + "Remove its duplicate as parameters should be unique." + ), + stacklevel=3, + ) + + return params + + def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the usage line into the formatter. + + This is a low-level method called by :meth:`get_usage`. + """ + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, " ".join(pieces)) + + def collect_usage_pieces(self, ctx: Context) -> list[str]: + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] if self.options_metavar else [] + + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + + return rv + + def get_help_option_names(self, ctx: Context) -> list[str]: + """Returns the names for the help option.""" + all_names = set(ctx.help_option_names) + for param in self.params: + all_names.difference_update(param.opts) + all_names.difference_update(param.secondary_opts) + return list(all_names) + + def get_help_option(self, ctx: Context) -> Option | None: + """Returns the help option object. + + Skipped if :attr:`add_help_option` is ``False``. + + .. versionchanged:: 8.1.8 + The help option is now cached to avoid creating it multiple times. + """ + help_option_names = self.get_help_option_names(ctx) + + if not help_option_names or not self.add_help_option: + return None + + # Cache the help option object in private _help_option attribute to + # avoid creating it multiple times. Not doing this will break the + # callback odering by iter_params_for_processing(), which relies on + # object comparison. + if self._help_option is None: + # Avoid circular import. + from .decorators import help_option + + # Apply help_option decorator and pop resulting option + help_option(*help_option_names)(self) + self._help_option = self.params.pop() # type: ignore[assignment] + + return self._help_option + + def make_parser(self, ctx: Context) -> _OptionParser: + """Creates the underlying option parser for this command.""" + parser = _OptionParser(ctx) + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx: Context) -> str: + """Formats the help into a string and returns it. + + Calls :meth:`format_help` internally. + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_short_help_str(self, limit: int = 45) -> str: + """Gets short help for the command or makes it by shortening the + long help string. + """ + if self.short_help: + text = inspect.cleandoc(self.short_help) + elif self.help: + text = make_default_short_help(self.help, limit) + else: + text = "" + + if self.deprecated: + deprecated_message = ( + f"(DEPRECATED: {self.deprecated})" + if isinstance(self.deprecated, str) + else "(DEPRECATED)" + ) + text = _("{text} {deprecated_message}").format( + text=text, deprecated_message=deprecated_message + ) + + return text.strip() + + def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help into the formatter if it exists. + + This is a low-level method called by :meth:`get_help`. + + This calls the following methods: + + - :meth:`format_usage` + - :meth:`format_help_text` + - :meth:`format_options` + - :meth:`format_epilog` + """ + self.format_usage(ctx, formatter) + self.format_help_text(ctx, formatter) + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help text to the formatter if it exists.""" + if self.help is not None: + # truncate the help text to the first form feed + text = inspect.cleandoc(self.help).partition("\f")[0] + else: + text = "" + + if self.deprecated: + deprecated_message = ( + f"(DEPRECATED: {self.deprecated})" + if isinstance(self.deprecated, str) + else "(DEPRECATED)" + ) + text = _("{text} {deprecated_message}").format( + text=text, deprecated_message=deprecated_message + ) + + if text: + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(text) + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes all the options into the formatter if they exist.""" + opts = [] + for param in self.get_params(ctx): + rv = param.get_help_record(ctx) + if rv is not None: + opts.append(rv) + + if opts: + with formatter.section(_("Options")): + formatter.write_dl(opts) + + def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + epilog = inspect.cleandoc(self.epilog) + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(epilog) + + def make_context( + self, + info_name: str | None, + args: list[str], + parent: Context | None = None, + **extra: t.Any, + ) -> Context: + """This function when given an info name and arguments will kick + off the parsing and create a new :class:`Context`. It does not + invoke the actual command callback though. + + To quickly customize the context class used without overriding + this method, set the :attr:`context_class` attribute. + + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it's usually + the name of the script, for commands below it's + the name of the command. + :param args: the arguments to parse as list of strings. + :param parent: the parent context if available. + :param extra: extra keyword arguments forwarded to the context + constructor. + + .. versionchanged:: 8.0 + Added the :attr:`context_class` attribute. + """ + for key, value in self.context_settings.items(): + if key not in extra: + extra[key] = value + + ctx = self.context_class(self, info_name=info_name, parent=parent, **extra) + + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx: Context, args: list[str]) -> list[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + raise NoArgsIsHelpError(ctx) + + parser = self.make_parser(ctx) + opts, args, param_order = parser.parse_args(args=args) + + for param in iter_params_for_processing(param_order, self.get_params(ctx)): + _, args = param.handle_parse_result(ctx, opts, args) + + if args and not ctx.allow_extra_args and not ctx.resilient_parsing: + ctx.fail( + ngettext( + "Got unexpected extra argument ({args})", + "Got unexpected extra arguments ({args})", + len(args), + ).format(args=" ".join(map(str, args))) + ) + + ctx.args = args + ctx._opt_prefixes.update(parser._opt_prefixes) + return args + + def invoke(self, ctx: Context) -> t.Any: + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + if self.deprecated: + extra_message = ( + f" {self.deprecated}" if isinstance(self.deprecated, str) else "" + ) + message = _( + "DeprecationWarning: The command {name!r} is deprecated.{extra_message}" + ).format(name=self.name, extra_message=extra_message) + echo(style(message, fg="red"), err=True) + + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: + """Return a list of completions for the incomplete value. Looks + at the names of options and chained multi-commands. + + Any command could be part of a chained multi-command, so sibling + commands are valid at any point during command completion. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: list[CompletionItem] = [] + + if incomplete and not incomplete[0].isalnum(): + for param in self.get_params(ctx): + if ( + not isinstance(param, Option) + or param.hidden + or ( + not param.multiple + and ctx.get_parameter_source(param.name) # type: ignore + is ParameterSource.COMMANDLINE + ) + ): + continue + + results.extend( + CompletionItem(name, help=param.help) + for name in [*param.opts, *param.secondary_opts] + if name.startswith(incomplete) + ) + + while ctx.parent is not None: + ctx = ctx.parent + + if isinstance(ctx.command, Group) and ctx.command.chain: + results.extend( + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + if name not in ctx._protected_args + ) + + return results + + @t.overload + def main( + self, + args: cabc.Sequence[str] | None = None, + prog_name: str | None = None, + complete_var: str | None = None, + standalone_mode: t.Literal[True] = True, + **extra: t.Any, + ) -> t.NoReturn: ... + + @t.overload + def main( + self, + args: cabc.Sequence[str] | None = None, + prog_name: str | None = None, + complete_var: str | None = None, + standalone_mode: bool = ..., + **extra: t.Any, + ) -> t.Any: ... + + def main( + self, + args: cabc.Sequence[str] | None = None, + prog_name: str | None = None, + complete_var: str | None = None, + standalone_mode: bool = True, + windows_expand_args: bool = True, + **extra: t.Any, + ) -> t.Any: + """This is the way to invoke a script with all the bells and + whistles as a command line application. This will always terminate + the application after a call. If this is not wanted, ``SystemExit`` + needs to be caught. + + This method is also available by directly calling the instance of + a :class:`Command`. + + :param args: the arguments that should be used for parsing. If not + provided, ``sys.argv[1:]`` is used. + :param prog_name: the program name that should be used. By default + the program name is constructed by taking the file + name from ``sys.argv[0]``. + :param complete_var: the environment variable that controls the + bash completion support. The default is + ``"__COMPLETE"`` with prog_name in + uppercase. + :param standalone_mode: the default behavior is to invoke the script + in standalone mode. Click will then + handle exceptions and convert them into + error messages and the function will never + return but shut down the interpreter. If + this is set to `False` they will be + propagated to the caller and the return + value of this function is the return value + of :meth:`invoke`. + :param windows_expand_args: Expand glob patterns, user dir, and + env vars in command line args on Windows. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + + .. versionchanged:: 8.0.1 + Added the ``windows_expand_args`` parameter to allow + disabling command line arg expansion on Windows. + + .. versionchanged:: 8.0 + When taking arguments from ``sys.argv`` on Windows, glob + patterns, user dir, and env vars are expanded. + + .. versionchanged:: 3.0 + Added the ``standalone_mode`` parameter. + """ + if args is None: + args = sys.argv[1:] + + if os.name == "nt" and windows_expand_args: + args = _expand_args(args) + else: + args = list(args) + + if prog_name is None: + prog_name = _detect_program_name() + + # Process shell completion requests and exit early. + self._main_shell_completion(extra, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + # it's not safe to `ctx.exit(rv)` here! + # note that `rv` may actually contain data like "1" which + # has obvious effects + # more subtle case: `rv=[None, None]` can come out of + # chained commands which all returned `None` -- so it's not + # even always obvious that `rv` indicates success/failure + # by its truthiness/falsiness + ctx.exit() + except (EOFError, KeyboardInterrupt) as e: + echo(file=sys.stderr) + raise Abort() from e + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except OSError as e: + if e.errno == errno.EPIPE: + sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) + sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) + sys.exit(1) + else: + raise + except Exit as e: + if standalone_mode: + sys.exit(e.exit_code) + else: + # in non-standalone mode, return the exit code + # note that this is only reached if `self.invoke` above raises + # an Exit explicitly -- thus bypassing the check there which + # would return its result + # the results of non-standalone execution may therefore be + # somewhat ambiguous: if there are codepaths which lead to + # `ctx.exit(1)` and to `return 1`, the caller won't be able to + # tell the difference between the two + return e.exit_code + except Abort: + if not standalone_mode: + raise + echo(_("Aborted!"), file=sys.stderr) + sys.exit(1) + + def _main_shell_completion( + self, + ctx_args: cabc.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str | None = None, + ) -> None: + """Check if the shell is asking for tab completion, process + that, then exit early. Called from :meth:`main` before the + program is invoked. + + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. Defaults to + ``_{PROG_NAME}_COMPLETE``. + + .. versionchanged:: 8.2.0 + Dots (``.``) in ``prog_name`` are replaced with underscores (``_``). + """ + if complete_var is None: + complete_name = prog_name.replace("-", "_").replace(".", "_") + complete_var = f"_{complete_name}_COMPLETE".upper() + + instruction = os.environ.get(complete_var) + + if not instruction: + return + + from .shell_completion import shell_complete + + rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) + sys.exit(rv) + + def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class _FakeSubclassCheck(type): + def __subclasscheck__(cls, subclass: type) -> bool: + return issubclass(subclass, cls.__bases__[0]) + + def __instancecheck__(cls, instance: t.Any) -> bool: + return isinstance(instance, cls.__bases__[0]) + + +class _BaseCommand(Command, metaclass=_FakeSubclassCheck): + """ + .. deprecated:: 8.2 + Will be removed in Click 9.0. Use ``Command`` instead. + """ + + +class Group(Command): + """A group is a command that nests other commands (or more groups). + + :param name: The name of the group command. + :param commands: Map names to :class:`Command` objects. Can be a list, which + will use :attr:`Command.name` as the keys. + :param invoke_without_command: Invoke the group's callback even if a + subcommand is not given. + :param no_args_is_help: If no arguments are given, show the group's help and + exit. Defaults to the opposite of ``invoke_without_command``. + :param subcommand_metavar: How to represent the subcommand argument in help. + The default will represent whether ``chain`` is set or not. + :param chain: Allow passing more than one subcommand argument. After parsing + a command's arguments, if any arguments remain another command will be + matched, and so on. + :param result_callback: A function to call after the group's and + subcommand's callbacks. The value returned by the subcommand is passed. + If ``chain`` is enabled, the value will be a list of values returned by + all the commands. If ``invoke_without_command`` is enabled, the value + will be the value returned by the group's callback, or an empty list if + ``chain`` is enabled. + :param kwargs: Other arguments passed to :class:`Command`. + + .. versionchanged:: 8.0 + The ``commands`` argument can be a list of command objects. + + .. versionchanged:: 8.2 + Merged with and replaces the ``MultiCommand`` base class. + """ + + allow_extra_args = True + allow_interspersed_args = False + + #: If set, this is used by the group's :meth:`command` decorator + #: as the default :class:`Command` class. This is useful to make all + #: subcommands use a custom command class. + #: + #: .. versionadded:: 8.0 + command_class: type[Command] | None = None + + #: If set, this is used by the group's :meth:`group` decorator + #: as the default :class:`Group` class. This is useful to make all + #: subgroups use a custom group class. + #: + #: If set to the special value :class:`type` (literally + #: ``group_class = type``), this group's class will be used as the + #: default class. This makes a custom group class continue to make + #: custom groups. + #: + #: .. versionadded:: 8.0 + group_class: type[Group] | type[type] | None = None + # Literal[type] isn't valid, so use Type[type] + + def __init__( + self, + name: str | None = None, + commands: cabc.MutableMapping[str, Command] + | cabc.Sequence[Command] + | None = None, + invoke_without_command: bool = False, + no_args_is_help: bool | None = None, + subcommand_metavar: str | None = None, + chain: bool = False, + result_callback: t.Callable[..., t.Any] | None = None, + **kwargs: t.Any, + ) -> None: + super().__init__(name, **kwargs) + + if commands is None: + commands = {} + elif isinstance(commands, abc.Sequence): + commands = {c.name: c for c in commands if c.name is not None} + + #: The registered subcommands by their exported names. + self.commands: cabc.MutableMapping[str, Command] = commands + + if no_args_is_help is None: + no_args_is_help = not invoke_without_command + + self.no_args_is_help = no_args_is_help + self.invoke_without_command = invoke_without_command + + if subcommand_metavar is None: + if chain: + subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." + else: + subcommand_metavar = "COMMAND [ARGS]..." + + self.subcommand_metavar = subcommand_metavar + self.chain = chain + # The result callback that is stored. This can be set or + # overridden with the :func:`result_callback` decorator. + self._result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError( + "A group in chain mode cannot have optional arguments." + ) + + def to_info_dict(self, ctx: Context) -> dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + commands = {} + + for name in self.list_commands(ctx): + command = self.get_command(ctx, name) + + if command is None: + continue + + sub_ctx = ctx._make_sub_context(command) + + with sub_ctx.scope(cleanup=False): + commands[name] = command.to_info_dict(sub_ctx) + + info_dict.update(commands=commands, chain=self.chain) + return info_dict + + def add_command(self, cmd: Command, name: str | None = None) -> None: + """Registers another :class:`Command` with this group. If the name + is not provided, the name of the command is used. + """ + name = name or cmd.name + if name is None: + raise TypeError("Command has no name.") + _check_nested_chain(self, name, cmd, register=True) + self.commands[name] = cmd + + @t.overload + def command(self, __func: t.Callable[..., t.Any]) -> Command: ... + + @t.overload + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Command]: ... + + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Command] | Command: + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` and + immediately registers the created command with this group by + calling :meth:`add_command`. + + To customize the command class used, set the + :attr:`command_class` attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`command_class` attribute. + """ + from .decorators import command + + func: t.Callable[..., t.Any] | None = None + + if args and callable(args[0]): + assert len(args) == 1 and not kwargs, ( + "Use 'command(**kwargs)(callable)' to provide arguments." + ) + (func,) = args + args = () + + if self.command_class and kwargs.get("cls") is None: + kwargs["cls"] = self.command_class + + def decorator(f: t.Callable[..., t.Any]) -> Command: + cmd: Command = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + @t.overload + def group(self, __func: t.Callable[..., t.Any]) -> Group: ... + + @t.overload + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Group]: ... + + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Group] | Group: + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` and + immediately registers the created group with this group by + calling :meth:`add_command`. + + To customize the group class used, set the :attr:`group_class` + attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`group_class` attribute. + """ + from .decorators import group + + func: t.Callable[..., t.Any] | None = None + + if args and callable(args[0]): + assert len(args) == 1 and not kwargs, ( + "Use 'group(**kwargs)(callable)' to provide arguments." + ) + (func,) = args + args = () + + if self.group_class is not None and kwargs.get("cls") is None: + if self.group_class is type: + kwargs["cls"] = type(self) + else: + kwargs["cls"] = self.group_class + + def decorator(f: t.Callable[..., t.Any]) -> Group: + cmd: Group = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: + """Adds a result callback to the command. By default if a + result callback is already registered this will chain them but + this can be disabled with the `replace` parameter. The result + callback is invoked with the return value of the subcommand + (or the list of return values from all subcommands if chaining + is enabled) as well as the parameters as they would be passed + to the main callback. + + Example:: + + @click.group() + @click.option('-i', '--input', default=23) + def cli(input): + return 42 + + @cli.result_callback() + def process_result(result, input): + return result + input + + :param replace: if set to `True` an already existing result + callback will be removed. + + .. versionchanged:: 8.0 + Renamed from ``resultcallback``. + + .. versionadded:: 3.0 + """ + + def decorator(f: F) -> F: + old_callback = self._result_callback + + if old_callback is None or replace: + self._result_callback = f + return f + + def function(value: t.Any, /, *args: t.Any, **kwargs: t.Any) -> t.Any: + inner = old_callback(value, *args, **kwargs) + return f(inner, *args, **kwargs) + + self._result_callback = rv = update_wrapper(t.cast(F, function), f) + return rv # type: ignore[return-value] + + return decorator + + def get_command(self, ctx: Context, cmd_name: str) -> Command | None: + """Given a context and a command name, this returns a :class:`Command` + object if it exists or returns ``None``. + """ + return self.commands.get(cmd_name) + + def list_commands(self, ctx: Context) -> list[str]: + """Returns a list of subcommand names in the order they should appear.""" + return sorted(self.commands) + + def collect_usage_pieces(self, ctx: Context) -> list[str]: + rv = super().collect_usage_pieces(ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + super().format_options(ctx, formatter) + self.format_commands(ctx, formatter) + + def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: + """Extra format methods for multi methods that adds all the commands + after the options. + """ + commands = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + if cmd.hidden: + continue + + commands.append((subcommand, cmd)) + + # allow for 3 times the default spacing + if len(commands): + limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) + + rows = [] + for subcommand, cmd in commands: + help = cmd.get_short_help_str(limit) + rows.append((subcommand, help)) + + if rows: + with formatter.section(_("Commands")): + formatter.write_dl(rows) + + def parse_args(self, ctx: Context, args: list[str]) -> list[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + raise NoArgsIsHelpError(ctx) + + rest = super().parse_args(ctx, args) + + if self.chain: + ctx._protected_args = rest + ctx.args = [] + elif rest: + ctx._protected_args, ctx.args = rest[:1], rest[1:] + + return ctx.args + + def invoke(self, ctx: Context) -> t.Any: + def _process_result(value: t.Any) -> t.Any: + if self._result_callback is not None: + value = ctx.invoke(self._result_callback, value, **ctx.params) + return value + + if not ctx._protected_args: + if self.invoke_without_command: + # No subcommand was invoked, so the result callback is + # invoked with the group return value for regular + # groups, or an empty list for chained groups. + with ctx: + rv = super().invoke(ctx) + return _process_result([] if self.chain else rv) + ctx.fail(_("Missing command.")) + + # Fetch args back out + args = [*ctx._protected_args, *ctx.args] + ctx.args = [] + ctx._protected_args = [] + + # If we're not in chain mode, we only allow the invocation of a + # single command but we also inform the current context about the + # name of the command to invoke. + if not self.chain: + # Make sure the context is entered so we do not clean up + # resources until the result processor has worked. + with ctx: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + ctx.invoked_subcommand = cmd_name + super().invoke(ctx) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) + with sub_ctx: + return _process_result(sub_ctx.command.invoke(sub_ctx)) + + # In chain mode we create the contexts step by step, but after the + # base command has been invoked. Because at that point we do not + # know the subcommands yet, the invoked subcommand attribute is + # set to ``*`` to inform the command that subcommands are executed + # but nothing else. + with ctx: + ctx.invoked_subcommand = "*" if args else None + super().invoke(ctx) + + # Otherwise we make every single context and invoke them in a + # chain. In that case the return value to the result processor + # is the list of all invoked subcommand's results. + contexts = [] + while args: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + sub_ctx = cmd.make_context( + cmd_name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + ) + contexts.append(sub_ctx) + args, sub_ctx.args = sub_ctx.args, [] + + rv = [] + for sub_ctx in contexts: + with sub_ctx: + rv.append(sub_ctx.command.invoke(sub_ctx)) + return _process_result(rv) + + def resolve_command( + self, ctx: Context, args: list[str] + ) -> tuple[str | None, Command | None, list[str]]: + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None and not ctx.resilient_parsing: + if _split_opt(cmd_name)[0]: + self.parse_args(ctx, args) + ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) + return cmd_name if cmd else None, cmd, args[1:] + + def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: + """Return a list of completions for the incomplete value. Looks + at the names of options, subcommands, and chained + multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results = [ + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + ] + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +class _MultiCommand(Group, metaclass=_FakeSubclassCheck): + """ + .. deprecated:: 8.2 + Will be removed in Click 9.0. Use ``Group`` instead. + """ + + +class CommandCollection(Group): + """A :class:`Group` that looks up subcommands on other groups. If a command + is not found on this group, each registered source is checked in order. + Parameters on a source are not added to this group, and a source's callback + is not invoked when invoking its commands. In other words, this "flattens" + commands in many groups into this one group. + + :param name: The name of the group command. + :param sources: A list of :class:`Group` objects to look up commands from. + :param kwargs: Other arguments passed to :class:`Group`. + + .. versionchanged:: 8.2 + This is a subclass of ``Group``. Commands are looked up first on this + group, then each of its sources. + """ + + def __init__( + self, + name: str | None = None, + sources: list[Group] | None = None, + **kwargs: t.Any, + ) -> None: + super().__init__(name, **kwargs) + #: The list of registered groups. + self.sources: list[Group] = sources or [] + + def add_source(self, group: Group) -> None: + """Add a group as a source of commands.""" + self.sources.append(group) + + def get_command(self, ctx: Context, cmd_name: str) -> Command | None: + rv = super().get_command(ctx, cmd_name) + + if rv is not None: + return rv + + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + + if rv is not None: + if self.chain: + _check_nested_chain(self, cmd_name, rv) + + return rv + + return None + + def list_commands(self, ctx: Context) -> list[str]: + rv: set[str] = set(super().list_commands(ctx)) + + for source in self.sources: + rv.update(source.list_commands(ctx)) + + return sorted(rv) + + +def _check_iter(value: t.Any) -> cabc.Iterator[t.Any]: + """Check if the value is iterable but not a string. Raises a type + error, or return an iterator over the value. + """ + if isinstance(value, str): + raise TypeError + + return iter(value) + + +class Parameter: + r"""A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + :param param_decls: the parameter declarations for this option or + argument. This is a list of flags or argument + names. + :param type: the type that should be used. Either a :class:`ParamType` + or a Python type. The latter is converted into the former + automatically if supported. + :param required: controls if this is optional or not. + :param default: the default value if omitted. This can also be a callable, + in which case it's invoked when the default is needed + without any arguments. + :param callback: A function to further process or validate the value + after type conversion. It is called as ``f(ctx, param, value)`` + and must return the value. It is called for all sources, + including prompts. + :param nargs: the number of arguments to match. If not ``1`` the return + value is a tuple instead of single value. The default for + nargs is ``1`` (except if the type is a tuple, then it's + the arity of the tuple). If ``nargs=-1``, all remaining + parameters are collected. + :param metavar: how the value is represented in the help page. + :param expose_value: if this is `True` then the value is passed onwards + to the command callback and stored on the context, + otherwise it's skipped. + :param is_eager: eager values are processed before non eager ones. This + should not be set for arguments or it will inverse the + order of processing. + :param envvar: environment variable(s) that are used to provide a default value for + this parameter. This can be a string or a sequence of strings. If a sequence is + given, only the first non-empty environment variable is used for the parameter. + :param shell_complete: A function that returns custom shell + completions. Used instead of the param's type completion if + given. Takes ``ctx, param, incomplete`` and must return a list + of :class:`~click.shell_completion.CompletionItem` or a list of + strings. + :param deprecated: If ``True`` or non-empty string, issues a message + indicating that the argument is deprecated and highlights + its deprecation in --help. The message can be customized + by using a string as the value. A deprecated parameter + cannot be required, a ValueError will be raised otherwise. + + .. versionchanged:: 8.2.0 + Introduction of ``deprecated``. + + .. versionchanged:: 8.2 + Adding duplicate parameter names to a :class:`~click.core.Command` will + result in a ``UserWarning`` being shown. + + .. versionchanged:: 8.2 + Adding duplicate parameter names to a :class:`~click.core.Command` will + result in a ``UserWarning`` being shown. + + .. versionchanged:: 8.0 + ``process_value`` validates required parameters and bounded + ``nargs``, and invokes the parameter callback before returning + the value. This allows the callback to validate prompts. + ``full_process_value`` is removed. + + .. versionchanged:: 8.0 + ``autocompletion`` is renamed to ``shell_complete`` and has new + semantics described above. The old name is deprecated and will + be removed in 8.1, until then it will be wrapped to match the + new requirements. + + .. versionchanged:: 8.0 + For ``multiple=True, nargs>1``, the default must be a list of + tuples. + + .. versionchanged:: 8.0 + Setting a default is no longer required for ``nargs>1``, it will + default to ``None``. ``multiple=True`` or ``nargs=-1`` will + default to ``()``. + + .. versionchanged:: 7.1 + Empty environment variables are ignored rather than taking the + empty string value. This makes it possible for scripts to clear + variables if they can't unset them. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. The old callback format will still work, but it will + raise a warning to give you a chance to migrate the code easier. + """ + + param_type_name = "parameter" + + def __init__( + self, + param_decls: cabc.Sequence[str] | None = None, + type: types.ParamType | t.Any | None = None, + required: bool = False, + # XXX The default historically embed two concepts: + # - the declaration of a Parameter object carrying the default (handy to + # arbitrage the default value of coupled Parameters sharing the same + # self.name, like flag options), + # - and the actual value of the default. + # It is confusing and is the source of many issues discussed in: + # https://github.com/pallets/click/pull/3030 + # In the future, we might think of splitting it in two, not unlike + # Option.is_flag and Option.flag_value: we could have something like + # Parameter.is_default and Parameter.default_value. + default: t.Any | t.Callable[[], t.Any] | None = UNSET, + callback: t.Callable[[Context, Parameter, t.Any], t.Any] | None = None, + nargs: int | None = None, + multiple: bool = False, + metavar: str | None = None, + expose_value: bool = True, + is_eager: bool = False, + envvar: str | cabc.Sequence[str] | None = None, + shell_complete: t.Callable[ + [Context, Parameter, str], list[CompletionItem] | list[str] + ] + | None = None, + deprecated: bool | str = False, + ) -> None: + self.name: str | None + self.opts: list[str] + self.secondary_opts: list[str] + self.name, self.opts, self.secondary_opts = self._parse_decls( + param_decls or (), expose_value + ) + self.type: types.ParamType = types.convert_type(type, default) + + # Default nargs to what the type tells us if we have that + # information available. + if nargs is None: + if self.type.is_composite: + nargs = self.type.arity + else: + nargs = 1 + + self.required = required + self.callback = callback + self.nargs = nargs + self.multiple = multiple + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + self._custom_shell_complete = shell_complete + self.deprecated = deprecated + + if __debug__: + if self.type.is_composite and nargs != self.type.arity: + raise ValueError( + f"'nargs' must be {self.type.arity} (or None) for" + f" type {self.type!r}, but it was {nargs}." + ) + + if required and deprecated: + raise ValueError( + f"The {self.param_type_name} '{self.human_readable_name}' " + "is deprecated and still required. A deprecated " + f"{self.param_type_name} cannot be required." + ) + + def to_info_dict(self) -> dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionchanged:: 8.3.0 + Returns ``None`` for the :attr:`default` if it was not set. + + .. versionadded:: 8.0 + """ + return { + "name": self.name, + "param_type_name": self.param_type_name, + "opts": self.opts, + "secondary_opts": self.secondary_opts, + "type": self.type.to_info_dict(), + "required": self.required, + "nargs": self.nargs, + "multiple": self.multiple, + # We explicitly hide the :attr:`UNSET` value to the user, as we choose to + # make it an implementation detail. And because ``to_info_dict`` has been + # designed for documentation purposes, we return ``None`` instead. + "default": self.default if self.default is not UNSET else None, + "envvar": self.envvar, + } + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def _parse_decls( + self, decls: cabc.Sequence[str], expose_value: bool + ) -> tuple[str | None, list[str], list[str]]: + raise NotImplementedError() + + @property + def human_readable_name(self) -> str: + """Returns the human readable name of this parameter. This is the + same as the name for options, but the metavar for arguments. + """ + return self.name # type: ignore + + def make_metavar(self, ctx: Context) -> str: + if self.metavar is not None: + return self.metavar + + metavar = self.type.get_metavar(param=self, ctx=ctx) + + if metavar is None: + metavar = self.type.name.upper() + + if self.nargs != 1: + metavar += "..." + + return metavar + + @t.overload + def get_default( + self, ctx: Context, call: t.Literal[True] = True + ) -> t.Any | None: ... + + @t.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Any | t.Callable[[], t.Any] | None: ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Any | t.Callable[[], t.Any] | None: + """Get the default for the parameter. Tries + :meth:`Context.lookup_default` first, then the local default. + + :param ctx: Current context. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0.2 + Type casting is no longer performed when getting a default. + + .. versionchanged:: 8.0.1 + Type casting can fail in resilient parsing mode. Invalid + defaults will not prevent showing help text. + + .. versionchanged:: 8.0 + Looks at ``ctx.default_map`` first. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + value = ctx.lookup_default(self.name, call=False) # type: ignore + + if value is UNSET: + value = self.default + + if call and callable(value): + value = value() + + return value + + def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: + raise NotImplementedError() + + def consume_value( + self, ctx: Context, opts: cabc.Mapping[str, t.Any] + ) -> tuple[t.Any, ParameterSource]: + """Returns the parameter value produced by the parser. + + If the parser did not produce a value from user input, the value is either + sourced from the environment variable, the default map, or the parameter's + default value. In that order of precedence. + + If no value is found, an internal sentinel value is returned. + + :meta private: + """ + # Collect from the parse the value passed by the user to the CLI. + value = opts.get(self.name, UNSET) # type: ignore + # If the value is set, it means it was sourced from the command line by the + # parser, otherwise it left unset by default. + source = ( + ParameterSource.COMMANDLINE + if value is not UNSET + else ParameterSource.DEFAULT + ) + + if value is UNSET: + envvar_value = self.value_from_envvar(ctx) + if envvar_value is not None: + value = envvar_value + source = ParameterSource.ENVIRONMENT + + if value is UNSET: + default_map_value = ctx.lookup_default(self.name) # type: ignore + if default_map_value is not UNSET: + value = default_map_value + source = ParameterSource.DEFAULT_MAP + + if value is UNSET: + default_value = self.get_default(ctx) + if default_value is not UNSET: + value = default_value + source = ParameterSource.DEFAULT + + return value, source + + def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: + """Convert and validate a value against the parameter's + :attr:`type`, :attr:`multiple`, and :attr:`nargs`. + """ + if value in (None, UNSET): + if self.multiple or self.nargs == -1: + return () + else: + return value + + def check_iter(value: t.Any) -> cabc.Iterator[t.Any]: + try: + return _check_iter(value) + except TypeError: + # This should only happen when passing in args manually, + # the parser should construct an iterable when parsing + # the command line. + raise BadParameter( + _("Value must be an iterable."), ctx=ctx, param=self + ) from None + + # Define the conversion function based on nargs and type. + + if self.nargs == 1 or self.type.is_composite: + + def convert(value: t.Any) -> t.Any: + return self.type(value, param=self, ctx=ctx) + + elif self.nargs == -1: + + def convert(value: t.Any) -> t.Any: # tuple[t.Any, ...] + return tuple(self.type(x, self, ctx) for x in check_iter(value)) + + else: # nargs > 1 + + def convert(value: t.Any) -> t.Any: # tuple[t.Any, ...] + value = tuple(check_iter(value)) + + if len(value) != self.nargs: + raise BadParameter( + ngettext( + "Takes {nargs} values but 1 was given.", + "Takes {nargs} values but {len} were given.", + len(value), + ).format(nargs=self.nargs, len=len(value)), + ctx=ctx, + param=self, + ) + + return tuple(self.type(x, self, ctx) for x in value) + + if self.multiple: + return tuple(convert(x) for x in check_iter(value)) + + return convert(value) + + def value_is_missing(self, value: t.Any) -> bool: + """A value is considered missing if: + + - it is :attr:`UNSET`, + - or if it is an empty sequence while the parameter is suppose to have + non-single value (i.e. :attr:`nargs` is not ``1`` or :attr:`multiple` is + set). + + :meta private: + """ + if value is UNSET: + return True + + if (self.nargs != 1 or self.multiple) and value == (): + return True + + return False + + def process_value(self, ctx: Context, value: t.Any) -> t.Any: + """Process the value of this parameter: + + 1. Type cast the value using :meth:`type_cast_value`. + 2. Check if the value is missing (see: :meth:`value_is_missing`), and raise + :exc:`MissingParameter` if it is required. + 3. If a :attr:`callback` is set, call it to have the value replaced by the + result of the callback. If the value was not set, the callback receive + ``None``. This keep the legacy behavior as it was before the introduction of + the :attr:`UNSET` sentinel. + + :meta private: + """ + value = self.type_cast_value(ctx, value) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + if self.callback is not None: + # Legacy case: UNSET is not exposed directly to the callback, but converted + # to None. + if value is UNSET: + value = None + value = self.callback(ctx, self, value) + + return value + + def resolve_envvar_value(self, ctx: Context) -> str | None: + """Returns the value found in the environment variable(s) attached to this + parameter. + + Environment variables values are `always returned as strings + `_. + + This method returns ``None`` if: + + - the :attr:`envvar` property is not set on the :class:`Parameter`, + - the environment variable is not found in the environment, + - the variable is found in the environment but its value is empty (i.e. the + environment variable is present but has an empty string). + + If :attr:`envvar` is setup with multiple environment variables, + then only the first non-empty value is returned. + + .. caution:: + + The raw value extracted from the environment is not normalized and is + returned as-is. Any normalization or reconciliation is performed later by + the :class:`Parameter`'s :attr:`type`. + + :meta private: + """ + if not self.envvar: + return None + + if isinstance(self.envvar, str): + rv = os.environ.get(self.envvar) + + if rv: + return rv + else: + for envvar in self.envvar: + rv = os.environ.get(envvar) + + # Return the first non-empty value of the list of environment variables. + if rv: + return rv + # Else, absence of value is interpreted as an environment variable that + # is not set, so proceed to the next one. + + return None + + def value_from_envvar(self, ctx: Context) -> str | cabc.Sequence[str] | None: + """Process the raw environment variable string for this parameter. + + Returns the string as-is or splits it into a sequence of strings if the + parameter is expecting multiple values (i.e. its :attr:`nargs` property is set + to a value other than ``1``). + + :meta private: + """ + rv = self.resolve_envvar_value(ctx) + + if rv is not None and self.nargs != 1: + return self.type.split_envvar_value(rv) + + return rv + + def handle_parse_result( + self, ctx: Context, opts: cabc.Mapping[str, t.Any], args: list[str] + ) -> tuple[t.Any, list[str]]: + """Process the value produced by the parser from user input. + + Always process the value through the Parameter's :attr:`type`, wherever it + comes from. + + If the parameter is deprecated, this method warn the user about it. But only if + the value has been explicitly set by the user (and as such, is not coming from + a default). + + :meta private: + """ + with augment_usage_errors(ctx, param=self): + value, source = self.consume_value(ctx, opts) + + ctx.set_parameter_source(self.name, source) # type: ignore + + # Display a deprecation warning if necessary. + if ( + self.deprecated + and value is not UNSET + and source not in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) + ): + extra_message = ( + f" {self.deprecated}" if isinstance(self.deprecated, str) else "" + ) + message = _( + "DeprecationWarning: The {param_type} {name!r} is deprecated." + "{extra_message}" + ).format( + param_type=self.param_type_name, + name=self.human_readable_name, + extra_message=extra_message, + ) + echo(style(message, fg="red"), err=True) + + # Process the value through the parameter's type. + try: + value = self.process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + # In resilient parsing mode, we do not want to fail the command if the + # value is incompatible with the parameter type, so we reset the value + # to UNSET, which will be interpreted as a missing value. + value = UNSET + + # Add parameter's value to the context. + if ( + self.expose_value + # We skip adding the value if it was previously set by another parameter + # targeting the same variable name. This prevents parameters competing for + # the same name to override each other. + and self.name not in ctx.params + ): + # Click is logically enforcing that the name is None if the parameter is + # not to be exposed. We still assert it here to please the type checker. + assert self.name is not None, ( + f"{self!r} parameter's name should not be None when exposing value." + ) + # Normalize UNSET values to None, as we're about to pass them to the + # command function and move them to the pure-Python realm of user-written + # code. + ctx.params[self.name] = value if value is not UNSET else None + + return value, args + + def get_help_record(self, ctx: Context) -> tuple[str, str] | None: + pass + + def get_usage_pieces(self, ctx: Context) -> list[str]: + return [] + + def get_error_hint(self, ctx: Context) -> str: + """Get a stringified version of the param for use in error messages to + indicate which param caused the error. + """ + hint_list = self.opts or [self.human_readable_name] + return " / ".join(f"'{x}'" for x in hint_list) + + def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: + """Return a list of completions for the incomplete value. If a + ``shell_complete`` function was given during init, it is used. + Otherwise, the :attr:`type` + :meth:`~click.types.ParamType.shell_complete` function is used. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + if self._custom_shell_complete is not None: + results = self._custom_shell_complete(ctx, self, incomplete) + + if results and isinstance(results[0], str): + from click.shell_completion import CompletionItem + + results = [CompletionItem(c) for c in results] + + return t.cast("list[CompletionItem]", results) + + return self.type.shell_complete(ctx, self, incomplete) + + +class Option(Parameter): + """Options are usually optional values on the command line and + have some extra features that arguments don't have. + + All other parameters are passed onwards to the parameter constructor. + + :param show_default: Show the default value for this option in its + help text. Values are not shown by default, unless + :attr:`Context.show_default` is ``True``. If this value is a + string, it shows that string in parentheses instead of the + actual value. This is particularly useful for dynamic options. + For single option boolean flags, the default remains hidden if + its value is ``False``. + :param show_envvar: Controls if an environment variable should be + shown on the help page and error messages. + Normally, environment variables are not shown. + :param prompt: If set to ``True`` or a non empty string then the + user will be prompted for input. If set to ``True`` the prompt + will be the option name capitalized. A deprecated option cannot be + prompted. + :param confirmation_prompt: Prompt a second time to confirm the + value if it was prompted for. Can be set to a string instead of + ``True`` to customize the message. + :param prompt_required: If set to ``False``, the user will be + prompted for input only when the option was specified as a flag + without a value. + :param hide_input: If this is ``True`` then the input on the prompt + will be hidden from the user. This is useful for password input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + :param hidden: hide this option from help outputs. + :param attrs: Other command arguments described in :class:`Parameter`. + + .. versionchanged:: 8.2 + ``envvar`` used with ``flag_value`` will always use the ``flag_value``, + previously it would use the value of the environment variable. + + .. versionchanged:: 8.1 + Help text indentation is cleaned here instead of only in the + ``@option`` decorator. + + .. versionchanged:: 8.1 + The ``show_default`` parameter overrides + ``Context.show_default``. + + .. versionchanged:: 8.1 + The default of a single option boolean flag is not shown if the + default value is ``False``. + + .. versionchanged:: 8.0.1 + ``type`` is detected from ``flag_value`` if given. + """ + + param_type_name = "option" + + def __init__( + self, + param_decls: cabc.Sequence[str] | None = None, + show_default: bool | str | None = None, + prompt: bool | str = False, + confirmation_prompt: bool | str = False, + prompt_required: bool = True, + hide_input: bool = False, + is_flag: bool | None = None, + flag_value: t.Any = UNSET, + multiple: bool = False, + count: bool = False, + allow_from_autoenv: bool = True, + type: types.ParamType | t.Any | None = None, + help: str | None = None, + hidden: bool = False, + show_choices: bool = True, + show_envvar: bool = False, + deprecated: bool | str = False, + **attrs: t.Any, + ) -> None: + if help: + help = inspect.cleandoc(help) + + super().__init__( + param_decls, type=type, multiple=multiple, deprecated=deprecated, **attrs + ) + + if prompt is True: + if self.name is None: + raise TypeError("'name' is required with 'prompt=True'.") + + prompt_text: str | None = self.name.replace("_", " ").capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + + if deprecated: + deprecated_message = ( + f"(DEPRECATED: {deprecated})" + if isinstance(deprecated, str) + else "(DEPRECATED)" + ) + help = help + deprecated_message if help is not None else deprecated_message + + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.prompt_required = prompt_required + self.hide_input = hide_input + self.hidden = hidden + + # The _flag_needs_value property tells the parser that this option is a flag + # that cannot be used standalone and needs a value. With this information, the + # parser can determine whether to consider the next user-provided argument in + # the CLI as a value for this flag or as a new option. + # If prompt is enabled but not required, then it opens the possibility for the + # option to gets its value from the user. + self._flag_needs_value = self.prompt is not None and not self.prompt_required + + # Auto-detect if this is a flag or not. + if is_flag is None: + # Implicitly a flag because flag_value was set. + if flag_value is not UNSET: + is_flag = True + # Not a flag, but when used as a flag it shows a prompt. + elif self._flag_needs_value: + is_flag = False + # Implicitly a flag because secondary options names were given. + elif self.secondary_opts: + is_flag = True + # The option is explicitly not a flag. But we do not know yet if it needs a + # value or not. So we look at the default value to determine it. + elif is_flag is False and not self._flag_needs_value: + self._flag_needs_value = self.default is UNSET + + if is_flag: + # Set missing default for flags if not explicitly required or prompted. + if self.default is UNSET and not self.required and not self.prompt: + if multiple: + self.default = () + + # Auto-detect the type of the flag based on the flag_value. + if type is None: + # A flag without a flag_value is a boolean flag. + if flag_value is UNSET: + self.type = types.BoolParamType() + # If the flag value is a boolean, use BoolParamType. + elif isinstance(flag_value, bool): + self.type = types.BoolParamType() + # Otherwise, guess the type from the flag value. + else: + self.type = types.convert_type(None, flag_value) + + self.is_flag: bool = bool(is_flag) + self.is_bool_flag: bool = bool( + is_flag and isinstance(self.type, types.BoolParamType) + ) + self.flag_value: t.Any = flag_value + + # Set boolean flag default to False if unset and not required. + if self.is_bool_flag: + if self.default is UNSET and not self.required: + self.default = False + + # Support the special case of aligning the default value with the flag_value + # for flags whose default is explicitly set to True. Note that as long as we + # have this condition, there is no way a flag can have a default set to True, + # and a flag_value set to something else. Refs: + # https://github.com/pallets/click/issues/3024#issuecomment-3146199461 + # https://github.com/pallets/click/pull/3030/commits/06847da + if self.default is True and self.flag_value is not UNSET: + self.default = self.flag_value + + # Set the default flag_value if it is not set. + if self.flag_value is UNSET: + if self.is_flag: + self.flag_value = True + else: + self.flag_value = None + + # Counting. + self.count = count + if count: + if type is None: + self.type = types.IntRange(min=0) + if self.default is UNSET: + self.default = 0 + + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + self.show_choices = show_choices + self.show_envvar = show_envvar + + if __debug__: + if deprecated and prompt: + raise ValueError("`deprecated` options cannot use `prompt`.") + + if self.nargs == -1: + raise TypeError("nargs=-1 is not supported for options.") + + if not self.is_bool_flag and self.secondary_opts: + raise TypeError("Secondary flag is not valid for non-boolean flag.") + + if self.is_bool_flag and self.hide_input and self.prompt is not None: + raise TypeError( + "'prompt' with 'hide_input' is not valid for boolean flag." + ) + + if self.count: + if self.multiple: + raise TypeError("'count' is not valid with 'multiple'.") + + if self.is_flag: + raise TypeError("'count' is not valid with 'is_flag'.") + + def to_info_dict(self) -> dict[str, t.Any]: + """ + .. versionchanged:: 8.3.0 + Returns ``None`` for the :attr:`flag_value` if it was not set. + """ + info_dict = super().to_info_dict() + info_dict.update( + help=self.help, + prompt=self.prompt, + is_flag=self.is_flag, + # We explicitly hide the :attr:`UNSET` value to the user, as we choose to + # make it an implementation detail. And because ``to_info_dict`` has been + # designed for documentation purposes, we return ``None`` instead. + flag_value=self.flag_value if self.flag_value is not UNSET else None, + count=self.count, + hidden=self.hidden, + ) + return info_dict + + def get_error_hint(self, ctx: Context) -> str: + result = super().get_error_hint(ctx) + if self.show_envvar and self.envvar is not None: + result += f" (env var: '{self.envvar}')" + return result + + def _parse_decls( + self, decls: cabc.Sequence[str], expose_value: bool + ) -> tuple[str | None, list[str], list[str]]: + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if decl.isidentifier(): + if name is not None: + raise TypeError(f"Name '{name}' defined twice") + name = decl + else: + split_char = ";" if decl[:1] == "/" else "/" + if split_char in decl: + first, second = decl.split(split_char, 1) + first = first.rstrip() + if first: + possible_names.append(_split_opt(first)) + opts.append(first) + second = second.lstrip() + if second: + secondary_opts.append(second.lstrip()) + if first == second: + raise ValueError( + f"Boolean option {decl!r} cannot use the" + " same flag for true/false." + ) + else: + possible_names.append(_split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: -len(x[0])) # group long options first + name = possible_names[0][1].replace("-", "_").lower() + if not name.isidentifier(): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError( + f"Could not determine name for option with declarations {decls!r}" + ) + + if not opts and not secondary_opts: + raise TypeError( + f"No options defined but a name was passed ({name})." + " Did you mean to declare an argument instead? Did" + f" you mean to pass '--{name}'?" + ) + + return name, opts, secondary_opts + + def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: + if self.multiple: + action = "append" + elif self.count: + action = "count" + else: + action = "store" + + if self.is_flag: + action = f"{action}_const" + + if self.is_bool_flag and self.secondary_opts: + parser.add_option( + obj=self, opts=self.opts, dest=self.name, action=action, const=True + ) + parser.add_option( + obj=self, + opts=self.secondary_opts, + dest=self.name, + action=action, + const=False, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + const=self.flag_value, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + nargs=self.nargs, + ) + + def get_help_record(self, ctx: Context) -> tuple[str, str] | None: + if self.hidden: + return None + + any_prefix_is_slash = False + + def _write_opts(opts: cabc.Sequence[str]) -> str: + nonlocal any_prefix_is_slash + + rv, any_slashes = join_options(opts) + + if any_slashes: + any_prefix_is_slash = True + + if not self.is_flag and not self.count: + rv += f" {self.make_metavar(ctx=ctx)}" + + return rv + + rv = [_write_opts(self.opts)] + + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or "" + + extra = self.get_help_extra(ctx) + extra_items = [] + if "envvars" in extra: + extra_items.append( + _("env var: {var}").format(var=", ".join(extra["envvars"])) + ) + if "default" in extra: + extra_items.append(_("default: {default}").format(default=extra["default"])) + if "range" in extra: + extra_items.append(extra["range"]) + if "required" in extra: + extra_items.append(_(extra["required"])) + + if extra_items: + extra_str = "; ".join(extra_items) + help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" + + return ("; " if any_prefix_is_slash else " / ").join(rv), help + + def get_help_extra(self, ctx: Context) -> types.OptionHelpExtra: + extra: types.OptionHelpExtra = {} + + if self.show_envvar: + envvar = self.envvar + + if envvar is None: + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + + if envvar is not None: + if isinstance(envvar, str): + extra["envvars"] = (envvar,) + else: + extra["envvars"] = tuple(str(d) for d in envvar) + + # Temporarily enable resilient parsing to avoid type casting + # failing for the default. Might be possible to extend this to + # help formatting in general. + resilient = ctx.resilient_parsing + ctx.resilient_parsing = True + + try: + default_value = self.get_default(ctx, call=False) + finally: + ctx.resilient_parsing = resilient + + show_default = False + show_default_is_str = False + + if self.show_default is not None: + if isinstance(self.show_default, str): + show_default_is_str = show_default = True + else: + show_default = self.show_default + elif ctx.show_default is not None: + show_default = ctx.show_default + + if show_default_is_str or ( + show_default and (default_value not in (None, UNSET)) + ): + if show_default_is_str: + default_string = f"({self.show_default})" + elif isinstance(default_value, (list, tuple)): + default_string = ", ".join(str(d) for d in default_value) + elif isinstance(default_value, enum.Enum): + default_string = default_value.name + elif inspect.isfunction(default_value): + default_string = _("(dynamic)") + elif self.is_bool_flag and self.secondary_opts: + # For boolean flags that have distinct True/False opts, + # use the opt without prefix instead of the value. + default_string = _split_opt( + (self.opts if default_value else self.secondary_opts)[0] + )[1] + elif self.is_bool_flag and not self.secondary_opts and not default_value: + default_string = "" + elif default_value == "": + default_string = '""' + else: + default_string = str(default_value) + + if default_string: + extra["default"] = default_string + + if ( + isinstance(self.type, types._NumberRangeBase) + # skip count with default range type + and not (self.count and self.type.min == 0 and self.type.max is None) + ): + range_str = self.type._describe_range() + + if range_str: + extra["range"] = range_str + + if self.required: + extra["required"] = "required" + + return extra + + def prompt_for_value(self, ctx: Context) -> t.Any: + """This is an alternative flow that can be activated in the full + value processing if a value does not exist. It will prompt the + user until a valid value exists and then returns the processed + value as result. + """ + assert self.prompt is not None + + # Calculate the default before prompting anything to lock in the value before + # attempting any user interaction. + default = self.get_default(ctx) + + # A boolean flag can use a simplified [y/n] confirmation prompt. + if self.is_bool_flag: + # If we have no boolean default, we force the user to explicitly provide + # one. + if default in (UNSET, None): + default = None + # Nothing prevent you to declare an option that is simultaneously: + # 1) auto-detected as a boolean flag, + # 2) allowed to prompt, and + # 3) still declare a non-boolean default. + # This forced casting into a boolean is necessary to align any non-boolean + # default to the prompt, which is going to be a [y/n]-style confirmation + # because the option is still a boolean flag. That way, instead of [y/n], + # we get [Y/n] or [y/N] depending on the truthy value of the default. + # Refs: https://github.com/pallets/click/pull/3030#discussion_r2289180249 + else: + default = bool(default) + return confirm(self.prompt, default) + + # If show_default is set to True/False, provide this to `prompt` as well. For + # non-bool values of `show_default`, we use `prompt`'s default behavior + prompt_kwargs: t.Any = {} + if isinstance(self.show_default, bool): + prompt_kwargs["show_default"] = self.show_default + + return prompt( + self.prompt, + # Use ``None`` to inform the prompt() function to reiterate until a valid + # value is provided by the user if we have no default. + default=None if default is UNSET else default, + type=self.type, + hide_input=self.hide_input, + show_choices=self.show_choices, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x), + **prompt_kwargs, + ) + + def resolve_envvar_value(self, ctx: Context) -> str | None: + """:class:`Option` resolves its environment variable the same way as + :func:`Parameter.resolve_envvar_value`, but it also supports + :attr:`Context.auto_envvar_prefix`. If we could not find an environment from + the :attr:`envvar` property, we fallback on :attr:`Context.auto_envvar_prefix` + to build dynamiccaly the environment variable name using the + :python:`{ctx.auto_envvar_prefix}_{self.name.upper()}` template. + + :meta private: + """ + rv = super().resolve_envvar_value(ctx) + + if rv is not None: + return rv + + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Any: + """For :class:`Option`, this method processes the raw environment variable + string the same way as :func:`Parameter.value_from_envvar` does. + + But in the case of non-boolean flags, the value is analyzed to determine if the + flag is activated or not, and returns a boolean of its activation, or the + :attr:`flag_value` if the latter is set. + + This method also takes care of repeated options (i.e. options with + :attr:`multiple` set to ``True``). + + :meta private: + """ + rv = self.resolve_envvar_value(ctx) + + # Absent environment variable or an empty string is interpreted as unset. + if rv is None: + return None + + # Non-boolean flags are more liberal in what they accept. But a flag being a + # flag, its envvar value still needs to be analyzed to determine if the flag is + # activated or not. + if self.is_flag and not self.is_bool_flag: + # If the flag_value is set and match the envvar value, return it + # directly. + if self.flag_value is not UNSET and rv == self.flag_value: + return self.flag_value + # Analyze the envvar value as a boolean to know if the flag is + # activated or not. + return types.BoolParamType.str_to_bool(rv) + + # Split the envvar value if it is allowed to be repeated. + value_depth = (self.nargs != 1) + bool(self.multiple) + if value_depth > 0: + multi_rv = self.type.split_envvar_value(rv) + if self.multiple and self.nargs != 1: + multi_rv = batch(multi_rv, self.nargs) # type: ignore[assignment] + + return multi_rv + + return rv + + def consume_value( + self, ctx: Context, opts: cabc.Mapping[str, Parameter] + ) -> tuple[t.Any, ParameterSource]: + """For :class:`Option`, the value can be collected from an interactive prompt + if the option is a flag that needs a value (and the :attr:`prompt` property is + set). + + Additionally, this method handles flag option that are activated without a + value, in which case the :attr:`flag_value` is returned. + + :meta private: + """ + value, source = super().consume_value(ctx, opts) + + # The parser will emit a sentinel value if the option is allowed to as a flag + # without a value. + if value is FLAG_NEEDS_VALUE: + # If the option allows for a prompt, we start an interaction with the user. + if self.prompt is not None and not ctx.resilient_parsing: + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + # Else the flag takes its flag_value as value. + else: + value = self.flag_value + source = ParameterSource.COMMANDLINE + + # A flag which is activated always returns the flag value, unless the value + # comes from the explicitly sets default. + elif ( + self.is_flag + and value is True + and not self.is_bool_flag + and source not in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) + ): + value = self.flag_value + + # Re-interpret a multiple option which has been sent as-is by the parser. + # Here we replace each occurrence of value-less flags (marked by the + # FLAG_NEEDS_VALUE sentinel) with the flag_value. + elif ( + self.multiple + and value is not UNSET + and source not in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) + and any(v is FLAG_NEEDS_VALUE for v in value) + ): + value = [self.flag_value if v is FLAG_NEEDS_VALUE else v for v in value] + source = ParameterSource.COMMANDLINE + + # The value wasn't set, or used the param's default, prompt for one to the user + # if prompting is enabled. + elif ( + ( + value is UNSET + or source in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) + ) + and self.prompt is not None + and (self.required or self.prompt_required) + and not ctx.resilient_parsing + ): + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + + return value, source + + def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: + if self.is_flag and not self.required: + if value is UNSET: + if self.is_bool_flag: + # If the flag is a boolean flag, we return False if it is not set. + value = False + return super().type_cast_value(ctx, value) + + +class Argument(Parameter): + """Arguments are positional parameters to a command. They generally + provide fewer features than options but can have infinite ``nargs`` + and are required by default. + + All parameters are passed onwards to the constructor of :class:`Parameter`. + """ + + param_type_name = "argument" + + def __init__( + self, + param_decls: cabc.Sequence[str], + required: bool | None = None, + **attrs: t.Any, + ) -> None: + # Auto-detect the requirement status of the argument if not explicitly set. + if required is None: + # The argument gets automatically required if it has no explicit default + # value set and is setup to match at least one value. + if attrs.get("default", UNSET) is UNSET: + required = attrs.get("nargs", 1) > 0 + # If the argument has a default value, it is not required. + else: + required = False + + if "multiple" in attrs: + raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") + + super().__init__(param_decls, required=required, **attrs) + + @property + def human_readable_name(self) -> str: + if self.metavar is not None: + return self.metavar + return self.name.upper() # type: ignore + + def make_metavar(self, ctx: Context) -> str: + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(param=self, ctx=ctx) + if not var: + var = self.name.upper() # type: ignore + if self.deprecated: + var += "!" + if not self.required: + var = f"[{var}]" + if self.nargs != 1: + var += "..." + return var + + def _parse_decls( + self, decls: cabc.Sequence[str], expose_value: bool + ) -> tuple[str | None, list[str], list[str]]: + if not decls: + if not expose_value: + return None, [], [] + raise TypeError("Argument is marked as exposed, but does not have a name.") + if len(decls) == 1: + name = arg = decls[0] + name = name.replace("-", "_").lower() + else: + raise TypeError( + "Arguments take exactly one parameter declaration, got" + f" {len(decls)}: {decls}." + ) + return name, [arg], [] + + def get_usage_pieces(self, ctx: Context) -> list[str]: + return [self.make_metavar(ctx)] + + def get_error_hint(self, ctx: Context) -> str: + return f"'{self.make_metavar(ctx)}'" + + def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: + parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) + + +def __getattr__(name: str) -> object: + import warnings + + if name == "BaseCommand": + warnings.warn( + "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Command' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _BaseCommand + + if name == "MultiCommand": + warnings.warn( + "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Group' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _MultiCommand + + raise AttributeError(name) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/decorators.py b/stripe_config/.venv/lib/python3.12/site-packages/click/decorators.py new file mode 100644 index 0000000..21f4c34 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/decorators.py @@ -0,0 +1,551 @@ +from __future__ import annotations + +import inspect +import typing as t +from functools import update_wrapper +from gettext import gettext as _ + +from .core import Argument +from .core import Command +from .core import Context +from .core import Group +from .core import Option +from .core import Parameter +from .globals import get_current_context +from .utils import echo + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") +T = t.TypeVar("T") +_AnyCallable = t.Callable[..., t.Any] +FC = t.TypeVar("FC", bound="_AnyCallable | Command") + + +def pass_context(f: t.Callable[te.Concatenate[Context, P], R]) -> t.Callable[P, R]: + """Marks a callback as wanting to receive the current context + object as first argument. + """ + + def new_func(*args: P.args, **kwargs: P.kwargs) -> R: + return f(get_current_context(), *args, **kwargs) + + return update_wrapper(new_func, f) + + +def pass_obj(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: + """Similar to :func:`pass_context`, but only pass the object on the + context onwards (:attr:`Context.obj`). This is useful if that object + represents the state of a nested system. + """ + + def new_func(*args: P.args, **kwargs: P.kwargs) -> R: + return f(get_current_context().obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + +def make_pass_decorator( + object_type: type[T], ensure: bool = False +) -> t.Callable[[t.Callable[te.Concatenate[T, P], R]], t.Callable[P, R]]: + """Given an object type this creates a decorator that will work + similar to :func:`pass_obj` but instead of passing the object of the + current context, it will find the innermost context of type + :func:`object_type`. + + This generates a decorator that works roughly like this:: + + from functools import update_wrapper + + def decorator(f): + @pass_context + def new_func(ctx, *args, **kwargs): + obj = ctx.find_object(object_type) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + :param object_type: the type of the object to pass. + :param ensure: if set to `True`, a new object will be created and + remembered on the context if it's not there yet. + """ + + def decorator(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: + def new_func(*args: P.args, **kwargs: P.kwargs) -> R: + ctx = get_current_context() + + obj: T | None + if ensure: + obj = ctx.ensure_object(object_type) + else: + obj = ctx.find_object(object_type) + + if obj is None: + raise RuntimeError( + "Managed to invoke callback without a context" + f" object of type {object_type.__name__!r}" + " existing." + ) + + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + return decorator + + +def pass_meta_key( + key: str, *, doc_description: str | None = None +) -> t.Callable[[t.Callable[te.Concatenate[T, P], R]], t.Callable[P, R]]: + """Create a decorator that passes a key from + :attr:`click.Context.meta` as the first argument to the decorated + function. + + :param key: Key in ``Context.meta`` to pass. + :param doc_description: Description of the object being passed, + inserted into the decorator's docstring. Defaults to "the 'key' + key from Context.meta". + + .. versionadded:: 8.0 + """ + + def decorator(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: + def new_func(*args: P.args, **kwargs: P.kwargs) -> R: + ctx = get_current_context() + obj = ctx.meta[key] + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + if doc_description is None: + doc_description = f"the {key!r} key from :attr:`click.Context.meta`" + + decorator.__doc__ = ( + f"Decorator that passes {doc_description} as the first argument" + " to the decorated function." + ) + return decorator + + +CmdType = t.TypeVar("CmdType", bound=Command) + + +# variant: no call, directly as decorator for a function. +@t.overload +def command(name: _AnyCallable) -> Command: ... + + +# variant: with positional name and with positional or keyword cls argument: +# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) +@t.overload +def command( + name: str | None, + cls: type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: ... + + +# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) +@t.overload +def command( + name: None = None, + *, + cls: type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def command( + name: str | None = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Command]: ... + + +def command( + name: str | _AnyCallable | None = None, + cls: type[CmdType] | None = None, + **attrs: t.Any, +) -> Command | t.Callable[[_AnyCallable], Command | CmdType]: + r"""Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function, converted to + lowercase, with underscores ``_`` replaced by dashes ``-``, and the suffixes + ``_command``, ``_cmd``, ``_group``, and ``_grp`` are removed. For example, + ``init_data_command`` becomes ``init-data``. + + All keyword arguments are forwarded to the underlying command class. + For the ``params`` argument, any decorated params are appended to + the end of the list. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: The name of the command. Defaults to modifying the function's + name as described above. + :param cls: The command class to create. Defaults to :class:`Command`. + + .. versionchanged:: 8.2 + The suffixes ``_command``, ``_cmd``, ``_group``, and ``_grp`` are + removed when generating the name. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.1 + The ``params`` argument can be used. Decorated params are + appended to the end of the list. + """ + + func: t.Callable[[_AnyCallable], t.Any] | None = None + + if callable(name): + func = name + name = None + assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." + assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." + + if cls is None: + cls = t.cast("type[CmdType]", Command) + + def decorator(f: _AnyCallable) -> CmdType: + if isinstance(f, Command): + raise TypeError("Attempted to convert a callback into a command twice.") + + attr_params = attrs.pop("params", None) + params = attr_params if attr_params is not None else [] + + try: + decorator_params = f.__click_params__ # type: ignore + except AttributeError: + pass + else: + del f.__click_params__ # type: ignore + params.extend(reversed(decorator_params)) + + if attrs.get("help") is None: + attrs["help"] = f.__doc__ + + if t.TYPE_CHECKING: + assert cls is not None + assert not callable(name) + + if name is not None: + cmd_name = name + else: + cmd_name = f.__name__.lower().replace("_", "-") + cmd_left, sep, suffix = cmd_name.rpartition("-") + + if sep and suffix in {"command", "cmd", "group", "grp"}: + cmd_name = cmd_left + + cmd = cls(name=cmd_name, callback=f, params=params, **attrs) + cmd.__doc__ = f.__doc__ + return cmd + + if func is not None: + return decorator(func) + + return decorator + + +GrpType = t.TypeVar("GrpType", bound=Group) + + +# variant: no call, directly as decorator for a function. +@t.overload +def group(name: _AnyCallable) -> Group: ... + + +# variant: with positional name and with positional or keyword cls argument: +# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) +@t.overload +def group( + name: str | None, + cls: type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: ... + + +# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) +@t.overload +def group( + name: None = None, + *, + cls: type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def group( + name: str | None = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Group]: ... + + +def group( + name: str | _AnyCallable | None = None, + cls: type[GrpType] | None = None, + **attrs: t.Any, +) -> Group | t.Callable[[_AnyCallable], Group | GrpType]: + """Creates a new :class:`Group` with a function as callback. This + works otherwise the same as :func:`command` just that the `cls` + parameter is set to :class:`Group`. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + """ + if cls is None: + cls = t.cast("type[GrpType]", Group) + + if callable(name): + return command(cls=cls, **attrs)(name) + + return command(name, cls, **attrs) + + +def _param_memo(f: t.Callable[..., t.Any], param: Parameter) -> None: + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, "__click_params__"): + f.__click_params__ = [] # type: ignore + + f.__click_params__.append(param) # type: ignore + + +def argument( + *param_decls: str, cls: type[Argument] | None = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """Attaches an argument to the command. All positional arguments are + passed as parameter declarations to :class:`Argument`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Argument` instance manually + and attaching it to the :attr:`Command.params` list. + + For the default argument class, refer to :class:`Argument` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Argument + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def option( + *param_decls: str, cls: type[Option] | None = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """Attaches an option to the command. All positional arguments are + passed as parameter declarations to :class:`Option`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Option` instance manually + and attaching it to the :attr:`Command.params` list. + + For the default option class, refer to :class:`Option` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Option + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--yes`` option which shows a prompt before continuing if + not passed. If the prompt is declined, the program will exit. + + :param param_decls: One or more option names. Defaults to the single + value ``"--yes"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value: + ctx.abort() + + if not param_decls: + param_decls = ("--yes",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("callback", callback) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("prompt", "Do you want to continue?") + kwargs.setdefault("help", "Confirm the action without prompting.") + return option(*param_decls, **kwargs) + + +def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--password`` option which prompts for a password, hiding + input and asking to enter the value again for confirmation. + + :param param_decls: One or more option names. Defaults to the single + value ``"--password"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + if not param_decls: + param_decls = ("--password",) + + kwargs.setdefault("prompt", True) + kwargs.setdefault("confirmation_prompt", True) + kwargs.setdefault("hide_input", True) + return option(*param_decls, **kwargs) + + +def version_option( + version: str | None = None, + *param_decls: str, + package_name: str | None = None, + prog_name: str | None = None, + message: str | None = None, + **kwargs: t.Any, +) -> t.Callable[[FC], FC]: + """Add a ``--version`` option which immediately prints the version + number and exits the program. + + If ``version`` is not provided, Click will try to detect it using + :func:`importlib.metadata.version` to get the version for the + ``package_name``. + + If ``package_name`` is not provided, Click will try to detect it by + inspecting the stack frames. This will be used to detect the + version, so it must match the name of the installed package. + + :param version: The version number to show. If not provided, Click + will try to detect it. + :param param_decls: One or more option names. Defaults to the single + value ``"--version"``. + :param package_name: The package name to detect the version from. If + not provided, Click will try to detect it. + :param prog_name: The name of the CLI to show in the message. If not + provided, it will be detected from the command. + :param message: The message to show. The values ``%(prog)s``, + ``%(package)s``, and ``%(version)s`` are available. Defaults to + ``"%(prog)s, version %(version)s"``. + :param kwargs: Extra arguments are passed to :func:`option`. + :raise RuntimeError: ``version`` could not be detected. + + .. versionchanged:: 8.0 + Add the ``package_name`` parameter, and the ``%(package)s`` + value for messages. + + .. versionchanged:: 8.0 + Use :mod:`importlib.metadata` instead of ``pkg_resources``. The + version is detected based on the package name, not the entry + point name. The Python package name must match the installed + package name, or be passed with ``package_name=``. + """ + if message is None: + message = _("%(prog)s, version %(version)s") + + if version is None and package_name is None: + frame = inspect.currentframe() + f_back = frame.f_back if frame is not None else None + f_globals = f_back.f_globals if f_back is not None else None + # break reference cycle + # https://docs.python.org/3/library/inspect.html#the-interpreter-stack + del frame + + if f_globals is not None: + package_name = f_globals.get("__name__") + + if package_name == "__main__": + package_name = f_globals.get("__package__") + + if package_name: + package_name = package_name.partition(".")[0] + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value or ctx.resilient_parsing: + return + + nonlocal prog_name + nonlocal version + + if prog_name is None: + prog_name = ctx.find_root().info_name + + if version is None and package_name is not None: + import importlib.metadata + + try: + version = importlib.metadata.version(package_name) + except importlib.metadata.PackageNotFoundError: + raise RuntimeError( + f"{package_name!r} is not installed. Try passing" + " 'package_name' instead." + ) from None + + if version is None: + raise RuntimeError( + f"Could not determine the version for {package_name!r} automatically." + ) + + echo( + message % {"prog": prog_name, "package": package_name, "version": version}, + color=ctx.color, + ) + ctx.exit() + + if not param_decls: + param_decls = ("--version",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show the version and exit.")) + kwargs["callback"] = callback + return option(*param_decls, **kwargs) + + +def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Pre-configured ``--help`` option which immediately prints the help page + and exits the program. + + :param param_decls: One or more option names. Defaults to the single + value ``"--help"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def show_help(ctx: Context, param: Parameter, value: bool) -> None: + """Callback that print the help page on ```` and exits.""" + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + if not param_decls: + param_decls = ("--help",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show this message and exit.")) + kwargs.setdefault("callback", show_help) + + return option(*param_decls, **kwargs) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/exceptions.py b/stripe_config/.venv/lib/python3.12/site-packages/click/exceptions.py new file mode 100644 index 0000000..4d782ee --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/exceptions.py @@ -0,0 +1,308 @@ +from __future__ import annotations + +import collections.abc as cabc +import typing as t +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import get_text_stderr +from .globals import resolve_color_default +from .utils import echo +from .utils import format_filename + +if t.TYPE_CHECKING: + from .core import Command + from .core import Context + from .core import Parameter + + +def _join_param_hints(param_hint: cabc.Sequence[str] | str | None) -> str | None: + if param_hint is not None and not isinstance(param_hint, str): + return " / ".join(repr(x) for x in param_hint) + + return param_hint + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception. + exit_code = 1 + + def __init__(self, message: str) -> None: + super().__init__(message) + # The context will be removed by the time we print the message, so cache + # the color settings here to be used later on (in `show`) + self.show_color: bool | None = resolve_color_default() + self.message = message + + def format_message(self) -> str: + return self.message + + def __str__(self) -> str: + return self.message + + def show(self, file: t.IO[t.Any] | None = None) -> None: + if file is None: + file = get_text_stderr() + + echo( + _("Error: {message}").format(message=self.format_message()), + file=file, + color=self.show_color, + ) + + +class UsageError(ClickException): + """An internal exception that signals a usage error. This typically + aborts any further handling. + + :param message: the error message to display. + :param ctx: optionally the context that caused this error. Click will + fill in the context automatically in some situations. + """ + + exit_code = 2 + + def __init__(self, message: str, ctx: Context | None = None) -> None: + super().__init__(message) + self.ctx = ctx + self.cmd: Command | None = self.ctx.command if self.ctx else None + + def show(self, file: t.IO[t.Any] | None = None) -> None: + if file is None: + file = get_text_stderr() + color = None + hint = "" + if ( + self.ctx is not None + and self.ctx.command.get_help_option(self.ctx) is not None + ): + hint = _("Try '{command} {option}' for help.").format( + command=self.ctx.command_path, option=self.ctx.help_option_names[0] + ) + hint = f"{hint}\n" + if self.ctx is not None: + color = self.ctx.color + echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) + echo( + _("Error: {message}").format(message=self.format_message()), + file=file, + color=color, + ) + + +class BadParameter(UsageError): + """An exception that formats out a standardized error message for a + bad parameter. This is useful when thrown from a callback or type as + Click will attach contextual information to it (for instance, which + parameter it is). + + .. versionadded:: 2.0 + + :param param: the parameter object that caused this error. This can + be left out, and Click will attach this info itself + if possible. + :param param_hint: a string that shows up as parameter name. This + can be used as alternative to `param` in cases + where custom validation should happen. If it is + a string it's used as such, if it's a list then + each item is quoted and separated. + """ + + def __init__( + self, + message: str, + ctx: Context | None = None, + param: Parameter | None = None, + param_hint: cabc.Sequence[str] | str | None = None, + ) -> None: + super().__init__(message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + return _("Invalid value: {message}").format(message=self.message) + + return _("Invalid value for {param_hint}: {message}").format( + param_hint=_join_param_hints(param_hint), message=self.message + ) + + +class MissingParameter(BadParameter): + """Raised if click required an option or argument but it was not + provided when invoking the script. + + .. versionadded:: 4.0 + + :param param_type: a string that indicates the type of the parameter. + The default is to inherit the parameter type from + the given `param`. Valid values are ``'parameter'``, + ``'option'`` or ``'argument'``. + """ + + def __init__( + self, + message: str | None = None, + ctx: Context | None = None, + param: Parameter | None = None, + param_hint: cabc.Sequence[str] | str | None = None, + param_type: str | None = None, + ) -> None: + super().__init__(message or "", ctx, param, param_hint) + self.param_type = param_type + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint: cabc.Sequence[str] | str | None = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + param_hint = None + + param_hint = _join_param_hints(param_hint) + param_hint = f" {param_hint}" if param_hint else "" + + param_type = self.param_type + if param_type is None and self.param is not None: + param_type = self.param.param_type_name + + msg = self.message + if self.param is not None: + msg_extra = self.param.type.get_missing_message( + param=self.param, ctx=self.ctx + ) + if msg_extra: + if msg: + msg += f". {msg_extra}" + else: + msg = msg_extra + + msg = f" {msg}" if msg else "" + + # Translate param_type for known types. + if param_type == "argument": + missing = _("Missing argument") + elif param_type == "option": + missing = _("Missing option") + elif param_type == "parameter": + missing = _("Missing parameter") + else: + missing = _("Missing {param_type}").format(param_type=param_type) + + return f"{missing}{param_hint}.{msg}" + + def __str__(self) -> str: + if not self.message: + param_name = self.param.name if self.param else None + return _("Missing parameter: {param_name}").format(param_name=param_name) + else: + return self.message + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__( + self, + option_name: str, + message: str | None = None, + possibilities: cabc.Sequence[str] | None = None, + ctx: Context | None = None, + ) -> None: + if message is None: + message = _("No such option: {name}").format(name=option_name) + + super().__init__(message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self) -> str: + if not self.possibilities: + return self.message + + possibility_str = ", ".join(sorted(self.possibilities)) + suggest = ngettext( + "Did you mean {possibility}?", + "(Possible options: {possibilities})", + len(self.possibilities), + ).format(possibility=possibility_str, possibilities=possibility_str) + return f"{self.message} {suggest}" + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + + :param option_name: the name of the option being used incorrectly. + """ + + def __init__( + self, option_name: str, message: str, ctx: Context | None = None + ) -> None: + super().__init__(message, ctx) + self.option_name = option_name + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + +class NoArgsIsHelpError(UsageError): + def __init__(self, ctx: Context) -> None: + self.ctx: Context + super().__init__(ctx.get_help(), ctx=ctx) + + def show(self, file: t.IO[t.Any] | None = None) -> None: + echo(self.format_message(), file=file, err=True, color=self.ctx.color) + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename: str, hint: str | None = None) -> None: + if hint is None: + hint = _("unknown error") + + super().__init__(hint) + self.ui_filename: str = format_filename(filename) + self.filename = filename + + def format_message(self) -> str: + return _("Could not open file {filename!r}: {message}").format( + filename=self.ui_filename, message=self.message + ) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" + + +class Exit(RuntimeError): + """An exception that indicates that the application should exit with some + status code. + + :param code: the status code to exit with. + """ + + __slots__ = ("exit_code",) + + def __init__(self, code: int = 0) -> None: + self.exit_code: int = code diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/formatting.py b/stripe_config/.venv/lib/python3.12/site-packages/click/formatting.py new file mode 100644 index 0000000..0b64f83 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/formatting.py @@ -0,0 +1,301 @@ +from __future__ import annotations + +import collections.abc as cabc +from contextlib import contextmanager +from gettext import gettext as _ + +from ._compat import term_len +from .parser import _split_opt + +# Can force a width. This is used by the test system +FORCED_WIDTH: int | None = None + + +def measure_table(rows: cabc.Iterable[tuple[str, str]]) -> tuple[int, ...]: + widths: dict[int, int] = {} + + for row in rows: + for idx, col in enumerate(row): + widths[idx] = max(widths.get(idx, 0), term_len(col)) + + return tuple(y for x, y in sorted(widths.items())) + + +def iter_rows( + rows: cabc.Iterable[tuple[str, str]], col_count: int +) -> cabc.Iterator[tuple[str, ...]]: + for row in rows: + yield row + ("",) * (col_count - len(row)) + + +def wrap_text( + text: str, + width: int = 78, + initial_indent: str = "", + subsequent_indent: str = "", + preserve_paragraphs: bool = False, +) -> str: + """A helper function that intelligently wraps text. By default, it + assumes that it operates on a single paragraph of text but if the + `preserve_paragraphs` parameter is provided it will intelligently + handle paragraphs (defined by two empty lines). + + If paragraphs are handled, a paragraph can be prefixed with an empty + line containing the ``\\b`` character (``\\x08``) to indicate that + no rewrapping should happen in that block. + + :param text: the text that should be rewrapped. + :param width: the maximum width for the text. + :param initial_indent: the initial indent that should be placed on the + first line as a string. + :param subsequent_indent: the indent string that should be placed on + each consecutive line. + :param preserve_paragraphs: if this flag is set then the wrapping will + intelligently handle paragraphs. + """ + from ._textwrap import TextWrapper + + text = text.expandtabs() + wrapper = TextWrapper( + width, + initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + replace_whitespace=False, + ) + if not preserve_paragraphs: + return wrapper.fill(text) + + p: list[tuple[int, bool, str]] = [] + buf: list[str] = [] + indent = None + + def _flush_par() -> None: + if not buf: + return + if buf[0].strip() == "\b": + p.append((indent or 0, True, "\n".join(buf[1:]))) + else: + p.append((indent or 0, False, " ".join(buf))) + del buf[:] + + for line in text.splitlines(): + if not line: + _flush_par() + indent = None + else: + if indent is None: + orig_len = term_len(line) + line = line.lstrip() + indent = orig_len - term_len(line) + buf.append(line) + _flush_par() + + rv = [] + for indent, raw, text in p: + with wrapper.extra_indent(" " * indent): + if raw: + rv.append(wrapper.indent_only(text)) + else: + rv.append(wrapper.fill(text)) + + return "\n\n".join(rv) + + +class HelpFormatter: + """This class helps with formatting text-based help pages. It's + usually just needed for very special internal cases, but it's also + exposed so that developers can write their own fancy outputs. + + At present, it always writes into memory. + + :param indent_increment: the additional increment for each level. + :param width: the width for the text. This defaults to the terminal + width clamped to a maximum of 78. + """ + + def __init__( + self, + indent_increment: int = 2, + width: int | None = None, + max_width: int | None = None, + ) -> None: + self.indent_increment = indent_increment + if max_width is None: + max_width = 80 + if width is None: + import shutil + + width = FORCED_WIDTH + if width is None: + width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) + self.width = width + self.current_indent: int = 0 + self.buffer: list[str] = [] + + def write(self, string: str) -> None: + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self) -> None: + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self) -> None: + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage(self, prog: str, args: str = "", prefix: str | None = None) -> None: + """Writes a usage line into the buffer. + + :param prog: the program name. + :param args: whitespace separated list of arguments. + :param prefix: The prefix for the first line. Defaults to + ``"Usage: "``. + """ + if prefix is None: + prefix = f"{_('Usage:')} " + + usage_prefix = f"{prefix:>{self.current_indent}}{prog} " + text_width = self.width - self.current_indent + + if text_width >= (term_len(usage_prefix) + 20): + # The arguments will fit to the right of the prefix. + indent = " " * term_len(usage_prefix) + self.write( + wrap_text( + args, + text_width, + initial_indent=usage_prefix, + subsequent_indent=indent, + ) + ) + else: + # The prefix is too long, put the arguments on the next line. + self.write(usage_prefix) + self.write("\n") + indent = " " * (max(self.current_indent, term_len(prefix)) + 4) + self.write( + wrap_text( + args, text_width, initial_indent=indent, subsequent_indent=indent + ) + ) + + self.write("\n") + + def write_heading(self, heading: str) -> None: + """Writes a heading into the buffer.""" + self.write(f"{'':>{self.current_indent}}{heading}:\n") + + def write_paragraph(self) -> None: + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write("\n") + + def write_text(self, text: str) -> None: + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + indent = " " * self.current_indent + self.write( + wrap_text( + text, + self.width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True, + ) + ) + self.write("\n") + + def write_dl( + self, + rows: cabc.Sequence[tuple[str, str]], + col_max: int = 30, + col_spacing: int = 2, + ) -> None: + """Writes a definition list into the buffer. This is how options + and commands are usually formatted. + + :param rows: a list of two item tuples for the terms and values. + :param col_max: the maximum width of the first column. + :param col_spacing: the number of spaces between the first and + second column. + """ + rows = list(rows) + widths = measure_table(rows) + if len(widths) != 2: + raise TypeError("Expected two columns for definition list") + + first_col = min(widths[0], col_max) + col_spacing + + for first, second in iter_rows(rows, len(widths)): + self.write(f"{'':>{self.current_indent}}{first}") + if not second: + self.write("\n") + continue + if term_len(first) <= first_col - col_spacing: + self.write(" " * (first_col - term_len(first))) + else: + self.write("\n") + self.write(" " * (first_col + self.current_indent)) + + text_width = max(self.width - first_col - 2, 10) + wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) + lines = wrapped_text.splitlines() + + if lines: + self.write(f"{lines[0]}\n") + + for line in lines[1:]: + self.write(f"{'':>{first_col + self.current_indent}}{line}\n") + else: + self.write("\n") + + @contextmanager + def section(self, name: str) -> cabc.Iterator[None]: + """Helpful context manager that writes a paragraph, a heading, + and the indents. + + :param name: the section name that is written as heading. + """ + self.write_paragraph() + self.write_heading(name) + self.indent() + try: + yield + finally: + self.dedent() + + @contextmanager + def indentation(self) -> cabc.Iterator[None]: + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self) -> str: + """Returns the buffer contents.""" + return "".join(self.buffer) + + +def join_options(options: cabc.Sequence[str]) -> tuple[str, bool]: + """Given a list of option strings this joins them in the most appropriate + way and returns them in the form ``(formatted_string, + any_prefix_is_slash)`` where the second item in the tuple is a flag that + indicates if any of the option prefixes was a slash. + """ + rv = [] + any_prefix_is_slash = False + + for opt in options: + prefix = _split_opt(opt)[0] + + if prefix == "/": + any_prefix_is_slash = True + + rv.append((len(prefix), opt)) + + rv.sort(key=lambda x: x[0]) + return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/globals.py b/stripe_config/.venv/lib/python3.12/site-packages/click/globals.py new file mode 100644 index 0000000..a2f9172 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/globals.py @@ -0,0 +1,67 @@ +from __future__ import annotations + +import typing as t +from threading import local + +if t.TYPE_CHECKING: + from .core import Context + +_local = local() + + +@t.overload +def get_current_context(silent: t.Literal[False] = False) -> Context: ... + + +@t.overload +def get_current_context(silent: bool = ...) -> Context | None: ... + + +def get_current_context(silent: bool = False) -> Context | None: + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing its behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: if set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return t.cast("Context", _local.stack[-1]) + except (AttributeError, IndexError) as e: + if not silent: + raise RuntimeError("There is no active click context.") from e + + return None + + +def push_context(ctx: Context) -> None: + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault("stack", []).append(ctx) + + +def pop_context() -> None: + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color: bool | None = None) -> bool | None: + """Internal helper to get the default value of the color flag. If a + value is passed it's returned unchanged, otherwise it's looked up from + the current context. + """ + if color is not None: + return color + + ctx = get_current_context(silent=True) + + if ctx is not None: + return ctx.color + + return None diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/parser.py b/stripe_config/.venv/lib/python3.12/site-packages/click/parser.py new file mode 100644 index 0000000..1ea1f71 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/parser.py @@ -0,0 +1,532 @@ +""" +This module started out as largely a copy paste from the stdlib's +optparse module with the features removed that we do not need from +optparse because we implement them in Click on a higher level (for +instance type handling, help formatting and a lot more). + +The plan is to remove more and more from here over time. + +The reason this is a different module and not optparse from the stdlib +is that there are differences in 2.x and 3.x about the error messages +generated and optparse in the stdlib uses gettext for no good reason +and might cause us issues. + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright 2001-2006 Gregory P. Ward. All rights reserved. +Copyright 2002-2006 Python Software Foundation. All rights reserved. +""" + +# This code uses parts of optparse written by Gregory P. Ward and +# maintained by the Python Software Foundation. +# Copyright 2001-2006 Gregory P. Ward +# Copyright 2002-2006 Python Software Foundation +from __future__ import annotations + +import collections.abc as cabc +import typing as t +from collections import deque +from gettext import gettext as _ +from gettext import ngettext + +from ._utils import FLAG_NEEDS_VALUE +from ._utils import UNSET +from .exceptions import BadArgumentUsage +from .exceptions import BadOptionUsage +from .exceptions import NoSuchOption +from .exceptions import UsageError + +if t.TYPE_CHECKING: + from ._utils import T_FLAG_NEEDS_VALUE + from ._utils import T_UNSET + from .core import Argument as CoreArgument + from .core import Context + from .core import Option as CoreOption + from .core import Parameter as CoreParameter + +V = t.TypeVar("V") + + +def _unpack_args( + args: cabc.Sequence[str], nargs_spec: cabc.Sequence[int] +) -> tuple[cabc.Sequence[str | cabc.Sequence[str | None] | None], list[str]]: + """Given an iterable of arguments and an iterable of nargs specifications, + it returns a tuple with all the unpacked arguments at the first index + and all remaining arguments as the second. + + The nargs specification is the number of arguments that should be consumed + or `-1` to indicate that this position should eat up all the remainders. + + Missing items are filled with ``UNSET``. + """ + args = deque(args) + nargs_spec = deque(nargs_spec) + rv: list[str | tuple[str | T_UNSET, ...] | T_UNSET] = [] + spos: int | None = None + + def _fetch(c: deque[V]) -> V | T_UNSET: + try: + if spos is None: + return c.popleft() + else: + return c.pop() + except IndexError: + return UNSET + + while nargs_spec: + nargs = _fetch(nargs_spec) + + if nargs is None: + continue + + if nargs == 1: + rv.append(_fetch(args)) # type: ignore[arg-type] + elif nargs > 1: + x = [_fetch(args) for _ in range(nargs)] + + # If we're reversed, we're pulling in the arguments in reverse, + # so we need to turn them around. + if spos is not None: + x.reverse() + + rv.append(tuple(x)) + elif nargs < 0: + if spos is not None: + raise TypeError("Cannot have two nargs < 0") + + spos = len(rv) + rv.append(UNSET) + + # spos is the position of the wildcard (star). If it's not `None`, + # we fill it with the remainder. + if spos is not None: + rv[spos] = tuple(args) + args = [] + rv[spos + 1 :] = reversed(rv[spos + 1 :]) + + return tuple(rv), list(args) + + +def _split_opt(opt: str) -> tuple[str, str]: + first = opt[:1] + if first.isalnum(): + return "", opt + if opt[1:2] == first: + return opt[:2], opt[2:] + return first, opt[1:] + + +def _normalize_opt(opt: str, ctx: Context | None) -> str: + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = _split_opt(opt) + return f"{prefix}{ctx.token_normalize_func(opt)}" + + +class _Option: + def __init__( + self, + obj: CoreOption, + opts: cabc.Sequence[str], + dest: str | None, + action: str | None = None, + nargs: int = 1, + const: t.Any | None = None, + ): + self._short_opts = [] + self._long_opts = [] + self.prefixes: set[str] = set() + + for opt in opts: + prefix, value = _split_opt(opt) + if not prefix: + raise ValueError(f"Invalid start character for option ({opt})") + self.prefixes.add(prefix[0]) + if len(prefix) == 1 and len(value) == 1: + self._short_opts.append(opt) + else: + self._long_opts.append(opt) + self.prefixes.add(prefix) + + if action is None: + action = "store" + + self.dest = dest + self.action = action + self.nargs = nargs + self.const = const + self.obj = obj + + @property + def takes_value(self) -> bool: + return self.action in ("store", "append") + + def process(self, value: t.Any, state: _ParsingState) -> None: + if self.action == "store": + state.opts[self.dest] = value # type: ignore + elif self.action == "store_const": + state.opts[self.dest] = self.const # type: ignore + elif self.action == "append": + state.opts.setdefault(self.dest, []).append(value) # type: ignore + elif self.action == "append_const": + state.opts.setdefault(self.dest, []).append(self.const) # type: ignore + elif self.action == "count": + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore + else: + raise ValueError(f"unknown action '{self.action}'") + state.order.append(self.obj) + + +class _Argument: + def __init__(self, obj: CoreArgument, dest: str | None, nargs: int = 1): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process( + self, + value: str | cabc.Sequence[str | None] | None | T_UNSET, + state: _ParsingState, + ) -> None: + if self.nargs > 1: + assert isinstance(value, cabc.Sequence) + holes = sum(1 for x in value if x is UNSET) + if holes == len(value): + value = UNSET + elif holes != 0: + raise BadArgumentUsage( + _("Argument {name!r} takes {nargs} values.").format( + name=self.dest, nargs=self.nargs + ) + ) + + # We failed to collect any argument value so we consider the argument as unset. + if value == (): + value = UNSET + + state.opts[self.dest] = value # type: ignore + state.order.append(self.obj) + + +class _ParsingState: + def __init__(self, rargs: list[str]) -> None: + self.opts: dict[str, t.Any] = {} + self.largs: list[str] = [] + self.rargs = rargs + self.order: list[CoreParameter] = [] + + +class _OptionParser: + """The option parser is an internal class that is ultimately used to + parse options and arguments. It's modelled after optparse and brings + a similar but vastly simplified API. It should generally not be used + directly as the high level Click classes wrap it for you. + + It's not nearly as extensible as optparse or argparse as it does not + implement features that are implemented on a higher level (such as + types or defaults). + + :param ctx: optionally the :class:`~click.Context` where this parser + should go with. + + .. deprecated:: 8.2 + Will be removed in Click 9.0. + """ + + def __init__(self, ctx: Context | None = None) -> None: + #: The :class:`~click.Context` for this parser. This might be + #: `None` for some advanced use cases. + self.ctx = ctx + #: This controls how the parser deals with interspersed arguments. + #: If this is set to `False`, the parser will stop on the first + #: non-option. Click uses this to implement nested subcommands + #: safely. + self.allow_interspersed_args: bool = True + #: This tells the parser how to deal with unknown options. By + #: default it will error out (which is sensible), but there is a + #: second mode where it will ignore it and continue processing + #: after shifting all the unknown options into the resulting args. + self.ignore_unknown_options: bool = False + + if ctx is not None: + self.allow_interspersed_args = ctx.allow_interspersed_args + self.ignore_unknown_options = ctx.ignore_unknown_options + + self._short_opt: dict[str, _Option] = {} + self._long_opt: dict[str, _Option] = {} + self._opt_prefixes = {"-", "--"} + self._args: list[_Argument] = [] + + def add_option( + self, + obj: CoreOption, + opts: cabc.Sequence[str], + dest: str | None, + action: str | None = None, + nargs: int = 1, + const: t.Any | None = None, + ) -> None: + """Adds a new option named `dest` to the parser. The destination + is not inferred (unlike with optparse) and needs to be explicitly + provided. Action can be any of ``store``, ``store_const``, + ``append``, ``append_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + opts = [_normalize_opt(opt, self.ctx) for opt in opts] + option = _Option(obj, opts, dest, action=action, nargs=nargs, const=const) + self._opt_prefixes.update(option.prefixes) + for opt in option._short_opts: + self._short_opt[opt] = option + for opt in option._long_opts: + self._long_opt[opt] = option + + def add_argument(self, obj: CoreArgument, dest: str | None, nargs: int = 1) -> None: + """Adds a positional argument named `dest` to the parser. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + self._args.append(_Argument(obj, dest=dest, nargs=nargs)) + + def parse_args( + self, args: list[str] + ) -> tuple[dict[str, t.Any], list[str], list[CoreParameter]]: + """Parses positional arguments and returns ``(values, args, order)`` + for the parsed options and arguments as well as the leftover + arguments if there are any. The order is a list of objects as they + appear on the command line. If arguments appear multiple times they + will be memorized multiple times as well. + """ + state = _ParsingState(args) + try: + self._process_args_for_options(state) + self._process_args_for_args(state) + except UsageError: + if self.ctx is None or not self.ctx.resilient_parsing: + raise + return state.opts, state.largs, state.order + + def _process_args_for_args(self, state: _ParsingState) -> None: + pargs, args = _unpack_args( + state.largs + state.rargs, [x.nargs for x in self._args] + ) + + for idx, arg in enumerate(self._args): + arg.process(pargs[idx], state) + + state.largs = args + state.rargs = [] + + def _process_args_for_options(self, state: _ParsingState) -> None: + while state.rargs: + arg = state.rargs.pop(0) + arglen = len(arg) + # Double dashes always handled explicitly regardless of what + # prefixes are valid. + if arg == "--": + return + elif arg[:1] in self._opt_prefixes and arglen > 1: + self._process_opts(arg, state) + elif self.allow_interspersed_args: + state.largs.append(arg) + else: + state.rargs.insert(0, arg) + return + + # Say this is the original argument list: + # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] + # ^ + # (we are about to process arg(i)). + # + # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of + # [arg0, ..., arg(i-1)] (any options and their arguments will have + # been removed from largs). + # + # The while loop will usually consume 1 or more arguments per pass. + # If it consumes 1 (eg. arg is an option that takes no arguments), + # then after _process_arg() is done the situation is: + # + # largs = subset of [arg0, ..., arg(i)] + # rargs = [arg(i+1), ..., arg(N-1)] + # + # If allow_interspersed_args is false, largs will always be + # *empty* -- still a subset of [arg0, ..., arg(i-1)], but + # not a very interesting subset! + + def _match_long_opt( + self, opt: str, explicit_value: str | None, state: _ParsingState + ) -> None: + if opt not in self._long_opt: + from difflib import get_close_matches + + possibilities = get_close_matches(opt, self._long_opt) + raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + value = self._get_value_from_state(opt, option, state) + + elif explicit_value is not None: + raise BadOptionUsage( + opt, _("Option {name!r} does not take a value.").format(name=opt) + ) + + else: + value = UNSET + + option.process(value, state) + + def _match_short_opt(self, arg: str, state: _ParsingState) -> None: + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = _normalize_opt(f"{prefix}{ch}", self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt, ctx=self.ctx) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + value = self._get_value_from_state(opt, option, state) + + else: + value = UNSET + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we recombine the string of the + # remaining options and re-attach the prefix, then report that + # to the state as new larg. This way there is basic combinatorics + # that can be achieved while still ignoring unknown arguments. + if self.ignore_unknown_options and unknown_options: + state.largs.append(f"{prefix}{''.join(unknown_options)}") + + def _get_value_from_state( + self, option_name: str, option: _Option, state: _ParsingState + ) -> str | cabc.Sequence[str] | T_FLAG_NEEDS_VALUE: + nargs = option.nargs + + value: str | cabc.Sequence[str] | T_FLAG_NEEDS_VALUE + + if len(state.rargs) < nargs: + if option.obj._flag_needs_value: + # Option allows omitting the value. + value = FLAG_NEEDS_VALUE + else: + raise BadOptionUsage( + option_name, + ngettext( + "Option {name!r} requires an argument.", + "Option {name!r} requires {nargs} arguments.", + nargs, + ).format(name=option_name, nargs=nargs), + ) + elif nargs == 1: + next_rarg = state.rargs[0] + + if ( + option.obj._flag_needs_value + and isinstance(next_rarg, str) + and next_rarg[:1] in self._opt_prefixes + and len(next_rarg) > 1 + ): + # The next arg looks like the start of an option, don't + # use it as the value if omitting the value is allowed. + value = FLAG_NEEDS_VALUE + else: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + return value + + def _process_opts(self, arg: str, state: _ParsingState) -> None: + explicit_value = None + # Long option handling happens in two parts. The first part is + # supporting explicitly attached values. In any case, we will try + # to long match the option first. + if "=" in arg: + long_opt, explicit_value = arg.split("=", 1) + else: + long_opt = arg + norm_long_opt = _normalize_opt(long_opt, self.ctx) + + # At this point we will match the (assumed) long option through + # the long option matching code. Note that this allows options + # like "-foo" to be matched as long options. + try: + self._match_long_opt(norm_long_opt, explicit_value, state) + except NoSuchOption: + # At this point the long option matching failed, and we need + # to try with short options. However there is a special rule + # which says, that if we have a two character options prefix + # (applies to "--foo" for instance), we do not dispatch to the + # short option code and will instead raise the no option + # error. + if arg[:2] not in self._opt_prefixes: + self._match_short_opt(arg, state) + return + + if not self.ignore_unknown_options: + raise + + state.largs.append(arg) + + +def __getattr__(name: str) -> object: + import warnings + + if name in { + "OptionParser", + "Argument", + "Option", + "split_opt", + "normalize_opt", + "ParsingState", + }: + warnings.warn( + f"'parser.{name}' is deprecated and will be removed in Click 9.0." + " The old parser is available in 'optparse'.", + DeprecationWarning, + stacklevel=2, + ) + return globals()[f"_{name}"] + + if name == "split_arg_string": + from .shell_completion import split_arg_string + + warnings.warn( + "Importing 'parser.split_arg_string' is deprecated, it will only be" + " available in 'shell_completion' in Click 9.0.", + DeprecationWarning, + stacklevel=2, + ) + return split_arg_string + + raise AttributeError(name) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/py.typed b/stripe_config/.venv/lib/python3.12/site-packages/click/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/shell_completion.py b/stripe_config/.venv/lib/python3.12/site-packages/click/shell_completion.py new file mode 100644 index 0000000..8f1564c --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/shell_completion.py @@ -0,0 +1,667 @@ +from __future__ import annotations + +import collections.abc as cabc +import os +import re +import typing as t +from gettext import gettext as _ + +from .core import Argument +from .core import Command +from .core import Context +from .core import Group +from .core import Option +from .core import Parameter +from .core import ParameterSource +from .utils import echo + + +def shell_complete( + cli: Command, + ctx_args: cabc.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + instruction: str, +) -> int: + """Perform shell completion for the given CLI program. + + :param cli: Command being called. + :param ctx_args: Extra arguments to pass to + ``cli.make_context``. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + :param instruction: Value of ``complete_var`` with the completion + instruction and shell, in the form ``instruction_shell``. + :return: Status code to exit with. + """ + shell, _, instruction = instruction.partition("_") + comp_cls = get_completion_class(shell) + + if comp_cls is None: + return 1 + + comp = comp_cls(cli, ctx_args, prog_name, complete_var) + + if instruction == "source": + echo(comp.source()) + return 0 + + if instruction == "complete": + echo(comp.complete()) + return 0 + + return 1 + + +class CompletionItem: + """Represents a completion value and metadata about the value. The + default metadata is ``type`` to indicate special shell handling, + and ``help`` if a shell supports showing a help string next to the + value. + + Arbitrary parameters can be passed when creating the object, and + accessed using ``item.attr``. If an attribute wasn't passed, + accessing it returns ``None``. + + :param value: The completion suggestion. + :param type: Tells the shell script to provide special completion + support for the type. Click uses ``"dir"`` and ``"file"``. + :param help: String shown next to the value if supported. + :param kwargs: Arbitrary metadata. The built-in implementations + don't use this, but custom type completions paired with custom + shell support could use it. + """ + + __slots__ = ("value", "type", "help", "_info") + + def __init__( + self, + value: t.Any, + type: str = "plain", + help: str | None = None, + **kwargs: t.Any, + ) -> None: + self.value: t.Any = value + self.type: str = type + self.help: str | None = help + self._info = kwargs + + def __getattr__(self, name: str) -> t.Any: + return self._info.get(name) + + +# Only Bash >= 4.4 has the nosort option. +_SOURCE_BASH = """\ +%(complete_func)s() { + local IFS=$'\\n' + local response + + response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ +%(complete_var)s=bash_complete $1) + + for completion in $response; do + IFS=',' read type value <<< "$completion" + + if [[ $type == 'dir' ]]; then + COMPREPLY=() + compopt -o dirnames + elif [[ $type == 'file' ]]; then + COMPREPLY=() + compopt -o default + elif [[ $type == 'plain' ]]; then + COMPREPLY+=($value) + fi + done + + return 0 +} + +%(complete_func)s_setup() { + complete -o nosort -F %(complete_func)s %(prog_name)s +} + +%(complete_func)s_setup; +""" + +# See ZshComplete.format_completion below, and issue #2703, before +# changing this script. +# +# (TL;DR: _describe is picky about the format, but this Zsh script snippet +# is already widely deployed. So freeze this script, and use clever-ish +# handling of colons in ZshComplet.format_completion.) +_SOURCE_ZSH = """\ +#compdef %(prog_name)s + +%(complete_func)s() { + local -a completions + local -a completions_with_descriptions + local -a response + (( ! $+commands[%(prog_name)s] )) && return 1 + + response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ +%(complete_var)s=zsh_complete %(prog_name)s)}") + + for type key descr in ${response}; do + if [[ "$type" == "plain" ]]; then + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + elif [[ "$type" == "dir" ]]; then + _path_files -/ + elif [[ "$type" == "file" ]]; then + _path_files -f + fi + done + + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U + fi + + if [ -n "$completions" ]; then + compadd -U -V unsorted -a completions + fi +} + +if [[ $zsh_eval_context[-1] == loadautofunc ]]; then + # autoload from fpath, call function directly + %(complete_func)s "$@" +else + # eval/source/. command, register function for later + compdef %(complete_func)s %(prog_name)s +fi +""" + +_SOURCE_FISH = """\ +function %(complete_func)s; + set -l response (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ +COMP_CWORD=(commandline -t) %(prog_name)s); + + for completion in $response; + set -l metadata (string split "," $completion); + + if test $metadata[1] = "dir"; + __fish_complete_directories $metadata[2]; + else if test $metadata[1] = "file"; + __fish_complete_path $metadata[2]; + else if test $metadata[1] = "plain"; + echo $metadata[2]; + end; + end; +end; + +complete --no-files --command %(prog_name)s --arguments \ +"(%(complete_func)s)"; +""" + + +class ShellComplete: + """Base class for providing shell completion support. A subclass for + a given shell will override attributes and methods to implement the + completion instructions (``source`` and ``complete``). + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + + .. versionadded:: 8.0 + """ + + name: t.ClassVar[str] + """Name to register the shell as with :func:`add_completion_class`. + This is used in completion instructions (``{name}_source`` and + ``{name}_complete``). + """ + + source_template: t.ClassVar[str] + """Completion script template formatted by :meth:`source`. This must + be provided by subclasses. + """ + + def __init__( + self, + cli: Command, + ctx_args: cabc.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + ) -> None: + self.cli = cli + self.ctx_args = ctx_args + self.prog_name = prog_name + self.complete_var = complete_var + + @property + def func_name(self) -> str: + """The name of the shell function defined by the completion + script. + """ + safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), flags=re.ASCII) + return f"_{safe_name}_completion" + + def source_vars(self) -> dict[str, t.Any]: + """Vars for formatting :attr:`source_template`. + + By default this provides ``complete_func``, ``complete_var``, + and ``prog_name``. + """ + return { + "complete_func": self.func_name, + "complete_var": self.complete_var, + "prog_name": self.prog_name, + } + + def source(self) -> str: + """Produce the shell script that defines the completion + function. By default this ``%``-style formats + :attr:`source_template` with the dict returned by + :meth:`source_vars`. + """ + return self.source_template % self.source_vars() + + def get_completion_args(self) -> tuple[list[str], str]: + """Use the env vars defined by the shell script to return a + tuple of ``args, incomplete``. This must be implemented by + subclasses. + """ + raise NotImplementedError + + def get_completions(self, args: list[str], incomplete: str) -> list[CompletionItem]: + """Determine the context and last complete command or parameter + from the complete args. Call that object's ``shell_complete`` + method to get the completions for the incomplete value. + + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) + obj, incomplete = _resolve_incomplete(ctx, args, incomplete) + return obj.shell_complete(ctx, incomplete) + + def format_completion(self, item: CompletionItem) -> str: + """Format a completion item into the form recognized by the + shell script. This must be implemented by subclasses. + + :param item: Completion item to format. + """ + raise NotImplementedError + + def complete(self) -> str: + """Produce the completion data to send back to the shell. + + By default this calls :meth:`get_completion_args`, gets the + completions, then calls :meth:`format_completion` for each + completion. + """ + args, incomplete = self.get_completion_args() + completions = self.get_completions(args, incomplete) + out = [self.format_completion(item) for item in completions] + return "\n".join(out) + + +class BashComplete(ShellComplete): + """Shell completion for Bash.""" + + name = "bash" + source_template = _SOURCE_BASH + + @staticmethod + def _check_version() -> None: + import shutil + import subprocess + + bash_exe = shutil.which("bash") + + if bash_exe is None: + match = None + else: + output = subprocess.run( + [bash_exe, "--norc", "-c", 'echo "${BASH_VERSION}"'], + stdout=subprocess.PIPE, + ) + match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) + + if match is not None: + major, minor = match.groups() + + if major < "4" or major == "4" and minor < "4": + echo( + _( + "Shell completion is not supported for Bash" + " versions older than 4.4." + ), + err=True, + ) + else: + echo( + _("Couldn't detect Bash version, shell completion is not supported."), + err=True, + ) + + def source(self) -> str: + self._check_version() + return super().source() + + def get_completion_args(self) -> tuple[list[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type},{item.value}" + + +class ZshComplete(ShellComplete): + """Shell completion for Zsh.""" + + name = "zsh" + source_template = _SOURCE_ZSH + + def get_completion_args(self) -> tuple[list[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + help_ = item.help or "_" + # The zsh completion script uses `_describe` on items with help + # texts (which splits the item help from the item value at the + # first unescaped colon) and `compadd` on items without help + # text (which uses the item value as-is and does not support + # colon escaping). So escape colons in the item value if and + # only if the item help is not the sentinel "_" value, as used + # by the completion script. + # + # (The zsh completion script is potentially widely deployed, and + # thus harder to fix than this method.) + # + # See issue #1812 and issue #2703 for further context. + value = item.value.replace(":", r"\:") if help_ != "_" else item.value + return f"{item.type}\n{value}\n{help_}" + + +class FishComplete(ShellComplete): + """Shell completion for Fish.""" + + name = "fish" + source_template = _SOURCE_FISH + + def get_completion_args(self) -> tuple[list[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + incomplete = os.environ["COMP_CWORD"] + if incomplete: + incomplete = split_arg_string(incomplete)[0] + args = cwords[1:] + + # Fish stores the partial word in both COMP_WORDS and + # COMP_CWORD, remove it from complete args. + if incomplete and args and args[-1] == incomplete: + args.pop() + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + if item.help: + return f"{item.type},{item.value}\t{item.help}" + + return f"{item.type},{item.value}" + + +ShellCompleteType = t.TypeVar("ShellCompleteType", bound="type[ShellComplete]") + + +_available_shells: dict[str, type[ShellComplete]] = { + "bash": BashComplete, + "fish": FishComplete, + "zsh": ZshComplete, +} + + +def add_completion_class( + cls: ShellCompleteType, name: str | None = None +) -> ShellCompleteType: + """Register a :class:`ShellComplete` subclass under the given name. + The name will be provided by the completion instruction environment + variable during completion. + + :param cls: The completion class that will handle completion for the + shell. + :param name: Name to register the class under. Defaults to the + class's ``name`` attribute. + """ + if name is None: + name = cls.name + + _available_shells[name] = cls + + return cls + + +def get_completion_class(shell: str) -> type[ShellComplete] | None: + """Look up a registered :class:`ShellComplete` subclass by the name + provided by the completion instruction environment variable. If the + name isn't registered, returns ``None``. + + :param shell: Name the class is registered under. + """ + return _available_shells.get(shell) + + +def split_arg_string(string: str) -> list[str]: + """Split an argument string as with :func:`shlex.split`, but don't + fail if the string is incomplete. Ignores a missing closing quote or + incomplete escape sequence and uses the partial token as-is. + + .. code-block:: python + + split_arg_string("example 'my file") + ["example", "my file"] + + split_arg_string("example my\\") + ["example", "my"] + + :param string: String to split. + + .. versionchanged:: 8.2 + Moved to ``shell_completion`` from ``parser``. + """ + import shlex + + lex = shlex.shlex(string, posix=True) + lex.whitespace_split = True + lex.commenters = "" + out = [] + + try: + for token in lex: + out.append(token) + except ValueError: + # Raised when end-of-string is reached in an invalid state. Use + # the partial token as-is. The quote or escape character is in + # lex.state, not lex.token. + out.append(lex.token) + + return out + + +def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: + """Determine if the given parameter is an argument that can still + accept values. + + :param ctx: Invocation context for the command represented by the + parsed complete args. + :param param: Argument object being checked. + """ + if not isinstance(param, Argument): + return False + + assert param.name is not None + # Will be None if expose_value is False. + value = ctx.params.get(param.name) + return ( + param.nargs == -1 + or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE + or ( + param.nargs > 1 + and isinstance(value, (tuple, list)) + and len(value) < param.nargs + ) + ) + + +def _start_of_option(ctx: Context, value: str) -> bool: + """Check if the value looks like the start of an option.""" + if not value: + return False + + c = value[0] + return c in ctx._opt_prefixes + + +def _is_incomplete_option(ctx: Context, args: list[str], param: Parameter) -> bool: + """Determine if the given parameter is an option that needs a value. + + :param args: List of complete args before the incomplete value. + :param param: Option object being checked. + """ + if not isinstance(param, Option): + return False + + if param.is_flag or param.count: + return False + + last_option = None + + for index, arg in enumerate(reversed(args)): + if index + 1 > param.nargs: + break + + if _start_of_option(ctx, arg): + last_option = arg + break + + return last_option is not None and last_option in param.opts + + +def _resolve_context( + cli: Command, + ctx_args: cabc.MutableMapping[str, t.Any], + prog_name: str, + args: list[str], +) -> Context: + """Produce the context hierarchy starting with the command and + traversing the complete arguments. This only follows the commands, + it doesn't trigger input prompts or callbacks. + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param args: List of complete args before the incomplete value. + """ + ctx_args["resilient_parsing"] = True + with cli.make_context(prog_name, args.copy(), **ctx_args) as ctx: + args = ctx._protected_args + ctx.args + + while args: + command = ctx.command + + if isinstance(command, Group): + if not command.chain: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + with cmd.make_context( + name, args, parent=ctx, resilient_parsing=True + ) as sub_ctx: + ctx = sub_ctx + args = ctx._protected_args + ctx.args + else: + sub_ctx = ctx + + while args: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + with cmd.make_context( + name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + resilient_parsing=True, + ) as sub_sub_ctx: + sub_ctx = sub_sub_ctx + args = sub_ctx.args + + ctx = sub_ctx + args = [*sub_ctx._protected_args, *sub_ctx.args] + else: + break + + return ctx + + +def _resolve_incomplete( + ctx: Context, args: list[str], incomplete: str +) -> tuple[Command | Parameter, str]: + """Find the Click object that will handle the completion of the + incomplete value. Return the object and the incomplete value. + + :param ctx: Invocation context for the command represented by + the parsed complete args. + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + # Different shells treat an "=" between a long option name and + # value differently. Might keep the value joined, return the "=" + # as a separate item, or return the split name and value. Always + # split and discard the "=" to make completion easier. + if incomplete == "=": + incomplete = "" + elif "=" in incomplete and _start_of_option(ctx, incomplete): + name, _, incomplete = incomplete.partition("=") + args.append(name) + + # The "--" marker tells Click to stop treating values as options + # even if they start with the option character. If it hasn't been + # given and the incomplete arg looks like an option, the current + # command will provide option name completions. + if "--" not in args and _start_of_option(ctx, incomplete): + return ctx.command, incomplete + + params = ctx.command.get_params(ctx) + + # If the last complete arg is an option name with an incomplete + # value, the option will provide value completions. + for param in params: + if _is_incomplete_option(ctx, args, param): + return param, incomplete + + # It's not an option name or value. The first argument without a + # parsed value will provide value completions. + for param in params: + if _is_incomplete_argument(ctx, param): + return param, incomplete + + # There were no unparsed arguments, the command may be a group that + # will provide command name completions. + return ctx.command, incomplete diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/termui.py b/stripe_config/.venv/lib/python3.12/site-packages/click/termui.py new file mode 100644 index 0000000..dcbb222 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/termui.py @@ -0,0 +1,877 @@ +from __future__ import annotations + +import collections.abc as cabc +import inspect +import io +import itertools +import sys +import typing as t +from contextlib import AbstractContextManager +from gettext import gettext as _ + +from ._compat import isatty +from ._compat import strip_ansi +from .exceptions import Abort +from .exceptions import UsageError +from .globals import resolve_color_default +from .types import Choice +from .types import convert_type +from .types import ParamType +from .utils import echo +from .utils import LazyFile + +if t.TYPE_CHECKING: + from ._termui_impl import ProgressBar + +V = t.TypeVar("V") + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func: t.Callable[[str], str] = input + +_ansi_colors = { + "black": 30, + "red": 31, + "green": 32, + "yellow": 33, + "blue": 34, + "magenta": 35, + "cyan": 36, + "white": 37, + "reset": 39, + "bright_black": 90, + "bright_red": 91, + "bright_green": 92, + "bright_yellow": 93, + "bright_blue": 94, + "bright_magenta": 95, + "bright_cyan": 96, + "bright_white": 97, +} +_ansi_reset_all = "\033[0m" + + +def hidden_prompt_func(prompt: str) -> str: + import getpass + + return getpass.getpass(prompt) + + +def _build_prompt( + text: str, + suffix: str, + show_default: bool = False, + default: t.Any | None = None, + show_choices: bool = True, + type: ParamType | None = None, +) -> str: + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += f" ({', '.join(map(str, type.choices))})" + if default is not None and show_default: + prompt = f"{prompt} [{_format_default(default)}]" + return f"{prompt}{suffix}" + + +def _format_default(default: t.Any) -> t.Any: + if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): + return default.name + + return default + + +def prompt( + text: str, + default: t.Any | None = None, + hide_input: bool = False, + confirmation_prompt: bool | str = False, + type: ParamType | t.Any | None = None, + value_proc: t.Callable[[str], t.Any] | None = None, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, + show_choices: bool = True, +) -> t.Any: + """Prompts a user for input. This is a convenience function that can + be used to prompt a user for input later. + + If the user aborts the input by sending an interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the text to show for the prompt. + :param default: the default value to use if no input happens. If this + is not given it will prompt until it's aborted. + :param hide_input: if this is set to true then the input value will + be hidden. + :param confirmation_prompt: Prompt a second time to confirm the + value. Can be set to a string instead of ``True`` to customize + the message. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + :param show_choices: Show or hide choices if the passed type is a Choice. + For example if type is a Choice of either day or week, + show_choices is true and text is "Group by" then the + prompt will be "Group by (day, week): ". + + .. versionadded:: 8.0 + ``confirmation_prompt`` can be a custom string. + + .. versionadded:: 7.0 + Added the ``show_choices`` parameter. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + """ + + def prompt_func(text: str) -> str: + f = hidden_prompt_func if hide_input else visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + return f(" ") + except (KeyboardInterrupt, EOFError): + # getpass doesn't print a newline if the user aborts input with ^C. + # Allegedly this behavior is inherited from getpass(3). + # A doc bug has been filed at https://bugs.python.org/issue24711 + if hide_input: + echo(None, err=err) + raise Abort() from None + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt( + text, prompt_suffix, show_default, default, show_choices, type + ) + + if confirmation_prompt: + if confirmation_prompt is True: + confirmation_prompt = _("Repeat for confirmation") + + confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) + + while True: + while True: + value = prompt_func(prompt) + if value: + break + elif default is not None: + value = default + break + try: + result = value_proc(value) + except UsageError as e: + if hide_input: + echo(_("Error: The value you entered was invalid."), err=err) + else: + echo(_("Error: {e.message}").format(e=e), err=err) + continue + if not confirmation_prompt: + return result + while True: + value2 = prompt_func(confirmation_prompt) + is_empty = not value and not value2 + if value2 or is_empty: + break + if value == value2: + return result + echo(_("Error: The two entered values do not match."), err=err) + + +def confirm( + text: str, + default: bool | None = False, + abort: bool = False, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, +) -> bool: + """Prompts for confirmation (yes/no question). + + If the user aborts the input by sending a interrupt signal this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the question to ask. + :param default: The default value to use when no input is given. If + ``None``, repeat until input is given. + :param abort: if this is set to `True` a negative answer aborts the + exception by raising :exc:`Abort`. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + + .. versionchanged:: 8.0 + Repeat until input is given if ``default`` is ``None``. + + .. versionadded:: 4.0 + Added the ``err`` parameter. + """ + prompt = _build_prompt( + text, + prompt_suffix, + show_default, + "y/n" if default is None else ("Y/n" if default else "y/N"), + ) + + while True: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + value = visible_prompt_func(" ").lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() from None + if value in ("y", "yes"): + rv = True + elif value in ("n", "no"): + rv = False + elif default is not None and value == "": + rv = default + else: + echo(_("Error: invalid input"), err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def echo_via_pager( + text_or_generator: cabc.Iterable[str] | t.Callable[[], cabc.Iterable[str]] | str, + color: bool | None = None, +) -> None: + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text_or_generator: the text to page, or alternatively, a + generator emitting the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + + if inspect.isgeneratorfunction(text_or_generator): + i = t.cast("t.Callable[[], cabc.Iterable[str]]", text_or_generator)() + elif isinstance(text_or_generator, str): + i = [text_or_generator] + else: + i = iter(t.cast("cabc.Iterable[str]", text_or_generator)) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, str) else str(el) for el in i) + + from ._termui_impl import pager + + return pager(itertools.chain(text_generator, "\n"), color) + + +@t.overload +def progressbar( + *, + length: int, + label: str | None = None, + hidden: bool = False, + show_eta: bool = True, + show_percent: bool | None = None, + show_pos: bool = False, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.TextIO | None = None, + color: bool | None = None, + update_min_steps: int = 1, +) -> ProgressBar[int]: ... + + +@t.overload +def progressbar( + iterable: cabc.Iterable[V] | None = None, + length: int | None = None, + label: str | None = None, + hidden: bool = False, + show_eta: bool = True, + show_percent: bool | None = None, + show_pos: bool = False, + item_show_func: t.Callable[[V | None], str | None] | None = None, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.TextIO | None = None, + color: bool | None = None, + update_min_steps: int = 1, +) -> ProgressBar[V]: ... + + +def progressbar( + iterable: cabc.Iterable[V] | None = None, + length: int | None = None, + label: str | None = None, + hidden: bool = False, + show_eta: bool = True, + show_percent: bool | None = None, + show_pos: bool = False, + item_show_func: t.Callable[[V | None], str | None] | None = None, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.TextIO | None = None, + color: bool | None = None, + update_min_steps: int = 1, +) -> ProgressBar[V]: + """This function creates an iterable context manager that can be used + to iterate over something while showing a progress bar. It will + either iterate over the `iterable` or `length` items (that are counted + up). While iteration happens, this function will print a rendered + progress bar to the given `file` (defaults to stdout) and will attempt + to calculate remaining time and more. By default, this progress bar + will not be rendered if the file is not a terminal. + + The context manager creates the progress bar. When the context + manager is entered the progress bar is already created. With every + iteration over the progress bar, the iterable passed to the bar is + advanced and the bar is updated. When the context manager exits, + a newline is printed and the progress bar is finalized on screen. + + Note: The progress bar is currently designed for use cases where the + total progress can be expected to take at least several seconds. + Because of this, the ProgressBar class object won't display + progress that is considered too fast, and progress where the time + between steps is less than a second. + + No printing must happen or the progress bar will be unintentionally + destroyed. + + Example usage:: + + with progressbar(items) as bar: + for item in bar: + do_something_with(item) + + Alternatively, if no iterable is specified, one can manually update the + progress bar through the `update()` method instead of directly + iterating over the progress bar. The update method accepts the number + of steps to increment the bar with:: + + with progressbar(length=chunks.total_bytes) as bar: + for chunk in chunks: + process_chunk(chunk) + bar.update(chunks.bytes) + + The ``update()`` method also takes an optional value specifying the + ``current_item`` at the new position. This is useful when used + together with ``item_show_func`` to customize the output for each + manual step:: + + with click.progressbar( + length=total_size, + label='Unzipping archive', + item_show_func=lambda a: a.filename + ) as bar: + for archive in zip_file: + archive.extract() + bar.update(archive.size, archive) + + :param iterable: an iterable to iterate over. If not provided the length + is required. + :param length: the number of items to iterate over. By default the + progressbar will attempt to ask the iterator about its + length, which might or might not work. If an iterable is + also provided this parameter can be used to override the + length. If an iterable is not provided the progress bar + will iterate over a range of that length. + :param label: the label to show next to the progress bar. + :param hidden: hide the progressbar. Defaults to ``False``. When no tty is + detected, it will only print the progressbar label. Setting this to + ``False`` also disables that. + :param show_eta: enables or disables the estimated time display. This is + automatically disabled if the length cannot be + determined. + :param show_percent: enables or disables the percentage display. The + default is `True` if the iterable has a length or + `False` if not. + :param show_pos: enables or disables the absolute position display. The + default is `False`. + :param item_show_func: A function called with the current item which + can return a string to show next to the progress bar. If the + function returns ``None`` nothing is shown. The current item can + be ``None``, such as when entering and exiting the bar. + :param fill_char: the character to use to show the filled part of the + progress bar. + :param empty_char: the character to use to show the non-filled part of + the progress bar. + :param bar_template: the format string to use as template for the bar. + The parameters in it are ``label`` for the label, + ``bar`` for the progress bar and ``info`` for the + info section. + :param info_sep: the separator between multiple info items (eta etc.) + :param width: the width of the progress bar in characters, 0 means full + terminal width + :param file: The file to write to. If this is not a terminal then + only the label is printed. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are included anywhere in the progress bar output + which is not the case by default. + :param update_min_steps: Render only when this many updates have + completed. This allows tuning for very fast iterators. + + .. versionadded:: 8.2 + The ``hidden`` argument. + + .. versionchanged:: 8.0 + Output is shown even if execution time is less than 0.5 seconds. + + .. versionchanged:: 8.0 + ``item_show_func`` shows the current item, not the previous one. + + .. versionchanged:: 8.0 + Labels are echoed if the output is not a TTY. Reverts a change + in 7.0 that removed all output. + + .. versionadded:: 8.0 + The ``update_min_steps`` parameter. + + .. versionadded:: 4.0 + The ``color`` parameter and ``update`` method. + + .. versionadded:: 2.0 + """ + from ._termui_impl import ProgressBar + + color = resolve_color_default(color) + return ProgressBar( + iterable=iterable, + length=length, + hidden=hidden, + show_eta=show_eta, + show_percent=show_percent, + show_pos=show_pos, + item_show_func=item_show_func, + fill_char=fill_char, + empty_char=empty_char, + bar_template=bar_template, + info_sep=info_sep, + file=file, + label=label, + width=width, + color=color, + update_min_steps=update_min_steps, + ) + + +def clear() -> None: + """Clears the terminal screen. This will have the effect of clearing + the whole visible space of the terminal and moving the cursor to the + top left. This does not do anything if not connected to a terminal. + + .. versionadded:: 2.0 + """ + if not isatty(sys.stdout): + return + + # ANSI escape \033[2J clears the screen, \033[1;1H moves the cursor + echo("\033[2J\033[1;1H", nl=False) + + +def _interpret_color(color: int | tuple[int, int, int] | str, offset: int = 0) -> str: + if isinstance(color, int): + return f"{38 + offset};5;{color:d}" + + if isinstance(color, (tuple, list)): + r, g, b = color + return f"{38 + offset};2;{r:d};{g:d};{b:d}" + + return str(_ansi_colors[color] + offset) + + +def style( + text: t.Any, + fg: int | tuple[int, int, int] | str | None = None, + bg: int | tuple[int, int, int] | str | None = None, + bold: bool | None = None, + dim: bool | None = None, + underline: bool | None = None, + overline: bool | None = None, + italic: bool | None = None, + blink: bool | None = None, + reverse: bool | None = None, + strikethrough: bool | None = None, + reset: bool = True, +) -> str: + """Styles a text with ANSI styles and returns the new string. By + default the styling is self contained which means that at the end + of the string a reset code is issued. This can be prevented by + passing ``reset=False``. + + Examples:: + + click.echo(click.style('Hello World!', fg='green')) + click.echo(click.style('ATTENTION!', blink=True)) + click.echo(click.style('Some things', reverse=True, fg='cyan')) + click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``bright_black`` + * ``bright_red`` + * ``bright_green`` + * ``bright_yellow`` + * ``bright_blue`` + * ``bright_magenta`` + * ``bright_cyan`` + * ``bright_white`` + * ``reset`` (reset the color code only) + + If the terminal supports it, color may also be specified as: + + - An integer in the interval [0, 255]. The terminal must support + 8-bit/256-color mode. + - An RGB tuple of three integers in [0, 255]. The terminal must + support 24-bit/true-color mode. + + See https://en.wikipedia.org/wiki/ANSI_color and + https://gist.github.com/XVilka/8346728 for more information. + + :param text: the string to style with ansi codes. + :param fg: if provided this will become the foreground color. + :param bg: if provided this will become the background color. + :param bold: if provided this will enable or disable bold mode. + :param dim: if provided this will enable or disable dim mode. This is + badly supported. + :param underline: if provided this will enable or disable underline. + :param overline: if provided this will enable or disable overline. + :param italic: if provided this will enable or disable italic. + :param blink: if provided this will enable or disable blinking. + :param reverse: if provided this will enable or disable inverse + rendering (foreground becomes background and the + other way round). + :param strikethrough: if provided this will enable or disable + striking through text. + :param reset: by default a reset-all code is added at the end of the + string which means that styles do not carry over. This + can be disabled to compose styles. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. + + .. versionchanged:: 8.0 + Added support for 256 and RGB color codes. + + .. versionchanged:: 8.0 + Added the ``strikethrough``, ``italic``, and ``overline`` + parameters. + + .. versionchanged:: 7.0 + Added support for bright colors. + + .. versionadded:: 2.0 + """ + if not isinstance(text, str): + text = str(text) + + bits = [] + + if fg: + try: + bits.append(f"\033[{_interpret_color(fg)}m") + except KeyError: + raise TypeError(f"Unknown color {fg!r}") from None + + if bg: + try: + bits.append(f"\033[{_interpret_color(bg, 10)}m") + except KeyError: + raise TypeError(f"Unknown color {bg!r}") from None + + if bold is not None: + bits.append(f"\033[{1 if bold else 22}m") + if dim is not None: + bits.append(f"\033[{2 if dim else 22}m") + if underline is not None: + bits.append(f"\033[{4 if underline else 24}m") + if overline is not None: + bits.append(f"\033[{53 if overline else 55}m") + if italic is not None: + bits.append(f"\033[{3 if italic else 23}m") + if blink is not None: + bits.append(f"\033[{5 if blink else 25}m") + if reverse is not None: + bits.append(f"\033[{7 if reverse else 27}m") + if strikethrough is not None: + bits.append(f"\033[{9 if strikethrough else 29}m") + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return "".join(bits) + + +def unstyle(text: str) -> str: + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho( + message: t.Any | None = None, + file: t.IO[t.AnyStr] | None = None, + nl: bool = True, + err: bool = False, + color: bool | None = None, + **styles: t.Any, +) -> None: + """This function combines :func:`echo` and :func:`style` into one + call. As such the following two calls are the same:: + + click.secho('Hello World!', fg='green') + click.echo(click.style('Hello World!', fg='green')) + + All keyword arguments are forwarded to the underlying functions + depending on which one they go with. + + Non-string types will be converted to :class:`str`. However, + :class:`bytes` are passed directly to :meth:`echo` without applying + style. If you want to style bytes that represent text, call + :meth:`bytes.decode` first. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. Bytes are + passed through without style applied. + + .. versionadded:: 2.0 + """ + if message is not None and not isinstance(message, (bytes, bytearray)): + message = style(message, **styles) + + return echo(message, file=file, nl=nl, err=err, color=color) + + +@t.overload +def edit( + text: bytes | bytearray, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = False, + extension: str = ".txt", +) -> bytes | None: ... + + +@t.overload +def edit( + text: str, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = True, + extension: str = ".txt", +) -> str | None: ... + + +@t.overload +def edit( + text: None = None, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = True, + extension: str = ".txt", + filename: str | cabc.Iterable[str] | None = None, +) -> None: ... + + +def edit( + text: str | bytes | bytearray | None = None, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = True, + extension: str = ".txt", + filename: str | cabc.Iterable[str] | None = None, +) -> str | bytes | bytearray | None: + r"""Edits the given text in the defined editor. If an editor is given + (should be the full path to the executable but the regular operating + system search path is used for finding the executable) it overrides + the detected editor. Optionally, some environment variables can be + used. If the editor is closed without changes, `None` is returned. In + case a file is edited directly the return value is always `None` and + `require_save` and `extension` are ignored. + + If the editor cannot be opened a :exc:`UsageError` is raised. + + Note for Windows: to simplify cross-platform usage, the newlines are + automatically converted from POSIX to Windows and vice versa. As such, + the message here will have ``\n`` as newline markers. + + :param text: the text to edit. + :param editor: optionally the editor to use. Defaults to automatic + detection. + :param env: environment variables to forward to the editor. + :param require_save: if this is true, then not saving in the editor + will make the return value become `None`. + :param extension: the extension to tell the editor about. This defaults + to `.txt` but changing this might change syntax + highlighting. + :param filename: if provided it will edit this file instead of the + provided text contents. It will not use a temporary + file as an indirection in that case. If the editor supports + editing multiple files at once, a sequence of files may be + passed as well. Invoke `click.file` once per file instead + if multiple files cannot be managed at once or editing the + files serially is desired. + + .. versionchanged:: 8.2.0 + ``filename`` now accepts any ``Iterable[str]`` in addition to a ``str`` + if the ``editor`` supports editing multiple files at once. + + """ + from ._termui_impl import Editor + + ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) + + if filename is None: + return ed.edit(text) + + if isinstance(filename, str): + filename = (filename,) + + ed.edit_files(filenames=filename) + return None + + +def launch(url: str, wait: bool = False, locate: bool = False) -> int: + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('https://click.palletsprojects.com/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: Wait for the program to exit before returning. This + only works if the launched program blocks. In particular, + ``xdg-open`` on Linux does not block. + :param locate: if this is set to `True` then instead of launching the + application associated with the URL it will attempt to + launch a file manager with the file located. This + might have weird effects if the URL does not point to + the filesystem. + """ + from ._termui_impl import open_url + + return open_url(url, wait=wait, locate=locate) + + +# If this is provided, getchar() calls into this instead. This is used +# for unittesting purposes. +_getchar: t.Callable[[bool], str] | None = None + + +def getchar(echo: bool = False) -> str: + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + Note for Windows: in rare cases when typing non-ASCII characters, this + function might wait for a second character and then return both at once. + This is because certain Unicode characters look like special-key markers. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + global _getchar + + if _getchar is None: + from ._termui_impl import getchar as f + + _getchar = f + + return _getchar(echo) + + +def raw_terminal() -> AbstractContextManager[int]: + from ._termui_impl import raw_terminal as f + + return f() + + +def pause(info: str | None = None, err: bool = False) -> None: + """This command stops execution and waits for the user to press any + key to continue. This is similar to the Windows batch "pause" + command. If the program is not run through a terminal, this command + will instead do nothing. + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param info: The message to print before pausing. Defaults to + ``"Press any key to continue..."``. + :param err: if set to message goes to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + if not isatty(sys.stdin) or not isatty(sys.stdout): + return + + if info is None: + info = _("Press any key to continue...") + + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/testing.py b/stripe_config/.venv/lib/python3.12/site-packages/click/testing.py new file mode 100644 index 0000000..f6f60b8 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/testing.py @@ -0,0 +1,577 @@ +from __future__ import annotations + +import collections.abc as cabc +import contextlib +import io +import os +import shlex +import sys +import tempfile +import typing as t +from types import TracebackType + +from . import _compat +from . import formatting +from . import termui +from . import utils +from ._compat import _find_binary_reader + +if t.TYPE_CHECKING: + from _typeshed import ReadableBuffer + + from .core import Command + + +class EchoingStdin: + def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: + self._input = input + self._output = output + self._paused = False + + def __getattr__(self, x: str) -> t.Any: + return getattr(self._input, x) + + def _echo(self, rv: bytes) -> bytes: + if not self._paused: + self._output.write(rv) + + return rv + + def read(self, n: int = -1) -> bytes: + return self._echo(self._input.read(n)) + + def read1(self, n: int = -1) -> bytes: + return self._echo(self._input.read1(n)) # type: ignore + + def readline(self, n: int = -1) -> bytes: + return self._echo(self._input.readline(n)) + + def readlines(self) -> list[bytes]: + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self) -> cabc.Iterator[bytes]: + return iter(self._echo(x) for x in self._input) + + def __repr__(self) -> str: + return repr(self._input) + + +@contextlib.contextmanager +def _pause_echo(stream: EchoingStdin | None) -> cabc.Iterator[None]: + if stream is None: + yield + else: + stream._paused = True + yield + stream._paused = False + + +class BytesIOCopy(io.BytesIO): + """Patch ``io.BytesIO`` to let the written stream be copied to another. + + .. versionadded:: 8.2 + """ + + def __init__(self, copy_to: io.BytesIO) -> None: + super().__init__() + self.copy_to = copy_to + + def flush(self) -> None: + super().flush() + self.copy_to.flush() + + def write(self, b: ReadableBuffer) -> int: + self.copy_to.write(b) + return super().write(b) + + +class StreamMixer: + """Mixes `` and `` streams. + + The result is available in the ``output`` attribute. + + .. versionadded:: 8.2 + """ + + def __init__(self) -> None: + self.output: io.BytesIO = io.BytesIO() + self.stdout: io.BytesIO = BytesIOCopy(copy_to=self.output) + self.stderr: io.BytesIO = BytesIOCopy(copy_to=self.output) + + def __del__(self) -> None: + """ + Guarantee that embedded file-like objects are closed in a + predictable order, protecting against races between + self.output being closed and other streams being flushed on close + + .. versionadded:: 8.2.2 + """ + self.stderr.close() + self.stdout.close() + self.output.close() + + +class _NamedTextIOWrapper(io.TextIOWrapper): + def __init__( + self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any + ) -> None: + super().__init__(buffer, **kwargs) + self._name = name + self._mode = mode + + @property + def name(self) -> str: + return self._name + + @property + def mode(self) -> str: + return self._mode + + +def make_input_stream( + input: str | bytes | t.IO[t.Any] | None, charset: str +) -> t.BinaryIO: + # Is already an input stream. + if hasattr(input, "read"): + rv = _find_binary_reader(t.cast("t.IO[t.Any]", input)) + + if rv is not None: + return rv + + raise TypeError("Could not find binary reader for input stream.") + + if input is None: + input = b"" + elif isinstance(input, str): + input = input.encode(charset) + + return io.BytesIO(input) + + +class Result: + """Holds the captured result of an invoked CLI script. + + :param runner: The runner that created the result + :param stdout_bytes: The standard output as bytes. + :param stderr_bytes: The standard error as bytes. + :param output_bytes: A mix of ``stdout_bytes`` and ``stderr_bytes``, as the + user would see it in its terminal. + :param return_value: The value returned from the invoked command. + :param exit_code: The exit code as integer. + :param exception: The exception that happened if one did. + :param exc_info: Exception information (exception type, exception instance, + traceback type). + + .. versionchanged:: 8.2 + ``stderr_bytes`` no longer optional, ``output_bytes`` introduced and + ``mix_stderr`` has been removed. + + .. versionadded:: 8.0 + Added ``return_value``. + """ + + def __init__( + self, + runner: CliRunner, + stdout_bytes: bytes, + stderr_bytes: bytes, + output_bytes: bytes, + return_value: t.Any, + exit_code: int, + exception: BaseException | None, + exc_info: tuple[type[BaseException], BaseException, TracebackType] + | None = None, + ): + self.runner = runner + self.stdout_bytes = stdout_bytes + self.stderr_bytes = stderr_bytes + self.output_bytes = output_bytes + self.return_value = return_value + self.exit_code = exit_code + self.exception = exception + self.exc_info = exc_info + + @property + def output(self) -> str: + """The terminal output as unicode string, as the user would see it. + + .. versionchanged:: 8.2 + No longer a proxy for ``self.stdout``. Now has its own independent stream + that is mixing `` and ``, in the order they were written. + """ + return self.output_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stdout(self) -> str: + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stderr(self) -> str: + """The standard error as unicode string. + + .. versionchanged:: 8.2 + No longer raise an exception, always returns the `` string. + """ + return self.stderr_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + def __repr__(self) -> str: + exc_str = repr(self.exception) if self.exception else "okay" + return f"<{type(self).__name__} {exc_str}>" + + +class CliRunner: + """The CLI runner provides functionality to invoke a Click command line + script for unittesting purposes in a isolated environment. This only + works in single-threaded systems without any concurrency as it changes the + global interpreter state. + + :param charset: the character set for the input and output data. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from `` writes + to ``. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param catch_exceptions: Whether to catch any exceptions other than + ``SystemExit`` when running :meth:`~CliRunner.invoke`. + + .. versionchanged:: 8.2 + Added the ``catch_exceptions`` parameter. + + .. versionchanged:: 8.2 + ``mix_stderr`` parameter has been removed. + """ + + def __init__( + self, + charset: str = "utf-8", + env: cabc.Mapping[str, str | None] | None = None, + echo_stdin: bool = False, + catch_exceptions: bool = True, + ) -> None: + self.charset = charset + self.env: cabc.Mapping[str, str | None] = env or {} + self.echo_stdin = echo_stdin + self.catch_exceptions = catch_exceptions + + def get_default_prog_name(self, cli: Command) -> str: + """Given a command object it will return the default program name + for it. The default is the `name` attribute or ``"root"`` if not + set. + """ + return cli.name or "root" + + def make_env( + self, overrides: cabc.Mapping[str, str | None] | None = None + ) -> cabc.Mapping[str, str | None]: + """Returns the environment overrides for invoking a script.""" + rv = dict(self.env) + if overrides: + rv.update(overrides) + return rv + + @contextlib.contextmanager + def isolation( + self, + input: str | bytes | t.IO[t.Any] | None = None, + env: cabc.Mapping[str, str | None] | None = None, + color: bool = False, + ) -> cabc.Iterator[tuple[io.BytesIO, io.BytesIO, io.BytesIO]]: + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up `` with the given input data + and `os.environ` with the overrides from the given dictionary. + This also rebinds some internals in Click to be mocked (like the + prompt functionality). + + This is automatically done in the :meth:`invoke` method. + + :param input: the input stream to put into `sys.stdin`. + :param env: the environment overrides as dictionary. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionadded:: 8.2 + An additional output stream is returned, which is a mix of + `` and `` streams. + + .. versionchanged:: 8.2 + Always returns the `` stream. + + .. versionchanged:: 8.0 + `` is opened with ``errors="backslashreplace"`` + instead of the default ``"strict"``. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + """ + bytes_input = make_input_stream(input, self.charset) + echo_input = None + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = formatting.FORCED_WIDTH + formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + stream_mixer = StreamMixer() + + if self.echo_stdin: + bytes_input = echo_input = t.cast( + t.BinaryIO, EchoingStdin(bytes_input, stream_mixer.stdout) + ) + + sys.stdin = text_input = _NamedTextIOWrapper( + bytes_input, encoding=self.charset, name="", mode="r" + ) + + if self.echo_stdin: + # Force unbuffered reads, otherwise TextIOWrapper reads a + # large chunk which is echoed early. + text_input._CHUNK_SIZE = 1 # type: ignore + + sys.stdout = _NamedTextIOWrapper( + stream_mixer.stdout, encoding=self.charset, name="", mode="w" + ) + + sys.stderr = _NamedTextIOWrapper( + stream_mixer.stderr, + encoding=self.charset, + name="", + mode="w", + errors="backslashreplace", + ) + + @_pause_echo(echo_input) # type: ignore + def visible_input(prompt: str | None = None) -> str: + sys.stdout.write(prompt or "") + try: + val = next(text_input).rstrip("\r\n") + except StopIteration as e: + raise EOFError() from e + sys.stdout.write(f"{val}\n") + sys.stdout.flush() + return val + + @_pause_echo(echo_input) # type: ignore + def hidden_input(prompt: str | None = None) -> str: + sys.stdout.write(f"{prompt or ''}\n") + sys.stdout.flush() + try: + return next(text_input).rstrip("\r\n") + except StopIteration as e: + raise EOFError() from e + + @_pause_echo(echo_input) # type: ignore + def _getchar(echo: bool) -> str: + char = sys.stdin.read(1) + + if echo: + sys.stdout.write(char) + + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi( + stream: t.IO[t.Any] | None = None, color: bool | None = None + ) -> bool: + if color is None: + return not default_color + return not color + + old_visible_prompt_func = termui.visible_prompt_func + old_hidden_prompt_func = termui.hidden_prompt_func + old__getchar_func = termui._getchar + old_should_strip_ansi = utils.should_strip_ansi # type: ignore + old__compat_should_strip_ansi = _compat.should_strip_ansi + termui.visible_prompt_func = visible_input + termui.hidden_prompt_func = hidden_input + termui._getchar = _getchar + utils.should_strip_ansi = should_strip_ansi # type: ignore + _compat.should_strip_ansi = should_strip_ansi + + old_env = {} + try: + for key, value in env.items(): + old_env[key] = os.environ.get(key) + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + yield (stream_mixer.stdout, stream_mixer.stderr, stream_mixer.output) + finally: + for key, value in old_env.items(): + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + sys.stdout = old_stdout + sys.stderr = old_stderr + sys.stdin = old_stdin + termui.visible_prompt_func = old_visible_prompt_func + termui.hidden_prompt_func = old_hidden_prompt_func + termui._getchar = old__getchar_func + utils.should_strip_ansi = old_should_strip_ansi # type: ignore + _compat.should_strip_ansi = old__compat_should_strip_ansi + formatting.FORCED_WIDTH = old_forced_width + + def invoke( + self, + cli: Command, + args: str | cabc.Sequence[str] | None = None, + input: str | bytes | t.IO[t.Any] | None = None, + env: cabc.Mapping[str, str | None] | None = None, + catch_exceptions: bool | None = None, + color: bool = False, + **extra: t.Any, + ) -> Result: + """Invokes a command in an isolated environment. The arguments are + forwarded directly to the command line script, the `extra` keyword + arguments are passed to the :meth:`~clickpkg.Command.main` function of + the command. + + This returns a :class:`Result` object. + + :param cli: the command to invoke + :param args: the arguments to invoke. It may be given as an iterable + or a string. When given as string it will be interpreted + as a Unix shell command. More details at + :func:`shlex.split`. + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. If :data:`None`, the value + from :class:`CliRunner` is used. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionadded:: 8.2 + The result object has the ``output_bytes`` attribute with + the mix of ``stdout_bytes`` and ``stderr_bytes``, as the user would + see it in its terminal. + + .. versionchanged:: 8.2 + The result object always returns the ``stderr_bytes`` stream. + + .. versionchanged:: 8.0 + The result object has the ``return_value`` attribute with + the value returned from the invoked command. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionchanged:: 3.0 + Added the ``catch_exceptions`` parameter. + + .. versionchanged:: 3.0 + The result object has the ``exc_info`` attribute with the + traceback if available. + """ + exc_info = None + if catch_exceptions is None: + catch_exceptions = self.catch_exceptions + + with self.isolation(input=input, env=env, color=color) as outstreams: + return_value = None + exception: BaseException | None = None + exit_code = 0 + + if isinstance(args, str): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + return_value = cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + e_code = t.cast("int | t.Any | None", e.code) + + if e_code is None: + e_code = 0 + + if e_code != 0: + exception = e + + if not isinstance(e_code, int): + sys.stdout.write(str(e_code)) + sys.stdout.write("\n") + e_code = 1 + + exit_code = e_code + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + sys.stderr.flush() + stdout = outstreams[0].getvalue() + stderr = outstreams[1].getvalue() + output = outstreams[2].getvalue() + + return Result( + runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + output_bytes=output, + return_value=return_value, + exit_code=exit_code, + exception=exception, + exc_info=exc_info, # type: ignore + ) + + @contextlib.contextmanager + def isolated_filesystem( + self, temp_dir: str | os.PathLike[str] | None = None + ) -> cabc.Iterator[str]: + """A context manager that creates a temporary directory and + changes the current working directory to it. This isolates tests + that affect the contents of the CWD to prevent them from + interfering with each other. + + :param temp_dir: Create the temporary directory under this + directory. If given, the created directory is not removed + when exiting. + + .. versionchanged:: 8.0 + Added the ``temp_dir`` parameter. + """ + cwd = os.getcwd() + dt = tempfile.mkdtemp(dir=temp_dir) + os.chdir(dt) + + try: + yield dt + finally: + os.chdir(cwd) + + if temp_dir is None: + import shutil + + try: + shutil.rmtree(dt) + except OSError: + pass diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/types.py b/stripe_config/.venv/lib/python3.12/site-packages/click/types.py new file mode 100644 index 0000000..e71c1c2 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/types.py @@ -0,0 +1,1209 @@ +from __future__ import annotations + +import collections.abc as cabc +import enum +import os +import stat +import sys +import typing as t +from datetime import datetime +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import _get_argv_encoding +from ._compat import open_stream +from .exceptions import BadParameter +from .utils import format_filename +from .utils import LazyFile +from .utils import safecall + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .core import Context + from .core import Parameter + from .shell_completion import CompletionItem + +ParamTypeValue = t.TypeVar("ParamTypeValue") + + +class ParamType: + """Represents the type of a parameter. Validates and converts values + from the command line or Python into the correct type. + + To implement a custom type, subclass and implement at least the + following: + + - The :attr:`name` class attribute must be set. + - Calling an instance of the type with ``None`` must return + ``None``. This is already implemented by default. + - :meth:`convert` must convert string values to the correct type. + - :meth:`convert` must accept values that are already the correct + type. + - It must be able to convert a value if the ``ctx`` and ``param`` + arguments are ``None``. This can occur when converting prompt + input. + """ + + is_composite: t.ClassVar[bool] = False + arity: t.ClassVar[int] = 1 + + #: the descriptive name of this type + name: str + + #: if a list of this type is expected and the value is pulled from a + #: string environment variable, this is what splits it up. `None` + #: means any whitespace. For all parameters the general rule is that + #: whitespace splits them up. The exception are paths and files which + #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on + #: Windows). + envvar_list_splitter: t.ClassVar[str | None] = None + + def to_info_dict(self) -> dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + # The class name without the "ParamType" suffix. + param_type = type(self).__name__.partition("ParamType")[0] + param_type = param_type.partition("ParameterType")[0] + + # Custom subclasses might not remember to set a name. + if hasattr(self, "name"): + name = self.name + else: + name = param_type + + return {"param_type": param_type, "name": name} + + def __call__( + self, + value: t.Any, + param: Parameter | None = None, + ctx: Context | None = None, + ) -> t.Any: + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param: Parameter, ctx: Context) -> str | None: + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param: Parameter, ctx: Context | None) -> str | None: + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + """Convert the value to the correct type. This is not called if + the value is ``None`` (the missing value). + + This must accept string values from the command line, as well as + values that are already the correct type. It may also convert + other compatible types. + + The ``param`` and ``ctx`` arguments may be ``None`` in certain + situations, such as when converting prompt input. + + If the value cannot be converted, call :meth:`fail` with a + descriptive message. + + :param value: The value to convert. + :param param: The parameter that is using this type to convert + its value. May be ``None``. + :param ctx: The current context that arrived at this value. May + be ``None``. + """ + return value + + def split_envvar_value(self, rv: str) -> cabc.Sequence[str]: + """Given a value from an environment variable this splits it up + into small chunks depending on the defined envvar list splitter. + + If the splitter is set to `None`, which means that whitespace splits, + then leading and trailing whitespace is ignored. Otherwise, leading + and trailing splitters usually lead to empty items being included. + """ + return (rv or "").split(self.envvar_list_splitter) + + def fail( + self, + message: str, + param: Parameter | None = None, + ctx: Context | None = None, + ) -> t.NoReturn: + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + def shell_complete( + self, ctx: Context, param: Parameter, incomplete: str + ) -> list[CompletionItem]: + """Return a list of + :class:`~click.shell_completion.CompletionItem` objects for the + incomplete value. Most types do not provide completions, but + some do, and this allows custom types to provide custom + completions as well. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + return [] + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self) -> int: # type: ignore + raise NotImplementedError() + + +class FuncParamType(ParamType): + def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: + self.name: str = func.__name__ + self.func = func + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["func"] = self.func + return info_dict + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + try: + return self.func(value) + except ValueError: + try: + value = str(value) + except UnicodeError: + value = value.decode("utf-8", "replace") + + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + return value + + def __repr__(self) -> str: + return "UNPROCESSED" + + +class StringParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = sys.getfilesystemencoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode("utf-8", "replace") + else: + value = value.decode("utf-8", "replace") + return value + return str(value) + + def __repr__(self) -> str: + return "STRING" + + +class Choice(ParamType, t.Generic[ParamTypeValue]): + """The choice type allows a value to be checked against a fixed set + of supported values. + + You may pass any iterable value which will be converted to a tuple + and thus will only be iterated once. + + The resulting value will always be one of the originally passed choices. + See :meth:`normalize_choice` for more info on the mapping of strings + to choices. See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + + .. versionchanged:: 8.2.0 + Non-``str`` ``choices`` are now supported. It can additionally be any + iterable. Before you were not recommended to pass anything but a list or + tuple. + + .. versionadded:: 8.2.0 + Choice normalization can be overridden via :meth:`normalize_choice`. + """ + + name = "choice" + + def __init__( + self, choices: cabc.Iterable[ParamTypeValue], case_sensitive: bool = True + ) -> None: + self.choices: cabc.Sequence[ParamTypeValue] = tuple(choices) + self.case_sensitive = case_sensitive + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["choices"] = self.choices + info_dict["case_sensitive"] = self.case_sensitive + return info_dict + + def _normalized_mapping( + self, ctx: Context | None = None + ) -> cabc.Mapping[ParamTypeValue, str]: + """ + Returns mapping where keys are the original choices and the values are + the normalized values that are accepted via the command line. + + This is a simple wrapper around :meth:`normalize_choice`, use that + instead which is supported. + """ + return { + choice: self.normalize_choice( + choice=choice, + ctx=ctx, + ) + for choice in self.choices + } + + def normalize_choice(self, choice: ParamTypeValue, ctx: Context | None) -> str: + """ + Normalize a choice value, used to map a passed string to a choice. + Each choice must have a unique normalized value. + + By default uses :meth:`Context.token_normalize_func` and if not case + sensitive, convert it to a casefolded value. + + .. versionadded:: 8.2.0 + """ + normed_value = choice.name if isinstance(choice, enum.Enum) else str(choice) + + if ctx is not None and ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(normed_value) + + if not self.case_sensitive: + normed_value = normed_value.casefold() + + return normed_value + + def get_metavar(self, param: Parameter, ctx: Context) -> str | None: + if param.param_type_name == "option" and not param.show_choices: # type: ignore + choice_metavars = [ + convert_type(type(choice)).name.upper() for choice in self.choices + ] + choices_str = "|".join([*dict.fromkeys(choice_metavars)]) + else: + choices_str = "|".join( + [str(i) for i in self._normalized_mapping(ctx=ctx).values()] + ) + + # Use curly braces to indicate a required argument. + if param.required and param.param_type_name == "argument": + return f"{{{choices_str}}}" + + # Use square braces to indicate an option or optional argument. + return f"[{choices_str}]" + + def get_missing_message(self, param: Parameter, ctx: Context | None) -> str: + """ + Message shown when no choice is passed. + + .. versionchanged:: 8.2.0 Added ``ctx`` argument. + """ + return _("Choose from:\n\t{choices}").format( + choices=",\n\t".join(self._normalized_mapping(ctx=ctx).values()) + ) + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> ParamTypeValue: + """ + For a given value from the parser, normalize it and find its + matching normalized value in the list of choices. Then return the + matched "original" choice. + """ + normed_value = self.normalize_choice(choice=value, ctx=ctx) + normalized_mapping = self._normalized_mapping(ctx=ctx) + + try: + return next( + original + for original, normalized in normalized_mapping.items() + if normalized == normed_value + ) + except StopIteration: + self.fail( + self.get_invalid_choice_message(value=value, ctx=ctx), + param=param, + ctx=ctx, + ) + + def get_invalid_choice_message(self, value: t.Any, ctx: Context | None) -> str: + """Get the error message when the given choice is invalid. + + :param value: The invalid value. + + .. versionadded:: 8.2 + """ + choices_str = ", ".join(map(repr, self._normalized_mapping(ctx=ctx).values())) + return ngettext( + "{value!r} is not {choice}.", + "{value!r} is not one of {choices}.", + len(self.choices), + ).format(value=value, choice=choices_str, choices=choices_str) + + def __repr__(self) -> str: + return f"Choice({list(self.choices)})" + + def shell_complete( + self, ctx: Context, param: Parameter, incomplete: str + ) -> list[CompletionItem]: + """Complete choices that start with the incomplete value. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + str_choices = map(str, self.choices) + + if self.case_sensitive: + matched = (c for c in str_choices if c.startswith(incomplete)) + else: + incomplete = incomplete.lower() + matched = (c for c in str_choices if c.lower().startswith(incomplete)) + + return [CompletionItem(c) for c in matched] + + +class DateTime(ParamType): + """The DateTime type converts date strings into `datetime` objects. + + The format strings which are checked are configurable, but default to some + common (non-timezone aware) ISO 8601 formats. + + When specifying *DateTime* formats, you should only pass a list or a tuple. + Other iterables, like generators, may lead to surprising results. + + The format strings are processed using ``datetime.strptime``, and this + consequently defines the format strings which are allowed. + + Parsing is tried using each format, in order, and the first format which + parses successfully is used. + + :param formats: A list or tuple of date format strings, in the order in + which they should be tried. Defaults to + ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, + ``'%Y-%m-%d %H:%M:%S'``. + """ + + name = "datetime" + + def __init__(self, formats: cabc.Sequence[str] | None = None): + self.formats: cabc.Sequence[str] = formats or [ + "%Y-%m-%d", + "%Y-%m-%dT%H:%M:%S", + "%Y-%m-%d %H:%M:%S", + ] + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["formats"] = self.formats + return info_dict + + def get_metavar(self, param: Parameter, ctx: Context) -> str | None: + return f"[{'|'.join(self.formats)}]" + + def _try_to_convert_date(self, value: t.Any, format: str) -> datetime | None: + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + if isinstance(value, datetime): + return value + + for format in self.formats: + converted = self._try_to_convert_date(value, format) + + if converted is not None: + return converted + + formats_str = ", ".join(map(repr, self.formats)) + self.fail( + ngettext( + "{value!r} does not match the format {format}.", + "{value!r} does not match the formats {formats}.", + len(self.formats), + ).format(value=value, format=formats_str, formats=formats_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return "DateTime" + + +class _NumberParamTypeBase(ParamType): + _number_class: t.ClassVar[type[t.Any]] + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + try: + return self._number_class(value) + except ValueError: + self.fail( + _("{value!r} is not a valid {number_type}.").format( + value=value, number_type=self.name + ), + param, + ctx, + ) + + +class _NumberRangeBase(_NumberParamTypeBase): + def __init__( + self, + min: float | None = None, + max: float | None = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + self.min = min + self.max = max + self.min_open = min_open + self.max_open = max_open + self.clamp = clamp + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + min=self.min, + max=self.max, + min_open=self.min_open, + max_open=self.max_open, + clamp=self.clamp, + ) + return info_dict + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + import operator + + rv = super().convert(value, param, ctx) + lt_min: bool = self.min is not None and ( + operator.le if self.min_open else operator.lt + )(rv, self.min) + gt_max: bool = self.max is not None and ( + operator.ge if self.max_open else operator.gt + )(rv, self.max) + + if self.clamp: + if lt_min: + return self._clamp(self.min, 1, self.min_open) # type: ignore + + if gt_max: + return self._clamp(self.max, -1, self.max_open) # type: ignore + + if lt_min or gt_max: + self.fail( + _("{value} is not in the range {range}.").format( + value=rv, range=self._describe_range() + ), + param, + ctx, + ) + + return rv + + def _clamp(self, bound: float, dir: t.Literal[1, -1], open: bool) -> float: + """Find the valid value to clamp to bound in the given + direction. + + :param bound: The boundary value. + :param dir: 1 or -1 indicating the direction to move. + :param open: If true, the range does not include the bound. + """ + raise NotImplementedError + + def _describe_range(self) -> str: + """Describe the range for use in help text.""" + if self.min is None: + op = "<" if self.max_open else "<=" + return f"x{op}{self.max}" + + if self.max is None: + op = ">" if self.min_open else ">=" + return f"x{op}{self.min}" + + lop = "<" if self.min_open else "<=" + rop = "<" if self.max_open else "<=" + return f"{self.min}{lop}x{rop}{self.max}" + + def __repr__(self) -> str: + clamp = " clamped" if self.clamp else "" + return f"<{type(self).__name__} {self._describe_range()}{clamp}>" + + +class IntParamType(_NumberParamTypeBase): + name = "integer" + _number_class = int + + def __repr__(self) -> str: + return "INT" + + +class IntRange(_NumberRangeBase, IntParamType): + """Restrict an :data:`click.INT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "integer range" + + def _clamp( # type: ignore + self, bound: int, dir: t.Literal[1, -1], open: bool + ) -> int: + if not open: + return bound + + return bound + dir + + +class FloatParamType(_NumberParamTypeBase): + name = "float" + _number_class = float + + def __repr__(self) -> str: + return "FLOAT" + + +class FloatRange(_NumberRangeBase, FloatParamType): + """Restrict a :data:`click.FLOAT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. This is not supported if either + boundary is marked ``open``. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "float range" + + def __init__( + self, + min: float | None = None, + max: float | None = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + super().__init__( + min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp + ) + + if (min_open or max_open) and clamp: + raise TypeError("Clamping is not supported for open bounds.") + + def _clamp(self, bound: float, dir: t.Literal[1, -1], open: bool) -> float: + if not open: + return bound + + # Could use math.nextafter here, but clamping an + # open float range doesn't seem to be particularly useful. It's + # left up to the user to write a callback to do it if needed. + raise RuntimeError("Clamping is not supported for open bounds.") + + +class BoolParamType(ParamType): + name = "boolean" + + bool_states: dict[str, bool] = { + "1": True, + "0": False, + "yes": True, + "no": False, + "true": True, + "false": False, + "on": True, + "off": False, + "t": True, + "f": False, + "y": True, + "n": False, + # Absence of value is considered False. + "": False, + } + """A mapping of string values to boolean states. + + Mapping is inspired by :py:attr:`configparser.ConfigParser.BOOLEAN_STATES` + and extends it. + + .. caution:: + String values are lower-cased, as the ``str_to_bool`` comparison function + below is case-insensitive. + + .. warning:: + The mapping is not exhaustive, and does not cover all possible boolean strings + representations. It will remains as it is to avoid endless bikeshedding. + + Future work my be considered to make this mapping user-configurable from public + API. + """ + + @staticmethod + def str_to_bool(value: str | bool) -> bool | None: + """Convert a string to a boolean value. + + If the value is already a boolean, it is returned as-is. If the value is a + string, it is stripped of whitespaces and lower-cased, then checked against + the known boolean states pre-defined in the `BoolParamType.bool_states` mapping + above. + + Returns `None` if the value does not match any known boolean state. + """ + if isinstance(value, bool): + return value + return BoolParamType.bool_states.get(value.strip().lower()) + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> bool: + normalized = self.str_to_bool(value) + if normalized is None: + self.fail( + _( + "{value!r} is not a valid boolean. Recognized values: {states}" + ).format(value=value, states=", ".join(sorted(self.bool_states))), + param, + ctx, + ) + return normalized + + def __repr__(self) -> str: + return "BOOL" + + +class UUIDParameterType(ParamType): + name = "uuid" + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + import uuid + + if isinstance(value, uuid.UUID): + return value + + value = value.strip() + + try: + return uuid.UUID(value) + except ValueError: + self.fail( + _("{value!r} is not a valid UUID.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "UUID" + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or upon + first IO. The default is to be non-lazy for standard input and output + streams as well as files opened for reading, `lazy` otherwise. When opening a + file lazily for reading, it is still opened temporarily for validation, but + will not be held open until first IO. lazy is mainly useful when opening + for writing to avoid creating the file until it is needed. + + Files can also be opened atomically in which case all writes go into a + separate file in the same folder and upon completion the file will + be moved over to the original location. This is useful if a file + regularly read by other users is modified. + + See :ref:`file-args` for more information. + + .. versionchanged:: 2.0 + Added the ``atomic`` parameter. + """ + + name = "filename" + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + mode: str = "r", + encoding: str | None = None, + errors: str | None = "strict", + lazy: bool | None = None, + atomic: bool = False, + ) -> None: + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update(mode=self.mode, encoding=self.encoding) + return info_dict + + def resolve_lazy_flag(self, value: str | os.PathLike[str]) -> bool: + if self.lazy is not None: + return self.lazy + if os.fspath(value) == "-": + return False + elif "w" in self.mode: + return True + return False + + def convert( + self, + value: str | os.PathLike[str] | t.IO[t.Any], + param: Parameter | None, + ctx: Context | None, + ) -> t.IO[t.Any]: + if _is_file_like(value): + return value + + value = t.cast("str | os.PathLike[str]", value) + + try: + lazy = self.resolve_lazy_flag(value) + + if lazy: + lf = LazyFile( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + if ctx is not None: + ctx.call_on_close(lf.close_intelligently) + + return t.cast("t.IO[t.Any]", lf) + + f, should_close = open_stream( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + # If a context is provided, we automatically close the file + # at the end of the context execution (or flush out). If a + # context does not exist, it's the caller's responsibility to + # properly close the file. This for instance happens when the + # type is used with prompts. + if ctx is not None: + if should_close: + ctx.call_on_close(safecall(f.close)) + else: + ctx.call_on_close(safecall(f.flush)) + + return f + except OSError as e: + self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) + + def shell_complete( + self, ctx: Context, param: Parameter, incomplete: str + ) -> list[CompletionItem]: + """Return a special completion marker that tells the completion + system to use the shell to provide file path completions. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + return [CompletionItem(incomplete, type="file")] + + +def _is_file_like(value: t.Any) -> te.TypeGuard[t.IO[t.Any]]: + return hasattr(value, "read") or hasattr(value, "write") + + +class Path(ParamType): + """The ``Path`` type is similar to the :class:`File` type, but + returns the filename instead of an open file. Various checks can be + enabled to validate the type of file and permissions. + + :param exists: The file or directory needs to exist for the value to + be valid. If this is not set to ``True``, and the file does not + exist, then all further checks are silently skipped. + :param file_okay: Allow a file as a value. + :param dir_okay: Allow a directory as a value. + :param readable: if true, a readable check is performed. + :param writable: if true, a writable check is performed. + :param executable: if true, an executable check is performed. + :param resolve_path: Make the value absolute and resolve any + symlinks. A ``~`` is not expanded, as this is supposed to be + done by the shell only. + :param allow_dash: Allow a single dash as a value, which indicates + a standard stream (but does not open it). Use + :func:`~click.open_file` to handle opening this value. + :param path_type: Convert the incoming path value to this type. If + ``None``, keep Python's default, which is ``str``. Useful to + convert to :class:`pathlib.Path`. + + .. versionchanged:: 8.1 + Added the ``executable`` parameter. + + .. versionchanged:: 8.0 + Allow passing ``path_type=pathlib.Path``. + + .. versionchanged:: 6.0 + Added the ``allow_dash`` parameter. + """ + + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + exists: bool = False, + file_okay: bool = True, + dir_okay: bool = True, + writable: bool = False, + readable: bool = True, + resolve_path: bool = False, + allow_dash: bool = False, + path_type: type[t.Any] | None = None, + executable: bool = False, + ): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.readable = readable + self.writable = writable + self.executable = executable + self.resolve_path = resolve_path + self.allow_dash = allow_dash + self.type = path_type + + if self.file_okay and not self.dir_okay: + self.name: str = _("file") + elif self.dir_okay and not self.file_okay: + self.name = _("directory") + else: + self.name = _("path") + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + exists=self.exists, + file_okay=self.file_okay, + dir_okay=self.dir_okay, + writable=self.writable, + readable=self.readable, + allow_dash=self.allow_dash, + ) + return info_dict + + def coerce_path_result( + self, value: str | os.PathLike[str] + ) -> str | bytes | os.PathLike[str]: + if self.type is not None and not isinstance(value, self.type): + if self.type is str: + return os.fsdecode(value) + elif self.type is bytes: + return os.fsencode(value) + else: + return t.cast("os.PathLike[str]", self.type(value)) + + return value + + def convert( + self, + value: str | os.PathLike[str], + param: Parameter | None, + ctx: Context | None, + ) -> str | bytes | os.PathLike[str]: + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") + + if not is_dash: + if self.resolve_path: + rv = os.path.realpath(rv) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail( + _("{name} {filename!r} does not exist.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail( + _("{name} {filename!r} is a file.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail( + _("{name} {filename!r} is a directory.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.readable and not os.access(rv, os.R_OK): + self.fail( + _("{name} {filename!r} is not readable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.writable and not os.access(rv, os.W_OK): + self.fail( + _("{name} {filename!r} is not writable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.executable and not os.access(value, os.X_OK): + self.fail( + _("{name} {filename!r} is not executable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + return self.coerce_path_result(rv) + + def shell_complete( + self, ctx: Context, param: Parameter, incomplete: str + ) -> list[CompletionItem]: + """Return a special completion marker that tells the completion + system to use the shell to provide path completions for only + directories or any paths. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + type = "dir" if self.dir_okay and not self.file_okay else "file" + return [CompletionItem(incomplete, type=type)] + + +class Tuple(CompositeParamType): + """The default behavior of Click is to apply a type on a value directly. + This works well in most cases, except for when `nargs` is set to a fixed + count and different types should be used for different items. In this + case the :class:`Tuple` type can be used. This type can only be used + if `nargs` is set to a fixed number. + + For more information see :ref:`tuple-type`. + + This can be selected by using a Python tuple literal as a type. + + :param types: a list of types that should be used for the tuple items. + """ + + def __init__(self, types: cabc.Sequence[type[t.Any] | ParamType]) -> None: + self.types: cabc.Sequence[ParamType] = [convert_type(ty) for ty in types] + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["types"] = [t.to_info_dict() for t in self.types] + return info_dict + + @property + def name(self) -> str: # type: ignore + return f"<{' '.join(ty.name for ty in self.types)}>" + + @property + def arity(self) -> int: # type: ignore + return len(self.types) + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + len_type = len(self.types) + len_value = len(value) + + if len_value != len_type: + self.fail( + ngettext( + "{len_type} values are required, but {len_value} was given.", + "{len_type} values are required, but {len_value} were given.", + len_value, + ).format(len_type=len_type, len_value=len_value), + param=param, + ctx=ctx, + ) + + return tuple( + ty(x, param, ctx) for ty, x in zip(self.types, value, strict=False) + ) + + +def convert_type(ty: t.Any | None, default: t.Any | None = None) -> ParamType: + """Find the most appropriate :class:`ParamType` for the given Python + type. If the type isn't provided, it can be inferred from a default + value. + """ + guessed_type = False + + if ty is None and default is not None: + if isinstance(default, (tuple, list)): + # If the default is empty, ty will remain None and will + # return STRING. + if default: + item = default[0] + + # A tuple of tuples needs to detect the inner types. + # Can't call convert recursively because that would + # incorrectly unwind the tuple to a single type. + if isinstance(item, (tuple, list)): + ty = tuple(map(type, item)) + else: + ty = type(item) + else: + ty = type(default) + + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + + if isinstance(ty, ParamType): + return ty + + if ty is str or ty is None: + return STRING + + if ty is int: + return INT + + if ty is float: + return FLOAT + + if ty is bool: + return BOOL + + if guessed_type: + return STRING + + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError( + f"Attempted to use an uninstantiated parameter type ({ty})." + ) + except TypeError: + # ty is an instance (correct), so issubclass fails. + pass + + return FuncParamType(ty) + + +#: A dummy parameter type that just does nothing. From a user's +#: perspective this appears to just be the same as `STRING` but +#: internally no string conversion takes place if the input was bytes. +#: This is usually useful when working with file paths as they can +#: appear in bytes and unicode. +#: +#: For path related uses the :class:`Path` type is a better choice but +#: there are situations where an unprocessed type is useful which is why +#: it is is provided. +#: +#: .. versionadded:: 4.0 +UNPROCESSED = UnprocessedParamType() + +#: A unicode string parameter type which is the implicit default. This +#: can also be selected by using ``str`` as type. +STRING = StringParamType() + +#: An integer parameter. This can also be selected by using ``int`` as +#: type. +INT = IntParamType() + +#: A floating point value parameter. This can also be selected by using +#: ``float`` as type. +FLOAT = FloatParamType() + +#: A boolean parameter. This is the default for boolean flags. This can +#: also be selected by using ``bool`` as a type. +BOOL = BoolParamType() + +#: A UUID parameter. +UUID = UUIDParameterType() + + +class OptionHelpExtra(t.TypedDict, total=False): + envvars: tuple[str, ...] + default: str + range: str + required: str diff --git a/stripe_config/.venv/lib/python3.12/site-packages/click/utils.py b/stripe_config/.venv/lib/python3.12/site-packages/click/utils.py new file mode 100644 index 0000000..beae26f --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/click/utils.py @@ -0,0 +1,627 @@ +from __future__ import annotations + +import collections.abc as cabc +import os +import re +import sys +import typing as t +from functools import update_wrapper +from types import ModuleType +from types import TracebackType + +from ._compat import _default_text_stderr +from ._compat import _default_text_stdout +from ._compat import _find_binary_writer +from ._compat import auto_wrap_for_ansi +from ._compat import binary_streams +from ._compat import open_stream +from ._compat import should_strip_ansi +from ._compat import strip_ansi +from ._compat import text_streams +from ._compat import WIN +from .globals import resolve_color_default + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") + + +def _posixify(name: str) -> str: + return "-".join(name.split()).lower() + + +def safecall(func: t.Callable[P, R]) -> t.Callable[P, R | None]: + """Wraps a function so that it swallows exceptions.""" + + def wrapper(*args: P.args, **kwargs: P.kwargs) -> R | None: + try: + return func(*args, **kwargs) + except Exception: + pass + return None + + return update_wrapper(wrapper, func) + + +def make_str(value: t.Any) -> str: + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(sys.getfilesystemencoding()) + except UnicodeError: + return value.decode("utf-8", "replace") + return str(value) + + +def make_default_short_help(help: str, max_length: int = 45) -> str: + """Returns a condensed version of help string.""" + # Consider only the first paragraph. + paragraph_end = help.find("\n\n") + + if paragraph_end != -1: + help = help[:paragraph_end] + + # Collapse newlines, tabs, and spaces. + words = help.split() + + if not words: + return "" + + # The first paragraph started with a "no rewrap" marker, ignore it. + if words[0] == "\b": + words = words[1:] + + total_length = 0 + last_index = len(words) - 1 + + for i, word in enumerate(words): + total_length += len(word) + (i > 0) + + if total_length > max_length: # too long, truncate + break + + if word[-1] == ".": # sentence end, truncate without "..." + return " ".join(words[: i + 1]) + + if total_length == max_length and i != last_index: + break # not at sentence end, truncate with "..." + else: + return " ".join(words) # no truncation needed + + # Account for the length of the suffix. + total_length += len("...") + + # remove words until the length is short enough + while i > 0: + total_length -= len(words[i]) + (i > 0) + + if total_length <= max_length: + break + + i -= 1 + + return " ".join(words[:i]) + "..." + + +class LazyFile: + """A lazy file works like a regular file but it does not fully open + the file but it does perform some basic checks early to see if the + filename parameter does make sense. This is useful for safely opening + files for writing. + """ + + def __init__( + self, + filename: str | os.PathLike[str], + mode: str = "r", + encoding: str | None = None, + errors: str | None = "strict", + atomic: bool = False, + ): + self.name: str = os.fspath(filename) + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + self._f: t.IO[t.Any] | None + self.should_close: bool + + if self.name == "-": + self._f, self.should_close = open_stream(filename, mode, encoding, errors) + else: + if "r" in mode: + # Open and close the file in case we're opening it for + # reading so that we can catch at least some errors in + # some cases early. + open(filename, mode).close() + self._f = None + self.should_close = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self.open(), name) + + def __repr__(self) -> str: + if self._f is not None: + return repr(self._f) + return f"" + + def open(self) -> t.IO[t.Any]: + """Opens the file if it's not yet open. This call might fail with + a :exc:`FileError`. Not handling this error will produce an error + that Click shows. + """ + if self._f is not None: + return self._f + try: + rv, self.should_close = open_stream( + self.name, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + except OSError as e: + from .exceptions import FileError + + raise FileError(self.name, hint=e.strerror) from e + self._f = rv + return rv + + def close(self) -> None: + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self) -> None: + """This function only closes the file if it was opened by the lazy + file wrapper. For instance this will never close stdin. + """ + if self.should_close: + self.close() + + def __enter__(self) -> LazyFile: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.close_intelligently() + + def __iter__(self) -> cabc.Iterator[t.AnyStr]: + self.open() + return iter(self._f) # type: ignore + + +class KeepOpenFile: + def __init__(self, file: t.IO[t.Any]) -> None: + self._file: t.IO[t.Any] = file + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._file, name) + + def __enter__(self) -> KeepOpenFile: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + pass + + def __repr__(self) -> str: + return repr(self._file) + + def __iter__(self) -> cabc.Iterator[t.AnyStr]: + return iter(self._file) + + +def echo( + message: t.Any | None = None, + file: t.IO[t.Any] | None = None, + nl: bool = True, + err: bool = False, + color: bool | None = None, +) -> None: + """Print a message and newline to stdout or a file. This should be + used instead of :func:`print` because it provides better support + for different data, files, and environments. + + Compared to :func:`print`, this does the following: + + - Ensures that the output encoding is not misconfigured on Linux. + - Supports Unicode in the Windows console. + - Supports writing to binary outputs, and supports writing bytes + to text outputs. + - Supports colors and styles on Windows. + - Removes ANSI color and style codes if the output does not look + like an interactive terminal. + - Always flushes the output. + + :param message: The string or bytes to output. Other objects are + converted to strings. + :param file: The file to write to. Defaults to ``stdout``. + :param err: Write to ``stderr`` instead of ``stdout``. + :param nl: Print a newline after the message. Enabled by default. + :param color: Force showing or hiding colors and other styles. By + default Click will remove color if the output does not look like + an interactive terminal. + + .. versionchanged:: 6.0 + Support Unicode output on the Windows console. Click does not + modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` + will still not support Unicode. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionadded:: 3.0 + Added the ``err`` parameter. + + .. versionchanged:: 2.0 + Support colors on Windows if colorama is installed. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + return + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, (str, bytes, bytearray)): + out: str | bytes | bytearray | None = str(message) + else: + out = message + + if nl: + out = out or "" + if isinstance(out, str): + out += "\n" + else: + out += b"\n" + + if not out: + file.flush() + return + + # If there is a message and the value looks like bytes, we manually + # need to find the binary stream and write the message in there. + # This is done separately so that most stream types will work as you + # would expect. Eg: you can write to StringIO for other cases. + if isinstance(out, (bytes, bytearray)): + binary_file = _find_binary_writer(file) + + if binary_file is not None: + file.flush() + binary_file.write(out) + binary_file.flush() + return + + # ANSI style code support. For no message or bytes, nothing happens. + # When outputting to a file instead of a terminal, strip codes. + else: + color = resolve_color_default(color) + + if should_strip_ansi(file, color): + out = strip_ansi(out) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file, color) # type: ignore + elif not color: + out = strip_ansi(out) + + file.write(out) # type: ignore + file.flush() + + +def get_binary_stream(name: t.Literal["stdin", "stdout", "stderr"]) -> t.BinaryIO: + """Returns a system stream for byte processing. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + """ + opener = binary_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener() + + +def get_text_stream( + name: t.Literal["stdin", "stdout", "stderr"], + encoding: str | None = None, + errors: str | None = "strict", +) -> t.TextIO: + """Returns a system stream for text processing. This usually returns + a wrapped stream around a binary stream returned from + :func:`get_binary_stream` but it also can take shortcuts for already + correctly configured streams. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + :param encoding: overrides the detected default encoding. + :param errors: overrides the default error mode. + """ + opener = text_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener(encoding, errors) + + +def open_file( + filename: str | os.PathLike[str], + mode: str = "r", + encoding: str | None = None, + errors: str | None = "strict", + lazy: bool = False, + atomic: bool = False, +) -> t.IO[t.Any]: + """Open a file, with extra behavior to handle ``'-'`` to indicate + a standard stream, lazy open on write, and atomic write. Similar to + the behavior of the :class:`~click.File` param type. + + If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is + wrapped so that using it in a context manager will not close it. + This makes it possible to use the function without accidentally + closing a standard stream: + + .. code-block:: python + + with open_file(filename) as f: + ... + + :param filename: The name or Path of the file to open, or ``'-'`` for + ``stdin``/``stdout``. + :param mode: The mode in which to open the file. + :param encoding: The encoding to decode or encode a file opened in + text mode. + :param errors: The error handling mode. + :param lazy: Wait to open the file until it is accessed. For read + mode, the file is temporarily opened to raise access errors + early, then closed until it is read again. + :param atomic: Write to a temporary file and replace the given file + on close. + + .. versionadded:: 3.0 + """ + if lazy: + return t.cast( + "t.IO[t.Any]", LazyFile(filename, mode, encoding, errors, atomic=atomic) + ) + + f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) + + if not should_close: + f = t.cast("t.IO[t.Any]", KeepOpenFile(f)) + + return f + + +def format_filename( + filename: str | bytes | os.PathLike[str] | os.PathLike[bytes], + shorten: bool = False, +) -> str: + """Format a filename as a string for display. Ensures the filename can be + displayed by replacing any invalid bytes or surrogate escapes in the name + with the replacement character ``�``. + + Invalid bytes or surrogate escapes will raise an error when written to a + stream with ``errors="strict"``. This will typically happen with ``stdout`` + when the locale is something like ``en_GB.UTF-8``. + + Many scenarios *are* safe to write surrogates though, due to PEP 538 and + PEP 540, including: + + - Writing to ``stderr``, which uses ``errors="backslashreplace"``. + - The system has ``LANG=C.UTF-8``, ``C``, or ``POSIX``. Python opens + stdout and stderr with ``errors="surrogateescape"``. + - None of ``LANG/LC_*`` are set. Python assumes ``LANG=C.UTF-8``. + - Python is started in UTF-8 mode with ``PYTHONUTF8=1`` or ``-X utf8``. + Python opens stdout and stderr with ``errors="surrogateescape"``. + + :param filename: formats a filename for UI display. This will also convert + the filename into unicode without failing. + :param shorten: this optionally shortens the filename to strip of the + path that leads up to it. + """ + if shorten: + filename = os.path.basename(filename) + else: + filename = os.fspath(filename) + + if isinstance(filename, bytes): + filename = filename.decode(sys.getfilesystemencoding(), "replace") + else: + filename = filename.encode("utf-8", "surrogateescape").decode( + "utf-8", "replace" + ) + + return filename + + +def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: + r"""Returns the config folder for the application. The default behavior + is to return whatever is most appropriate for the operating system. + + To give you an idea, for an app called ``"Foo Bar"``, something like + the following folders could be returned: + + Mac OS X: + ``~/Library/Application Support/Foo Bar`` + Mac OS X (POSIX): + ``~/.foo-bar`` + Unix: + ``~/.config/foo-bar`` + Unix (POSIX): + ``~/.foo-bar`` + Windows (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Windows (not roaming): + ``C:\Users\\AppData\Local\Foo Bar`` + + .. versionadded:: 2.0 + + :param app_name: the application name. This should be properly capitalized + and can contain whitespace. + :param roaming: controls if the folder should be roaming or not on Windows. + Has no effect otherwise. + :param force_posix: if this is set to `True` then on any POSIX system the + folder will be stored in the home folder with a leading + dot instead of the XDG config home or darwin's + application support folder. + """ + if WIN: + key = "APPDATA" if roaming else "LOCALAPPDATA" + folder = os.environ.get(key) + if folder is None: + folder = os.path.expanduser("~") + return os.path.join(folder, app_name) + if force_posix: + return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) + if sys.platform == "darwin": + return os.path.join( + os.path.expanduser("~/Library/Application Support"), app_name + ) + return os.path.join( + os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), + _posixify(app_name), + ) + + +class PacifyFlushWrapper: + """This wrapper is used to catch and suppress BrokenPipeErrors resulting + from ``.flush()`` being called on broken pipe during the shutdown/final-GC + of the Python interpreter. Notably ``.flush()`` is always called on + ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any + other cleanup code, and the case where the underlying file is not a broken + pipe, all calls and attributes are proxied. + """ + + def __init__(self, wrapped: t.IO[t.Any]) -> None: + self.wrapped = wrapped + + def flush(self) -> None: + try: + self.wrapped.flush() + except OSError as e: + import errno + + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr: str) -> t.Any: + return getattr(self.wrapped, attr) + + +def _detect_program_name( + path: str | None = None, _main: ModuleType | None = None +) -> str: + """Determine the command used to run the program, for use in help + text. If a file or entry point was executed, the file name is + returned. If ``python -m`` was used to execute a module or package, + ``python -m name`` is returned. + + This doesn't try to be too precise, the goal is to give a concise + name for help text. Files are only shown as their name without the + path. ``python`` is only shown for modules, and the full path to + ``sys.executable`` is not shown. + + :param path: The Python file being executed. Python puts this in + ``sys.argv[0]``, which is used by default. + :param _main: The ``__main__`` module. This should only be passed + during internal testing. + + .. versionadded:: 8.0 + Based on command args detection in the Werkzeug reloader. + + :meta private: + """ + if _main is None: + _main = sys.modules["__main__"] + + if not path: + path = sys.argv[0] + + # The value of __package__ indicates how Python was called. It may + # not exist if a setuptools script is installed as an egg. It may be + # set incorrectly for entry points created with pip on Windows. + # It is set to "" inside a Shiv or PEX zipapp. + if getattr(_main, "__package__", None) in {None, ""} or ( + os.name == "nt" + and _main.__package__ == "" + and not os.path.exists(path) + and os.path.exists(f"{path}.exe") + ): + # Executed a file, like "python app.py". + return os.path.basename(path) + + # Executed a module, like "python -m example". + # Rewritten by Python from "-m script" to "/path/to/script.py". + # Need to look at main module to determine how it was executed. + py_module = t.cast(str, _main.__package__) + name = os.path.splitext(os.path.basename(path))[0] + + # A submodule like "example.cli". + if name != "__main__": + py_module = f"{py_module}.{name}" + + return f"python -m {py_module.lstrip('.')}" + + +def _expand_args( + args: cabc.Iterable[str], + *, + user: bool = True, + env: bool = True, + glob_recursive: bool = True, +) -> list[str]: + """Simulate Unix shell expansion with Python functions. + + See :func:`glob.glob`, :func:`os.path.expanduser`, and + :func:`os.path.expandvars`. + + This is intended for use on Windows, where the shell does not do any + expansion. It may not exactly match what a Unix shell would do. + + :param args: List of command line arguments to expand. + :param user: Expand user home directory. + :param env: Expand environment variables. + :param glob_recursive: ``**`` matches directories recursively. + + .. versionchanged:: 8.1 + Invalid glob patterns are treated as empty expansions rather + than raising an error. + + .. versionadded:: 8.0 + + :meta private: + """ + from glob import glob + + out = [] + + for arg in args: + if user: + arg = os.path.expanduser(arg) + + if env: + arg = os.path.expandvars(arg) + + try: + matches = glob(arg, recursive=glob_recursive) + except re.error: + matches = [] + + if not matches: + out.append(arg) + else: + out.extend(matches) + + return out diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__init__.py b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__init__.py new file mode 100644 index 0000000..7f4c631 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__init__.py @@ -0,0 +1,49 @@ +from typing import Any, Optional + +from .main import (dotenv_values, find_dotenv, get_key, load_dotenv, set_key, + unset_key) + + +def load_ipython_extension(ipython: Any) -> None: + from .ipython import load_ipython_extension + load_ipython_extension(ipython) + + +def get_cli_string( + path: Optional[str] = None, + action: Optional[str] = None, + key: Optional[str] = None, + value: Optional[str] = None, + quote: Optional[str] = None, +): + """Returns a string suitable for running as a shell script. + + Useful for converting a arguments passed to a fabric task + to be passed to a `local` or `run` command. + """ + command = ['dotenv'] + if quote: + command.append(f'-q {quote}') + if path: + command.append(f'-f {path}') + if action: + command.append(action) + if key: + command.append(key) + if value: + if ' ' in value: + command.append(f'"{value}"') + else: + command.append(value) + + return ' '.join(command).strip() + + +__all__ = ['get_cli_string', + 'load_dotenv', + 'dotenv_values', + 'get_key', + 'set_key', + 'unset_key', + 'find_dotenv', + 'load_ipython_extension'] diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__main__.py b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__main__.py new file mode 100644 index 0000000..3977f55 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__main__.py @@ -0,0 +1,6 @@ +"""Entry point for cli, enables execution with `python -m dotenv`""" + +from .cli import cli + +if __name__ == "__main__": + cli() diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70de42f85f94d7c3560845058ea9d19bc0b4b8c0 GIT binary patch literal 1678 zcmZ`(&ube;7@gVQ(n_)ut8P*!@!;46QEas}r8&5Pl2G?j6*tXAm-Sk+lGolJ%Ir#1 zVGS<$P@Sw4N(3QbdP+$DlU`cl5P6~0&{J+|d!Iy?rt=E(tP*FbA6j11XqryL3Szx#d(;@@Vzp+4#-`PZ zb;mbPv%xT%YIvhiwd<{L-S=XJSz&{Dr3#lHH4y^-J0bvJ5vBsSXbWQ`pa@6k*^rG< z3l+o?1CLPw$CJsjLuteM0SXPE_@@Hnrn4~);{bsGK*;ge#dY7ciWT2kYZZf#*>$V9 z(1hI;9eb@fsBm%NlTV9*9a{5sv$AQ{te`m9ZP74n&khY^q23xubA6S|X92d+UsCZv z`k?#y3+eh1Bv35X&2T+d%nElj7P(P!Vq+}dYk;d2zKv1iapJ*k*emy-hPUKMV);nk zIP2ArPlZT&gdPj0&P3>)Trom#aWPvtUpK;M6a{wk9jvqKitHmQMPd`N$@AG%j>JcZ z%8$iUZSTVQ+~^F4N*mmfw^}5RR5s4~H)K5<_IKdy-v8~pZiAH4-%J&|GsY zQuP^O4bS6AGa;;7jzfY99ExxuohH!k23EDzW>2NcgcbIA{08`FjMQN{%sn zX9^-5p?cl&Xe@2`winCE$t@^s0`|)C9NyzF$>Du~SRD!n3XJ$p2w@laM2=tBienoC zI~ai^zbe5m0Nbd435{R+X=8i&K+W{DvE5ud*PZCz?Jjq=_O-bKRX^1gkPgeGpUgSSM z9OgdT&le8$-0qF`jn49O{mM&y=1+a*xjy@cG|MhRWd$v%l%*hMd{0c{!2ffZ&Vk>; zM50KFs7hciP|dWr+It9_M^Gz4?E+F$fje3TxJ Qj<~|>B~_pMQBA7+59Jh!?EnA( literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9ff056f3e523c9e2fa5b7cb8c4f69a18d470083 GIT binary patch literal 342 zcmXv~u};G<5Vhl=MxbsiAR&1q5{(6{s1uc#`Tq?e3leCA1QuS73p~OY zfhWl16d@CM2=LpMj8W~^ez-U950o`EEwxmZ-fBbBT%J)-agswt;Q`XAm0HnzX)`)5 zYn!>IS5ToXsM+`zJHZe)#H}>}=S3_P=fjXR9nOVLIXA>H+L4M2;QSS>+7s3{EYk(B zROd;}Dr;m3ESfn-9sJ*8; hacM~~#tU@)gATvQ!Snos94-9L(_l%Ee{2HB_y;O2U`YS~ literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7931a431eed1c28787571471f9cb1e416ac0901a GIT binary patch literal 9712 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0347f80cf76e5da28f4fbdd0450aeceaccba212 GIT binary patch literal 9984 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 DncdjP literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b89928a4e52c3aa6dcc098f58c316de410dda0c GIT binary patch literal 194 zcmX@j%ge<81b&~cXNUpm#~=<2FhUuhIe?7m3@Hpz43&(UOjWFgdIoxiewvK8xZ~r? zQj3Z+^Yh~4S2BDCssH7!pOK%Ns-K*nlT@i+TvC)-kgBg&mYP?lpOcxSUr None: + """This script is used to set, get or unset values from a .env file.""" + ctx.obj = {'QUOTE': quote, 'EXPORT': export, 'FILE': file} + + +@contextmanager +def stream_file(path: os.PathLike) -> Iterator[IO[str]]: + """ + Open a file and yield the corresponding (decoded) stream. + + Exits with error code 2 if the file cannot be opened. + """ + + try: + with open(path) as stream: + yield stream + except OSError as exc: + print(f"Error opening env file: {exc}", file=sys.stderr) + exit(2) + + +@cli.command() +@click.pass_context +@click.option('--format', default='simple', + type=click.Choice(['simple', 'json', 'shell', 'export']), + help="The format in which to display the list. Default format is simple, " + "which displays name=value without quotes.") +def list(ctx: click.Context, format: bool) -> None: + """Display all the stored key/value.""" + file = ctx.obj['FILE'] + + with stream_file(file) as stream: + values = dotenv_values(stream=stream) + + if format == 'json': + click.echo(json.dumps(values, indent=2, sort_keys=True)) + else: + prefix = 'export ' if format == 'export' else '' + for k in sorted(values): + v = values[k] + if v is not None: + if format in ('export', 'shell'): + v = shlex.quote(v) + click.echo(f'{prefix}{k}={v}') + + +@cli.command() +@click.pass_context +@click.argument('key', required=True) +@click.argument('value', required=True) +def set(ctx: click.Context, key: Any, value: Any) -> None: + """Store the given key/value.""" + file = ctx.obj['FILE'] + quote = ctx.obj['QUOTE'] + export = ctx.obj['EXPORT'] + success, key, value = set_key(file, key, value, quote, export) + if success: + click.echo(f'{key}={value}') + else: + exit(1) + + +@cli.command() +@click.pass_context +@click.argument('key', required=True) +def get(ctx: click.Context, key: Any) -> None: + """Retrieve the value for the given key.""" + file = ctx.obj['FILE'] + + with stream_file(file) as stream: + values = dotenv_values(stream=stream) + + stored_value = values.get(key) + if stored_value: + click.echo(stored_value) + else: + exit(1) + + +@cli.command() +@click.pass_context +@click.argument('key', required=True) +def unset(ctx: click.Context, key: Any) -> None: + """Removes the given key.""" + file = ctx.obj['FILE'] + quote = ctx.obj['QUOTE'] + success, key = unset_key(file, key, quote) + if success: + click.echo(f"Successfully removed {key}") + else: + exit(1) + + +@cli.command(context_settings={'ignore_unknown_options': True}) +@click.pass_context +@click.option( + "--override/--no-override", + default=True, + help="Override variables from the environment file with those from the .env file.", +) +@click.argument('commandline', nargs=-1, type=click.UNPROCESSED) +def run(ctx: click.Context, override: bool, commandline: List[str]) -> None: + """Run command with environment variables present.""" + file = ctx.obj['FILE'] + if not os.path.isfile(file): + raise click.BadParameter( + f'Invalid value for \'-f\' "{file}" does not exist.', + ctx=ctx + ) + dotenv_as_dict = { + k: v + for (k, v) in dotenv_values(file).items() + if v is not None and (override or k not in os.environ) + } + + if not commandline: + click.echo('No command given.') + exit(1) + ret = run_command(commandline, dotenv_as_dict) + exit(ret) + + +def run_command(command: List[str], env: Dict[str, str]) -> int: + """Run command in sub process. + + Runs the command in a sub process with the variables from `env` + added in the current environment variables. + + Parameters + ---------- + command: List[str] + The command and it's parameters + env: Dict + The additional environment variables + + Returns + ------- + int + The return code of the command + + """ + # copy the current environment variables and add the vales from + # `env` + cmd_env = os.environ.copy() + cmd_env.update(env) + + p = Popen(command, + universal_newlines=True, + bufsize=0, + shell=False, + env=cmd_env) + _, _ = p.communicate() + + return p.returncode diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/ipython.py b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/ipython.py new file mode 100644 index 0000000..7df727c --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/ipython.py @@ -0,0 +1,39 @@ +from IPython.core.magic import Magics, line_magic, magics_class # type: ignore +from IPython.core.magic_arguments import (argument, magic_arguments, # type: ignore + parse_argstring) # type: ignore + +from .main import find_dotenv, load_dotenv + + +@magics_class +class IPythonDotEnv(Magics): + + @magic_arguments() + @argument( + '-o', '--override', action='store_true', + help="Indicate to override existing variables" + ) + @argument( + '-v', '--verbose', action='store_true', + help="Indicate function calls to be verbose" + ) + @argument('dotenv_path', nargs='?', type=str, default='.env', + help='Search in increasingly higher folders for the `dotenv_path`') + @line_magic + def dotenv(self, line): + args = parse_argstring(self.dotenv, line) + # Locate the .env file + dotenv_path = args.dotenv_path + try: + dotenv_path = find_dotenv(dotenv_path, True, True) + except IOError: + print("cannot find .env file") + return + + # Load the .env file + load_dotenv(dotenv_path, verbose=args.verbose, override=args.override) + + +def load_ipython_extension(ipython): + """Register the %dotenv magic.""" + ipython.register_magics(IPythonDotEnv) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/main.py b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/main.py new file mode 100644 index 0000000..7bc5428 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/main.py @@ -0,0 +1,392 @@ +import io +import logging +import os +import pathlib +import shutil +import sys +import tempfile +from collections import OrderedDict +from contextlib import contextmanager +from typing import (IO, Dict, Iterable, Iterator, Mapping, Optional, Tuple, + Union) + +from .parser import Binding, parse_stream +from .variables import parse_variables + +# A type alias for a string path to be used for the paths in this file. +# These paths may flow to `open()` and `shutil.move()`; `shutil.move()` +# only accepts string paths, not byte paths or file descriptors. See +# https://github.com/python/typeshed/pull/6832. +StrPath = Union[str, 'os.PathLike[str]'] + +logger = logging.getLogger(__name__) + + +def with_warn_for_invalid_lines(mappings: Iterator[Binding]) -> Iterator[Binding]: + for mapping in mappings: + if mapping.error: + logger.warning( + "Python-dotenv could not parse statement starting at line %s", + mapping.original.line, + ) + yield mapping + + +class DotEnv: + def __init__( + self, + dotenv_path: Optional[StrPath], + stream: Optional[IO[str]] = None, + verbose: bool = False, + encoding: Optional[str] = None, + interpolate: bool = True, + override: bool = True, + ) -> None: + self.dotenv_path: Optional[StrPath] = dotenv_path + self.stream: Optional[IO[str]] = stream + self._dict: Optional[Dict[str, Optional[str]]] = None + self.verbose: bool = verbose + self.encoding: Optional[str] = encoding + self.interpolate: bool = interpolate + self.override: bool = override + + @contextmanager + def _get_stream(self) -> Iterator[IO[str]]: + if self.dotenv_path and os.path.isfile(self.dotenv_path): + with open(self.dotenv_path, encoding=self.encoding) as stream: + yield stream + elif self.stream is not None: + yield self.stream + else: + if self.verbose: + logger.info( + "Python-dotenv could not find configuration file %s.", + self.dotenv_path or '.env', + ) + yield io.StringIO('') + + def dict(self) -> Dict[str, Optional[str]]: + """Return dotenv as dict""" + if self._dict: + return self._dict + + raw_values = self.parse() + + if self.interpolate: + self._dict = OrderedDict(resolve_variables(raw_values, override=self.override)) + else: + self._dict = OrderedDict(raw_values) + + return self._dict + + def parse(self) -> Iterator[Tuple[str, Optional[str]]]: + with self._get_stream() as stream: + for mapping in with_warn_for_invalid_lines(parse_stream(stream)): + if mapping.key is not None: + yield mapping.key, mapping.value + + def set_as_environment_variables(self) -> bool: + """ + Load the current dotenv as system environment variable. + """ + if not self.dict(): + return False + + for k, v in self.dict().items(): + if k in os.environ and not self.override: + continue + if v is not None: + os.environ[k] = v + + return True + + def get(self, key: str) -> Optional[str]: + """ + """ + data = self.dict() + + if key in data: + return data[key] + + if self.verbose: + logger.warning("Key %s not found in %s.", key, self.dotenv_path) + + return None + + +def get_key( + dotenv_path: StrPath, + key_to_get: str, + encoding: Optional[str] = "utf-8", +) -> Optional[str]: + """ + Get the value of a given key from the given .env. + + Returns `None` if the key isn't found or doesn't have a value. + """ + return DotEnv(dotenv_path, verbose=True, encoding=encoding).get(key_to_get) + + +@contextmanager +def rewrite( + path: StrPath, + encoding: Optional[str], +) -> Iterator[Tuple[IO[str], IO[str]]]: + pathlib.Path(path).touch() + + with tempfile.NamedTemporaryFile(mode="w", encoding=encoding, delete=False) as dest: + error = None + try: + with open(path, encoding=encoding) as source: + yield (source, dest) + except BaseException as err: + error = err + + if error is None: + shutil.move(dest.name, path) + else: + os.unlink(dest.name) + raise error from None + + +def set_key( + dotenv_path: StrPath, + key_to_set: str, + value_to_set: str, + quote_mode: str = "always", + export: bool = False, + encoding: Optional[str] = "utf-8", +) -> Tuple[Optional[bool], str, str]: + """ + Adds or Updates a key/value to the given .env + + If the .env path given doesn't exist, fails instead of risking creating + an orphan .env somewhere in the filesystem + """ + if quote_mode not in ("always", "auto", "never"): + raise ValueError(f"Unknown quote_mode: {quote_mode}") + + quote = ( + quote_mode == "always" + or (quote_mode == "auto" and not value_to_set.isalnum()) + ) + + if quote: + value_out = "'{}'".format(value_to_set.replace("'", "\\'")) + else: + value_out = value_to_set + if export: + line_out = f'export {key_to_set}={value_out}\n' + else: + line_out = f"{key_to_set}={value_out}\n" + + with rewrite(dotenv_path, encoding=encoding) as (source, dest): + replaced = False + missing_newline = False + for mapping in with_warn_for_invalid_lines(parse_stream(source)): + if mapping.key == key_to_set: + dest.write(line_out) + replaced = True + else: + dest.write(mapping.original.string) + missing_newline = not mapping.original.string.endswith("\n") + if not replaced: + if missing_newline: + dest.write("\n") + dest.write(line_out) + + return True, key_to_set, value_to_set + + +def unset_key( + dotenv_path: StrPath, + key_to_unset: str, + quote_mode: str = "always", + encoding: Optional[str] = "utf-8", +) -> Tuple[Optional[bool], str]: + """ + Removes a given key from the given `.env` file. + + If the .env path given doesn't exist, fails. + If the given key doesn't exist in the .env, fails. + """ + if not os.path.exists(dotenv_path): + logger.warning("Can't delete from %s - it doesn't exist.", dotenv_path) + return None, key_to_unset + + removed = False + with rewrite(dotenv_path, encoding=encoding) as (source, dest): + for mapping in with_warn_for_invalid_lines(parse_stream(source)): + if mapping.key == key_to_unset: + removed = True + else: + dest.write(mapping.original.string) + + if not removed: + logger.warning("Key %s not removed from %s - key doesn't exist.", key_to_unset, dotenv_path) + return None, key_to_unset + + return removed, key_to_unset + + +def resolve_variables( + values: Iterable[Tuple[str, Optional[str]]], + override: bool, +) -> Mapping[str, Optional[str]]: + new_values: Dict[str, Optional[str]] = {} + + for (name, value) in values: + if value is None: + result = None + else: + atoms = parse_variables(value) + env: Dict[str, Optional[str]] = {} + if override: + env.update(os.environ) # type: ignore + env.update(new_values) + else: + env.update(new_values) + env.update(os.environ) # type: ignore + result = "".join(atom.resolve(env) for atom in atoms) + + new_values[name] = result + + return new_values + + +def _walk_to_root(path: str) -> Iterator[str]: + """ + Yield directories starting from the given directory up to the root + """ + if not os.path.exists(path): + raise IOError('Starting path not found') + + if os.path.isfile(path): + path = os.path.dirname(path) + + last_dir = None + current_dir = os.path.abspath(path) + while last_dir != current_dir: + yield current_dir + parent_dir = os.path.abspath(os.path.join(current_dir, os.path.pardir)) + last_dir, current_dir = current_dir, parent_dir + + +def find_dotenv( + filename: str = '.env', + raise_error_if_not_found: bool = False, + usecwd: bool = False, +) -> str: + """ + Search in increasingly higher folders for the given file + + Returns path to the file if found, or an empty string otherwise + """ + + def _is_interactive(): + """ Decide whether this is running in a REPL or IPython notebook """ + try: + main = __import__('__main__', None, None, fromlist=['__file__']) + except ModuleNotFoundError: + return False + return not hasattr(main, '__file__') + + if usecwd or _is_interactive() or getattr(sys, 'frozen', False): + # Should work without __file__, e.g. in REPL or IPython notebook. + path = os.getcwd() + else: + # will work for .py files + frame = sys._getframe() + current_file = __file__ + + while frame.f_code.co_filename == current_file or not os.path.exists( + frame.f_code.co_filename + ): + assert frame.f_back is not None + frame = frame.f_back + frame_filename = frame.f_code.co_filename + path = os.path.dirname(os.path.abspath(frame_filename)) + + for dirname in _walk_to_root(path): + check_path = os.path.join(dirname, filename) + if os.path.isfile(check_path): + return check_path + + if raise_error_if_not_found: + raise IOError('File not found') + + return '' + + +def load_dotenv( + dotenv_path: Optional[StrPath] = None, + stream: Optional[IO[str]] = None, + verbose: bool = False, + override: bool = False, + interpolate: bool = True, + encoding: Optional[str] = "utf-8", +) -> bool: + """Parse a .env file and then load all the variables found as environment variables. + + Parameters: + dotenv_path: Absolute or relative path to .env file. + stream: Text stream (such as `io.StringIO`) with .env content, used if + `dotenv_path` is `None`. + verbose: Whether to output a warning the .env file is missing. + override: Whether to override the system environment variables with the variables + from the `.env` file. + encoding: Encoding to be used to read the file. + Returns: + Bool: True if at least one environment variable is set else False + + If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the + .env file. + """ + if dotenv_path is None and stream is None: + dotenv_path = find_dotenv() + + dotenv = DotEnv( + dotenv_path=dotenv_path, + stream=stream, + verbose=verbose, + interpolate=interpolate, + override=override, + encoding=encoding, + ) + return dotenv.set_as_environment_variables() + + +def dotenv_values( + dotenv_path: Optional[StrPath] = None, + stream: Optional[IO[str]] = None, + verbose: bool = False, + interpolate: bool = True, + encoding: Optional[str] = "utf-8", +) -> Dict[str, Optional[str]]: + """ + Parse a .env file and return its content as a dict. + + The returned dict will have `None` values for keys without values in the .env file. + For example, `foo=bar` results in `{"foo": "bar"}` whereas `foo` alone results in + `{"foo": None}` + + Parameters: + dotenv_path: Absolute or relative path to the .env file. + stream: `StringIO` object with .env content, used if `dotenv_path` is `None`. + verbose: Whether to output a warning if the .env file is missing. + encoding: Encoding to be used to read the file. + + If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the + .env file. + """ + if dotenv_path is None and stream is None: + dotenv_path = find_dotenv() + + return DotEnv( + dotenv_path=dotenv_path, + stream=stream, + verbose=verbose, + interpolate=interpolate, + override=True, + encoding=encoding, + ).dict() diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/parser.py b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/parser.py new file mode 100644 index 0000000..735f14a --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/parser.py @@ -0,0 +1,175 @@ +import codecs +import re +from typing import (IO, Iterator, Match, NamedTuple, Optional, # noqa:F401 + Pattern, Sequence, Tuple) + + +def make_regex(string: str, extra_flags: int = 0) -> Pattern[str]: + return re.compile(string, re.UNICODE | extra_flags) + + +_newline = make_regex(r"(\r\n|\n|\r)") +_multiline_whitespace = make_regex(r"\s*", extra_flags=re.MULTILINE) +_whitespace = make_regex(r"[^\S\r\n]*") +_export = make_regex(r"(?:export[^\S\r\n]+)?") +_single_quoted_key = make_regex(r"'([^']+)'") +_unquoted_key = make_regex(r"([^=\#\s]+)") +_equal_sign = make_regex(r"(=[^\S\r\n]*)") +_single_quoted_value = make_regex(r"'((?:\\'|[^'])*)'") +_double_quoted_value = make_regex(r'"((?:\\"|[^"])*)"') +_unquoted_value = make_regex(r"([^\r\n]*)") +_comment = make_regex(r"(?:[^\S\r\n]*#[^\r\n]*)?") +_end_of_line = make_regex(r"[^\S\r\n]*(?:\r\n|\n|\r|$)") +_rest_of_line = make_regex(r"[^\r\n]*(?:\r|\n|\r\n)?") +_double_quote_escapes = make_regex(r"\\[\\'\"abfnrtv]") +_single_quote_escapes = make_regex(r"\\[\\']") + + +class Original(NamedTuple): + string: str + line: int + + +class Binding(NamedTuple): + key: Optional[str] + value: Optional[str] + original: Original + error: bool + + +class Position: + def __init__(self, chars: int, line: int) -> None: + self.chars = chars + self.line = line + + @classmethod + def start(cls) -> "Position": + return cls(chars=0, line=1) + + def set(self, other: "Position") -> None: + self.chars = other.chars + self.line = other.line + + def advance(self, string: str) -> None: + self.chars += len(string) + self.line += len(re.findall(_newline, string)) + + +class Error(Exception): + pass + + +class Reader: + def __init__(self, stream: IO[str]) -> None: + self.string = stream.read() + self.position = Position.start() + self.mark = Position.start() + + def has_next(self) -> bool: + return self.position.chars < len(self.string) + + def set_mark(self) -> None: + self.mark.set(self.position) + + def get_marked(self) -> Original: + return Original( + string=self.string[self.mark.chars:self.position.chars], + line=self.mark.line, + ) + + def peek(self, count: int) -> str: + return self.string[self.position.chars:self.position.chars + count] + + def read(self, count: int) -> str: + result = self.string[self.position.chars:self.position.chars + count] + if len(result) < count: + raise Error("read: End of string") + self.position.advance(result) + return result + + def read_regex(self, regex: Pattern[str]) -> Sequence[str]: + match = regex.match(self.string, self.position.chars) + if match is None: + raise Error("read_regex: Pattern not found") + self.position.advance(self.string[match.start():match.end()]) + return match.groups() + + +def decode_escapes(regex: Pattern[str], string: str) -> str: + def decode_match(match: Match[str]) -> str: + return codecs.decode(match.group(0), 'unicode-escape') # type: ignore + + return regex.sub(decode_match, string) + + +def parse_key(reader: Reader) -> Optional[str]: + char = reader.peek(1) + if char == "#": + return None + elif char == "'": + (key,) = reader.read_regex(_single_quoted_key) + else: + (key,) = reader.read_regex(_unquoted_key) + return key + + +def parse_unquoted_value(reader: Reader) -> str: + (part,) = reader.read_regex(_unquoted_value) + return re.sub(r"\s+#.*", "", part).rstrip() + + +def parse_value(reader: Reader) -> str: + char = reader.peek(1) + if char == u"'": + (value,) = reader.read_regex(_single_quoted_value) + return decode_escapes(_single_quote_escapes, value) + elif char == u'"': + (value,) = reader.read_regex(_double_quoted_value) + return decode_escapes(_double_quote_escapes, value) + elif char in (u"", u"\n", u"\r"): + return u"" + else: + return parse_unquoted_value(reader) + + +def parse_binding(reader: Reader) -> Binding: + reader.set_mark() + try: + reader.read_regex(_multiline_whitespace) + if not reader.has_next(): + return Binding( + key=None, + value=None, + original=reader.get_marked(), + error=False, + ) + reader.read_regex(_export) + key = parse_key(reader) + reader.read_regex(_whitespace) + if reader.peek(1) == "=": + reader.read_regex(_equal_sign) + value: Optional[str] = parse_value(reader) + else: + value = None + reader.read_regex(_comment) + reader.read_regex(_end_of_line) + return Binding( + key=key, + value=value, + original=reader.get_marked(), + error=False, + ) + except Error: + reader.read_regex(_rest_of_line) + return Binding( + key=None, + value=None, + original=reader.get_marked(), + error=True, + ) + + +def parse_stream(stream: IO[str]) -> Iterator[Binding]: + reader = Reader(stream) + while reader.has_next(): + yield parse_binding(reader) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/py.typed b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/py.typed new file mode 100644 index 0000000..7632ecf --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/py.typed @@ -0,0 +1 @@ +# Marker file for PEP 561 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/variables.py b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/variables.py new file mode 100644 index 0000000..667f2f2 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/variables.py @@ -0,0 +1,86 @@ +import re +from abc import ABCMeta, abstractmethod +from typing import Iterator, Mapping, Optional, Pattern + +_posix_variable: Pattern[str] = re.compile( + r""" + \$\{ + (?P[^\}:]*) + (?::- + (?P[^\}]*) + )? + \} + """, + re.VERBOSE, +) + + +class Atom(metaclass=ABCMeta): + def __ne__(self, other: object) -> bool: + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + return not result + + @abstractmethod + def resolve(self, env: Mapping[str, Optional[str]]) -> str: ... + + +class Literal(Atom): + def __init__(self, value: str) -> None: + self.value = value + + def __repr__(self) -> str: + return f"Literal(value={self.value})" + + def __eq__(self, other: object) -> bool: + if not isinstance(other, self.__class__): + return NotImplemented + return self.value == other.value + + def __hash__(self) -> int: + return hash((self.__class__, self.value)) + + def resolve(self, env: Mapping[str, Optional[str]]) -> str: + return self.value + + +class Variable(Atom): + def __init__(self, name: str, default: Optional[str]) -> None: + self.name = name + self.default = default + + def __repr__(self) -> str: + return f"Variable(name={self.name}, default={self.default})" + + def __eq__(self, other: object) -> bool: + if not isinstance(other, self.__class__): + return NotImplemented + return (self.name, self.default) == (other.name, other.default) + + def __hash__(self) -> int: + return hash((self.__class__, self.name, self.default)) + + def resolve(self, env: Mapping[str, Optional[str]]) -> str: + default = self.default if self.default is not None else "" + result = env.get(self.name, default) + return result if result is not None else "" + + +def parse_variables(value: str) -> Iterator[Atom]: + cursor = 0 + + for match in _posix_variable.finditer(value): + (start, end) = match.span() + name = match["name"] + default = match["default"] + + if start > cursor: + yield Literal(value=value[cursor:start]) + + yield Variable(name=name, default=default) + cursor = end + + length = len(value) + if cursor < length: + yield Literal(value=value[cursor:length]) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/dotenv/version.py b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/version.py new file mode 100644 index 0000000..5c4105c --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/dotenv/version.py @@ -0,0 +1 @@ +__version__ = "1.0.1" diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/INSTALLER b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/LICENSE.txt b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/LICENSE.txt new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/METADATA b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/METADATA new file mode 100644 index 0000000..5a02107 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/METADATA @@ -0,0 +1,101 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 3.0.3 +Summary: A simple framework for building complex web applications. +Maintainer-email: Pallets +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Typing :: Typed +Requires-Dist: Werkzeug>=3.0.0 +Requires-Dist: Jinja2>=3.1.2 +Requires-Dist: itsdangerous>=2.1.2 +Requires-Dist: click>=8.1.3 +Requires-Dist: blinker>=1.6.2 +Requires-Dist: importlib-metadata>=3.6.0; python_version < '3.10' +Requires-Dist: asgiref>=3.2 ; extra == "async" +Requires-Dist: python-dotenv ; extra == "dotenv" +Project-URL: Changes, https://flask.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://flask.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/flask/ +Provides-Extra: async +Provides-Extra: dotenv + +# Flask + +Flask is a lightweight [WSGI][] web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around [Werkzeug][] +and [Jinja][], and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + +[WSGI]: https://wsgi.readthedocs.io/ +[Werkzeug]: https://werkzeug.palletsprojects.com/ +[Jinja]: https://jinja.palletsprojects.com/ + + +## Installing + +Install and update from [PyPI][] using an installer such as [pip][]: + +``` +$ pip install -U Flask +``` + +[PyPI]: https://pypi.org/project/Flask/ +[pip]: https://pip.pypa.io/en/stable/getting-started/ + + +## A Simple Example + +```python +# save this as app.py +from flask import Flask + +app = Flask(__name__) + +@app.route("/") +def hello(): + return "Hello, World!" +``` + +``` +$ flask run + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) +``` + + +## Contributing + +For guidance on setting up a development environment and how to make a +contribution to Flask, see the [contributing guidelines][]. + +[contributing guidelines]: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst + + +## Donate + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, [please +donate today][]. + +[please donate today]: https://palletsprojects.com/donate + diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/RECORD b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/RECORD new file mode 100644 index 0000000..e63f0ec --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/RECORD @@ -0,0 +1,58 @@ +../../../bin/flask,sha256=mHXq8KoRL782g9oOoISQjtC-2zzIXRB86dkc9jIYTaY,227 +flask-3.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask-3.0.3.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +flask-3.0.3.dist-info/METADATA,sha256=exPahy4aahjV-mYqd9qb5HNP8haB_IxTuaotoSvCtag,3177 +flask-3.0.3.dist-info/RECORD,, +flask-3.0.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask-3.0.3.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +flask-3.0.3.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40 +flask/__init__.py,sha256=6xMqdVA0FIQ2U1KVaGX3lzNCdXPzoHPaa0hvQCNcfSk,2625 +flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 +flask/__pycache__/__init__.cpython-312.pyc,, +flask/__pycache__/__main__.cpython-312.pyc,, +flask/__pycache__/app.cpython-312.pyc,, +flask/__pycache__/blueprints.cpython-312.pyc,, +flask/__pycache__/cli.cpython-312.pyc,, +flask/__pycache__/config.cpython-312.pyc,, +flask/__pycache__/ctx.cpython-312.pyc,, +flask/__pycache__/debughelpers.cpython-312.pyc,, +flask/__pycache__/globals.cpython-312.pyc,, +flask/__pycache__/helpers.cpython-312.pyc,, +flask/__pycache__/logging.cpython-312.pyc,, +flask/__pycache__/sessions.cpython-312.pyc,, +flask/__pycache__/signals.cpython-312.pyc,, +flask/__pycache__/templating.cpython-312.pyc,, +flask/__pycache__/testing.cpython-312.pyc,, +flask/__pycache__/typing.cpython-312.pyc,, +flask/__pycache__/views.cpython-312.pyc,, +flask/__pycache__/wrappers.cpython-312.pyc,, +flask/app.py,sha256=7-lh6cIj27riTE1Q18Ok1p5nOZ8qYiMux4Btc6o6mNc,60143 +flask/blueprints.py,sha256=7INXPwTkUxfOQXOOv1yu52NpHPmPGI5fMTMFZ-BG9yY,4430 +flask/cli.py,sha256=OOaf_Efqih1i2in58j-5ZZZmQnPpaSfiUFbEjlL9bzw,35825 +flask/config.py,sha256=bLzLVAj-cq-Xotu9erqOFte0xSFaVXyfz0AkP4GbwmY,13312 +flask/ctx.py,sha256=4atDhJJ_cpV1VMq4qsfU4E_61M1oN93jlS2H9gjrl58,15120 +flask/debughelpers.py,sha256=PGIDhStW_efRjpaa3zHIpo-htStJOR41Ip3OJWPYBwo,6080 +flask/globals.py,sha256=XdQZmStBmPIs8t93tjx6pO7Bm3gobAaONWkFcUHaGas,1713 +flask/helpers.py,sha256=tYrcQ_73GuSZVEgwFr-eMmV69UriFQDBmt8wZJIAqvg,23084 +flask/json/__init__.py,sha256=hLNR898paqoefdeAhraa5wyJy-bmRB2k2dV4EgVy2Z8,5602 +flask/json/__pycache__/__init__.cpython-312.pyc,, +flask/json/__pycache__/provider.cpython-312.pyc,, +flask/json/__pycache__/tag.cpython-312.pyc,, +flask/json/provider.py,sha256=q6iB83lSiopy80DZPrU-9mGcWwrD0mvLjiv9fHrRZgc,7646 +flask/json/tag.py,sha256=DhaNwuIOhdt2R74oOC9Y4Z8ZprxFYiRb5dUP5byyINw,9281 +flask/logging.py,sha256=8sM3WMTubi1cBb2c_lPkWpN0J8dMAqrgKRYLLi1dCVI,2377 +flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask/sansio/README.md,sha256=-0X1tECnilmz1cogx-YhNw5d7guK7GKrq_DEV2OzlU0,228 +flask/sansio/__pycache__/app.cpython-312.pyc,, +flask/sansio/__pycache__/blueprints.cpython-312.pyc,, +flask/sansio/__pycache__/scaffold.cpython-312.pyc,, +flask/sansio/app.py,sha256=YG5Gf7JVf1c0yccWDZ86q5VSfJUidOVp27HFxFNxC7U,38053 +flask/sansio/blueprints.py,sha256=Tqe-7EkZ-tbWchm8iDoCfD848f0_3nLv6NNjeIPvHwM,24637 +flask/sansio/scaffold.py,sha256=WLV9TRQMMhGlXz-1OKtQ3lv6mtIBQZxdW2HezYrGxoI,30633 +flask/sessions.py,sha256=RU4lzm9MQW9CtH8rVLRTDm8USMJyT4LbvYe7sxM2__k,14807 +flask/signals.py,sha256=V7lMUww7CqgJ2ThUBn1PiatZtQanOyt7OZpu2GZI-34,750 +flask/templating.py,sha256=2TcXLT85Asflm2W9WOSFxKCmYn5e49w_Jkg9-NaaJWo,7537 +flask/testing.py,sha256=3BFXb3bP7R5r-XLBuobhczbxDu8-1LWRzYuhbr-lwaE,10163 +flask/typing.py,sha256=ZavK-wV28Yv8CQB7u73qZp_jLalpbWdrXS37QR1ftN0,3190 +flask/views.py,sha256=B66bTvYBBcHMYk4dA1ScZD0oTRTBl0I5smp1lRm9riI,6939 +flask/wrappers.py,sha256=m1j5tIJxIu8_sPPgTAB_G4TTh52Q-HoDuw_qHV5J59g,5831 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/REQUESTED b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/WHEEL b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/WHEEL new file mode 100644 index 0000000..3b5e64b --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/entry_points.txt b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/entry_points.txt new file mode 100644 index 0000000..eec6733 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask-3.0.3.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask=flask.cli:main + diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/__init__.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/__init__.py new file mode 100644 index 0000000..e86eb43 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/__init__.py @@ -0,0 +1,60 @@ +from __future__ import annotations + +import typing as t + +from . import json as json +from .app import Flask as Flask +from .blueprints import Blueprint as Blueprint +from .config import Config as Config +from .ctx import after_this_request as after_this_request +from .ctx import copy_current_request_context as copy_current_request_context +from .ctx import has_app_context as has_app_context +from .ctx import has_request_context as has_request_context +from .globals import current_app as current_app +from .globals import g as g +from .globals import request as request +from .globals import session as session +from .helpers import abort as abort +from .helpers import flash as flash +from .helpers import get_flashed_messages as get_flashed_messages +from .helpers import get_template_attribute as get_template_attribute +from .helpers import make_response as make_response +from .helpers import redirect as redirect +from .helpers import send_file as send_file +from .helpers import send_from_directory as send_from_directory +from .helpers import stream_with_context as stream_with_context +from .helpers import url_for as url_for +from .json import jsonify as jsonify +from .signals import appcontext_popped as appcontext_popped +from .signals import appcontext_pushed as appcontext_pushed +from .signals import appcontext_tearing_down as appcontext_tearing_down +from .signals import before_render_template as before_render_template +from .signals import got_request_exception as got_request_exception +from .signals import message_flashed as message_flashed +from .signals import request_finished as request_finished +from .signals import request_started as request_started +from .signals import request_tearing_down as request_tearing_down +from .signals import template_rendered as template_rendered +from .templating import render_template as render_template +from .templating import render_template_string as render_template_string +from .templating import stream_template as stream_template +from .templating import stream_template_string as stream_template_string +from .wrappers import Request as Request +from .wrappers import Response as Response + + +def __getattr__(name: str) -> t.Any: + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " Flask 3.1. Use feature detection or" + " 'importlib.metadata.version(\"flask\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("flask") + + raise AttributeError(name) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/__main__.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/__main__.py new file mode 100644 index 0000000..4e28416 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/__main__.py @@ -0,0 +1,3 @@ +from .cli import main + +main() diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c86d2aee6ac93d703c5e0f13f1c91bcfaca0013 GIT binary patch literal 2461 zcmZXW%Wo4$9LHzY)et6I#*#q!%a$(4v(p(H^)(B_~e({U%9FJh;1N0^ zxdc2)MKRJVmD@j{;BAX~`Af89F0*40x8# zN*)KEqjQocfHkT~p0v}>Je`+3WiL33bW!p&@Dg2;JOjK;mnF{vuh13AbHG(vm8=1; z(pAaxz%^Qvya2pL*Ca0juhVtOOTcI8S;@=xIj2tRl2?Emv>~|)e4d_{yb64QUXWa~ zH=IqnDR~X}BE1NF)?EKSMc?TqYUf^J3e=RaV7RU)3}Jb0aPuXk1DdIwz;od@{h4h9 zy8yXQ>@M@Ub)SzxB_ zKtp4j1>jfE7tHZ(LonSCf?Lh5U{F(Zj9ms%1U{?<8d=Uvi?bH?n+uq0>TS!$is9n| z_Z!!Dl)2=ibbc{i}CT>K3T2M2(?Y&)lcBjRB++wIG_17X^8?XlBm2X?F)gQDJ zdx0>xka3K})~O(d;$iz?$j0#f>5wX?EIoj=cX3ZkK)7&mM_^S>S#KMwx87u0_Evwh zT9~-;lLkl4fBCY*wCV}F zs=dij%?dOV4k2qn;+mS_n%cf)+gg)poH^bec$TZl6RU03FVwZK0;aW@A-bHwhXV2# zM$$a4RV~Md(_&lAy2FHF8p5de16f_bBeT0ut3qc1Y_wT_iIKsMCYL`PAcGT6OY@IQ^G{2)$EDh@)hDHmN7;?P^WzUjp5$jA zrDk72x1^Th@54`+gs{U5XRt-?-L$B0xxL!EVP4nUUEDPY2PYe5M9+uy3>6U)ju{&! z;Y#3`rD47q-^>A5Wn;Kh;CAMisbR7u?(iHC$3FucGnJpg3U%A|nuZ;4Oin(4QbHM& zl^tgLkeGZ3tuo3m$_UCRN(E&MWgKM!WfElyBvb=y+r`eO(V9V-MVUj^^ zP?kZ$eE$l7>GBnHt0-`K39n&&cAvx4F}5}I)=_ZFek1$}@+FYh*(;7`c5U_{zX3%& zh`|pahe<_IBC_y;l>Z@<5t)lfJt9jH`5+=UBC;8g%MocrWGW(6`7TBT-mQpSleM*o stViS{`9cHu5Zc3gT{gHHk@sX*pzsO!mm>0ctg8`OJIV|wb27~T0J#0Y82|tP literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/__main__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b603363505207b4eb90b8e328b142084350c9b0 GIT binary patch literal 222 zcmX@j%ge<81c9HfXUGBR#~=<2FhLogK{C@BQW#Pga~N_NqZk<(m>5zSS3{*487i4H znO`yjxtff(SaK6H^ZYcKZZRk4WEL?41y?eB2C4kzuAh;go2s9jpOaLnUtCg@S&*u) zSC*Prrk|6Uq+d{3l98WhtY>JXUz}Nzs#}nloSm4STCAUzlUSUsA0H1gH$Gmkpz;@o nO>TZlX-=wL5eLv*kiEscK;i>4BO~Ko2GNHMEUj!sY(NnJ?o2ih literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79a3850fb6853c4f75707bc2521901ee601c04b7 GIT binary patch literal 61157 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 vDia@jriEFf5gvz10w( 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 U*E>7+DDob;H2fQhJ+RUL2mcPh#Q*>R literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/ctx.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/ctx.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff38cc71f17444d4ebc9ecca399ecdb74c091811 GIT binary patch literal 19819 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 WvrqSt^3nh)OJwe)tczcSQ~w7)Un3X* literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1df426b61a01d978ea16ade31cb3b20b22f77f0 GIT binary patch literal 24799 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/logging.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/logging.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3b58a49113647bec866c4dfeedad3da8480a48a GIT binary patch literal 3248 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 K-mAF4m;DbezDdFW literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/templating.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/templating.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4927f40a35db81d6b951b1b9d13846d6a29015a2 GIT binary patch literal 9913 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5012fd9620db6c0b587dabe803fb2823e48d80d0 GIT binary patch literal 13687 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/views.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98253ca7013ff85b81a3eff4fca4e712c19102d4 GIT binary patch literal 6998 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 IftQ&7KTiD*K>z>% literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/wrappers.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/__pycache__/wrappers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12d25b30f383123ea0c05e2322d333e3dbacea3e GIT binary patch literal 6104 zcma)AU2Ggz6~427-d*o{*Iqku+mKAs#9`B9owT71CZVLoP0|*pBrb(TXguDz>s@ASLYoGZXp~4nZ66RXrb$EV{Mz`b!{b>thAJR+k#63W{{RaS-n86IiWDTXPCqpY>xMa*z`iAnEwZn z6cx8uZ#FGQcj{Ktp1^zh8QnO;Uu|>S!CUs^O6_b&e>>5lKn1a!_2GeH@F0-m)Q;bT}n&JQ{ZH)^EKTeVq0yuRNYp`DqwAoODa4rWI3irl z+m^qkCO?^?wZKP&OnmV-Q55lB-M~B-a~ zR@q z@chYF)6~@0j(<~o_VmQ$_{604;`qdg$&*u4YQ<_+>oe*cUnsc)_ft$1BZA_koA3zV z!?CuxS+z-S_1=lmn$_T=70aAn7==daEk0U0$D8Ly&HD6cYr&~m%_mBS9v`*q4nNS+ zD|7k`w@0PVj)wMbEw}>>{k(=H9EvL@Z_YTi&cnVRl{_!`M|IN+0#U| z6T=c)8DyFKkB?nE*6rPWy|DGtvA2(1D-^F3irq}{R<0l(2Gu&7!k(T@UjpzTo4%$j zDz6V4kwxVk6N8J&EPb`%F(U7if8a5q{&7-@F@4szt>80t+u;J6ZjvtiW98>UHOzh+ zt+1JSNuj~sDY%neTe@(FsUDgjWVxS|4zD2fOQ(9UXRLZe$YvAIFf7DITC~Y4+_rU5 zN3f8brLE=uNXAeCWD`4NSP@)zpaycNl8W@y&==sI=RgnN1W%~RkTS2)ne@KZy}^B| z&?Qn7E#?Jb=|cCElAs6&S0Z0=(}EOJm*q)BYz0cZ5BfmaGH(4~;_=XHV9@6?b$W@@1&pc+zPxYwX$ zAWg1|EjZ)6(Q+146Fy9?1nUa!xt@BT3zO}_H8%IVHC|pSsppWjQ9tU2!Huyo_3_fd z(xH$6EU7|Uq89^TGNBuj8(wR}^y(%$1NRxx*723S3xkXh`N1DwxOibXcB?nHeDr!@ zX!+Dfx!sp1ujcl3llwj+M7#?IKU3Cb){Buv_7=+ipmbE269bWa#IaR)mI}WOkJyhy zk=%g9tD(#xKZ$Lam955l3Oi>+&_W~{J+CQL)-NiHEbtA5Erh>fY@$Gq79Y}6Z^zIWqQWE$JeNPLZ(REdc_v{uwRb_BaA%`5jb%_iSg)g>>k@5M`JYhbsH zD`L_o}*+ zzw`XZnXmpmv+v!*f6E+PNwJ|FD^b?}6b-vDWQRRVlNSXK*$#3kw|@wLES*|YMFqBA zdlnyEWAEKe?0rpfLQ9MORd_Qy3*`;w_$}kA2Q4aZL=5(tazU9_=Gpn^x7fT=R3?gX zF#?&~EvPSLkx53OQqarrf+UxfmiRm%U+1pE#eTf5*L4Y)&h|jpoAY~}zWNFVsC*@o zNR8Ym48Q%OtFJ6(1<9!h1_tGdF z)}uNpiab;_f5#_sV^r=GV`3Cvbo#%cqkSAFAND_#oJ1ccivw;_(sLMxW@$hPqoHyBd4^Ry_MjBpx5W9c78W6@pg! z0DTh4#0PyGpp|VBmk)7(R(4BVU;Htj4$xgS8$a~#?LG04e=!X5%t%oykTQJypr_n^ z4ygM(b0boY8BrcLVn;F06V#cPlRRbg$SyhYW+n)r<+SXUdy(dnq6ftKZ*f4qbmv_s z1nsh{kx~47M%(;~CFX48tT|2zOJ)?|UrGdAs={il_I+prDXF1rrFK--BuITHC%=Zm z$q#hs&?O_kOGm@}^){LlBwzF%vU4`9=3dA97)-os2kV2c-{@1DOHB~!or(_eCBHGm z(b|R%xuMT-Es%K1tMnb!;LHo3`(?e-sSsH7GUrz}{U-MVi>W zclTKRkLGDmx+KmnVWcF&TbZcPC(hIkC?d`^PAlTnQp4ck`wuHP0O`M8Dlm=K&Bd92G`@`wrqD6*%x7V*6p3!YCWpy)w+6m=)x^R1D zOlw*fc-_uoq%^)A)E zET|5o%xRBfScxi%a+B@)kPUpy_T6L$ZnDES*^?i$ftyUd$@blf#(wbh8&BVi?YWaU arzj)Kb9Wg1-x1MAmA%W0cNzZVGXDi>He6Ex literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/app.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/app.py new file mode 100644 index 0000000..7622b5e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/app.py @@ -0,0 +1,1498 @@ +from __future__ import annotations + +import collections.abc as cabc +import os +import sys +import typing as t +import weakref +from datetime import timedelta +from inspect import iscoroutinefunction +from itertools import chain +from types import TracebackType +from urllib.parse import quote as _url_quote + +import click +from werkzeug.datastructures import Headers +from werkzeug.datastructures import ImmutableDict +from werkzeug.exceptions import BadRequestKeyError +from werkzeug.exceptions import HTTPException +from werkzeug.exceptions import InternalServerError +from werkzeug.routing import BuildError +from werkzeug.routing import MapAdapter +from werkzeug.routing import RequestRedirect +from werkzeug.routing import RoutingException +from werkzeug.routing import Rule +from werkzeug.serving import is_running_from_reloader +from werkzeug.wrappers import Response as BaseResponse + +from . import cli +from . import typing as ft +from .ctx import AppContext +from .ctx import RequestContext +from .globals import _cv_app +from .globals import _cv_request +from .globals import current_app +from .globals import g +from .globals import request +from .globals import request_ctx +from .globals import session +from .helpers import get_debug_flag +from .helpers import get_flashed_messages +from .helpers import get_load_dotenv +from .helpers import send_from_directory +from .sansio.app import App +from .sansio.scaffold import _sentinel +from .sessions import SecureCookieSessionInterface +from .sessions import SessionInterface +from .signals import appcontext_tearing_down +from .signals import got_request_exception +from .signals import request_finished +from .signals import request_started +from .signals import request_tearing_down +from .templating import Environment +from .wrappers import Request +from .wrappers import Response + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIEnvironment + + from .testing import FlaskClient + from .testing import FlaskCliRunner + +T_shell_context_processor = t.TypeVar( + "T_shell_context_processor", bound=ft.ShellContextProcessorCallable +) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) + + +def _make_timedelta(value: timedelta | int | None) -> timedelta | None: + if value is None or isinstance(value, timedelta): + return value + + return timedelta(seconds=value) + + +class Flask(App): + """The flask object implements a WSGI application and acts as the central + object. It is passed the name of the module or package of the + application. Once it is created it will act as a central registry for + the view functions, the URL rules, template configuration and much more. + + The name of the package is used to resolve resources from inside the + package or the folder the module is contained in depending on if the + package parameter resolves to an actual python package (a folder with + an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). + + For more information about resource loading, see :func:`open_resource`. + + Usually you create a :class:`Flask` instance in your main module or + in the :file:`__init__.py` file of your package like this:: + + from flask import Flask + app = Flask(__name__) + + .. admonition:: About the First Parameter + + The idea of the first parameter is to give Flask an idea of what + belongs to your application. This name is used to find resources + on the filesystem, can be used by extensions to improve debugging + information and a lot more. + + So it's important what you provide there. If you are using a single + module, `__name__` is always the correct value. If you however are + using a package, it's usually recommended to hardcode the name of + your package there. + + For example if your application is defined in :file:`yourapplication/app.py` + you should create it with one of the two versions below:: + + app = Flask('yourapplication') + app = Flask(__name__.split('.')[0]) + + Why is that? The application will work even with `__name__`, thanks + to how resources are looked up. However it will make debugging more + painful. Certain extensions can make assumptions based on the + import name of your application. For example the Flask-SQLAlchemy + extension will look for the code in your application that triggered + an SQL query in debug mode. If the import name is not properly set + up, that debugging information is lost. (For example it would only + pick up SQL queries in `yourapplication.app` and not + `yourapplication.views.frontend`) + + .. versionadded:: 0.7 + The `static_url_path`, `static_folder`, and `template_folder` + parameters were added. + + .. versionadded:: 0.8 + The `instance_path` and `instance_relative_config` parameters were + added. + + .. versionadded:: 0.11 + The `root_path` parameter was added. + + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. + + .. versionadded:: 1.0 + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. + + :param import_name: the name of the application package + :param static_url_path: can be used to specify a different path for the + static files on the web. Defaults to the name + of the `static_folder` folder. + :param static_folder: The folder with static files that is served at + ``static_url_path``. Relative to the application ``root_path`` + or an absolute path. Defaults to ``'static'``. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. + :param template_folder: the folder that contains the templates that should + be used by the application. Defaults to + ``'templates'`` folder in the root path of the + application. + :param instance_path: An alternative instance path for the application. + By default the folder ``'instance'`` next to the + package or module is assumed to be the instance + path. + :param instance_relative_config: if set to ``True`` relative filenames + for loading the config are assumed to + be relative to the instance path instead + of the application root. + :param root_path: The path to the root of the application files. + This should only be set manually when it can't be detected + automatically, such as for namespace packages. + """ + + default_config = ImmutableDict( + { + "DEBUG": None, + "TESTING": False, + "PROPAGATE_EXCEPTIONS": None, + "SECRET_KEY": None, + "PERMANENT_SESSION_LIFETIME": timedelta(days=31), + "USE_X_SENDFILE": False, + "SERVER_NAME": None, + "APPLICATION_ROOT": "/", + "SESSION_COOKIE_NAME": "session", + "SESSION_COOKIE_DOMAIN": None, + "SESSION_COOKIE_PATH": None, + "SESSION_COOKIE_HTTPONLY": True, + "SESSION_COOKIE_SECURE": False, + "SESSION_COOKIE_SAMESITE": None, + "SESSION_REFRESH_EACH_REQUEST": True, + "MAX_CONTENT_LENGTH": None, + "SEND_FILE_MAX_AGE_DEFAULT": None, + "TRAP_BAD_REQUEST_ERRORS": None, + "TRAP_HTTP_EXCEPTIONS": False, + "EXPLAIN_TEMPLATE_LOADING": False, + "PREFERRED_URL_SCHEME": "http", + "TEMPLATES_AUTO_RELOAD": None, + "MAX_COOKIE_SIZE": 4093, + } + ) + + #: The class that is used for request objects. See :class:`~flask.Request` + #: for more information. + request_class: type[Request] = Request + + #: The class that is used for response objects. See + #: :class:`~flask.Response` for more information. + response_class: type[Response] = Response + + #: the session interface to use. By default an instance of + #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. + #: + #: .. versionadded:: 0.8 + session_interface: SessionInterface = SecureCookieSessionInterface() + + def __init__( + self, + import_name: str, + static_url_path: str | None = None, + static_folder: str | os.PathLike[str] | None = "static", + static_host: str | None = None, + host_matching: bool = False, + subdomain_matching: bool = False, + template_folder: str | os.PathLike[str] | None = "templates", + instance_path: str | None = None, + instance_relative_config: bool = False, + root_path: str | None = None, + ): + super().__init__( + import_name=import_name, + static_url_path=static_url_path, + static_folder=static_folder, + static_host=static_host, + host_matching=host_matching, + subdomain_matching=subdomain_matching, + template_folder=template_folder, + instance_path=instance_path, + instance_relative_config=instance_relative_config, + root_path=root_path, + ) + + #: The Click command group for registering CLI commands for this + #: object. The commands are available from the ``flask`` command + #: once the application has been discovered and blueprints have + #: been registered. + self.cli = cli.AppGroup() + + # Set the name of the Click group in case someone wants to add + # the app's commands to another CLI tool. + self.cli.name = self.name + + # Add a static route using the provided static_url_path, static_host, + # and static_folder if there is a configured static_folder. + # Note we do this without checking if static_folder exists. + # For one, it might be created while the server is running (e.g. during + # development). Also, Google App Engine stores static files somewhere + if self.has_static_folder: + assert ( + bool(static_host) == host_matching + ), "Invalid static_host/host_matching combination" + # Use a weakref to avoid creating a reference cycle between the app + # and the view function (see #3761). + self_ref = weakref.ref(self) + self.add_url_rule( + f"{self.static_url_path}/", + endpoint="static", + host=static_host, + view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950 + ) + + def get_send_file_max_age(self, filename: str | None) -> int | None: + """Used by :func:`send_file` to determine the ``max_age`` cache + value for a given file path if it wasn't passed. + + By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from + the configuration of :data:`~flask.current_app`. This defaults + to ``None``, which tells the browser to use conditional requests + instead of a timed cache, which is usually preferable. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionchanged:: 2.0 + The default configuration is ``None`` instead of 12 hours. + + .. versionadded:: 0.9 + """ + value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] + + if value is None: + return None + + if isinstance(value, timedelta): + return int(value.total_seconds()) + + return value # type: ignore[no-any-return] + + def send_static_file(self, filename: str) -> Response: + """The view function used to serve files from + :attr:`static_folder`. A route is automatically registered for + this view at :attr:`static_url_path` if :attr:`static_folder` is + set. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionadded:: 0.5 + + """ + if not self.has_static_folder: + raise RuntimeError("'static_folder' must be set to serve static_files.") + + # send_file only knows to call get_send_file_max_age on the app, + # call it here so it works for blueprints too. + max_age = self.get_send_file_max_age(filename) + return send_from_directory( + t.cast(str, self.static_folder), filename, max_age=max_age + ) + + def open_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Open a resource file relative to :attr:`root_path` for + reading. + + For example, if the file ``schema.sql`` is next to the file + ``app.py`` where the ``Flask`` app is defined, it can be opened + with: + + .. code-block:: python + + with app.open_resource("schema.sql") as f: + conn.executescript(f.read()) + + :param resource: Path to the resource relative to + :attr:`root_path`. + :param mode: Open the file in this mode. Only reading is + supported, valid values are "r" (or "rt") and "rb". + + Note this is a duplicate of the same method in the Flask + class. + + """ + if mode not in {"r", "rt", "rb"}: + raise ValueError("Resources can only be opened for reading.") + + return open(os.path.join(self.root_path, resource), mode) + + def open_instance_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Opens a resource from the application's instance folder + (:attr:`instance_path`). Otherwise works like + :meth:`open_resource`. Instance resources can also be opened for + writing. + + :param resource: the name of the resource. To access resources within + subfolders use forward slashes as separator. + :param mode: resource file opening mode, default is 'rb'. + """ + return open(os.path.join(self.instance_path, resource), mode) + + def create_jinja_environment(self) -> Environment: + """Create the Jinja environment based on :attr:`jinja_options` + and the various Jinja-related methods of the app. Changing + :attr:`jinja_options` after this will have no effect. Also adds + Flask-related globals and filters to the environment. + + .. versionchanged:: 0.11 + ``Environment.auto_reload`` set in accordance with + ``TEMPLATES_AUTO_RELOAD`` configuration option. + + .. versionadded:: 0.5 + """ + options = dict(self.jinja_options) + + if "autoescape" not in options: + options["autoescape"] = self.select_jinja_autoescape + + if "auto_reload" not in options: + auto_reload = self.config["TEMPLATES_AUTO_RELOAD"] + + if auto_reload is None: + auto_reload = self.debug + + options["auto_reload"] = auto_reload + + rv = self.jinja_environment(self, **options) + rv.globals.update( + url_for=self.url_for, + get_flashed_messages=get_flashed_messages, + config=self.config, + # request, session and g are normally added with the + # context processor for efficiency reasons but for imported + # templates we also want the proxies in there. + request=request, + session=session, + g=g, + ) + rv.policies["json.dumps_function"] = self.json.dumps + return rv + + def create_url_adapter(self, request: Request | None) -> MapAdapter | None: + """Creates a URL adapter for the given request. The URL adapter + is created at a point where the request context is not yet set + up so the request is passed explicitly. + + .. versionadded:: 0.6 + + .. versionchanged:: 0.9 + This can now also be called without a request object when the + URL adapter is created for the application context. + + .. versionchanged:: 1.0 + :data:`SERVER_NAME` no longer implicitly enables subdomain + matching. Use :attr:`subdomain_matching` instead. + """ + if request is not None: + # If subdomain matching is disabled (the default), use the + # default subdomain in all cases. This should be the default + # in Werkzeug but it currently does not have that feature. + if not self.subdomain_matching: + subdomain = self.url_map.default_subdomain or None + else: + subdomain = None + + return self.url_map.bind_to_environ( + request.environ, + server_name=self.config["SERVER_NAME"], + subdomain=subdomain, + ) + # We need at the very least the server name to be set for this + # to work. + if self.config["SERVER_NAME"] is not None: + return self.url_map.bind( + self.config["SERVER_NAME"], + script_name=self.config["APPLICATION_ROOT"], + url_scheme=self.config["PREFERRED_URL_SCHEME"], + ) + + return None + + def raise_routing_exception(self, request: Request) -> t.NoReturn: + """Intercept routing exceptions and possibly do something else. + + In debug mode, intercept a routing redirect and replace it with + an error if the body will be discarded. + + With modern Werkzeug this shouldn't occur, since it now uses a + 308 status which tells the browser to resend the method and + body. + + .. versionchanged:: 2.1 + Don't intercept 307 and 308 redirects. + + :meta private: + :internal: + """ + if ( + not self.debug + or not isinstance(request.routing_exception, RequestRedirect) + or request.routing_exception.code in {307, 308} + or request.method in {"GET", "HEAD", "OPTIONS"} + ): + raise request.routing_exception # type: ignore[misc] + + from .debughelpers import FormDataRoutingRedirect + + raise FormDataRoutingRedirect(request) + + def update_template_context(self, context: dict[str, t.Any]) -> None: + """Update the template context with some commonly used variables. + This injects request, session, config and g into the template + context as well as everything template context processors want + to inject. Note that the as of Flask 0.6, the original values + in the context will not be overridden if a context processor + decides to return a value with the same key. + + :param context: the context as a dictionary that is updated in place + to add extra variables. + """ + names: t.Iterable[str | None] = (None,) + + # A template may be rendered outside a request context. + if request: + names = chain(names, reversed(request.blueprints)) + + # The values passed to render_template take precedence. Keep a + # copy to re-apply after all context functions. + orig_ctx = context.copy() + + for name in names: + if name in self.template_context_processors: + for func in self.template_context_processors[name]: + context.update(self.ensure_sync(func)()) + + context.update(orig_ctx) + + def make_shell_context(self) -> dict[str, t.Any]: + """Returns the shell context for an interactive shell for this + application. This runs all the registered shell context + processors. + + .. versionadded:: 0.11 + """ + rv = {"app": self, "g": g} + for processor in self.shell_context_processors: + rv.update(processor()) + return rv + + def run( + self, + host: str | None = None, + port: int | None = None, + debug: bool | None = None, + load_dotenv: bool = True, + **options: t.Any, + ) -> None: + """Runs the application on a local development server. + + Do not use ``run()`` in a production setting. It is not intended to + meet security and performance requirements for a production server. + Instead, see :doc:`/deploying/index` for WSGI server recommendations. + + If the :attr:`debug` flag is set the server will automatically reload + for code changes and show a debugger in case an exception happened. + + If you want to run the application in debug mode, but disable the + code execution on the interactive debugger, you can pass + ``use_evalex=False`` as parameter. This will keep the debugger's + traceback screen active, but disable code execution. + + It is not recommended to use this function for development with + automatic reloading as this is badly supported. Instead you should + be using the :command:`flask` command line script's ``run`` support. + + .. admonition:: Keep in Mind + + Flask will suppress any server error with a generic error page + unless it is in debug mode. As such to enable just the + interactive debugger without the code reloading, you have to + invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. + Setting ``use_debugger`` to ``True`` without being in debug mode + won't catch any exceptions because there won't be any to + catch. + + :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to + have the server available externally as well. Defaults to + ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable + if present. + :param port: the port of the webserver. Defaults to ``5000`` or the + port defined in the ``SERVER_NAME`` config variable if present. + :param debug: if given, enable or disable debug mode. See + :attr:`debug`. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param options: the options to be forwarded to the underlying Werkzeug + server. See :func:`werkzeug.serving.run_simple` for more + information. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment + variables from :file:`.env` and :file:`.flaskenv` files. + + The :envvar:`FLASK_DEBUG` environment variable will override :attr:`debug`. + + Threaded mode is enabled by default. + + .. versionchanged:: 0.10 + The default port is now picked from the ``SERVER_NAME`` + variable. + """ + # Ignore this call so that it doesn't start another server if + # the 'flask run' command is used. + if os.environ.get("FLASK_RUN_FROM_CLI") == "true": + if not is_running_from_reloader(): + click.secho( + " * Ignoring a call to 'app.run()' that would block" + " the current 'flask' CLI command.\n" + " Only call 'app.run()' in an 'if __name__ ==" + ' "__main__"\' guard.', + fg="red", + ) + + return + + if get_load_dotenv(load_dotenv): + cli.load_dotenv() + + # if set, env var overrides existing value + if "FLASK_DEBUG" in os.environ: + self.debug = get_debug_flag() + + # debug passed to method overrides all other sources + if debug is not None: + self.debug = bool(debug) + + server_name = self.config.get("SERVER_NAME") + sn_host = sn_port = None + + if server_name: + sn_host, _, sn_port = server_name.partition(":") + + if not host: + if sn_host: + host = sn_host + else: + host = "127.0.0.1" + + if port or port == 0: + port = int(port) + elif sn_port: + port = int(sn_port) + else: + port = 5000 + + options.setdefault("use_reloader", self.debug) + options.setdefault("use_debugger", self.debug) + options.setdefault("threaded", True) + + cli.show_server_banner(self.debug, self.name) + + from werkzeug.serving import run_simple + + try: + run_simple(t.cast(str, host), port, self, **options) + finally: + # reset the first request information if the development server + # reset normally. This makes it possible to restart the server + # without reloader and that stuff from an interactive shell. + self._got_first_request = False + + def test_client(self, use_cookies: bool = True, **kwargs: t.Any) -> FlaskClient: + """Creates a test client for this application. For information + about unit testing head over to :doc:`/testing`. + + Note that if you are testing for assertions or exceptions in your + application code, you must set ``app.testing = True`` in order for the + exceptions to propagate to the test client. Otherwise, the exception + will be handled by the application (not visible to the test client) and + the only indication of an AssertionError or other exception will be a + 500 status code response to the test client. See the :attr:`testing` + attribute. For example:: + + app.testing = True + client = app.test_client() + + The test client can be used in a ``with`` block to defer the closing down + of the context until the end of the ``with`` block. This is useful if + you want to access the context locals for testing:: + + with app.test_client() as c: + rv = c.get('/?vodka=42') + assert request.args['vodka'] == '42' + + Additionally, you may pass optional keyword arguments that will then + be passed to the application's :attr:`test_client_class` constructor. + For example:: + + from flask.testing import FlaskClient + + class CustomClient(FlaskClient): + def __init__(self, *args, **kwargs): + self._authentication = kwargs.pop("authentication") + super(CustomClient,self).__init__( *args, **kwargs) + + app.test_client_class = CustomClient + client = app.test_client(authentication='Basic ....') + + See :class:`~flask.testing.FlaskClient` for more information. + + .. versionchanged:: 0.4 + added support for ``with`` block usage for the client. + + .. versionadded:: 0.7 + The `use_cookies` parameter was added as well as the ability + to override the client to be used by setting the + :attr:`test_client_class` attribute. + + .. versionchanged:: 0.11 + Added `**kwargs` to support passing additional keyword arguments to + the constructor of :attr:`test_client_class`. + """ + cls = self.test_client_class + if cls is None: + from .testing import FlaskClient as cls + return cls( # type: ignore + self, self.response_class, use_cookies=use_cookies, **kwargs + ) + + def test_cli_runner(self, **kwargs: t.Any) -> FlaskCliRunner: + """Create a CLI runner for testing CLI commands. + See :ref:`testing-cli`. + + Returns an instance of :attr:`test_cli_runner_class`, by default + :class:`~flask.testing.FlaskCliRunner`. The Flask app object is + passed as the first argument. + + .. versionadded:: 1.0 + """ + cls = self.test_cli_runner_class + + if cls is None: + from .testing import FlaskCliRunner as cls + + return cls(self, **kwargs) # type: ignore + + def handle_http_exception( + self, e: HTTPException + ) -> HTTPException | ft.ResponseReturnValue: + """Handles an HTTP exception. By default this will invoke the + registered error handlers and fall back to returning the + exception as response. + + .. versionchanged:: 1.0.3 + ``RoutingException``, used internally for actions such as + slash redirects during routing, is not passed to error + handlers. + + .. versionchanged:: 1.0 + Exceptions are looked up by code *and* by MRO, so + ``HTTPException`` subclasses can be handled with a catch-all + handler for the base ``HTTPException``. + + .. versionadded:: 0.3 + """ + # Proxy exceptions don't have error codes. We want to always return + # those unchanged as errors + if e.code is None: + return e + + # RoutingExceptions are used internally to trigger routing + # actions, such as slash redirects raising RequestRedirect. They + # are not raised or handled in user code. + if isinstance(e, RoutingException): + return e + + handler = self._find_error_handler(e, request.blueprints) + if handler is None: + return e + return self.ensure_sync(handler)(e) # type: ignore[no-any-return] + + def handle_user_exception( + self, e: Exception + ) -> HTTPException | ft.ResponseReturnValue: + """This method is called whenever an exception occurs that + should be handled. A special case is :class:`~werkzeug + .exceptions.HTTPException` which is forwarded to the + :meth:`handle_http_exception` method. This function will either + return a response value or reraise the exception with the same + traceback. + + .. versionchanged:: 1.0 + Key errors raised from request data like ``form`` show the + bad key in debug mode rather than a generic bad request + message. + + .. versionadded:: 0.7 + """ + if isinstance(e, BadRequestKeyError) and ( + self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"] + ): + e.show_exception = True + + if isinstance(e, HTTPException) and not self.trap_http_exception(e): + return self.handle_http_exception(e) + + handler = self._find_error_handler(e, request.blueprints) + + if handler is None: + raise + + return self.ensure_sync(handler)(e) # type: ignore[no-any-return] + + def handle_exception(self, e: Exception) -> Response: + """Handle an exception that did not have an error handler + associated with it, or that was raised from an error handler. + This always causes a 500 ``InternalServerError``. + + Always sends the :data:`got_request_exception` signal. + + If :data:`PROPAGATE_EXCEPTIONS` is ``True``, such as in debug + mode, the error will be re-raised so that the debugger can + display it. Otherwise, the original exception is logged, and + an :exc:`~werkzeug.exceptions.InternalServerError` is returned. + + If an error handler is registered for ``InternalServerError`` or + ``500``, it will be used. For consistency, the handler will + always receive the ``InternalServerError``. The original + unhandled exception is available as ``e.original_exception``. + + .. versionchanged:: 1.1.0 + Always passes the ``InternalServerError`` instance to the + handler, setting ``original_exception`` to the unhandled + error. + + .. versionchanged:: 1.1.0 + ``after_request`` functions and other finalization is done + even for the default 500 response when there is no handler. + + .. versionadded:: 0.3 + """ + exc_info = sys.exc_info() + got_request_exception.send(self, _async_wrapper=self.ensure_sync, exception=e) + propagate = self.config["PROPAGATE_EXCEPTIONS"] + + if propagate is None: + propagate = self.testing or self.debug + + if propagate: + # Re-raise if called with an active exception, otherwise + # raise the passed in exception. + if exc_info[1] is e: + raise + + raise e + + self.log_exception(exc_info) + server_error: InternalServerError | ft.ResponseReturnValue + server_error = InternalServerError(original_exception=e) + handler = self._find_error_handler(server_error, request.blueprints) + + if handler is not None: + server_error = self.ensure_sync(handler)(server_error) + + return self.finalize_request(server_error, from_error_handler=True) + + def log_exception( + self, + exc_info: (tuple[type, BaseException, TracebackType] | tuple[None, None, None]), + ) -> None: + """Logs an exception. This is called by :meth:`handle_exception` + if debugging is disabled and right before the handler is called. + The default implementation logs the exception as error on the + :attr:`logger`. + + .. versionadded:: 0.8 + """ + self.logger.error( + f"Exception on {request.path} [{request.method}]", exc_info=exc_info + ) + + def dispatch_request(self) -> ft.ResponseReturnValue: + """Does the request dispatching. Matches the URL and returns the + return value of the view or error handler. This does not have to + be a response object. In order to convert the return value to a + proper response object, call :func:`make_response`. + + .. versionchanged:: 0.7 + This no longer does the exception handling, this code was + moved to the new :meth:`full_dispatch_request`. + """ + req = request_ctx.request + if req.routing_exception is not None: + self.raise_routing_exception(req) + rule: Rule = req.url_rule # type: ignore[assignment] + # if we provide automatic options for this URL and the + # request came with the OPTIONS method, reply automatically + if ( + getattr(rule, "provide_automatic_options", False) + and req.method == "OPTIONS" + ): + return self.make_default_options_response() + # otherwise dispatch to the handler for that endpoint + view_args: dict[str, t.Any] = req.view_args # type: ignore[assignment] + return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] + + def full_dispatch_request(self) -> Response: + """Dispatches the request and on top of that performs request + pre and postprocessing as well as HTTP exception catching and + error handling. + + .. versionadded:: 0.7 + """ + self._got_first_request = True + + try: + request_started.send(self, _async_wrapper=self.ensure_sync) + rv = self.preprocess_request() + if rv is None: + rv = self.dispatch_request() + except Exception as e: + rv = self.handle_user_exception(e) + return self.finalize_request(rv) + + def finalize_request( + self, + rv: ft.ResponseReturnValue | HTTPException, + from_error_handler: bool = False, + ) -> Response: + """Given the return value from a view function this finalizes + the request by converting it into a response and invoking the + postprocessing functions. This is invoked for both normal + request dispatching as well as error handlers. + + Because this means that it might be called as a result of a + failure a special safe mode is available which can be enabled + with the `from_error_handler` flag. If enabled, failures in + response processing will be logged and otherwise ignored. + + :internal: + """ + response = self.make_response(rv) + try: + response = self.process_response(response) + request_finished.send( + self, _async_wrapper=self.ensure_sync, response=response + ) + except Exception: + if not from_error_handler: + raise + self.logger.exception( + "Request finalizing failed with an error while handling an error" + ) + return response + + def make_default_options_response(self) -> Response: + """This method is called to create the default ``OPTIONS`` response. + This can be changed through subclassing to change the default + behavior of ``OPTIONS`` responses. + + .. versionadded:: 0.7 + """ + adapter = request_ctx.url_adapter + methods = adapter.allowed_methods() # type: ignore[union-attr] + rv = self.response_class() + rv.allow.update(methods) + return rv + + def ensure_sync(self, func: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: + """Ensure that the function is synchronous for WSGI workers. + Plain ``def`` functions are returned as-is. ``async def`` + functions are wrapped to run and wait for the response. + + Override this method to change how the app runs async views. + + .. versionadded:: 2.0 + """ + if iscoroutinefunction(func): + return self.async_to_sync(func) + + return func + + def async_to_sync( + self, func: t.Callable[..., t.Coroutine[t.Any, t.Any, t.Any]] + ) -> t.Callable[..., t.Any]: + """Return a sync function that will run the coroutine function. + + .. code-block:: python + + result = app.async_to_sync(func)(*args, **kwargs) + + Override this method to change how the app converts async code + to be synchronously callable. + + .. versionadded:: 2.0 + """ + try: + from asgiref.sync import async_to_sync as asgiref_async_to_sync + except ImportError: + raise RuntimeError( + "Install Flask with the 'async' extra in order to use async views." + ) from None + + return asgiref_async_to_sync(func) + + def url_for( + self, + /, + endpoint: str, + *, + _anchor: str | None = None, + _method: str | None = None, + _scheme: str | None = None, + _external: bool | None = None, + **values: t.Any, + ) -> str: + """Generate a URL to the given endpoint with the given values. + + This is called by :func:`flask.url_for`, and can be called + directly as well. + + An *endpoint* is the name of a URL rule, usually added with + :meth:`@app.route() `, and usually the same name as the + view function. A route defined in a :class:`~flask.Blueprint` + will prepend the blueprint's name separated by a ``.`` to the + endpoint. + + In some cases, such as email messages, you want URLs to include + the scheme and domain, like ``https://example.com/hello``. When + not in an active request, URLs will be external by default, but + this requires setting :data:`SERVER_NAME` so Flask knows what + domain to use. :data:`APPLICATION_ROOT` and + :data:`PREFERRED_URL_SCHEME` should also be configured as + needed. This config is only used when not in an active request. + + Functions can be decorated with :meth:`url_defaults` to modify + keyword arguments before the URL is built. + + If building fails for some reason, such as an unknown endpoint + or incorrect values, the app's :meth:`handle_url_build_error` + method is called. If that returns a string, that is returned, + otherwise a :exc:`~werkzeug.routing.BuildError` is raised. + + :param endpoint: The endpoint name associated with the URL to + generate. If this starts with a ``.``, the current blueprint + name (if any) will be used. + :param _anchor: If given, append this as ``#anchor`` to the URL. + :param _method: If given, generate the URL associated with this + method for the endpoint. + :param _scheme: If given, the URL will have this scheme if it + is external. + :param _external: If given, prefer the URL to be internal + (False) or require it to be external (True). External URLs + include the scheme and domain. When not in an active + request, URLs are external by default. + :param values: Values to use for the variable parts of the URL + rule. Unknown keys are appended as query string arguments, + like ``?a=b&c=d``. + + .. versionadded:: 2.2 + Moved from ``flask.url_for``, which calls this method. + """ + req_ctx = _cv_request.get(None) + + if req_ctx is not None: + url_adapter = req_ctx.url_adapter + blueprint_name = req_ctx.request.blueprint + + # If the endpoint starts with "." and the request matches a + # blueprint, the endpoint is relative to the blueprint. + if endpoint[:1] == ".": + if blueprint_name is not None: + endpoint = f"{blueprint_name}{endpoint}" + else: + endpoint = endpoint[1:] + + # When in a request, generate a URL without scheme and + # domain by default, unless a scheme is given. + if _external is None: + _external = _scheme is not None + else: + app_ctx = _cv_app.get(None) + + # If called by helpers.url_for, an app context is active, + # use its url_adapter. Otherwise, app.url_for was called + # directly, build an adapter. + if app_ctx is not None: + url_adapter = app_ctx.url_adapter + else: + url_adapter = self.create_url_adapter(None) + + if url_adapter is None: + raise RuntimeError( + "Unable to build URLs outside an active request" + " without 'SERVER_NAME' configured. Also configure" + " 'APPLICATION_ROOT' and 'PREFERRED_URL_SCHEME' as" + " needed." + ) + + # When outside a request, generate a URL with scheme and + # domain by default. + if _external is None: + _external = True + + # It is an error to set _scheme when _external=False, in order + # to avoid accidental insecure URLs. + if _scheme is not None and not _external: + raise ValueError("When specifying '_scheme', '_external' must be True.") + + self.inject_url_defaults(endpoint, values) + + try: + rv = url_adapter.build( # type: ignore[union-attr] + endpoint, + values, + method=_method, + url_scheme=_scheme, + force_external=_external, + ) + except BuildError as error: + values.update( + _anchor=_anchor, _method=_method, _scheme=_scheme, _external=_external + ) + return self.handle_url_build_error(error, endpoint, values) + + if _anchor is not None: + _anchor = _url_quote(_anchor, safe="%!#$&'()*+,/:;=?@") + rv = f"{rv}#{_anchor}" + + return rv + + def make_response(self, rv: ft.ResponseReturnValue) -> Response: + """Convert the return value from a view function to an instance of + :attr:`response_class`. + + :param rv: the return value from the view function. The view function + must return a response. Returning ``None``, or the view ending + without returning, is not allowed. The following types are allowed + for ``view_rv``: + + ``str`` + A response object is created with the string encoded to UTF-8 + as the body. + + ``bytes`` + A response object is created with the bytes as the body. + + ``dict`` + A dictionary that will be jsonify'd before being returned. + + ``list`` + A list that will be jsonify'd before being returned. + + ``generator`` or ``iterator`` + A generator that returns ``str`` or ``bytes`` to be + streamed as the response. + + ``tuple`` + Either ``(body, status, headers)``, ``(body, status)``, or + ``(body, headers)``, where ``body`` is any of the other types + allowed here, ``status`` is a string or an integer, and + ``headers`` is a dictionary or a list of ``(key, value)`` + tuples. If ``body`` is a :attr:`response_class` instance, + ``status`` overwrites the exiting value and ``headers`` are + extended. + + :attr:`response_class` + The object is returned unchanged. + + other :class:`~werkzeug.wrappers.Response` class + The object is coerced to :attr:`response_class`. + + :func:`callable` + The function is called as a WSGI application. The result is + used to create a response object. + + .. versionchanged:: 2.2 + A generator will be converted to a streaming response. + A list will be converted to a JSON response. + + .. versionchanged:: 1.1 + A dict will be converted to a JSON response. + + .. versionchanged:: 0.9 + Previously a tuple was interpreted as the arguments for the + response object. + """ + + status = headers = None + + # unpack tuple returns + if isinstance(rv, tuple): + len_rv = len(rv) + + # a 3-tuple is unpacked directly + if len_rv == 3: + rv, status, headers = rv # type: ignore[misc] + # decide if a 2-tuple has status or headers + elif len_rv == 2: + if isinstance(rv[1], (Headers, dict, tuple, list)): + rv, headers = rv + else: + rv, status = rv # type: ignore[assignment,misc] + # other sized tuples are not allowed + else: + raise TypeError( + "The view function did not return a valid response tuple." + " The tuple must have the form (body, status, headers)," + " (body, status), or (body, headers)." + ) + + # the body must not be None + if rv is None: + raise TypeError( + f"The view function for {request.endpoint!r} did not" + " return a valid response. The function either returned" + " None or ended without a return statement." + ) + + # make sure the body is an instance of the response class + if not isinstance(rv, self.response_class): + if isinstance(rv, (str, bytes, bytearray)) or isinstance(rv, cabc.Iterator): + # let the response class set the status and headers instead of + # waiting to do it manually, so that the class can handle any + # special logic + rv = self.response_class( + rv, + status=status, + headers=headers, # type: ignore[arg-type] + ) + status = headers = None + elif isinstance(rv, (dict, list)): + rv = self.json.response(rv) + elif isinstance(rv, BaseResponse) or callable(rv): + # evaluate a WSGI callable, or coerce a different response + # class to the correct type + try: + rv = self.response_class.force_type( + rv, # type: ignore[arg-type] + request.environ, + ) + except TypeError as e: + raise TypeError( + f"{e}\nThe view function did not return a valid" + " response. The return type must be a string," + " dict, list, tuple with headers or status," + " Response instance, or WSGI callable, but it" + f" was a {type(rv).__name__}." + ).with_traceback(sys.exc_info()[2]) from None + else: + raise TypeError( + "The view function did not return a valid" + " response. The return type must be a string," + " dict, list, tuple with headers or status," + " Response instance, or WSGI callable, but it was a" + f" {type(rv).__name__}." + ) + + rv = t.cast(Response, rv) + # prefer the status if it was provided + if status is not None: + if isinstance(status, (str, bytes, bytearray)): + rv.status = status + else: + rv.status_code = status + + # extend existing headers with provided headers + if headers: + rv.headers.update(headers) # type: ignore[arg-type] + + return rv + + def preprocess_request(self) -> ft.ResponseReturnValue | None: + """Called before the request is dispatched. Calls + :attr:`url_value_preprocessors` registered with the app and the + current blueprint (if any). Then calls :attr:`before_request_funcs` + registered with the app and the blueprint. + + If any :meth:`before_request` handler returns a non-None value, the + value is handled as if it was the return value from the view, and + further request handling is stopped. + """ + names = (None, *reversed(request.blueprints)) + + for name in names: + if name in self.url_value_preprocessors: + for url_func in self.url_value_preprocessors[name]: + url_func(request.endpoint, request.view_args) + + for name in names: + if name in self.before_request_funcs: + for before_func in self.before_request_funcs[name]: + rv = self.ensure_sync(before_func)() + + if rv is not None: + return rv # type: ignore[no-any-return] + + return None + + def process_response(self, response: Response) -> Response: + """Can be overridden in order to modify the response object + before it's sent to the WSGI server. By default this will + call all the :meth:`after_request` decorated functions. + + .. versionchanged:: 0.5 + As of Flask 0.5 the functions registered for after request + execution are called in reverse order of registration. + + :param response: a :attr:`response_class` object. + :return: a new response object or the same, has to be an + instance of :attr:`response_class`. + """ + ctx = request_ctx._get_current_object() # type: ignore[attr-defined] + + for func in ctx._after_request_functions: + response = self.ensure_sync(func)(response) + + for name in chain(request.blueprints, (None,)): + if name in self.after_request_funcs: + for func in reversed(self.after_request_funcs[name]): + response = self.ensure_sync(func)(response) + + if not self.session_interface.is_null_session(ctx.session): + self.session_interface.save_session(self, ctx.session, response) + + return response + + def do_teardown_request( + self, + exc: BaseException | None = _sentinel, # type: ignore[assignment] + ) -> None: + """Called after the request is dispatched and the response is + returned, right before the request context is popped. + + This calls all functions decorated with + :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` + if a blueprint handled the request. Finally, the + :data:`request_tearing_down` signal is sent. + + This is called by + :meth:`RequestContext.pop() `, + which may be delayed during testing to maintain access to + resources. + + :param exc: An unhandled exception raised while dispatching the + request. Detected from the current exception information if + not passed. Passed to each teardown function. + + .. versionchanged:: 0.9 + Added the ``exc`` argument. + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + + for name in chain(request.blueprints, (None,)): + if name in self.teardown_request_funcs: + for func in reversed(self.teardown_request_funcs[name]): + self.ensure_sync(func)(exc) + + request_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) + + def do_teardown_appcontext( + self, + exc: BaseException | None = _sentinel, # type: ignore[assignment] + ) -> None: + """Called right before the application context is popped. + + When handling a request, the application context is popped + after the request context. See :meth:`do_teardown_request`. + + This calls all functions decorated with + :meth:`teardown_appcontext`. Then the + :data:`appcontext_tearing_down` signal is sent. + + This is called by + :meth:`AppContext.pop() `. + + .. versionadded:: 0.9 + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + + for func in reversed(self.teardown_appcontext_funcs): + self.ensure_sync(func)(exc) + + appcontext_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) + + def app_context(self) -> AppContext: + """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` + block to push the context, which will make :data:`current_app` + point at this application. + + An application context is automatically pushed by + :meth:`RequestContext.push() ` + when handling a request, and when running a CLI command. Use + this to manually create a context outside of these situations. + + :: + + with app.app_context(): + init_db() + + See :doc:`/appcontext`. + + .. versionadded:: 0.9 + """ + return AppContext(self) + + def request_context(self, environ: WSGIEnvironment) -> RequestContext: + """Create a :class:`~flask.ctx.RequestContext` representing a + WSGI environment. Use a ``with`` block to push the context, + which will make :data:`request` point at this request. + + See :doc:`/reqcontext`. + + Typically you should not call this from your own code. A request + context is automatically pushed by the :meth:`wsgi_app` when + handling a request. Use :meth:`test_request_context` to create + an environment and context instead of this method. + + :param environ: a WSGI environment + """ + return RequestContext(self, environ) + + def test_request_context(self, *args: t.Any, **kwargs: t.Any) -> RequestContext: + """Create a :class:`~flask.ctx.RequestContext` for a WSGI + environment created from the given values. This is mostly useful + during testing, where you may want to run a function that uses + request data without dispatching a full request. + + See :doc:`/reqcontext`. + + Use a ``with`` block to push the context, which will make + :data:`request` point at the request for the created + environment. :: + + with app.test_request_context(...): + generate_report() + + When using the shell, it may be easier to push and pop the + context manually to avoid indentation. :: + + ctx = app.test_request_context(...) + ctx.push() + ... + ctx.pop() + + Takes the same arguments as Werkzeug's + :class:`~werkzeug.test.EnvironBuilder`, with some defaults from + the application. See the linked Werkzeug docs for most of the + available arguments. Flask-specific behavior is listed here. + + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to + :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param data: The request body, either as a string or a dict of + form keys and values. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + from .testing import EnvironBuilder + + builder = EnvironBuilder(self, *args, **kwargs) + + try: + return self.request_context(builder.get_environ()) + finally: + builder.close() + + def wsgi_app( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> cabc.Iterable[bytes]: + """The actual WSGI application. This is not implemented in + :meth:`__call__` so that middlewares can be applied without + losing a reference to the app object. Instead of doing this:: + + app = MyMiddleware(app) + + It's a better idea to do this instead:: + + app.wsgi_app = MyMiddleware(app.wsgi_app) + + Then you still have the original application object around and + can continue to call methods on it. + + .. versionchanged:: 0.7 + Teardown events for the request and app contexts are called + even if an unhandled error occurs. Other events may not be + called depending on when an error occurs during dispatch. + See :ref:`callbacks-and-errors`. + + :param environ: A WSGI environment. + :param start_response: A callable accepting a status code, + a list of headers, and an optional exception context to + start the response. + """ + ctx = self.request_context(environ) + error: BaseException | None = None + try: + try: + ctx.push() + response = self.full_dispatch_request() + except Exception as e: + error = e + response = self.handle_exception(e) + except: # noqa: B001 + error = sys.exc_info()[1] + raise + return response(environ, start_response) + finally: + if "werkzeug.debug.preserve_context" in environ: + environ["werkzeug.debug.preserve_context"](_cv_app.get()) + environ["werkzeug.debug.preserve_context"](_cv_request.get()) + + if error is not None and self.should_ignore_error(error): + error = None + + ctx.pop(error) + + def __call__( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> cabc.Iterable[bytes]: + """The WSGI server calls the Flask application object as the + WSGI application. This calls :meth:`wsgi_app`, which can be + wrapped to apply middleware. + """ + return self.wsgi_app(environ, start_response) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/blueprints.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/blueprints.py new file mode 100644 index 0000000..aa9eacf --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/blueprints.py @@ -0,0 +1,129 @@ +from __future__ import annotations + +import os +import typing as t +from datetime import timedelta + +from .cli import AppGroup +from .globals import current_app +from .helpers import send_from_directory +from .sansio.blueprints import Blueprint as SansioBlueprint +from .sansio.blueprints import BlueprintSetupState as BlueprintSetupState # noqa +from .sansio.scaffold import _sentinel + +if t.TYPE_CHECKING: # pragma: no cover + from .wrappers import Response + + +class Blueprint(SansioBlueprint): + def __init__( + self, + name: str, + import_name: str, + static_folder: str | os.PathLike[str] | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike[str] | None = None, + url_prefix: str | None = None, + subdomain: str | None = None, + url_defaults: dict[str, t.Any] | None = None, + root_path: str | None = None, + cli_group: str | None = _sentinel, # type: ignore + ) -> None: + super().__init__( + name, + import_name, + static_folder, + static_url_path, + template_folder, + url_prefix, + subdomain, + url_defaults, + root_path, + cli_group, + ) + + #: The Click command group for registering CLI commands for this + #: object. The commands are available from the ``flask`` command + #: once the application has been discovered and blueprints have + #: been registered. + self.cli = AppGroup() + + # Set the name of the Click group in case someone wants to add + # the app's commands to another CLI tool. + self.cli.name = self.name + + def get_send_file_max_age(self, filename: str | None) -> int | None: + """Used by :func:`send_file` to determine the ``max_age`` cache + value for a given file path if it wasn't passed. + + By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from + the configuration of :data:`~flask.current_app`. This defaults + to ``None``, which tells the browser to use conditional requests + instead of a timed cache, which is usually preferable. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionchanged:: 2.0 + The default configuration is ``None`` instead of 12 hours. + + .. versionadded:: 0.9 + """ + value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] + + if value is None: + return None + + if isinstance(value, timedelta): + return int(value.total_seconds()) + + return value # type: ignore[no-any-return] + + def send_static_file(self, filename: str) -> Response: + """The view function used to serve files from + :attr:`static_folder`. A route is automatically registered for + this view at :attr:`static_url_path` if :attr:`static_folder` is + set. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionadded:: 0.5 + + """ + if not self.has_static_folder: + raise RuntimeError("'static_folder' must be set to serve static_files.") + + # send_file only knows to call get_send_file_max_age on the app, + # call it here so it works for blueprints too. + max_age = self.get_send_file_max_age(filename) + return send_from_directory( + t.cast(str, self.static_folder), filename, max_age=max_age + ) + + def open_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Open a resource file relative to :attr:`root_path` for + reading. + + For example, if the file ``schema.sql`` is next to the file + ``app.py`` where the ``Flask`` app is defined, it can be opened + with: + + .. code-block:: python + + with app.open_resource("schema.sql") as f: + conn.executescript(f.read()) + + :param resource: Path to the resource relative to + :attr:`root_path`. + :param mode: Open the file in this mode. Only reading is + supported, valid values are "r" (or "rt") and "rb". + + Note this is a duplicate of the same method in the Flask + class. + + """ + if mode not in {"r", "rt", "rb"}: + raise ValueError("Resources can only be opened for reading.") + + return open(os.path.join(self.root_path, resource), mode) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/cli.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/cli.py new file mode 100644 index 0000000..ecb292a --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/cli.py @@ -0,0 +1,1109 @@ +from __future__ import annotations + +import ast +import collections.abc as cabc +import importlib.metadata +import inspect +import os +import platform +import re +import sys +import traceback +import typing as t +from functools import update_wrapper +from operator import itemgetter +from types import ModuleType + +import click +from click.core import ParameterSource +from werkzeug import run_simple +from werkzeug.serving import is_running_from_reloader +from werkzeug.utils import import_string + +from .globals import current_app +from .helpers import get_debug_flag +from .helpers import get_load_dotenv + +if t.TYPE_CHECKING: + import ssl + + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + from .app import Flask + + +class NoAppException(click.UsageError): + """Raised if an application cannot be found or loaded.""" + + +def find_best_app(module: ModuleType) -> Flask: + """Given a module instance this tries to find the best possible + application in the module or raises an exception. + """ + from . import Flask + + # Search for the most common names first. + for attr_name in ("app", "application"): + app = getattr(module, attr_name, None) + + if isinstance(app, Flask): + return app + + # Otherwise find the only object that is a Flask instance. + matches = [v for v in module.__dict__.values() if isinstance(v, Flask)] + + if len(matches) == 1: + return matches[0] + elif len(matches) > 1: + raise NoAppException( + "Detected multiple Flask applications in module" + f" '{module.__name__}'. Use '{module.__name__}:name'" + " to specify the correct one." + ) + + # Search for app factory functions. + for attr_name in ("create_app", "make_app"): + app_factory = getattr(module, attr_name, None) + + if inspect.isfunction(app_factory): + try: + app = app_factory() + + if isinstance(app, Flask): + return app + except TypeError as e: + if not _called_with_wrong_args(app_factory): + raise + + raise NoAppException( + f"Detected factory '{attr_name}' in module '{module.__name__}'," + " but could not call it without arguments. Use" + f" '{module.__name__}:{attr_name}(args)'" + " to specify arguments." + ) from e + + raise NoAppException( + "Failed to find Flask application or factory in module" + f" '{module.__name__}'. Use '{module.__name__}:name'" + " to specify one." + ) + + +def _called_with_wrong_args(f: t.Callable[..., Flask]) -> bool: + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the factory raised the + error. + + :param f: The function that was called. + :return: ``True`` if the call failed. + """ + tb = sys.exc_info()[2] + + try: + while tb is not None: + if tb.tb_frame.f_code is f.__code__: + # In the function, it was called successfully. + return False + + tb = tb.tb_next + + # Didn't reach the function. + return True + finally: + # Delete tb to break a circular reference. + # https://docs.python.org/2/library/sys.html#sys.exc_info + del tb + + +def find_app_by_string(module: ModuleType, app_name: str) -> Flask: + """Check if the given string is a variable name or a function. Call + a function to get the app instance, or return the variable directly. + """ + from . import Flask + + # Parse app_name as a single expression to determine if it's a valid + # attribute name or function call. + try: + expr = ast.parse(app_name.strip(), mode="eval").body + except SyntaxError: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) from None + + if isinstance(expr, ast.Name): + name = expr.id + args = [] + kwargs = {} + elif isinstance(expr, ast.Call): + # Ensure the function name is an attribute name only. + if not isinstance(expr.func, ast.Name): + raise NoAppException( + f"Function reference must be a simple name: {app_name!r}." + ) + + name = expr.func.id + + # Parse the positional and keyword arguments as literals. + try: + args = [ast.literal_eval(arg) for arg in expr.args] + kwargs = { + kw.arg: ast.literal_eval(kw.value) + for kw in expr.keywords + if kw.arg is not None + } + except ValueError: + # literal_eval gives cryptic error messages, show a generic + # message with the full expression instead. + raise NoAppException( + f"Failed to parse arguments as literal values: {app_name!r}." + ) from None + else: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) + + try: + attr = getattr(module, name) + except AttributeError as e: + raise NoAppException( + f"Failed to find attribute {name!r} in {module.__name__!r}." + ) from e + + # If the attribute is a function, call it with any args and kwargs + # to get the real application. + if inspect.isfunction(attr): + try: + app = attr(*args, **kwargs) + except TypeError as e: + if not _called_with_wrong_args(attr): + raise + + raise NoAppException( + f"The factory {app_name!r} in module" + f" {module.__name__!r} could not be called with the" + " specified arguments." + ) from e + else: + app = attr + + if isinstance(app, Flask): + return app + + raise NoAppException( + "A valid Flask application was not obtained from" + f" '{module.__name__}:{app_name}'." + ) + + +def prepare_import(path: str) -> str: + """Given a filename this will try to calculate the python path, add it + to the search path and return the actual module name that is expected. + """ + path = os.path.realpath(path) + + fname, ext = os.path.splitext(path) + if ext == ".py": + path = fname + + if os.path.basename(path) == "__init__": + path = os.path.dirname(path) + + module_name = [] + + # move up until outside package structure (no __init__.py) + while True: + path, name = os.path.split(path) + module_name.append(name) + + if not os.path.exists(os.path.join(path, "__init__.py")): + break + + if sys.path[0] != path: + sys.path.insert(0, path) + + return ".".join(module_name[::-1]) + + +@t.overload +def locate_app( + module_name: str, app_name: str | None, raise_if_not_found: t.Literal[True] = True +) -> Flask: ... + + +@t.overload +def locate_app( + module_name: str, app_name: str | None, raise_if_not_found: t.Literal[False] = ... +) -> Flask | None: ... + + +def locate_app( + module_name: str, app_name: str | None, raise_if_not_found: bool = True +) -> Flask | None: + try: + __import__(module_name) + except ImportError: + # Reraise the ImportError if it occurred within the imported module. + # Determine this by checking whether the trace has a depth > 1. + if sys.exc_info()[2].tb_next: # type: ignore[union-attr] + raise NoAppException( + f"While importing {module_name!r}, an ImportError was" + f" raised:\n\n{traceback.format_exc()}" + ) from None + elif raise_if_not_found: + raise NoAppException(f"Could not import {module_name!r}.") from None + else: + return None + + module = sys.modules[module_name] + + if app_name is None: + return find_best_app(module) + else: + return find_app_by_string(module, app_name) + + +def get_version(ctx: click.Context, param: click.Parameter, value: t.Any) -> None: + if not value or ctx.resilient_parsing: + return + + flask_version = importlib.metadata.version("flask") + werkzeug_version = importlib.metadata.version("werkzeug") + + click.echo( + f"Python {platform.python_version()}\n" + f"Flask {flask_version}\n" + f"Werkzeug {werkzeug_version}", + color=ctx.color, + ) + ctx.exit() + + +version_option = click.Option( + ["--version"], + help="Show the Flask version.", + expose_value=False, + callback=get_version, + is_flag=True, + is_eager=True, +) + + +class ScriptInfo: + """Helper object to deal with Flask applications. This is usually not + necessary to interface with as it's used internally in the dispatching + to click. In future versions of Flask this object will most likely play + a bigger role. Typically it's created automatically by the + :class:`FlaskGroup` but you can also manually create it and pass it + onwards as click object. + """ + + def __init__( + self, + app_import_path: str | None = None, + create_app: t.Callable[..., Flask] | None = None, + set_debug_flag: bool = True, + ) -> None: + #: Optionally the import path for the Flask application. + self.app_import_path = app_import_path + #: Optionally a function that is passed the script info to create + #: the instance of the application. + self.create_app = create_app + #: A dictionary with arbitrary data that can be associated with + #: this script info. + self.data: dict[t.Any, t.Any] = {} + self.set_debug_flag = set_debug_flag + self._loaded_app: Flask | None = None + + def load_app(self) -> Flask: + """Loads the Flask app (if not yet loaded) and returns it. Calling + this multiple times will just result in the already loaded app to + be returned. + """ + if self._loaded_app is not None: + return self._loaded_app + + if self.create_app is not None: + app: Flask | None = self.create_app() + else: + if self.app_import_path: + path, name = ( + re.split(r":(?![\\/])", self.app_import_path, maxsplit=1) + [None] + )[:2] + import_name = prepare_import(path) + app = locate_app(import_name, name) + else: + for path in ("wsgi.py", "app.py"): + import_name = prepare_import(path) + app = locate_app(import_name, None, raise_if_not_found=False) + + if app is not None: + break + + if app is None: + raise NoAppException( + "Could not locate a Flask application. Use the" + " 'flask --app' option, 'FLASK_APP' environment" + " variable, or a 'wsgi.py' or 'app.py' file in the" + " current directory." + ) + + if self.set_debug_flag: + # Update the app's debug flag through the descriptor so that + # other values repopulate as well. + app.debug = get_debug_flag() + + self._loaded_app = app + return app + + +pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + + +def with_appcontext(f: F) -> F: + """Wraps a callback so that it's guaranteed to be executed with the + script's application context. + + Custom commands (and their options) registered under ``app.cli`` or + ``blueprint.cli`` will always have an app context available, this + decorator is not required in that case. + + .. versionchanged:: 2.2 + The app context is active for subcommands as well as the + decorated callback. The app context is always available to + ``app.cli`` command and parameter callbacks. + """ + + @click.pass_context + def decorator(ctx: click.Context, /, *args: t.Any, **kwargs: t.Any) -> t.Any: + if not current_app: + app = ctx.ensure_object(ScriptInfo).load_app() + ctx.with_resource(app.app_context()) + + return ctx.invoke(f, *args, **kwargs) + + return update_wrapper(decorator, f) # type: ignore[return-value] + + +class AppGroup(click.Group): + """This works similar to a regular click :class:`~click.Group` but it + changes the behavior of the :meth:`command` decorator so that it + automatically wraps the functions in :func:`with_appcontext`. + + Not to be confused with :class:`FlaskGroup`. + """ + + def command( # type: ignore[override] + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], click.Command]: + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` + unless it's disabled by passing ``with_appcontext=False``. + """ + wrap_for_ctx = kwargs.pop("with_appcontext", True) + + def decorator(f: t.Callable[..., t.Any]) -> click.Command: + if wrap_for_ctx: + f = with_appcontext(f) + return super(AppGroup, self).command(*args, **kwargs)(f) # type: ignore[no-any-return] + + return decorator + + def group( # type: ignore[override] + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], click.Group]: + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it defaults the group class to + :class:`AppGroup`. + """ + kwargs.setdefault("cls", AppGroup) + return super().group(*args, **kwargs) # type: ignore[no-any-return] + + +def _set_app(ctx: click.Context, param: click.Option, value: str | None) -> str | None: + if value is None: + return None + + info = ctx.ensure_object(ScriptInfo) + info.app_import_path = value + return value + + +# This option is eager so the app will be available if --help is given. +# --help is also eager, so --app must be before it in the param list. +# no_args_is_help bypasses eager processing, so this option must be +# processed manually in that case to ensure FLASK_APP gets picked up. +_app_option = click.Option( + ["-A", "--app"], + metavar="IMPORT", + help=( + "The Flask application or factory function to load, in the form 'module:name'." + " Module can be a dotted import or file path. Name is not required if it is" + " 'app', 'application', 'create_app', or 'make_app', and can be 'name(args)' to" + " pass arguments." + ), + is_eager=True, + expose_value=False, + callback=_set_app, +) + + +def _set_debug(ctx: click.Context, param: click.Option, value: bool) -> bool | None: + # If the flag isn't provided, it will default to False. Don't use + # that, let debug be set by env in that case. + source = ctx.get_parameter_source(param.name) # type: ignore[arg-type] + + if source is not None and source in ( + ParameterSource.DEFAULT, + ParameterSource.DEFAULT_MAP, + ): + return None + + # Set with env var instead of ScriptInfo.load so that it can be + # accessed early during a factory function. + os.environ["FLASK_DEBUG"] = "1" if value else "0" + return value + + +_debug_option = click.Option( + ["--debug/--no-debug"], + help="Set debug mode.", + expose_value=False, + callback=_set_debug, +) + + +def _env_file_callback( + ctx: click.Context, param: click.Option, value: str | None +) -> str | None: + if value is None: + return None + + import importlib + + try: + importlib.import_module("dotenv") + except ImportError: + raise click.BadParameter( + "python-dotenv must be installed to load an env file.", + ctx=ctx, + param=param, + ) from None + + # Don't check FLASK_SKIP_DOTENV, that only disables automatically + # loading .env and .flaskenv files. + load_dotenv(value) + return value + + +# This option is eager so env vars are loaded as early as possible to be +# used by other options. +_env_file_option = click.Option( + ["-e", "--env-file"], + type=click.Path(exists=True, dir_okay=False), + help="Load environment variables from this file. python-dotenv must be installed.", + is_eager=True, + expose_value=False, + callback=_env_file_callback, +) + + +class FlaskGroup(AppGroup): + """Special subclass of the :class:`AppGroup` group that supports + loading more commands from the configured Flask app. Normally a + developer does not have to interface with this class but there are + some very advanced use cases for which it makes sense to create an + instance of this. see :ref:`custom-scripts`. + + :param add_default_commands: if this is True then the default run and + shell commands will be added. + :param add_version_option: adds the ``--version`` option. + :param create_app: an optional callback that is passed the script info and + returns the loaded app. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param set_debug_flag: Set the app's debug flag. + + .. versionchanged:: 2.2 + Added the ``-A/--app``, ``--debug/--no-debug``, ``-e/--env-file`` options. + + .. versionchanged:: 2.2 + An app context is pushed when running ``app.cli`` commands, so + ``@with_appcontext`` is no longer required for those commands. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment variables + from :file:`.env` and :file:`.flaskenv` files. + """ + + def __init__( + self, + add_default_commands: bool = True, + create_app: t.Callable[..., Flask] | None = None, + add_version_option: bool = True, + load_dotenv: bool = True, + set_debug_flag: bool = True, + **extra: t.Any, + ) -> None: + params = list(extra.pop("params", None) or ()) + # Processing is done with option callbacks instead of a group + # callback. This allows users to make a custom group callback + # without losing the behavior. --env-file must come first so + # that it is eagerly evaluated before --app. + params.extend((_env_file_option, _app_option, _debug_option)) + + if add_version_option: + params.append(version_option) + + if "context_settings" not in extra: + extra["context_settings"] = {} + + extra["context_settings"].setdefault("auto_envvar_prefix", "FLASK") + + super().__init__(params=params, **extra) + + self.create_app = create_app + self.load_dotenv = load_dotenv + self.set_debug_flag = set_debug_flag + + if add_default_commands: + self.add_command(run_command) + self.add_command(shell_command) + self.add_command(routes_command) + + self._loaded_plugin_commands = False + + def _load_plugin_commands(self) -> None: + if self._loaded_plugin_commands: + return + + if sys.version_info >= (3, 10): + from importlib import metadata + else: + # Use a backport on Python < 3.10. We technically have + # importlib.metadata on 3.8+, but the API changed in 3.10, + # so use the backport for consistency. + import importlib_metadata as metadata + + for ep in metadata.entry_points(group="flask.commands"): + self.add_command(ep.load(), ep.name) + + self._loaded_plugin_commands = True + + def get_command(self, ctx: click.Context, name: str) -> click.Command | None: + self._load_plugin_commands() + # Look up built-in and plugin commands, which should be + # available even if the app fails to load. + rv = super().get_command(ctx, name) + + if rv is not None: + return rv + + info = ctx.ensure_object(ScriptInfo) + + # Look up commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + app = info.load_app() + except NoAppException as e: + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + return None + + # Push an app context for the loaded app unless it is already + # active somehow. This makes the context available to parameter + # and command callbacks without needing @with_appcontext. + if not current_app or current_app._get_current_object() is not app: # type: ignore[attr-defined] + ctx.with_resource(app.app_context()) + + return app.cli.get_command(ctx, name) + + def list_commands(self, ctx: click.Context) -> list[str]: + self._load_plugin_commands() + # Start with the built-in and plugin commands. + rv = set(super().list_commands(ctx)) + info = ctx.ensure_object(ScriptInfo) + + # Add commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + rv.update(info.load_app().cli.list_commands(ctx)) + except NoAppException as e: + # When an app couldn't be loaded, show the error message + # without the traceback. + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + except Exception: + # When any other errors occurred during loading, show the + # full traceback. + click.secho(f"{traceback.format_exc()}\n", err=True, fg="red") + + return sorted(rv) + + def make_context( + self, + info_name: str | None, + args: list[str], + parent: click.Context | None = None, + **extra: t.Any, + ) -> click.Context: + # Set a flag to tell app.run to become a no-op. If app.run was + # not in a __name__ == __main__ guard, it would start the server + # when importing, blocking whatever command is being called. + os.environ["FLASK_RUN_FROM_CLI"] = "true" + + # Attempt to load .env and .flask env files. The --env-file + # option can cause another file to be loaded. + if get_load_dotenv(self.load_dotenv): + load_dotenv() + + if "obj" not in extra and "obj" not in self.context_settings: + extra["obj"] = ScriptInfo( + create_app=self.create_app, set_debug_flag=self.set_debug_flag + ) + + return super().make_context(info_name, args, parent=parent, **extra) + + def parse_args(self, ctx: click.Context, args: list[str]) -> list[str]: + if not args and self.no_args_is_help: + # Attempt to load --env-file and --app early in case they + # were given as env vars. Otherwise no_args_is_help will not + # see commands from app.cli. + _env_file_option.handle_parse_result(ctx, {}, []) + _app_option.handle_parse_result(ctx, {}, []) + + return super().parse_args(ctx, args) + + +def _path_is_ancestor(path: str, other: str) -> bool: + """Take ``other`` and remove the length of ``path`` from it. Then join it + to ``path``. If it is the original value, ``path`` is an ancestor of + ``other``.""" + return os.path.join(path, other[len(path) :].lstrip(os.sep)) == other + + +def load_dotenv(path: str | os.PathLike[str] | None = None) -> bool: + """Load "dotenv" files in order of precedence to set environment variables. + + If an env var is already set it is not overwritten, so earlier files in the + list are preferred over later files. + + This is a no-op if `python-dotenv`_ is not installed. + + .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme + + :param path: Load the file at this location instead of searching. + :return: ``True`` if a file was loaded. + + .. versionchanged:: 2.0 + The current directory is not changed to the location of the + loaded file. + + .. versionchanged:: 2.0 + When loading the env files, set the default encoding to UTF-8. + + .. versionchanged:: 1.1.0 + Returns ``False`` when python-dotenv is not installed, or when + the given path isn't a file. + + .. versionadded:: 1.0 + """ + try: + import dotenv + except ImportError: + if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): + click.secho( + " * Tip: There are .env or .flaskenv files present." + ' Do "pip install python-dotenv" to use them.', + fg="yellow", + err=True, + ) + + return False + + # Always return after attempting to load a given path, don't load + # the default files. + if path is not None: + if os.path.isfile(path): + return dotenv.load_dotenv(path, encoding="utf-8") + + return False + + loaded = False + + for name in (".env", ".flaskenv"): + path = dotenv.find_dotenv(name, usecwd=True) + + if not path: + continue + + dotenv.load_dotenv(path, encoding="utf-8") + loaded = True + + return loaded # True if at least one file was located and loaded. + + +def show_server_banner(debug: bool, app_import_path: str | None) -> None: + """Show extra startup messages the first time the server is run, + ignoring the reloader. + """ + if is_running_from_reloader(): + return + + if app_import_path is not None: + click.echo(f" * Serving Flask app '{app_import_path}'") + + if debug is not None: + click.echo(f" * Debug mode: {'on' if debug else 'off'}") + + +class CertParamType(click.ParamType): + """Click option type for the ``--cert`` option. Allows either an + existing file, the string ``'adhoc'``, or an import for a + :class:`~ssl.SSLContext` object. + """ + + name = "path" + + def __init__(self) -> None: + self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) + + def convert( + self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None + ) -> t.Any: + try: + import ssl + except ImportError: + raise click.BadParameter( + 'Using "--cert" requires Python to be compiled with SSL support.', + ctx, + param, + ) from None + + try: + return self.path_type(value, param, ctx) + except click.BadParameter: + value = click.STRING(value, param, ctx).lower() + + if value == "adhoc": + try: + import cryptography # noqa: F401 + except ImportError: + raise click.BadParameter( + "Using ad-hoc certificates requires the cryptography library.", + ctx, + param, + ) from None + + return value + + obj = import_string(value, silent=True) + + if isinstance(obj, ssl.SSLContext): + return obj + + raise + + +def _validate_key(ctx: click.Context, param: click.Parameter, value: t.Any) -> t.Any: + """The ``--key`` option must be specified when ``--cert`` is a file. + Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. + """ + cert = ctx.params.get("cert") + is_adhoc = cert == "adhoc" + + try: + import ssl + except ImportError: + is_context = False + else: + is_context = isinstance(cert, ssl.SSLContext) + + if value is not None: + if is_adhoc: + raise click.BadParameter( + 'When "--cert" is "adhoc", "--key" is not used.', ctx, param + ) + + if is_context: + raise click.BadParameter( + 'When "--cert" is an SSLContext object, "--key" is not used.', + ctx, + param, + ) + + if not cert: + raise click.BadParameter('"--cert" must also be specified.', ctx, param) + + ctx.params["cert"] = cert, value + + else: + if cert and not (is_adhoc or is_context): + raise click.BadParameter('Required when using "--cert".', ctx, param) + + return value + + +class SeparatedPathType(click.Path): + """Click option type that accepts a list of values separated by the + OS's path separator (``:``, ``;`` on Windows). Each value is + validated as a :class:`click.Path` type. + """ + + def convert( + self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None + ) -> t.Any: + items = self.split_envvar_value(value) + # can't call no-arg super() inside list comprehension until Python 3.12 + super_convert = super().convert + return [super_convert(item, param, ctx) for item in items] + + +@click.command("run", short_help="Run a development server.") +@click.option("--host", "-h", default="127.0.0.1", help="The interface to bind to.") +@click.option("--port", "-p", default=5000, help="The port to bind to.") +@click.option( + "--cert", + type=CertParamType(), + help="Specify a certificate file to use HTTPS.", + is_eager=True, +) +@click.option( + "--key", + type=click.Path(exists=True, dir_okay=False, resolve_path=True), + callback=_validate_key, + expose_value=False, + help="The key file to use when specifying a certificate.", +) +@click.option( + "--reload/--no-reload", + default=None, + help="Enable or disable the reloader. By default the reloader " + "is active if debug is enabled.", +) +@click.option( + "--debugger/--no-debugger", + default=None, + help="Enable or disable the debugger. By default the debugger " + "is active if debug is enabled.", +) +@click.option( + "--with-threads/--without-threads", + default=True, + help="Enable or disable multithreading.", +) +@click.option( + "--extra-files", + default=None, + type=SeparatedPathType(), + help=( + "Extra files that trigger a reload on change. Multiple paths" + f" are separated by {os.path.pathsep!r}." + ), +) +@click.option( + "--exclude-patterns", + default=None, + type=SeparatedPathType(), + help=( + "Files matching these fnmatch patterns will not trigger a reload" + " on change. Multiple patterns are separated by" + f" {os.path.pathsep!r}." + ), +) +@pass_script_info +def run_command( + info: ScriptInfo, + host: str, + port: int, + reload: bool, + debugger: bool, + with_threads: bool, + cert: ssl.SSLContext | tuple[str, str | None] | t.Literal["adhoc"] | None, + extra_files: list[str] | None, + exclude_patterns: list[str] | None, +) -> None: + """Run a local development server. + + This server is for development purposes only. It does not provide + the stability, security, or performance of production WSGI servers. + + The reloader and debugger are enabled by default with the '--debug' + option. + """ + try: + app: WSGIApplication = info.load_app() + except Exception as e: + if is_running_from_reloader(): + # When reloading, print out the error immediately, but raise + # it later so the debugger or server can handle it. + traceback.print_exc() + err = e + + def app( + environ: WSGIEnvironment, start_response: StartResponse + ) -> cabc.Iterable[bytes]: + raise err from None + + else: + # When not reloading, raise the error immediately so the + # command fails. + raise e from None + + debug = get_debug_flag() + + if reload is None: + reload = debug + + if debugger is None: + debugger = debug + + show_server_banner(debug, info.app_import_path) + + run_simple( + host, + port, + app, + use_reloader=reload, + use_debugger=debugger, + threaded=with_threads, + ssl_context=cert, + extra_files=extra_files, + exclude_patterns=exclude_patterns, + ) + + +run_command.params.insert(0, _debug_option) + + +@click.command("shell", short_help="Run a shell in the app context.") +@with_appcontext +def shell_command() -> None: + """Run an interactive Python shell in the context of a given + Flask application. The application will populate the default + namespace of this shell according to its configuration. + + This is useful for executing small snippets of management code + without having to manually configure the application. + """ + import code + + banner = ( + f"Python {sys.version} on {sys.platform}\n" + f"App: {current_app.import_name}\n" + f"Instance: {current_app.instance_path}" + ) + ctx: dict[str, t.Any] = {} + + # Support the regular Python interpreter startup script if someone + # is using it. + startup = os.environ.get("PYTHONSTARTUP") + if startup and os.path.isfile(startup): + with open(startup) as f: + eval(compile(f.read(), startup, "exec"), ctx) + + ctx.update(current_app.make_shell_context()) + + # Site, customize, or startup script can set a hook to call when + # entering interactive mode. The default one sets up readline with + # tab and history completion. + interactive_hook = getattr(sys, "__interactivehook__", None) + + if interactive_hook is not None: + try: + import readline + from rlcompleter import Completer + except ImportError: + pass + else: + # rlcompleter uses __main__.__dict__ by default, which is + # flask.__main__. Use the shell context instead. + readline.set_completer(Completer(ctx).complete) + + interactive_hook() + + code.interact(banner=banner, local=ctx) + + +@click.command("routes", short_help="Show the routes for the app.") +@click.option( + "--sort", + "-s", + type=click.Choice(("endpoint", "methods", "domain", "rule", "match")), + default="endpoint", + help=( + "Method to sort routes by. 'match' is the order that Flask will match routes" + " when dispatching a request." + ), +) +@click.option("--all-methods", is_flag=True, help="Show HEAD and OPTIONS methods.") +@with_appcontext +def routes_command(sort: str, all_methods: bool) -> None: + """Show all registered routes with endpoints and methods.""" + rules = list(current_app.url_map.iter_rules()) + + if not rules: + click.echo("No routes were registered.") + return + + ignored_methods = set() if all_methods else {"HEAD", "OPTIONS"} + host_matching = current_app.url_map.host_matching + has_domain = any(rule.host if host_matching else rule.subdomain for rule in rules) + rows = [] + + for rule in rules: + row = [ + rule.endpoint, + ", ".join(sorted((rule.methods or set()) - ignored_methods)), + ] + + if has_domain: + row.append((rule.host if host_matching else rule.subdomain) or "") + + row.append(rule.rule) + rows.append(row) + + headers = ["Endpoint", "Methods"] + sorts = ["endpoint", "methods"] + + if has_domain: + headers.append("Host" if host_matching else "Subdomain") + sorts.append("domain") + + headers.append("Rule") + sorts.append("rule") + + try: + rows.sort(key=itemgetter(sorts.index(sort))) + except ValueError: + pass + + rows.insert(0, headers) + widths = [max(len(row[i]) for row in rows) for i in range(len(headers))] + rows.insert(1, ["-" * w for w in widths]) + template = " ".join(f"{{{i}:<{w}}}" for i, w in enumerate(widths)) + + for row in rows: + click.echo(template.format(*row)) + + +cli = FlaskGroup( + name="flask", + help="""\ +A general utility script for Flask applications. + +An application to load must be given with the '--app' option, +'FLASK_APP' environment variable, or with a 'wsgi.py' or 'app.py' file +in the current directory. +""", +) + + +def main() -> None: + cli.main() + + +if __name__ == "__main__": + main() diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/config.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/config.py new file mode 100644 index 0000000..7e3ba17 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/config.py @@ -0,0 +1,370 @@ +from __future__ import annotations + +import errno +import json +import os +import types +import typing as t + +from werkzeug.utils import import_string + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .sansio.app import App + + +T = t.TypeVar("T") + + +class ConfigAttribute(t.Generic[T]): + """Makes an attribute forward to the config""" + + def __init__( + self, name: str, get_converter: t.Callable[[t.Any], T] | None = None + ) -> None: + self.__name__ = name + self.get_converter = get_converter + + @t.overload + def __get__(self, obj: None, owner: None) -> te.Self: ... + + @t.overload + def __get__(self, obj: App, owner: type[App]) -> T: ... + + def __get__(self, obj: App | None, owner: type[App] | None = None) -> T | te.Self: + if obj is None: + return self + + rv = obj.config[self.__name__] + + if self.get_converter is not None: + rv = self.get_converter(rv) + + return rv # type: ignore[no-any-return] + + def __set__(self, obj: App, value: t.Any) -> None: + obj.config[self.__name__] = value + + +class Config(dict): # type: ignore[type-arg] + """Works exactly like a dict but provides ways to fill it from files + or special dictionaries. There are two common patterns to populate the + config. + + Either you can fill the config from a config file:: + + app.config.from_pyfile('yourconfig.cfg') + + Or alternatively you can define the configuration options in the + module that calls :meth:`from_object` or provide an import path to + a module that should be loaded. It is also possible to tell it to + use the same module and with that provide the configuration values + just before the call:: + + DEBUG = True + SECRET_KEY = 'development key' + app.config.from_object(__name__) + + In both cases (loading from any Python file or loading from modules), + only uppercase keys are added to the config. This makes it possible to use + lowercase values in the config file for temporary values that are not added + to the config or to define the config keys in the same file that implements + the application. + + Probably the most interesting way to load configurations is from an + environment variable pointing to a file:: + + app.config.from_envvar('YOURAPPLICATION_SETTINGS') + + In this case before launching the application you have to set this + environment variable to the file you want to use. On Linux and OS X + use the export statement:: + + export YOURAPPLICATION_SETTINGS='/path/to/config/file' + + On windows use `set` instead. + + :param root_path: path to which files are read relative from. When the + config object is created by the application, this is + the application's :attr:`~flask.Flask.root_path`. + :param defaults: an optional dictionary of default values + """ + + def __init__( + self, + root_path: str | os.PathLike[str], + defaults: dict[str, t.Any] | None = None, + ) -> None: + super().__init__(defaults or {}) + self.root_path = root_path + + def from_envvar(self, variable_name: str, silent: bool = False) -> bool: + """Loads a configuration from an environment variable pointing to + a configuration file. This is basically just a shortcut with nicer + error messages for this line of code:: + + app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) + + :param variable_name: name of the environment variable + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: ``True`` if the file was loaded successfully. + """ + rv = os.environ.get(variable_name) + if not rv: + if silent: + return False + raise RuntimeError( + f"The environment variable {variable_name!r} is not set" + " and as such configuration could not be loaded. Set" + " this variable and make it point to a configuration" + " file" + ) + return self.from_pyfile(rv, silent=silent) + + def from_prefixed_env( + self, prefix: str = "FLASK", *, loads: t.Callable[[str], t.Any] = json.loads + ) -> bool: + """Load any environment variables that start with ``FLASK_``, + dropping the prefix from the env key for the config key. Values + are passed through a loading function to attempt to convert them + to more specific types than strings. + + Keys are loaded in :func:`sorted` order. + + The default loading function attempts to parse values as any + valid JSON type, including dicts and lists. + + Specific items in nested dicts can be set by separating the + keys with double underscores (``__``). If an intermediate key + doesn't exist, it will be initialized to an empty dict. + + :param prefix: Load env vars that start with this prefix, + separated with an underscore (``_``). + :param loads: Pass each string value to this function and use + the returned value as the config value. If any error is + raised it is ignored and the value remains a string. The + default is :func:`json.loads`. + + .. versionadded:: 2.1 + """ + prefix = f"{prefix}_" + len_prefix = len(prefix) + + for key in sorted(os.environ): + if not key.startswith(prefix): + continue + + value = os.environ[key] + + try: + value = loads(value) + except Exception: + # Keep the value as a string if loading failed. + pass + + # Change to key.removeprefix(prefix) on Python >= 3.9. + key = key[len_prefix:] + + if "__" not in key: + # A non-nested key, set directly. + self[key] = value + continue + + # Traverse nested dictionaries with keys separated by "__". + current = self + *parts, tail = key.split("__") + + for part in parts: + # If an intermediate dict does not exist, create it. + if part not in current: + current[part] = {} + + current = current[part] + + current[tail] = value + + return True + + def from_pyfile( + self, filename: str | os.PathLike[str], silent: bool = False + ) -> bool: + """Updates the values in the config from a Python file. This function + behaves as if the file was imported as module with the + :meth:`from_object` function. + + :param filename: the filename of the config. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: ``True`` if the file was loaded successfully. + + .. versionadded:: 0.7 + `silent` parameter. + """ + filename = os.path.join(self.root_path, filename) + d = types.ModuleType("config") + d.__file__ = filename + try: + with open(filename, mode="rb") as config_file: + exec(compile(config_file.read(), filename, "exec"), d.__dict__) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): + return False + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + self.from_object(d) + return True + + def from_object(self, obj: object | str) -> None: + """Updates the values from the given object. An object can be of one + of the following two types: + + - a string: in this case the object with that name will be imported + - an actual object reference: that object is used directly + + Objects are usually either modules or classes. :meth:`from_object` + loads only the uppercase attributes of the module/class. A ``dict`` + object will not work with :meth:`from_object` because the keys of a + ``dict`` are not attributes of the ``dict`` class. + + Example of module-based configuration:: + + app.config.from_object('yourapplication.default_config') + from yourapplication import default_config + app.config.from_object(default_config) + + Nothing is done to the object before loading. If the object is a + class and has ``@property`` attributes, it needs to be + instantiated before being passed to this method. + + You should not use this function to load the actual configuration but + rather configuration defaults. The actual config should be loaded + with :meth:`from_pyfile` and ideally from a location not within the + package because the package might be installed system wide. + + See :ref:`config-dev-prod` for an example of class-based configuration + using :meth:`from_object`. + + :param obj: an import name or object + """ + if isinstance(obj, str): + obj = import_string(obj) + for key in dir(obj): + if key.isupper(): + self[key] = getattr(obj, key) + + def from_file( + self, + filename: str | os.PathLike[str], + load: t.Callable[[t.IO[t.Any]], t.Mapping[str, t.Any]], + silent: bool = False, + text: bool = True, + ) -> bool: + """Update the values in the config from a file that is loaded + using the ``load`` parameter. The loaded data is passed to the + :meth:`from_mapping` method. + + .. code-block:: python + + import json + app.config.from_file("config.json", load=json.load) + + import tomllib + app.config.from_file("config.toml", load=tomllib.load, text=False) + + :param filename: The path to the data file. This can be an + absolute path or relative to the config root path. + :param load: A callable that takes a file handle and returns a + mapping of loaded data from the file. + :type load: ``Callable[[Reader], Mapping]`` where ``Reader`` + implements a ``read`` method. + :param silent: Ignore the file if it doesn't exist. + :param text: Open the file in text or binary mode. + :return: ``True`` if the file was loaded successfully. + + .. versionchanged:: 2.3 + The ``text`` parameter was added. + + .. versionadded:: 2.0 + """ + filename = os.path.join(self.root_path, filename) + + try: + with open(filename, "r" if text else "rb") as f: + obj = load(f) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR): + return False + + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + + return self.from_mapping(obj) + + def from_mapping( + self, mapping: t.Mapping[str, t.Any] | None = None, **kwargs: t.Any + ) -> bool: + """Updates the config like :meth:`update` ignoring items with + non-upper keys. + + :return: Always returns ``True``. + + .. versionadded:: 0.11 + """ + mappings: dict[str, t.Any] = {} + if mapping is not None: + mappings.update(mapping) + mappings.update(kwargs) + for key, value in mappings.items(): + if key.isupper(): + self[key] = value + return True + + def get_namespace( + self, namespace: str, lowercase: bool = True, trim_namespace: bool = True + ) -> dict[str, t.Any]: + """Returns a dictionary containing a subset of configuration options + that match the specified namespace/prefix. Example usage:: + + app.config['IMAGE_STORE_TYPE'] = 'fs' + app.config['IMAGE_STORE_PATH'] = '/var/app/images' + app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' + image_store_config = app.config.get_namespace('IMAGE_STORE_') + + The resulting dictionary `image_store_config` would look like:: + + { + 'type': 'fs', + 'path': '/var/app/images', + 'base_url': 'http://img.website.com' + } + + This is often useful when configuration options map directly to + keyword arguments in functions or class constructors. + + :param namespace: a configuration namespace + :param lowercase: a flag indicating if the keys of the resulting + dictionary should be lowercase + :param trim_namespace: a flag indicating if the keys of the resulting + dictionary should not include the namespace + + .. versionadded:: 0.11 + """ + rv = {} + for k, v in self.items(): + if not k.startswith(namespace): + continue + if trim_namespace: + key = k[len(namespace) :] + else: + key = k + if lowercase: + key = key.lower() + rv[key] = v + return rv + + def __repr__(self) -> str: + return f"<{type(self).__name__} {dict.__repr__(self)}>" diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/ctx.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/ctx.py new file mode 100644 index 0000000..9b164d3 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/ctx.py @@ -0,0 +1,449 @@ +from __future__ import annotations + +import contextvars +import sys +import typing as t +from functools import update_wrapper +from types import TracebackType + +from werkzeug.exceptions import HTTPException + +from . import typing as ft +from .globals import _cv_app +from .globals import _cv_request +from .signals import appcontext_popped +from .signals import appcontext_pushed + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import WSGIEnvironment + + from .app import Flask + from .sessions import SessionMixin + from .wrappers import Request + + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +class _AppCtxGlobals: + """A plain object. Used as a namespace for storing data during an + application context. + + Creating an app context automatically creates this object, which is + made available as the :data:`g` proxy. + + .. describe:: 'key' in g + + Check whether an attribute is present. + + .. versionadded:: 0.10 + + .. describe:: iter(g) + + Return an iterator over the attribute names. + + .. versionadded:: 0.10 + """ + + # Define attr methods to let mypy know this is a namespace object + # that has arbitrary attributes. + + def __getattr__(self, name: str) -> t.Any: + try: + return self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def __setattr__(self, name: str, value: t.Any) -> None: + self.__dict__[name] = value + + def __delattr__(self, name: str) -> None: + try: + del self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def get(self, name: str, default: t.Any | None = None) -> t.Any: + """Get an attribute by name, or a default value. Like + :meth:`dict.get`. + + :param name: Name of attribute to get. + :param default: Value to return if the attribute is not present. + + .. versionadded:: 0.10 + """ + return self.__dict__.get(name, default) + + def pop(self, name: str, default: t.Any = _sentinel) -> t.Any: + """Get and remove an attribute by name. Like :meth:`dict.pop`. + + :param name: Name of attribute to pop. + :param default: Value to return if the attribute is not present, + instead of raising a ``KeyError``. + + .. versionadded:: 0.11 + """ + if default is _sentinel: + return self.__dict__.pop(name) + else: + return self.__dict__.pop(name, default) + + def setdefault(self, name: str, default: t.Any = None) -> t.Any: + """Get the value of an attribute if it is present, otherwise + set and return a default value. Like :meth:`dict.setdefault`. + + :param name: Name of attribute to get. + :param default: Value to set and return if the attribute is not + present. + + .. versionadded:: 0.11 + """ + return self.__dict__.setdefault(name, default) + + def __contains__(self, item: str) -> bool: + return item in self.__dict__ + + def __iter__(self) -> t.Iterator[str]: + return iter(self.__dict__) + + def __repr__(self) -> str: + ctx = _cv_app.get(None) + if ctx is not None: + return f"" + return object.__repr__(self) + + +def after_this_request( + f: ft.AfterRequestCallable[t.Any], +) -> ft.AfterRequestCallable[t.Any]: + """Executes a function after this request. This is useful to modify + response objects. The function is passed the response object and has + to return the same or a new one. + + Example:: + + @app.route('/') + def index(): + @after_this_request + def add_header(response): + response.headers['X-Foo'] = 'Parachute' + return response + return 'Hello World!' + + This is more useful if a function other than the view function wants to + modify a response. For instance think of a decorator that wants to add + some headers without converting the return value into a response object. + + .. versionadded:: 0.9 + """ + ctx = _cv_request.get(None) + + if ctx is None: + raise RuntimeError( + "'after_this_request' can only be used when a request" + " context is active, such as in a view function." + ) + + ctx._after_request_functions.append(f) + return f + + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + + +def copy_current_request_context(f: F) -> F: + """A helper function that decorates a function to retain the current + request context. This is useful when working with greenlets. The moment + the function is decorated a copy of the request context is created and + then pushed when the function is called. The current session is also + included in the copied request context. + + Example:: + + import gevent + from flask import copy_current_request_context + + @app.route('/') + def index(): + @copy_current_request_context + def do_some_work(): + # do some work here, it can access flask.request or + # flask.session like you would otherwise in the view function. + ... + gevent.spawn(do_some_work) + return 'Regular response' + + .. versionadded:: 0.10 + """ + ctx = _cv_request.get(None) + + if ctx is None: + raise RuntimeError( + "'copy_current_request_context' can only be used when a" + " request context is active, such as in a view function." + ) + + ctx = ctx.copy() + + def wrapper(*args: t.Any, **kwargs: t.Any) -> t.Any: + with ctx: # type: ignore[union-attr] + return ctx.app.ensure_sync(f)(*args, **kwargs) # type: ignore[union-attr] + + return update_wrapper(wrapper, f) # type: ignore[return-value] + + +def has_request_context() -> bool: + """If you have code that wants to test if a request context is there or + not this function can be used. For instance, you may want to take advantage + of request information if the request object is available, but fail + silently if it is unavailable. + + :: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and has_request_context(): + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + Alternatively you can also just test any of the context bound objects + (such as :class:`request` or :class:`g`) for truthness:: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and request: + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + .. versionadded:: 0.7 + """ + return _cv_request.get(None) is not None + + +def has_app_context() -> bool: + """Works like :func:`has_request_context` but for the application + context. You can also just do a boolean check on the + :data:`current_app` object instead. + + .. versionadded:: 0.9 + """ + return _cv_app.get(None) is not None + + +class AppContext: + """The app context contains application-specific information. An app + context is created and pushed at the beginning of each request if + one is not already active. An app context is also pushed when + running CLI commands. + """ + + def __init__(self, app: Flask) -> None: + self.app = app + self.url_adapter = app.create_url_adapter(None) + self.g: _AppCtxGlobals = app.app_ctx_globals_class() + self._cv_tokens: list[contextvars.Token[AppContext]] = [] + + def push(self) -> None: + """Binds the app context to the current context.""" + self._cv_tokens.append(_cv_app.set(self)) + appcontext_pushed.send(self.app, _async_wrapper=self.app.ensure_sync) + + def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore + """Pops the app context.""" + try: + if len(self._cv_tokens) == 1: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_appcontext(exc) + finally: + ctx = _cv_app.get() + _cv_app.reset(self._cv_tokens.pop()) + + if ctx is not self: + raise AssertionError( + f"Popped wrong app context. ({ctx!r} instead of {self!r})" + ) + + appcontext_popped.send(self.app, _async_wrapper=self.app.ensure_sync) + + def __enter__(self) -> AppContext: + self.push() + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.pop(exc_value) + + +class RequestContext: + """The request context contains per-request information. The Flask + app creates and pushes it at the beginning of the request, then pops + it at the end of the request. It will create the URL adapter and + request object for the WSGI environment provided. + + Do not attempt to use this class directly, instead use + :meth:`~flask.Flask.test_request_context` and + :meth:`~flask.Flask.request_context` to create this object. + + When the request context is popped, it will evaluate all the + functions registered on the application for teardown execution + (:meth:`~flask.Flask.teardown_request`). + + The request context is automatically popped at the end of the + request. When using the interactive debugger, the context will be + restored so ``request`` is still accessible. Similarly, the test + client can preserve the context after the request ends. However, + teardown functions may already have closed some resources such as + database connections. + """ + + def __init__( + self, + app: Flask, + environ: WSGIEnvironment, + request: Request | None = None, + session: SessionMixin | None = None, + ) -> None: + self.app = app + if request is None: + request = app.request_class(environ) + request.json_module = app.json + self.request: Request = request + self.url_adapter = None + try: + self.url_adapter = app.create_url_adapter(self.request) + except HTTPException as e: + self.request.routing_exception = e + self.flashes: list[tuple[str, str]] | None = None + self.session: SessionMixin | None = session + # Functions that should be executed after the request on the response + # object. These will be called before the regular "after_request" + # functions. + self._after_request_functions: list[ft.AfterRequestCallable[t.Any]] = [] + + self._cv_tokens: list[ + tuple[contextvars.Token[RequestContext], AppContext | None] + ] = [] + + def copy(self) -> RequestContext: + """Creates a copy of this request context with the same request object. + This can be used to move a request context to a different greenlet. + Because the actual request object is the same this cannot be used to + move a request context to a different thread unless access to the + request object is locked. + + .. versionadded:: 0.10 + + .. versionchanged:: 1.1 + The current session object is used instead of reloading the original + data. This prevents `flask.session` pointing to an out-of-date object. + """ + return self.__class__( + self.app, + environ=self.request.environ, + request=self.request, + session=self.session, + ) + + def match_request(self) -> None: + """Can be overridden by a subclass to hook into the matching + of the request. + """ + try: + result = self.url_adapter.match(return_rule=True) # type: ignore + self.request.url_rule, self.request.view_args = result # type: ignore + except HTTPException as e: + self.request.routing_exception = e + + def push(self) -> None: + # Before we push the request context we have to ensure that there + # is an application context. + app_ctx = _cv_app.get(None) + + if app_ctx is None or app_ctx.app is not self.app: + app_ctx = self.app.app_context() + app_ctx.push() + else: + app_ctx = None + + self._cv_tokens.append((_cv_request.set(self), app_ctx)) + + # Open the session at the moment that the request context is available. + # This allows a custom open_session method to use the request context. + # Only open a new session if this is the first time the request was + # pushed, otherwise stream_with_context loses the session. + if self.session is None: + session_interface = self.app.session_interface + self.session = session_interface.open_session(self.app, self.request) + + if self.session is None: + self.session = session_interface.make_null_session(self.app) + + # Match the request URL after loading the session, so that the + # session is available in custom URL converters. + if self.url_adapter is not None: + self.match_request() + + def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore + """Pops the request context and unbinds it by doing that. This will + also trigger the execution of functions registered by the + :meth:`~flask.Flask.teardown_request` decorator. + + .. versionchanged:: 0.9 + Added the `exc` argument. + """ + clear_request = len(self._cv_tokens) == 1 + + try: + if clear_request: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_request(exc) + + request_close = getattr(self.request, "close", None) + if request_close is not None: + request_close() + finally: + ctx = _cv_request.get() + token, app_ctx = self._cv_tokens.pop() + _cv_request.reset(token) + + # get rid of circular dependencies at the end of the request + # so that we don't require the GC to be active. + if clear_request: + ctx.request.environ["werkzeug.request"] = None + + if app_ctx is not None: + app_ctx.pop(exc) + + if ctx is not self: + raise AssertionError( + f"Popped wrong request context. ({ctx!r} instead of {self!r})" + ) + + def __enter__(self) -> RequestContext: + self.push() + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.pop(exc_value) + + def __repr__(self) -> str: + return ( + f"<{type(self).__name__} {self.request.url!r}" + f" [{self.request.method}] of {self.app.name}>" + ) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/debughelpers.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/debughelpers.py new file mode 100644 index 0000000..2c8c4c4 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/debughelpers.py @@ -0,0 +1,178 @@ +from __future__ import annotations + +import typing as t + +from jinja2.loaders import BaseLoader +from werkzeug.routing import RequestRedirect + +from .blueprints import Blueprint +from .globals import request_ctx +from .sansio.app import App + +if t.TYPE_CHECKING: + from .sansio.scaffold import Scaffold + from .wrappers import Request + + +class UnexpectedUnicodeError(AssertionError, UnicodeError): + """Raised in places where we want some better error reporting for + unexpected unicode or binary data. + """ + + +class DebugFilesKeyError(KeyError, AssertionError): + """Raised from request.files during debugging. The idea is that it can + provide a better error message than just a generic KeyError/BadRequest. + """ + + def __init__(self, request: Request, key: str) -> None: + form_matches = request.form.getlist(key) + buf = [ + f"You tried to access the file {key!r} in the request.files" + " dictionary but it does not exist. The mimetype for the" + f" request is {request.mimetype!r} instead of" + " 'multipart/form-data' which means that no file contents" + " were transmitted. To fix this error you should provide" + ' enctype="multipart/form-data" in your form.' + ] + if form_matches: + names = ", ".join(repr(x) for x in form_matches) + buf.append( + "\n\nThe browser instead transmitted some file names. " + f"This was submitted: {names}" + ) + self.msg = "".join(buf) + + def __str__(self) -> str: + return self.msg + + +class FormDataRoutingRedirect(AssertionError): + """This exception is raised in debug mode if a routing redirect + would cause the browser to drop the method or body. This happens + when method is not GET, HEAD or OPTIONS and the status code is not + 307 or 308. + """ + + def __init__(self, request: Request) -> None: + exc = request.routing_exception + assert isinstance(exc, RequestRedirect) + buf = [ + f"A request was sent to '{request.url}', but routing issued" + f" a redirect to the canonical URL '{exc.new_url}'." + ] + + if f"{request.base_url}/" == exc.new_url.partition("?")[0]: + buf.append( + " The URL was defined with a trailing slash. Flask" + " will redirect to the URL with a trailing slash if it" + " was accessed without one." + ) + + buf.append( + " Send requests to the canonical URL, or use 307 or 308 for" + " routing redirects. Otherwise, browsers will drop form" + " data.\n\n" + "This exception is only raised in debug mode." + ) + super().__init__("".join(buf)) + + +def attach_enctype_error_multidict(request: Request) -> None: + """Patch ``request.files.__getitem__`` to raise a descriptive error + about ``enctype=multipart/form-data``. + + :param request: The request to patch. + :meta private: + """ + oldcls = request.files.__class__ + + class newcls(oldcls): # type: ignore[valid-type, misc] + def __getitem__(self, key: str) -> t.Any: + try: + return super().__getitem__(key) + except KeyError as e: + if key not in request.form: + raise + + raise DebugFilesKeyError(request, key).with_traceback( + e.__traceback__ + ) from None + + newcls.__name__ = oldcls.__name__ + newcls.__module__ = oldcls.__module__ + request.files.__class__ = newcls + + +def _dump_loader_info(loader: BaseLoader) -> t.Iterator[str]: + yield f"class: {type(loader).__module__}.{type(loader).__name__}" + for key, value in sorted(loader.__dict__.items()): + if key.startswith("_"): + continue + if isinstance(value, (tuple, list)): + if not all(isinstance(x, str) for x in value): + continue + yield f"{key}:" + for item in value: + yield f" - {item}" + continue + elif not isinstance(value, (str, int, float, bool)): + continue + yield f"{key}: {value!r}" + + +def explain_template_loading_attempts( + app: App, + template: str, + attempts: list[ + tuple[ + BaseLoader, + Scaffold, + tuple[str, str | None, t.Callable[[], bool] | None] | None, + ] + ], +) -> None: + """This should help developers understand what failed""" + info = [f"Locating template {template!r}:"] + total_found = 0 + blueprint = None + if request_ctx and request_ctx.request.blueprint is not None: + blueprint = request_ctx.request.blueprint + + for idx, (loader, srcobj, triple) in enumerate(attempts): + if isinstance(srcobj, App): + src_info = f"application {srcobj.import_name!r}" + elif isinstance(srcobj, Blueprint): + src_info = f"blueprint {srcobj.name!r} ({srcobj.import_name})" + else: + src_info = repr(srcobj) + + info.append(f"{idx + 1:5}: trying loader of {src_info}") + + for line in _dump_loader_info(loader): + info.append(f" {line}") + + if triple is None: + detail = "no match" + else: + detail = f"found ({triple[1] or ''!r})" + total_found += 1 + info.append(f" -> {detail}") + + seems_fishy = False + if total_found == 0: + info.append("Error: the template could not be found.") + seems_fishy = True + elif total_found > 1: + info.append("Warning: multiple loaders returned a match for the template.") + seems_fishy = True + + if blueprint is not None and seems_fishy: + info.append( + " The template was looked up from an endpoint that belongs" + f" to the blueprint {blueprint!r}." + ) + info.append(" Maybe you did not place a template in the right folder?") + info.append(" See https://flask.palletsprojects.com/blueprints/#templates") + + app.logger.info("\n".join(info)) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/globals.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/globals.py new file mode 100644 index 0000000..e2c410c --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/globals.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +import typing as t +from contextvars import ContextVar + +from werkzeug.local import LocalProxy + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .ctx import _AppCtxGlobals + from .ctx import AppContext + from .ctx import RequestContext + from .sessions import SessionMixin + from .wrappers import Request + + +_no_app_msg = """\ +Working outside of application context. + +This typically means that you attempted to use functionality that needed +the current application. To solve this, set up an application context +with app.app_context(). See the documentation for more information.\ +""" +_cv_app: ContextVar[AppContext] = ContextVar("flask.app_ctx") +app_ctx: AppContext = LocalProxy( # type: ignore[assignment] + _cv_app, unbound_message=_no_app_msg +) +current_app: Flask = LocalProxy( # type: ignore[assignment] + _cv_app, "app", unbound_message=_no_app_msg +) +g: _AppCtxGlobals = LocalProxy( # type: ignore[assignment] + _cv_app, "g", unbound_message=_no_app_msg +) + +_no_req_msg = """\ +Working outside of request context. + +This typically means that you attempted to use functionality that needed +an active HTTP request. Consult the documentation on testing for +information about how to avoid this problem.\ +""" +_cv_request: ContextVar[RequestContext] = ContextVar("flask.request_ctx") +request_ctx: RequestContext = LocalProxy( # type: ignore[assignment] + _cv_request, unbound_message=_no_req_msg +) +request: Request = LocalProxy( # type: ignore[assignment] + _cv_request, "request", unbound_message=_no_req_msg +) +session: SessionMixin = LocalProxy( # type: ignore[assignment] + _cv_request, "session", unbound_message=_no_req_msg +) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/helpers.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/helpers.py new file mode 100644 index 0000000..359a842 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/helpers.py @@ -0,0 +1,621 @@ +from __future__ import annotations + +import importlib.util +import os +import sys +import typing as t +from datetime import datetime +from functools import lru_cache +from functools import update_wrapper + +import werkzeug.utils +from werkzeug.exceptions import abort as _wz_abort +from werkzeug.utils import redirect as _wz_redirect +from werkzeug.wrappers import Response as BaseResponse + +from .globals import _cv_request +from .globals import current_app +from .globals import request +from .globals import request_ctx +from .globals import session +from .signals import message_flashed + +if t.TYPE_CHECKING: # pragma: no cover + from .wrappers import Response + + +def get_debug_flag() -> bool: + """Get whether debug mode should be enabled for the app, indicated by the + :envvar:`FLASK_DEBUG` environment variable. The default is ``False``. + """ + val = os.environ.get("FLASK_DEBUG") + return bool(val and val.lower() not in {"0", "false", "no"}) + + +def get_load_dotenv(default: bool = True) -> bool: + """Get whether the user has disabled loading default dotenv files by + setting :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load + the files. + + :param default: What to return if the env var isn't set. + """ + val = os.environ.get("FLASK_SKIP_DOTENV") + + if not val: + return default + + return val.lower() in ("0", "false", "no") + + +def stream_with_context( + generator_or_function: t.Iterator[t.AnyStr] | t.Callable[..., t.Iterator[t.AnyStr]], +) -> t.Iterator[t.AnyStr]: + """Request contexts disappear when the response is started on the server. + This is done for efficiency reasons and to make it less likely to encounter + memory leaks with badly written WSGI middlewares. The downside is that if + you are using streamed responses, the generator cannot access request bound + information any more. + + This function however can help you keep the context around for longer:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + @stream_with_context + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(generate()) + + Alternatively it can also be used around a specific generator:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(stream_with_context(generate())) + + .. versionadded:: 0.9 + """ + try: + gen = iter(generator_or_function) # type: ignore[arg-type] + except TypeError: + + def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any: + gen = generator_or_function(*args, **kwargs) # type: ignore[operator] + return stream_with_context(gen) + + return update_wrapper(decorator, generator_or_function) # type: ignore[arg-type] + + def generator() -> t.Iterator[t.AnyStr | None]: + ctx = _cv_request.get(None) + if ctx is None: + raise RuntimeError( + "'stream_with_context' can only be used when a request" + " context is active, such as in a view function." + ) + with ctx: + # Dummy sentinel. Has to be inside the context block or we're + # not actually keeping the context around. + yield None + + # The try/finally is here so that if someone passes a WSGI level + # iterator in we're still running the cleanup logic. Generators + # don't need that because they are closed on their destruction + # automatically. + try: + yield from gen + finally: + if hasattr(gen, "close"): + gen.close() + + # The trick is to start the generator. Then the code execution runs until + # the first dummy None is yielded at which point the context was already + # pushed. This item is discarded. Then when the iteration continues the + # real generator is executed. + wrapped_g = generator() + next(wrapped_g) + return wrapped_g # type: ignore[return-value] + + +def make_response(*args: t.Any) -> Response: + """Sometimes it is necessary to set additional headers in a view. Because + views do not have to return response objects but can return a value that + is converted into a response object by Flask itself, it becomes tricky to + add headers to it. This function can be called instead of using a return + and you will get a response object which you can use to attach headers. + + If view looked like this and you want to add a new header:: + + def index(): + return render_template('index.html', foo=42) + + You can now do something like this:: + + def index(): + response = make_response(render_template('index.html', foo=42)) + response.headers['X-Parachutes'] = 'parachutes are cool' + return response + + This function accepts the very same arguments you can return from a + view function. This for example creates a response with a 404 error + code:: + + response = make_response(render_template('not_found.html'), 404) + + The other use case of this function is to force the return value of a + view function into a response which is helpful with view + decorators:: + + response = make_response(view_function()) + response.headers['X-Parachutes'] = 'parachutes are cool' + + Internally this function does the following things: + + - if no arguments are passed, it creates a new response argument + - if one argument is passed, :meth:`flask.Flask.make_response` + is invoked with it. + - if more than one argument is passed, the arguments are passed + to the :meth:`flask.Flask.make_response` function as tuple. + + .. versionadded:: 0.6 + """ + if not args: + return current_app.response_class() + if len(args) == 1: + args = args[0] + return current_app.make_response(args) + + +def url_for( + endpoint: str, + *, + _anchor: str | None = None, + _method: str | None = None, + _scheme: str | None = None, + _external: bool | None = None, + **values: t.Any, +) -> str: + """Generate a URL to the given endpoint with the given values. + + This requires an active request or application context, and calls + :meth:`current_app.url_for() `. See that method + for full documentation. + + :param endpoint: The endpoint name associated with the URL to + generate. If this starts with a ``.``, the current blueprint + name (if any) will be used. + :param _anchor: If given, append this as ``#anchor`` to the URL. + :param _method: If given, generate the URL associated with this + method for the endpoint. + :param _scheme: If given, the URL will have this scheme if it is + external. + :param _external: If given, prefer the URL to be internal (False) or + require it to be external (True). External URLs include the + scheme and domain. When not in an active request, URLs are + external by default. + :param values: Values to use for the variable parts of the URL rule. + Unknown keys are appended as query string arguments, like + ``?a=b&c=d``. + + .. versionchanged:: 2.2 + Calls ``current_app.url_for``, allowing an app to override the + behavior. + + .. versionchanged:: 0.10 + The ``_scheme`` parameter was added. + + .. versionchanged:: 0.9 + The ``_anchor`` and ``_method`` parameters were added. + + .. versionchanged:: 0.9 + Calls ``app.handle_url_build_error`` on build errors. + """ + return current_app.url_for( + endpoint, + _anchor=_anchor, + _method=_method, + _scheme=_scheme, + _external=_external, + **values, + ) + + +def redirect( + location: str, code: int = 302, Response: type[BaseResponse] | None = None +) -> BaseResponse: + """Create a redirect response object. + + If :data:`~flask.current_app` is available, it will use its + :meth:`~flask.Flask.redirect` method, otherwise it will use + :func:`werkzeug.utils.redirect`. + + :param location: The URL to redirect to. + :param code: The status code for the redirect. + :param Response: The response class to use. Not used when + ``current_app`` is active, which uses ``app.response_class``. + + .. versionadded:: 2.2 + Calls ``current_app.redirect`` if available instead of always + using Werkzeug's default ``redirect``. + """ + if current_app: + return current_app.redirect(location, code=code) + + return _wz_redirect(location, code=code, Response=Response) + + +def abort(code: int | BaseResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: + """Raise an :exc:`~werkzeug.exceptions.HTTPException` for the given + status code. + + If :data:`~flask.current_app` is available, it will call its + :attr:`~flask.Flask.aborter` object, otherwise it will use + :func:`werkzeug.exceptions.abort`. + + :param code: The status code for the exception, which must be + registered in ``app.aborter``. + :param args: Passed to the exception. + :param kwargs: Passed to the exception. + + .. versionadded:: 2.2 + Calls ``current_app.aborter`` if available instead of always + using Werkzeug's default ``abort``. + """ + if current_app: + current_app.aborter(code, *args, **kwargs) + + _wz_abort(code, *args, **kwargs) + + +def get_template_attribute(template_name: str, attribute: str) -> t.Any: + """Loads a macro (or variable) a template exports. This can be used to + invoke a macro from within Python code. If you for example have a + template named :file:`_cider.html` with the following contents: + + .. sourcecode:: html+jinja + + {% macro hello(name) %}Hello {{ name }}!{% endmacro %} + + You can access this from Python code like this:: + + hello = get_template_attribute('_cider.html', 'hello') + return hello('World') + + .. versionadded:: 0.2 + + :param template_name: the name of the template + :param attribute: the name of the variable of macro to access + """ + return getattr(current_app.jinja_env.get_template(template_name).module, attribute) + + +def flash(message: str, category: str = "message") -> None: + """Flashes a message to the next request. In order to remove the + flashed message from the session and to display it to the user, + the template has to call :func:`get_flashed_messages`. + + .. versionchanged:: 0.3 + `category` parameter added. + + :param message: the message to be flashed. + :param category: the category for the message. The following values + are recommended: ``'message'`` for any kind of message, + ``'error'`` for errors, ``'info'`` for information + messages and ``'warning'`` for warnings. However any + kind of string can be used as category. + """ + # Original implementation: + # + # session.setdefault('_flashes', []).append((category, message)) + # + # This assumed that changes made to mutable structures in the session are + # always in sync with the session object, which is not true for session + # implementations that use external storage for keeping their keys/values. + flashes = session.get("_flashes", []) + flashes.append((category, message)) + session["_flashes"] = flashes + app = current_app._get_current_object() # type: ignore + message_flashed.send( + app, + _async_wrapper=app.ensure_sync, + message=message, + category=category, + ) + + +def get_flashed_messages( + with_categories: bool = False, category_filter: t.Iterable[str] = () +) -> list[str] | list[tuple[str, str]]: + """Pulls all flashed messages from the session and returns them. + Further calls in the same request to the function will return + the same messages. By default just the messages are returned, + but when `with_categories` is set to ``True``, the return value will + be a list of tuples in the form ``(category, message)`` instead. + + Filter the flashed messages to one or more categories by providing those + categories in `category_filter`. This allows rendering categories in + separate html blocks. The `with_categories` and `category_filter` + arguments are distinct: + + * `with_categories` controls whether categories are returned with message + text (``True`` gives a tuple, where ``False`` gives just the message text). + * `category_filter` filters the messages down to only those matching the + provided categories. + + See :doc:`/patterns/flashing` for examples. + + .. versionchanged:: 0.3 + `with_categories` parameter added. + + .. versionchanged:: 0.9 + `category_filter` parameter added. + + :param with_categories: set to ``True`` to also receive categories. + :param category_filter: filter of categories to limit return values. Only + categories in the list will be returned. + """ + flashes = request_ctx.flashes + if flashes is None: + flashes = session.pop("_flashes") if "_flashes" in session else [] + request_ctx.flashes = flashes + if category_filter: + flashes = list(filter(lambda f: f[0] in category_filter, flashes)) + if not with_categories: + return [x[1] for x in flashes] + return flashes + + +def _prepare_send_file_kwargs(**kwargs: t.Any) -> dict[str, t.Any]: + if kwargs.get("max_age") is None: + kwargs["max_age"] = current_app.get_send_file_max_age + + kwargs.update( + environ=request.environ, + use_x_sendfile=current_app.config["USE_X_SENDFILE"], + response_class=current_app.response_class, + _root_path=current_app.root_path, # type: ignore + ) + return kwargs + + +def send_file( + path_or_file: os.PathLike[t.AnyStr] | str | t.BinaryIO, + mimetype: str | None = None, + as_attachment: bool = False, + download_name: str | None = None, + conditional: bool = True, + etag: bool | str = True, + last_modified: datetime | int | float | None = None, + max_age: None | (int | t.Callable[[str | None], int | None]) = None, +) -> Response: + """Send the contents of a file to the client. + + The first argument can be a file path or a file-like object. Paths + are preferred in most cases because Werkzeug can manage the file and + get extra information from the path. Passing a file-like object + requires that the file is opened in binary mode, and is mostly + useful when building a file in memory with :class:`io.BytesIO`. + + Never pass file paths provided by a user. The path is assumed to be + trusted, so a user could craft a path to access a file you didn't + intend. Use :func:`send_from_directory` to safely serve + user-requested paths from within a directory. + + If the WSGI server sets a ``file_wrapper`` in ``environ``, it is + used, otherwise Werkzeug's built-in wrapper is used. Alternatively, + if the HTTP server supports ``X-Sendfile``, configuring Flask with + ``USE_X_SENDFILE = True`` will tell the server to send the given + path, which is much more efficient than reading it in Python. + + :param path_or_file: The path to the file to send, relative to the + current working directory if a relative path is given. + Alternatively, a file-like object opened in binary mode. Make + sure the file pointer is seeked to the start of the data. + :param mimetype: The MIME type to send for the file. If not + provided, it will try to detect it from the file name. + :param as_attachment: Indicate to a browser that it should offer to + save the file instead of displaying it. + :param download_name: The default name browsers will use when saving + the file. Defaults to the passed file name. + :param conditional: Enable conditional and range responses based on + request headers. Requires passing a file path and ``environ``. + :param etag: Calculate an ETag for the file, which requires passing + a file path. Can also be a string to use instead. + :param last_modified: The last modified time to send for the file, + in seconds. If not provided, it will try to detect it from the + file path. + :param max_age: How long the client should cache the file, in + seconds. If set, ``Cache-Control`` will be ``public``, otherwise + it will be ``no-cache`` to prefer conditional caching. + + .. versionchanged:: 2.0 + ``download_name`` replaces the ``attachment_filename`` + parameter. If ``as_attachment=False``, it is passed with + ``Content-Disposition: inline`` instead. + + .. versionchanged:: 2.0 + ``max_age`` replaces the ``cache_timeout`` parameter. + ``conditional`` is enabled and ``max_age`` is not set by + default. + + .. versionchanged:: 2.0 + ``etag`` replaces the ``add_etags`` parameter. It can be a + string to use instead of generating one. + + .. versionchanged:: 2.0 + Passing a file-like object that inherits from + :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather + than sending an empty file. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionchanged:: 1.1 + ``filename`` may be a :class:`~os.PathLike` object. + + .. versionchanged:: 1.1 + Passing a :class:`~io.BytesIO` object supports range requests. + + .. versionchanged:: 1.0.3 + Filenames are encoded with ASCII instead of Latin-1 for broader + compatibility with WSGI servers. + + .. versionchanged:: 1.0 + UTF-8 filenames as specified in :rfc:`2231` are supported. + + .. versionchanged:: 0.12 + The filename is no longer automatically inferred from file + objects. If you want to use automatic MIME and etag support, + pass a filename via ``filename_or_fp`` or + ``attachment_filename``. + + .. versionchanged:: 0.12 + ``attachment_filename`` is preferred over ``filename`` for MIME + detection. + + .. versionchanged:: 0.9 + ``cache_timeout`` defaults to + :meth:`Flask.get_send_file_max_age`. + + .. versionchanged:: 0.7 + MIME guessing and etag support for file-like objects was + removed because it was unreliable. Pass a filename if you are + able to, otherwise attach an etag yourself. + + .. versionchanged:: 0.5 + The ``add_etags``, ``cache_timeout`` and ``conditional`` + parameters were added. The default behavior is to add etags. + + .. versionadded:: 0.2 + """ + return werkzeug.utils.send_file( # type: ignore[return-value] + **_prepare_send_file_kwargs( + path_or_file=path_or_file, + environ=request.environ, + mimetype=mimetype, + as_attachment=as_attachment, + download_name=download_name, + conditional=conditional, + etag=etag, + last_modified=last_modified, + max_age=max_age, + ) + ) + + +def send_from_directory( + directory: os.PathLike[str] | str, + path: os.PathLike[str] | str, + **kwargs: t.Any, +) -> Response: + """Send a file from within a directory using :func:`send_file`. + + .. code-block:: python + + @app.route("/uploads/") + def download_file(name): + return send_from_directory( + app.config['UPLOAD_FOLDER'], name, as_attachment=True + ) + + This is a secure way to serve files from a folder, such as static + files or uploads. Uses :func:`~werkzeug.security.safe_join` to + ensure the path coming from the client is not maliciously crafted to + point outside the specified directory. + + If the final path does not point to an existing regular file, + raises a 404 :exc:`~werkzeug.exceptions.NotFound` error. + + :param directory: The directory that ``path`` must be located under, + relative to the current application's root path. + :param path: The path to the file to send, relative to + ``directory``. + :param kwargs: Arguments to pass to :func:`send_file`. + + .. versionchanged:: 2.0 + ``path`` replaces the ``filename`` parameter. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionadded:: 0.5 + """ + return werkzeug.utils.send_from_directory( # type: ignore[return-value] + directory, path, **_prepare_send_file_kwargs(**kwargs) + ) + + +def get_root_path(import_name: str) -> str: + """Find the root path of a package, or the path that contains a + module. If it cannot be found, returns the current working + directory. + + Not to be confused with the value returned by :func:`find_package`. + + :meta private: + """ + # Module already imported and has a file attribute. Use that first. + mod = sys.modules.get(import_name) + + if mod is not None and hasattr(mod, "__file__") and mod.__file__ is not None: + return os.path.dirname(os.path.abspath(mod.__file__)) + + # Next attempt: check the loader. + try: + spec = importlib.util.find_spec(import_name) + + if spec is None: + raise ValueError + except (ImportError, ValueError): + loader = None + else: + loader = spec.loader + + # Loader does not exist or we're referring to an unloaded main + # module or a main module without path (interactive sessions), go + # with the current working directory. + if loader is None: + return os.getcwd() + + if hasattr(loader, "get_filename"): + filepath = loader.get_filename(import_name) + else: + # Fall back to imports. + __import__(import_name) + mod = sys.modules[import_name] + filepath = getattr(mod, "__file__", None) + + # If we don't have a file path it might be because it is a + # namespace package. In this case pick the root path from the + # first module that is contained in the package. + if filepath is None: + raise RuntimeError( + "No root path can be found for the provided module" + f" {import_name!r}. This can happen because the module" + " came from an import hook that does not provide file" + " name information or because it's a namespace package." + " In this case the root path needs to be explicitly" + " provided." + ) + + # filepath is import_name.py for a module, or __init__.py for a package. + return os.path.dirname(os.path.abspath(filepath)) # type: ignore[no-any-return] + + +@lru_cache(maxsize=None) +def _split_blueprint_path(name: str) -> list[str]: + out: list[str] = [name] + + if "." in name: + out.extend(_split_blueprint_path(name.rpartition(".")[0])) + + return out diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/json/__init__.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/json/__init__.py new file mode 100644 index 0000000..c0941d0 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/json/__init__.py @@ -0,0 +1,170 @@ +from __future__ import annotations + +import json as _json +import typing as t + +from ..globals import current_app +from .provider import _default + +if t.TYPE_CHECKING: # pragma: no cover + from ..wrappers import Response + + +def dumps(obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.dumps() ` + method, otherwise it will use :func:`json.dumps`. + + :param obj: The data to serialize. + :param kwargs: Arguments passed to the ``dumps`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.dumps``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + if current_app: + return current_app.json.dumps(obj, **kwargs) + + kwargs.setdefault("default", _default) + return _json.dumps(obj, **kwargs) + + +def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: + """Serialize data as JSON and write to a file. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.dump() ` + method, otherwise it will use :func:`json.dump`. + + :param obj: The data to serialize. + :param fp: A file opened for writing text. Should use the UTF-8 + encoding to be valid JSON. + :param kwargs: Arguments passed to the ``dump`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.dump``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0 + Writing to a binary file, and the ``encoding`` argument, will be + removed in Flask 2.1. + """ + if current_app: + current_app.json.dump(obj, fp, **kwargs) + else: + kwargs.setdefault("default", _default) + _json.dump(obj, fp, **kwargs) + + +def loads(s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.loads() ` + method, otherwise it will use :func:`json.loads`. + + :param s: Text or UTF-8 bytes. + :param kwargs: Arguments passed to the ``loads`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.loads``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. The data must be a + string or UTF-8 bytes. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + if current_app: + return current_app.json.loads(s, **kwargs) + + return _json.loads(s, **kwargs) + + +def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON read from a file. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.load() ` + method, otherwise it will use :func:`json.load`. + + :param fp: A file opened for reading text or UTF-8 bytes. + :param kwargs: Arguments passed to the ``load`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.load``, allowing an app to override + the behavior. + + .. versionchanged:: 2.2 + The ``app`` parameter will be removed in Flask 2.3. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. The file must be text + mode, or binary mode with UTF-8 bytes. + """ + if current_app: + return current_app.json.load(fp, **kwargs) + + return _json.load(fp, **kwargs) + + +def jsonify(*args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with the ``application/json`` + mimetype. A dict or list returned from a view will be converted to a + JSON response automatically without needing to call this. + + This requires an active request or application context, and calls + :meth:`app.json.response() `. + + In debug mode, the output is formatted with indentation to make it + easier to read. This may also be controlled by the provider. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + + .. versionchanged:: 2.2 + Calls ``current_app.json.response``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 0.11 + Added support for serializing top-level arrays. This was a + security risk in ancient browsers. See :ref:`security-json`. + + .. versionadded:: 0.2 + """ + return current_app.json.response(*args, **kwargs) # type: ignore[return-value] diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6aecd5d93bc1d79c0cc8e297ae911005958d6264 GIT binary patch literal 6674 zcmd5=&2JmW72l;OX)Ri!?Zk~^*YPBli?WrMvK+esV>mJVkvMIgG*Z7*6y%UQlvZBu zGP6smG>jrB0u=6{@hv*~U<57-^dIR(L;?t4ZNO;SgKtHZUVQ5B&Fn6zkEpV%1SY`Q z*`1j;GjHDe&F{Uxj*gBP`2FPHtMh+9Xc%A6OY+O;in;a?DxVmR;h3J$FlSAZ>KQLH zJD{G~*+FN($$CSL;n`ud4LU=f)z~w;$27#?!t;r^-ct^t|FD;9?48|<{-cidQFeCJ z8FTjFIp*Y@5j^wGJ|~CgK4-tP7tj6eOyR&I5>ha`Iqv&G#3MKG!)uRdq4crVl2Z6l znKzq{O#RI&JEG28UW9h*eGxV>K-8!)`3<6yGYoU>Q&c`NqU5_FS(Nr$h;@-RqOy?f zf7A7wM%{Fco912fkLEO<3&WfHIA&xeU;muw*od$O{rlf?3mJZ8z%ZtTbh+o=5X|8b zXFO!@Ouu{09vNZyU9GbceJ)jgTlaW)-R@IPg}EW)i`?~i)e{rUjo6awd8`!*)I&AC z)DY2psRC8n3t`~fPOH%jzguAEv^4dtDT77V5z?l4-%DOp&+`=}g@gpo1Ph{hA(vbw zzc*K@-tuduN>6?zUVN#^C2z2xx=>;>^YQ+ofQ8A9ZM{a_?fMdzb76^HkaMjD&Oc;L z9)`kU7=d|NrJ|Np!L}PsPf!X> zP((tqC8%49MzAQHZRJd*axQYu3n8iRAo^5WsZ20*2$o!bj&Yx1K3YHIO9>sPQfNa} zG0zv>KyEwnq}`jkRD%hGrHUhJZi9RFCH+)(5Vo4lKt@nkwasdQj|n4M119Gzj3nyY z&yy~#QW1VFa4-OxQU+BOiH?}-vnynWQ0=L0$k&B z?!lwgchG5V%+L@b~-2=jnvI_&;{7Nu{ zEjVmRLfhJ&>#iqa>-#zYa>w}iRPgw8=vZ$885wPy1x?|@&&d%;C(6s=88(}q4_cn1 z@SpJIr!!YhzLxq=;?$%;IN>6$94EeM2p(gs-Wdo#(-^$_5S;4p=ZU%rRI9GfWm_Ey zFdqg=I$sB#xX;v0Hj%(+Dk#2kHoz&JgCrt%t)M|n5}W8|3Bx3zhr%v7hFW1j=BX`H zZ_0hBgzz1MhVREy5?ND4k(w@}0OZ&NIo5Nl)}fAdXw^E}v5qd+?o4&8$$Q`W%$j^? zjjdWQcB~hd3wM9pQYIgR0xpS^S$q>*$_u!&GcKiiJ~3FRQ5(<#{Ah-5LHNFMZ`}5g2%nHgX~EAb zkBV2f+dL}uy>%|SEx+lJ)sMN_Ix=b+lRqN3kCBPwJS5z-hksI;n~BhxiQ z4H}y7Xv}y49xSQ&G5+BXPyjQgwxB7zlb^bG7R8D+^^cgAe9*}qU%rB3C42l?Mv24Q zpaiHV$E_-Z2EhGmWEgZ3J7O5r@u@>VZ9cZ@+b=YLabQA5E5zsoHSw^52x65GC z3(01-jw&e(-#ThKy-n0KWlyH~@`Na*h+%?K6ep#E8i9k{0Pc&Juh2XANHo9s0$GO` zS<+k#7!o-pV>4tNrms|Z_$QDtxgIjcJNfZD?{9#N(yh|%>L$p5kn~5y0tClgdlMB9 ziWMV6lJ%i5ropdMrb}&2@X)0kLV(S1$Hvu-;SJtKHYQX74{b&Uo(EaTkkB+~-b*Xz zGJFCOngODEq!qYF>bNf2OM!Iy>?BTNDD#1kOp;;0MqRuww(HUguO>($y}Qk zw2_Y8k|WOa1}M8+KS0Udip)&)C8fSHAC{c-?#E+&vnRf}`zf(W`_!pau@@W%b`$5= zROFrLRb8P$^Q0#hg@>b;ydB2YN4dp5!YGh2bfY$tF4AYnqjA6H!kSrC21}5JQPV=O zk`(n)1<7sI`6OkN5>M%!1gGU7znLTl5e*VxYN}@?ibr-UOD44mxVyt7)~&bYOBnSB z{KJ<~d}w_6rfKYbVKsN8lRL7S8}H=C?>H;DGxv~iIwo5&`}9P zKe~%)?kmmUsefB(ks k-guBbzBY8s{Lb1X^9agw-!{kB&L1(yzdXmxvr6)R0nM{M`~Uy| literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f214e98d46a0eabbb3f0bcaa4916f2a170c1e9bb GIT binary patch literal 9241 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 -S>a^mXOkTs(d!e01Z64vqW2Hl!YZ>l%iy-w!j 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/json/provider.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/json/provider.py new file mode 100644 index 0000000..f9b2e8f --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/json/provider.py @@ -0,0 +1,215 @@ +from __future__ import annotations + +import dataclasses +import decimal +import json +import typing as t +import uuid +import weakref +from datetime import date + +from werkzeug.http import http_date + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.sansio.response import Response + + from ..sansio.app import App + + +class JSONProvider: + """A standard set of JSON operations for an application. Subclasses + of this can be used to customize JSON behavior or use different + JSON libraries. + + To implement a provider for a specific library, subclass this base + class and implement at least :meth:`dumps` and :meth:`loads`. All + other methods have default implementations. + + To use a different provider, either subclass ``Flask`` and set + :attr:`~flask.Flask.json_provider_class` to a provider class, or set + :attr:`app.json ` to an instance of the class. + + :param app: An application instance. This will be stored as a + :class:`weakref.proxy` on the :attr:`_app` attribute. + + .. versionadded:: 2.2 + """ + + def __init__(self, app: App) -> None: + self._app: App = weakref.proxy(app) + + def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON. + + :param obj: The data to serialize. + :param kwargs: May be passed to the underlying JSON library. + """ + raise NotImplementedError + + def dump(self, obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: + """Serialize data as JSON and write to a file. + + :param obj: The data to serialize. + :param fp: A file opened for writing text. Should use the UTF-8 + encoding to be valid JSON. + :param kwargs: May be passed to the underlying JSON library. + """ + fp.write(self.dumps(obj, **kwargs)) + + def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON. + + :param s: Text or UTF-8 bytes. + :param kwargs: May be passed to the underlying JSON library. + """ + raise NotImplementedError + + def load(self, fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON read from a file. + + :param fp: A file opened for reading text or UTF-8 bytes. + :param kwargs: May be passed to the underlying JSON library. + """ + return self.loads(fp.read(), **kwargs) + + def _prepare_response_obj( + self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] + ) -> t.Any: + if args and kwargs: + raise TypeError("app.json.response() takes either args or kwargs, not both") + + if not args and not kwargs: + return None + + if len(args) == 1: + return args[0] + + return args or kwargs + + def response(self, *args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with the ``application/json`` + mimetype. + + The :func:`~flask.json.jsonify` function calls this method for + the current application. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + """ + obj = self._prepare_response_obj(args, kwargs) + return self._app.response_class(self.dumps(obj), mimetype="application/json") + + +def _default(o: t.Any) -> t.Any: + if isinstance(o, date): + return http_date(o) + + if isinstance(o, (decimal.Decimal, uuid.UUID)): + return str(o) + + if dataclasses and dataclasses.is_dataclass(o): + return dataclasses.asdict(o) + + if hasattr(o, "__html__"): + return str(o.__html__()) + + raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable") + + +class DefaultJSONProvider(JSONProvider): + """Provide JSON operations using Python's built-in :mod:`json` + library. Serializes the following additional data types: + + - :class:`datetime.datetime` and :class:`datetime.date` are + serialized to :rfc:`822` strings. This is the same as the HTTP + date format. + - :class:`uuid.UUID` is serialized to a string. + - :class:`dataclasses.dataclass` is passed to + :func:`dataclasses.asdict`. + - :class:`~markupsafe.Markup` (or any object with a ``__html__`` + method) will call the ``__html__`` method to get a string. + """ + + default: t.Callable[[t.Any], t.Any] = staticmethod(_default) # type: ignore[assignment] + """Apply this function to any object that :meth:`json.dumps` does + not know how to serialize. It should return a valid JSON type or + raise a ``TypeError``. + """ + + ensure_ascii = True + """Replace non-ASCII characters with escape sequences. This may be + more compatible with some clients, but can be disabled for better + performance and size. + """ + + sort_keys = True + """Sort the keys in any serialized dicts. This may be useful for + some caching situations, but can be disabled for better performance. + When enabled, keys must all be strings, they are not converted + before sorting. + """ + + compact: bool | None = None + """If ``True``, or ``None`` out of debug mode, the :meth:`response` + output will not add indentation, newlines, or spaces. If ``False``, + or ``None`` in debug mode, it will use a non-compact representation. + """ + + mimetype = "application/json" + """The mimetype set in :meth:`response`.""" + + def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON to a string. + + Keyword arguments are passed to :func:`json.dumps`. Sets some + parameter defaults from the :attr:`default`, + :attr:`ensure_ascii`, and :attr:`sort_keys` attributes. + + :param obj: The data to serialize. + :param kwargs: Passed to :func:`json.dumps`. + """ + kwargs.setdefault("default", self.default) + kwargs.setdefault("ensure_ascii", self.ensure_ascii) + kwargs.setdefault("sort_keys", self.sort_keys) + return json.dumps(obj, **kwargs) + + def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON from a string or bytes. + + :param s: Text or UTF-8 bytes. + :param kwargs: Passed to :func:`json.loads`. + """ + return json.loads(s, **kwargs) + + def response(self, *args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with it. The response mimetype + will be "application/json" and can be changed with + :attr:`mimetype`. + + If :attr:`compact` is ``False`` or debug mode is enabled, the + output will be formatted to be easier to read. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + """ + obj = self._prepare_response_obj(args, kwargs) + dump_args: dict[str, t.Any] = {} + + if (self.compact is None and self._app.debug) or self.compact is False: + dump_args.setdefault("indent", 2) + else: + dump_args.setdefault("separators", (",", ":")) + + return self._app.response_class( + f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype + ) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/json/tag.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/json/tag.py new file mode 100644 index 0000000..8dc3629 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/json/tag.py @@ -0,0 +1,327 @@ +""" +Tagged JSON +~~~~~~~~~~~ + +A compact representation for lossless serialization of non-standard JSON +types. :class:`~flask.sessions.SecureCookieSessionInterface` uses this +to serialize the session data, but it may be useful in other places. It +can be extended to support other types. + +.. autoclass:: TaggedJSONSerializer + :members: + +.. autoclass:: JSONTag + :members: + +Let's see an example that adds support for +:class:`~collections.OrderedDict`. Dicts don't have an order in JSON, so +to handle this we will dump the items as a list of ``[key, value]`` +pairs. Subclass :class:`JSONTag` and give it the new key ``' od'`` to +identify the type. The session serializer processes dicts first, so +insert the new tag at the front of the order since ``OrderedDict`` must +be processed before ``dict``. + +.. code-block:: python + + from flask.json.tag import JSONTag + + class TagOrderedDict(JSONTag): + __slots__ = ('serializer',) + key = ' od' + + def check(self, value): + return isinstance(value, OrderedDict) + + def to_json(self, value): + return [[k, self.serializer.tag(v)] for k, v in iteritems(value)] + + def to_python(self, value): + return OrderedDict(value) + + app.session_interface.serializer.register(TagOrderedDict, index=0) +""" + +from __future__ import annotations + +import typing as t +from base64 import b64decode +from base64 import b64encode +from datetime import datetime +from uuid import UUID + +from markupsafe import Markup +from werkzeug.http import http_date +from werkzeug.http import parse_date + +from ..json import dumps +from ..json import loads + + +class JSONTag: + """Base class for defining type tags for :class:`TaggedJSONSerializer`.""" + + __slots__ = ("serializer",) + + #: The tag to mark the serialized object with. If empty, this tag is + #: only used as an intermediate step during tagging. + key: str = "" + + def __init__(self, serializer: TaggedJSONSerializer) -> None: + """Create a tagger for the given serializer.""" + self.serializer = serializer + + def check(self, value: t.Any) -> bool: + """Check if the given value should be tagged by this tag.""" + raise NotImplementedError + + def to_json(self, value: t.Any) -> t.Any: + """Convert the Python object to an object that is a valid JSON type. + The tag will be added later.""" + raise NotImplementedError + + def to_python(self, value: t.Any) -> t.Any: + """Convert the JSON representation back to the correct type. The tag + will already be removed.""" + raise NotImplementedError + + def tag(self, value: t.Any) -> dict[str, t.Any]: + """Convert the value to a valid JSON type and add the tag structure + around it.""" + return {self.key: self.to_json(value)} + + +class TagDict(JSONTag): + """Tag for 1-item dicts whose only key matches a registered tag. + + Internally, the dict key is suffixed with `__`, and the suffix is removed + when deserializing. + """ + + __slots__ = () + key = " di" + + def check(self, value: t.Any) -> bool: + return ( + isinstance(value, dict) + and len(value) == 1 + and next(iter(value)) in self.serializer.tags + ) + + def to_json(self, value: t.Any) -> t.Any: + key = next(iter(value)) + return {f"{key}__": self.serializer.tag(value[key])} + + def to_python(self, value: t.Any) -> t.Any: + key = next(iter(value)) + return {key[:-2]: value[key]} + + +class PassDict(JSONTag): + __slots__ = () + + def check(self, value: t.Any) -> bool: + return isinstance(value, dict) + + def to_json(self, value: t.Any) -> t.Any: + # JSON objects may only have string keys, so don't bother tagging the + # key here. + return {k: self.serializer.tag(v) for k, v in value.items()} + + tag = to_json + + +class TagTuple(JSONTag): + __slots__ = () + key = " t" + + def check(self, value: t.Any) -> bool: + return isinstance(value, tuple) + + def to_json(self, value: t.Any) -> t.Any: + return [self.serializer.tag(item) for item in value] + + def to_python(self, value: t.Any) -> t.Any: + return tuple(value) + + +class PassList(JSONTag): + __slots__ = () + + def check(self, value: t.Any) -> bool: + return isinstance(value, list) + + def to_json(self, value: t.Any) -> t.Any: + return [self.serializer.tag(item) for item in value] + + tag = to_json + + +class TagBytes(JSONTag): + __slots__ = () + key = " b" + + def check(self, value: t.Any) -> bool: + return isinstance(value, bytes) + + def to_json(self, value: t.Any) -> t.Any: + return b64encode(value).decode("ascii") + + def to_python(self, value: t.Any) -> t.Any: + return b64decode(value) + + +class TagMarkup(JSONTag): + """Serialize anything matching the :class:`~markupsafe.Markup` API by + having a ``__html__`` method to the result of that method. Always + deserializes to an instance of :class:`~markupsafe.Markup`.""" + + __slots__ = () + key = " m" + + def check(self, value: t.Any) -> bool: + return callable(getattr(value, "__html__", None)) + + def to_json(self, value: t.Any) -> t.Any: + return str(value.__html__()) + + def to_python(self, value: t.Any) -> t.Any: + return Markup(value) + + +class TagUUID(JSONTag): + __slots__ = () + key = " u" + + def check(self, value: t.Any) -> bool: + return isinstance(value, UUID) + + def to_json(self, value: t.Any) -> t.Any: + return value.hex + + def to_python(self, value: t.Any) -> t.Any: + return UUID(value) + + +class TagDateTime(JSONTag): + __slots__ = () + key = " d" + + def check(self, value: t.Any) -> bool: + return isinstance(value, datetime) + + def to_json(self, value: t.Any) -> t.Any: + return http_date(value) + + def to_python(self, value: t.Any) -> t.Any: + return parse_date(value) + + +class TaggedJSONSerializer: + """Serializer that uses a tag system to compactly represent objects that + are not JSON types. Passed as the intermediate serializer to + :class:`itsdangerous.Serializer`. + + The following extra types are supported: + + * :class:`dict` + * :class:`tuple` + * :class:`bytes` + * :class:`~markupsafe.Markup` + * :class:`~uuid.UUID` + * :class:`~datetime.datetime` + """ + + __slots__ = ("tags", "order") + + #: Tag classes to bind when creating the serializer. Other tags can be + #: added later using :meth:`~register`. + default_tags = [ + TagDict, + PassDict, + TagTuple, + PassList, + TagBytes, + TagMarkup, + TagUUID, + TagDateTime, + ] + + def __init__(self) -> None: + self.tags: dict[str, JSONTag] = {} + self.order: list[JSONTag] = [] + + for cls in self.default_tags: + self.register(cls) + + def register( + self, + tag_class: type[JSONTag], + force: bool = False, + index: int | None = None, + ) -> None: + """Register a new tag with this serializer. + + :param tag_class: tag class to register. Will be instantiated with this + serializer instance. + :param force: overwrite an existing tag. If false (default), a + :exc:`KeyError` is raised. + :param index: index to insert the new tag in the tag order. Useful when + the new tag is a special case of an existing tag. If ``None`` + (default), the tag is appended to the end of the order. + + :raise KeyError: if the tag key is already registered and ``force`` is + not true. + """ + tag = tag_class(self) + key = tag.key + + if key: + if not force and key in self.tags: + raise KeyError(f"Tag '{key}' is already registered.") + + self.tags[key] = tag + + if index is None: + self.order.append(tag) + else: + self.order.insert(index, tag) + + def tag(self, value: t.Any) -> t.Any: + """Convert a value to a tagged representation if necessary.""" + for tag in self.order: + if tag.check(value): + return tag.tag(value) + + return value + + def untag(self, value: dict[str, t.Any]) -> t.Any: + """Convert a tagged representation back to the original type.""" + if len(value) != 1: + return value + + key = next(iter(value)) + + if key not in self.tags: + return value + + return self.tags[key].to_python(value[key]) + + def _untag_scan(self, value: t.Any) -> t.Any: + if isinstance(value, dict): + # untag each item recursively + value = {k: self._untag_scan(v) for k, v in value.items()} + # untag the dict itself + value = self.untag(value) + elif isinstance(value, list): + # untag each item recursively + value = [self._untag_scan(item) for item in value] + + return value + + def dumps(self, value: t.Any) -> str: + """Tag the value and dump it to a compact JSON string.""" + return dumps(self.tag(value), separators=(",", ":")) + + def loads(self, value: str) -> t.Any: + """Load data from a JSON string and deserialized any tagged objects.""" + return self._untag_scan(loads(value)) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/logging.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/logging.py new file mode 100644 index 0000000..0cb8f43 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/logging.py @@ -0,0 +1,79 @@ +from __future__ import annotations + +import logging +import sys +import typing as t + +from werkzeug.local import LocalProxy + +from .globals import request + +if t.TYPE_CHECKING: # pragma: no cover + from .sansio.app import App + + +@LocalProxy +def wsgi_errors_stream() -> t.TextIO: + """Find the most appropriate error stream for the application. If a request + is active, log to ``wsgi.errors``, otherwise use ``sys.stderr``. + + If you configure your own :class:`logging.StreamHandler`, you may want to + use this for the stream. If you are using file or dict configuration and + can't import this directly, you can refer to it as + ``ext://flask.logging.wsgi_errors_stream``. + """ + if request: + return request.environ["wsgi.errors"] # type: ignore[no-any-return] + + return sys.stderr + + +def has_level_handler(logger: logging.Logger) -> bool: + """Check if there is a handler in the logging chain that will handle the + given logger's :meth:`effective level <~logging.Logger.getEffectiveLevel>`. + """ + level = logger.getEffectiveLevel() + current = logger + + while current: + if any(handler.level <= level for handler in current.handlers): + return True + + if not current.propagate: + break + + current = current.parent # type: ignore + + return False + + +#: Log messages to :func:`~flask.logging.wsgi_errors_stream` with the format +#: ``[%(asctime)s] %(levelname)s in %(module)s: %(message)s``. +default_handler = logging.StreamHandler(wsgi_errors_stream) # type: ignore +default_handler.setFormatter( + logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s") +) + + +def create_logger(app: App) -> logging.Logger: + """Get the Flask app's logger and configure it if needed. + + The logger name will be the same as + :attr:`app.import_name `. + + When :attr:`~flask.Flask.debug` is enabled, set the logger level to + :data:`logging.DEBUG` if it is not set. + + If there is no handler for the logger's effective level, add a + :class:`~logging.StreamHandler` for + :func:`~flask.logging.wsgi_errors_stream` with a basic format. + """ + logger = logging.getLogger(app.name) + + if app.debug and not logger.level: + logger.setLevel(logging.DEBUG) + + if not has_level_handler(logger): + logger.addHandler(default_handler) + + return logger diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/py.typed b/stripe_config/.venv/lib/python3.12/site-packages/flask/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/README.md b/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/README.md new file mode 100644 index 0000000..623ac19 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/README.md @@ -0,0 +1,6 @@ +# Sansio + +This folder contains code that can be used by alternative Flask +implementations, for example Quart. The code therefore cannot do any +IO, nor be part of a likely IO path. Finally this code cannot use the +Flask globals. diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8c88e3c3d9c48cf81476fd905a578651c4d94be GIT binary patch literal 33594 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 TPsS_<9emk><5P~FY&rff65dP( literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4018777954bc182b9ea484b526aaf8bbd8b615b1 GIT binary patch literal 30472 zcmdUYdvF}bdFSj4SYQ`eJQl>0irxRNWtI zk(Ve;UETe@?wOuhU?Eb9qg;l>Oixeu*RQX?SAX66Cp9(I60R?PSQvkAMw0%FUaYHv z2V4&{k0jlc6iIQVq)FGX%SB;#%0291Pw%joJ$=JI_N*ALV9&~7Kc1dc)nxT>HOu2o z1tx>TK^FFXt5S`V;o&gC)k+}MG+8;k zfrW#q=E;`f78b5awNADTx49(MKe69xhW*s2UbU%?$&JGsU6NZ;H@$Cu9NvsK|HLzP zS}UZ45dW<8W3rLEW-0)J8x( zXG60>jvDo@n>UQS7pxri(~&o_Zr'kTOSAxGZr>*n2ny#L6`VLu&tcdVPY8F^o_ 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 Ku1(C0`2PTBoYT_) literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/app.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/app.py new file mode 100644 index 0000000..01fd5db --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/app.py @@ -0,0 +1,964 @@ +from __future__ import annotations + +import logging +import os +import sys +import typing as t +from datetime import timedelta +from itertools import chain + +from werkzeug.exceptions import Aborter +from werkzeug.exceptions import BadRequest +from werkzeug.exceptions import BadRequestKeyError +from werkzeug.routing import BuildError +from werkzeug.routing import Map +from werkzeug.routing import Rule +from werkzeug.sansio.response import Response +from werkzeug.utils import cached_property +from werkzeug.utils import redirect as _wz_redirect + +from .. import typing as ft +from ..config import Config +from ..config import ConfigAttribute +from ..ctx import _AppCtxGlobals +from ..helpers import _split_blueprint_path +from ..helpers import get_debug_flag +from ..json.provider import DefaultJSONProvider +from ..json.provider import JSONProvider +from ..logging import create_logger +from ..templating import DispatchingJinjaLoader +from ..templating import Environment +from .scaffold import _endpoint_from_view_func +from .scaffold import find_package +from .scaffold import Scaffold +from .scaffold import setupmethod + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.wrappers import Response as BaseResponse + + from ..testing import FlaskClient + from ..testing import FlaskCliRunner + from .blueprints import Blueprint + +T_shell_context_processor = t.TypeVar( + "T_shell_context_processor", bound=ft.ShellContextProcessorCallable +) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) + + +def _make_timedelta(value: timedelta | int | None) -> timedelta | None: + if value is None or isinstance(value, timedelta): + return value + + return timedelta(seconds=value) + + +class App(Scaffold): + """The flask object implements a WSGI application and acts as the central + object. It is passed the name of the module or package of the + application. Once it is created it will act as a central registry for + the view functions, the URL rules, template configuration and much more. + + The name of the package is used to resolve resources from inside the + package or the folder the module is contained in depending on if the + package parameter resolves to an actual python package (a folder with + an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). + + For more information about resource loading, see :func:`open_resource`. + + Usually you create a :class:`Flask` instance in your main module or + in the :file:`__init__.py` file of your package like this:: + + from flask import Flask + app = Flask(__name__) + + .. admonition:: About the First Parameter + + The idea of the first parameter is to give Flask an idea of what + belongs to your application. This name is used to find resources + on the filesystem, can be used by extensions to improve debugging + information and a lot more. + + So it's important what you provide there. If you are using a single + module, `__name__` is always the correct value. If you however are + using a package, it's usually recommended to hardcode the name of + your package there. + + For example if your application is defined in :file:`yourapplication/app.py` + you should create it with one of the two versions below:: + + app = Flask('yourapplication') + app = Flask(__name__.split('.')[0]) + + Why is that? The application will work even with `__name__`, thanks + to how resources are looked up. However it will make debugging more + painful. Certain extensions can make assumptions based on the + import name of your application. For example the Flask-SQLAlchemy + extension will look for the code in your application that triggered + an SQL query in debug mode. If the import name is not properly set + up, that debugging information is lost. (For example it would only + pick up SQL queries in `yourapplication.app` and not + `yourapplication.views.frontend`) + + .. versionadded:: 0.7 + The `static_url_path`, `static_folder`, and `template_folder` + parameters were added. + + .. versionadded:: 0.8 + The `instance_path` and `instance_relative_config` parameters were + added. + + .. versionadded:: 0.11 + The `root_path` parameter was added. + + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. + + .. versionadded:: 1.0 + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. + + :param import_name: the name of the application package + :param static_url_path: can be used to specify a different path for the + static files on the web. Defaults to the name + of the `static_folder` folder. + :param static_folder: The folder with static files that is served at + ``static_url_path``. Relative to the application ``root_path`` + or an absolute path. Defaults to ``'static'``. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. + :param template_folder: the folder that contains the templates that should + be used by the application. Defaults to + ``'templates'`` folder in the root path of the + application. + :param instance_path: An alternative instance path for the application. + By default the folder ``'instance'`` next to the + package or module is assumed to be the instance + path. + :param instance_relative_config: if set to ``True`` relative filenames + for loading the config are assumed to + be relative to the instance path instead + of the application root. + :param root_path: The path to the root of the application files. + This should only be set manually when it can't be detected + automatically, such as for namespace packages. + """ + + #: The class of the object assigned to :attr:`aborter`, created by + #: :meth:`create_aborter`. That object is called by + #: :func:`flask.abort` to raise HTTP errors, and can be + #: called directly as well. + #: + #: Defaults to :class:`werkzeug.exceptions.Aborter`. + #: + #: .. versionadded:: 2.2 + aborter_class = Aborter + + #: The class that is used for the Jinja environment. + #: + #: .. versionadded:: 0.11 + jinja_environment = Environment + + #: The class that is used for the :data:`~flask.g` instance. + #: + #: Example use cases for a custom class: + #: + #: 1. Store arbitrary attributes on flask.g. + #: 2. Add a property for lazy per-request database connectors. + #: 3. Return None instead of AttributeError on unexpected attributes. + #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. + #: + #: In Flask 0.9 this property was called `request_globals_class` but it + #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the + #: flask.g object is now application context scoped. + #: + #: .. versionadded:: 0.10 + app_ctx_globals_class = _AppCtxGlobals + + #: The class that is used for the ``config`` attribute of this app. + #: Defaults to :class:`~flask.Config`. + #: + #: Example use cases for a custom class: + #: + #: 1. Default values for certain config options. + #: 2. Access to config values through attributes in addition to keys. + #: + #: .. versionadded:: 0.11 + config_class = Config + + #: The testing flag. Set this to ``True`` to enable the test mode of + #: Flask extensions (and in the future probably also Flask itself). + #: For example this might activate test helpers that have an + #: additional runtime cost which should not be enabled by default. + #: + #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the + #: default it's implicitly enabled. + #: + #: This attribute can also be configured from the config with the + #: ``TESTING`` configuration key. Defaults to ``False``. + testing = ConfigAttribute[bool]("TESTING") + + #: If a secret key is set, cryptographic components can use this to + #: sign cookies and other things. Set this to a complex random value + #: when you want to use the secure cookie for instance. + #: + #: This attribute can also be configured from the config with the + #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. + secret_key = ConfigAttribute[t.Union[str, bytes, None]]("SECRET_KEY") + + #: A :class:`~datetime.timedelta` which is used to set the expiration + #: date of a permanent session. The default is 31 days which makes a + #: permanent session survive for roughly one month. + #: + #: This attribute can also be configured from the config with the + #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to + #: ``timedelta(days=31)`` + permanent_session_lifetime = ConfigAttribute[timedelta]( + "PERMANENT_SESSION_LIFETIME", + get_converter=_make_timedelta, # type: ignore[arg-type] + ) + + json_provider_class: type[JSONProvider] = DefaultJSONProvider + """A subclass of :class:`~flask.json.provider.JSONProvider`. An + instance is created and assigned to :attr:`app.json` when creating + the app. + + The default, :class:`~flask.json.provider.DefaultJSONProvider`, uses + Python's built-in :mod:`json` library. A different provider can use + a different JSON library. + + .. versionadded:: 2.2 + """ + + #: Options that are passed to the Jinja environment in + #: :meth:`create_jinja_environment`. Changing these options after + #: the environment is created (accessing :attr:`jinja_env`) will + #: have no effect. + #: + #: .. versionchanged:: 1.1.0 + #: This is a ``dict`` instead of an ``ImmutableDict`` to allow + #: easier configuration. + #: + jinja_options: dict[str, t.Any] = {} + + #: The rule object to use for URL rules created. This is used by + #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. + #: + #: .. versionadded:: 0.7 + url_rule_class = Rule + + #: The map object to use for storing the URL rules and routing + #: configuration parameters. Defaults to :class:`werkzeug.routing.Map`. + #: + #: .. versionadded:: 1.1.0 + url_map_class = Map + + #: The :meth:`test_client` method creates an instance of this test + #: client class. Defaults to :class:`~flask.testing.FlaskClient`. + #: + #: .. versionadded:: 0.7 + test_client_class: type[FlaskClient] | None = None + + #: The :class:`~click.testing.CliRunner` subclass, by default + #: :class:`~flask.testing.FlaskCliRunner` that is used by + #: :meth:`test_cli_runner`. Its ``__init__`` method should take a + #: Flask app object as the first argument. + #: + #: .. versionadded:: 1.0 + test_cli_runner_class: type[FlaskCliRunner] | None = None + + default_config: dict[str, t.Any] + response_class: type[Response] + + def __init__( + self, + import_name: str, + static_url_path: str | None = None, + static_folder: str | os.PathLike[str] | None = "static", + static_host: str | None = None, + host_matching: bool = False, + subdomain_matching: bool = False, + template_folder: str | os.PathLike[str] | None = "templates", + instance_path: str | None = None, + instance_relative_config: bool = False, + root_path: str | None = None, + ): + super().__init__( + import_name=import_name, + static_folder=static_folder, + static_url_path=static_url_path, + template_folder=template_folder, + root_path=root_path, + ) + + if instance_path is None: + instance_path = self.auto_find_instance_path() + elif not os.path.isabs(instance_path): + raise ValueError( + "If an instance path is provided it must be absolute." + " A relative path was given instead." + ) + + #: Holds the path to the instance folder. + #: + #: .. versionadded:: 0.8 + self.instance_path = instance_path + + #: The configuration dictionary as :class:`Config`. This behaves + #: exactly like a regular dictionary but supports additional methods + #: to load a config from files. + self.config = self.make_config(instance_relative_config) + + #: An instance of :attr:`aborter_class` created by + #: :meth:`make_aborter`. This is called by :func:`flask.abort` + #: to raise HTTP errors, and can be called directly as well. + #: + #: .. versionadded:: 2.2 + #: Moved from ``flask.abort``, which calls this object. + self.aborter = self.make_aborter() + + self.json: JSONProvider = self.json_provider_class(self) + """Provides access to JSON methods. Functions in ``flask.json`` + will call methods on this provider when the application context + is active. Used for handling JSON requests and responses. + + An instance of :attr:`json_provider_class`. Can be customized by + changing that attribute on a subclass, or by assigning to this + attribute afterwards. + + The default, :class:`~flask.json.provider.DefaultJSONProvider`, + uses Python's built-in :mod:`json` library. A different provider + can use a different JSON library. + + .. versionadded:: 2.2 + """ + + #: A list of functions that are called by + #: :meth:`handle_url_build_error` when :meth:`.url_for` raises a + #: :exc:`~werkzeug.routing.BuildError`. Each function is called + #: with ``error``, ``endpoint`` and ``values``. If a function + #: returns ``None`` or raises a ``BuildError``, it is skipped. + #: Otherwise, its return value is returned by ``url_for``. + #: + #: .. versionadded:: 0.9 + self.url_build_error_handlers: list[ + t.Callable[[Exception, str, dict[str, t.Any]], str] + ] = [] + + #: A list of functions that are called when the application context + #: is destroyed. Since the application context is also torn down + #: if the request ends this is the place to store code that disconnects + #: from databases. + #: + #: .. versionadded:: 0.9 + self.teardown_appcontext_funcs: list[ft.TeardownCallable] = [] + + #: A list of shell context processor functions that should be run + #: when a shell context is created. + #: + #: .. versionadded:: 0.11 + self.shell_context_processors: list[ft.ShellContextProcessorCallable] = [] + + #: Maps registered blueprint names to blueprint objects. The + #: dict retains the order the blueprints were registered in. + #: Blueprints can be registered multiple times, this dict does + #: not track how often they were attached. + #: + #: .. versionadded:: 0.7 + self.blueprints: dict[str, Blueprint] = {} + + #: a place where extensions can store application specific state. For + #: example this is where an extension could store database engines and + #: similar things. + #: + #: The key must match the name of the extension module. For example in + #: case of a "Flask-Foo" extension in `flask_foo`, the key would be + #: ``'foo'``. + #: + #: .. versionadded:: 0.7 + self.extensions: dict[str, t.Any] = {} + + #: The :class:`~werkzeug.routing.Map` for this instance. You can use + #: this to change the routing converters after the class was created + #: but before any routes are connected. Example:: + #: + #: from werkzeug.routing import BaseConverter + #: + #: class ListConverter(BaseConverter): + #: def to_python(self, value): + #: return value.split(',') + #: def to_url(self, values): + #: return ','.join(super(ListConverter, self).to_url(value) + #: for value in values) + #: + #: app = Flask(__name__) + #: app.url_map.converters['list'] = ListConverter + self.url_map = self.url_map_class(host_matching=host_matching) + + self.subdomain_matching = subdomain_matching + + # tracks internally if the application already handled at least one + # request. + self._got_first_request = False + + def _check_setup_finished(self, f_name: str) -> None: + if self._got_first_request: + raise AssertionError( + f"The setup method '{f_name}' can no longer be called" + " on the application. It has already handled its first" + " request, any changes will not be applied" + " consistently.\n" + "Make sure all imports, decorators, functions, etc." + " needed to set up the application are done before" + " running it." + ) + + @cached_property + def name(self) -> str: # type: ignore + """The name of the application. This is usually the import name + with the difference that it's guessed from the run file if the + import name is main. This name is used as a display name when + Flask needs the name of the application. It can be set and overridden + to change the value. + + .. versionadded:: 0.8 + """ + if self.import_name == "__main__": + fn: str | None = getattr(sys.modules["__main__"], "__file__", None) + if fn is None: + return "__main__" + return os.path.splitext(os.path.basename(fn))[0] + return self.import_name + + @cached_property + def logger(self) -> logging.Logger: + """A standard Python :class:`~logging.Logger` for the app, with + the same name as :attr:`name`. + + In debug mode, the logger's :attr:`~logging.Logger.level` will + be set to :data:`~logging.DEBUG`. + + If there are no handlers configured, a default handler will be + added. See :doc:`/logging` for more information. + + .. versionchanged:: 1.1.0 + The logger takes the same name as :attr:`name` rather than + hard-coding ``"flask.app"``. + + .. versionchanged:: 1.0.0 + Behavior was simplified. The logger is always named + ``"flask.app"``. The level is only set during configuration, + it doesn't check ``app.debug`` each time. Only one format is + used, not different ones depending on ``app.debug``. No + handlers are removed, and a handler is only added if no + handlers are already configured. + + .. versionadded:: 0.3 + """ + return create_logger(self) + + @cached_property + def jinja_env(self) -> Environment: + """The Jinja environment used to load templates. + + The environment is created the first time this property is + accessed. Changing :attr:`jinja_options` after that will have no + effect. + """ + return self.create_jinja_environment() + + def create_jinja_environment(self) -> Environment: + raise NotImplementedError() + + def make_config(self, instance_relative: bool = False) -> Config: + """Used to create the config attribute by the Flask constructor. + The `instance_relative` parameter is passed in from the constructor + of Flask (there named `instance_relative_config`) and indicates if + the config should be relative to the instance path or the root path + of the application. + + .. versionadded:: 0.8 + """ + root_path = self.root_path + if instance_relative: + root_path = self.instance_path + defaults = dict(self.default_config) + defaults["DEBUG"] = get_debug_flag() + return self.config_class(root_path, defaults) + + def make_aborter(self) -> Aborter: + """Create the object to assign to :attr:`aborter`. That object + is called by :func:`flask.abort` to raise HTTP errors, and can + be called directly as well. + + By default, this creates an instance of :attr:`aborter_class`, + which defaults to :class:`werkzeug.exceptions.Aborter`. + + .. versionadded:: 2.2 + """ + return self.aborter_class() + + def auto_find_instance_path(self) -> str: + """Tries to locate the instance path if it was not provided to the + constructor of the application class. It will basically calculate + the path to a folder named ``instance`` next to your main file or + the package. + + .. versionadded:: 0.8 + """ + prefix, package_path = find_package(self.import_name) + if prefix is None: + return os.path.join(package_path, "instance") + return os.path.join(prefix, "var", f"{self.name}-instance") + + def create_global_jinja_loader(self) -> DispatchingJinjaLoader: + """Creates the loader for the Jinja2 environment. Can be used to + override just the loader and keeping the rest unchanged. It's + discouraged to override this function. Instead one should override + the :meth:`jinja_loader` function instead. + + The global loader dispatches between the loaders of the application + and the individual blueprints. + + .. versionadded:: 0.7 + """ + return DispatchingJinjaLoader(self) + + def select_jinja_autoescape(self, filename: str) -> bool: + """Returns ``True`` if autoescaping should be active for the given + template name. If no template name is given, returns `True`. + + .. versionchanged:: 2.2 + Autoescaping is now enabled by default for ``.svg`` files. + + .. versionadded:: 0.5 + """ + if filename is None: + return True + return filename.endswith((".html", ".htm", ".xml", ".xhtml", ".svg")) + + @property + def debug(self) -> bool: + """Whether debug mode is enabled. When using ``flask run`` to start the + development server, an interactive debugger will be shown for unhandled + exceptions, and the server will be reloaded when code changes. This maps to the + :data:`DEBUG` config key. It may not behave as expected if set late. + + **Do not enable debug mode when deploying in production.** + + Default: ``False`` + """ + return self.config["DEBUG"] # type: ignore[no-any-return] + + @debug.setter + def debug(self, value: bool) -> None: + self.config["DEBUG"] = value + + if self.config["TEMPLATES_AUTO_RELOAD"] is None: + self.jinja_env.auto_reload = value + + @setupmethod + def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: + """Register a :class:`~flask.Blueprint` on the application. Keyword + arguments passed to this method will override the defaults set on the + blueprint. + + Calls the blueprint's :meth:`~flask.Blueprint.register` method after + recording the blueprint in the application's :attr:`blueprints`. + + :param blueprint: The blueprint to register. + :param url_prefix: Blueprint routes will be prefixed with this. + :param subdomain: Blueprint routes will match on this subdomain. + :param url_defaults: Blueprint routes will use these default values for + view arguments. + :param options: Additional keyword arguments are passed to + :class:`~flask.blueprints.BlueprintSetupState`. They can be + accessed in :meth:`~flask.Blueprint.record` callbacks. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionadded:: 0.7 + """ + blueprint.register(self, options) + + def iter_blueprints(self) -> t.ValuesView[Blueprint]: + """Iterates over all blueprints by the order they were registered. + + .. versionadded:: 0.11 + """ + return self.blueprints.values() + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) # type: ignore + options["endpoint"] = endpoint + methods = options.pop("methods", None) + + # if the methods are not given and the view_func object knows its + # methods we can use that instead. If neither exists, we go with + # a tuple of only ``GET`` as default. + if methods is None: + methods = getattr(view_func, "methods", None) or ("GET",) + if isinstance(methods, str): + raise TypeError( + "Allowed methods must be a list of strings, for" + ' example: @app.route(..., methods=["POST"])' + ) + methods = {item.upper() for item in methods} + + # Methods that should always be added + required_methods = set(getattr(view_func, "required_methods", ())) + + # starting with Flask 0.8 the view_func object can disable and + # force-enable the automatic options handling. + if provide_automatic_options is None: + provide_automatic_options = getattr( + view_func, "provide_automatic_options", None + ) + + if provide_automatic_options is None: + if "OPTIONS" not in methods: + provide_automatic_options = True + required_methods.add("OPTIONS") + else: + provide_automatic_options = False + + # Add the required methods now. + methods |= required_methods + + rule_obj = self.url_rule_class(rule, methods=methods, **options) + rule_obj.provide_automatic_options = provide_automatic_options # type: ignore[attr-defined] + + self.url_map.add(rule_obj) + if view_func is not None: + old_func = self.view_functions.get(endpoint) + if old_func is not None and old_func != view_func: + raise AssertionError( + "View function mapping is overwriting an existing" + f" endpoint function: {endpoint}" + ) + self.view_functions[endpoint] = view_func + + @setupmethod + def template_filter( + self, name: str | None = None + ) -> t.Callable[[T_template_filter], T_template_filter]: + """A decorator that is used to register custom template filter. + You can specify a name for the filter, otherwise the function + name will be used. Example:: + + @app.template_filter() + def reverse(s): + return s[::-1] + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f: T_template_filter) -> T_template_filter: + self.add_template_filter(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_filter( + self, f: ft.TemplateFilterCallable, name: str | None = None + ) -> None: + """Register a custom template filter. Works exactly like the + :meth:`template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + self.jinja_env.filters[name or f.__name__] = f + + @setupmethod + def template_test( + self, name: str | None = None + ) -> t.Callable[[T_template_test], T_template_test]: + """A decorator that is used to register custom template test. + You can specify a name for the test, otherwise the function + name will be used. Example:: + + @app.template_test() + def is_prime(n): + if n == 2: + return True + for i in range(2, int(math.ceil(math.sqrt(n))) + 1): + if n % i == 0: + return False + return True + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f: T_template_test) -> T_template_test: + self.add_template_test(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_test( + self, f: ft.TemplateTestCallable, name: str | None = None + ) -> None: + """Register a custom template test. Works exactly like the + :meth:`template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + self.jinja_env.tests[name or f.__name__] = f + + @setupmethod + def template_global( + self, name: str | None = None + ) -> t.Callable[[T_template_global], T_template_global]: + """A decorator that is used to register a custom template global function. + You can specify a name for the global function, otherwise the function + name will be used. Example:: + + @app.template_global() + def double(n): + return 2 * n + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + + def decorator(f: T_template_global) -> T_template_global: + self.add_template_global(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_global( + self, f: ft.TemplateGlobalCallable, name: str | None = None + ) -> None: + """Register a custom template global function. Works exactly like the + :meth:`template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + self.jinja_env.globals[name or f.__name__] = f + + @setupmethod + def teardown_appcontext(self, f: T_teardown) -> T_teardown: + """Registers a function to be called when the application + context is popped. The application context is typically popped + after the request context for each request, at the end of CLI + commands, or after a manually pushed context ends. + + .. code-block:: python + + with app.app_context(): + ... + + When the ``with`` block exits (or ``ctx.pop()`` is called), the + teardown functions are called just before the app context is + made inactive. Since a request context typically also manages an + application context it would also be called when you pop a + request context. + + When a teardown function was called because of an unhandled + exception it will be passed an error object. If an + :meth:`errorhandler` is registered, it will handle the exception + and the teardown will not receive it. + + Teardown functions must avoid raising exceptions. If they + execute code that might fail they must surround that code with a + ``try``/``except`` block and log any errors. + + The return values of teardown functions are ignored. + + .. versionadded:: 0.9 + """ + self.teardown_appcontext_funcs.append(f) + return f + + @setupmethod + def shell_context_processor( + self, f: T_shell_context_processor + ) -> T_shell_context_processor: + """Registers a shell context processor function. + + .. versionadded:: 0.11 + """ + self.shell_context_processors.append(f) + return f + + def _find_error_handler( + self, e: Exception, blueprints: list[str] + ) -> ft.ErrorHandlerCallable | None: + """Return a registered error handler for an exception in this order: + blueprint handler for a specific code, app handler for a specific code, + blueprint handler for an exception class, app handler for an exception + class, or ``None`` if a suitable handler is not found. + """ + exc_class, code = self._get_exc_class_and_code(type(e)) + names = (*blueprints, None) + + for c in (code, None) if code is not None else (None,): + for name in names: + handler_map = self.error_handler_spec[name][c] + + if not handler_map: + continue + + for cls in exc_class.__mro__: + handler = handler_map.get(cls) + + if handler is not None: + return handler + return None + + def trap_http_exception(self, e: Exception) -> bool: + """Checks if an HTTP exception should be trapped or not. By default + this will return ``False`` for all exceptions except for a bad request + key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It + also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. + + This is called for all HTTP exceptions raised by a view function. + If it returns ``True`` for any exception the error handler for this + exception is not called and it shows up as regular exception in the + traceback. This is helpful for debugging implicitly raised HTTP + exceptions. + + .. versionchanged:: 1.0 + Bad request errors are not trapped by default in debug mode. + + .. versionadded:: 0.8 + """ + if self.config["TRAP_HTTP_EXCEPTIONS"]: + return True + + trap_bad_request = self.config["TRAP_BAD_REQUEST_ERRORS"] + + # if unset, trap key errors in debug mode + if ( + trap_bad_request is None + and self.debug + and isinstance(e, BadRequestKeyError) + ): + return True + + if trap_bad_request: + return isinstance(e, BadRequest) + + return False + + def should_ignore_error(self, error: BaseException | None) -> bool: + """This is called to figure out if an error should be ignored + or not as far as the teardown system is concerned. If this + function returns ``True`` then the teardown handlers will not be + passed the error. + + .. versionadded:: 0.10 + """ + return False + + def redirect(self, location: str, code: int = 302) -> BaseResponse: + """Create a redirect response object. + + This is called by :func:`flask.redirect`, and can be called + directly as well. + + :param location: The URL to redirect to. + :param code: The status code for the redirect. + + .. versionadded:: 2.2 + Moved from ``flask.redirect``, which calls this method. + """ + return _wz_redirect( + location, + code=code, + Response=self.response_class, # type: ignore[arg-type] + ) + + def inject_url_defaults(self, endpoint: str, values: dict[str, t.Any]) -> None: + """Injects the URL defaults for the given endpoint directly into + the values dictionary passed. This is used internally and + automatically called on URL building. + + .. versionadded:: 0.7 + """ + names: t.Iterable[str | None] = (None,) + + # url_for may be called outside a request context, parse the + # passed endpoint instead of using request.blueprints. + if "." in endpoint: + names = chain( + names, reversed(_split_blueprint_path(endpoint.rpartition(".")[0])) + ) + + for name in names: + if name in self.url_default_functions: + for func in self.url_default_functions[name]: + func(endpoint, values) + + def handle_url_build_error( + self, error: BuildError, endpoint: str, values: dict[str, t.Any] + ) -> str: + """Called by :meth:`.url_for` if a + :exc:`~werkzeug.routing.BuildError` was raised. If this returns + a value, it will be returned by ``url_for``, otherwise the error + will be re-raised. + + Each function in :attr:`url_build_error_handlers` is called with + ``error``, ``endpoint`` and ``values``. If a function returns + ``None`` or raises a ``BuildError``, it is skipped. Otherwise, + its return value is returned by ``url_for``. + + :param error: The active ``BuildError`` being handled. + :param endpoint: The endpoint being built. + :param values: The keyword arguments passed to ``url_for``. + """ + for handler in self.url_build_error_handlers: + try: + rv = handler(error, endpoint, values) + except BuildError as e: + # make error available outside except block + error = e + else: + if rv is not None: + return rv + + # Re-raise if called with an active exception, otherwise raise + # the passed in exception. + if error is sys.exc_info()[1]: + raise + + raise error diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/blueprints.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/blueprints.py new file mode 100644 index 0000000..4f912cc --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/blueprints.py @@ -0,0 +1,632 @@ +from __future__ import annotations + +import os +import typing as t +from collections import defaultdict +from functools import update_wrapper + +from .. import typing as ft +from .scaffold import _endpoint_from_view_func +from .scaffold import _sentinel +from .scaffold import Scaffold +from .scaffold import setupmethod + +if t.TYPE_CHECKING: # pragma: no cover + from .app import App + +DeferredSetupFunction = t.Callable[["BlueprintSetupState"], None] +T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable[t.Any]) +T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) +T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_context_processor = t.TypeVar( + "T_template_context_processor", bound=ft.TemplateContextProcessorCallable +) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) +T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) +T_url_value_preprocessor = t.TypeVar( + "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable +) + + +class BlueprintSetupState: + """Temporary holder object for registering a blueprint with the + application. An instance of this class is created by the + :meth:`~flask.Blueprint.make_setup_state` method and later passed + to all register callback functions. + """ + + def __init__( + self, + blueprint: Blueprint, + app: App, + options: t.Any, + first_registration: bool, + ) -> None: + #: a reference to the current application + self.app = app + + #: a reference to the blueprint that created this setup state. + self.blueprint = blueprint + + #: a dictionary with all options that were passed to the + #: :meth:`~flask.Flask.register_blueprint` method. + self.options = options + + #: as blueprints can be registered multiple times with the + #: application and not everything wants to be registered + #: multiple times on it, this attribute can be used to figure + #: out if the blueprint was registered in the past already. + self.first_registration = first_registration + + subdomain = self.options.get("subdomain") + if subdomain is None: + subdomain = self.blueprint.subdomain + + #: The subdomain that the blueprint should be active for, ``None`` + #: otherwise. + self.subdomain = subdomain + + url_prefix = self.options.get("url_prefix") + if url_prefix is None: + url_prefix = self.blueprint.url_prefix + #: The prefix that should be used for all URLs defined on the + #: blueprint. + self.url_prefix = url_prefix + + self.name = self.options.get("name", blueprint.name) + self.name_prefix = self.options.get("name_prefix", "") + + #: A dictionary with URL defaults that is added to each and every + #: URL that was defined with the blueprint. + self.url_defaults = dict(self.blueprint.url_values_defaults) + self.url_defaults.update(self.options.get("url_defaults", ())) + + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + **options: t.Any, + ) -> None: + """A helper method to register a rule (and optionally a view function) + to the application. The endpoint is automatically prefixed with the + blueprint's name. + """ + if self.url_prefix is not None: + if rule: + rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/"))) + else: + rule = self.url_prefix + options.setdefault("subdomain", self.subdomain) + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) # type: ignore + defaults = self.url_defaults + if "defaults" in options: + defaults = dict(defaults, **options.pop("defaults")) + + self.app.add_url_rule( + rule, + f"{self.name_prefix}.{self.name}.{endpoint}".lstrip("."), + view_func, + defaults=defaults, + **options, + ) + + +class Blueprint(Scaffold): + """Represents a blueprint, a collection of routes and other + app-related functions that can be registered on a real application + later. + + A blueprint is an object that allows defining application functions + without requiring an application object ahead of time. It uses the + same decorators as :class:`~flask.Flask`, but defers the need for an + application by recording them for later registration. + + Decorating a function with a blueprint creates a deferred function + that is called with :class:`~flask.blueprints.BlueprintSetupState` + when the blueprint is registered on an application. + + See :doc:`/blueprints` for more information. + + :param name: The name of the blueprint. Will be prepended to each + endpoint name. + :param import_name: The name of the blueprint package, usually + ``__name__``. This helps locate the ``root_path`` for the + blueprint. + :param static_folder: A folder with static files that should be + served by the blueprint's static route. The path is relative to + the blueprint's root path. Blueprint static files are disabled + by default. + :param static_url_path: The url to serve static files from. + Defaults to ``static_folder``. If the blueprint does not have + a ``url_prefix``, the app's static route will take precedence, + and the blueprint's static files won't be accessible. + :param template_folder: A folder with templates that should be added + to the app's template search path. The path is relative to the + blueprint's root path. Blueprint templates are disabled by + default. Blueprint templates have a lower precedence than those + in the app's templates folder. + :param url_prefix: A path to prepend to all of the blueprint's URLs, + to make them distinct from the rest of the app's routes. + :param subdomain: A subdomain that blueprint routes will match on by + default. + :param url_defaults: A dict of default values that blueprint routes + will receive by default. + :param root_path: By default, the blueprint will automatically set + this based on ``import_name``. In certain situations this + automatic detection can fail, so the path can be specified + manually instead. + + .. versionchanged:: 1.1.0 + Blueprints have a ``cli`` group to register nested CLI commands. + The ``cli_group`` parameter controls the name of the group under + the ``flask`` command. + + .. versionadded:: 0.7 + """ + + _got_registered_once = False + + def __init__( + self, + name: str, + import_name: str, + static_folder: str | os.PathLike[str] | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike[str] | None = None, + url_prefix: str | None = None, + subdomain: str | None = None, + url_defaults: dict[str, t.Any] | None = None, + root_path: str | None = None, + cli_group: str | None = _sentinel, # type: ignore[assignment] + ): + super().__init__( + import_name=import_name, + static_folder=static_folder, + static_url_path=static_url_path, + template_folder=template_folder, + root_path=root_path, + ) + + if not name: + raise ValueError("'name' may not be empty.") + + if "." in name: + raise ValueError("'name' may not contain a dot '.' character.") + + self.name = name + self.url_prefix = url_prefix + self.subdomain = subdomain + self.deferred_functions: list[DeferredSetupFunction] = [] + + if url_defaults is None: + url_defaults = {} + + self.url_values_defaults = url_defaults + self.cli_group = cli_group + self._blueprints: list[tuple[Blueprint, dict[str, t.Any]]] = [] + + def _check_setup_finished(self, f_name: str) -> None: + if self._got_registered_once: + raise AssertionError( + f"The setup method '{f_name}' can no longer be called on the blueprint" + f" '{self.name}'. It has already been registered at least once, any" + " changes will not be applied consistently.\n" + "Make sure all imports, decorators, functions, etc. needed to set up" + " the blueprint are done before registering it." + ) + + @setupmethod + def record(self, func: DeferredSetupFunction) -> None: + """Registers a function that is called when the blueprint is + registered on the application. This function is called with the + state as argument as returned by the :meth:`make_setup_state` + method. + """ + self.deferred_functions.append(func) + + @setupmethod + def record_once(self, func: DeferredSetupFunction) -> None: + """Works like :meth:`record` but wraps the function in another + function that will ensure the function is only called once. If the + blueprint is registered a second time on the application, the + function passed is not called. + """ + + def wrapper(state: BlueprintSetupState) -> None: + if state.first_registration: + func(state) + + self.record(update_wrapper(wrapper, func)) + + def make_setup_state( + self, app: App, options: dict[str, t.Any], first_registration: bool = False + ) -> BlueprintSetupState: + """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` + object that is later passed to the register callback functions. + Subclasses can override this to return a subclass of the setup state. + """ + return BlueprintSetupState(self, app, options, first_registration) + + @setupmethod + def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: + """Register a :class:`~flask.Blueprint` on this blueprint. Keyword + arguments passed to this method will override the defaults set + on the blueprint. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionadded:: 2.0 + """ + if blueprint is self: + raise ValueError("Cannot register a blueprint on itself") + self._blueprints.append((blueprint, options)) + + def register(self, app: App, options: dict[str, t.Any]) -> None: + """Called by :meth:`Flask.register_blueprint` to register all + views and callbacks registered on the blueprint with the + application. Creates a :class:`.BlueprintSetupState` and calls + each :meth:`record` callback with it. + + :param app: The application this blueprint is being registered + with. + :param options: Keyword arguments forwarded from + :meth:`~Flask.register_blueprint`. + + .. versionchanged:: 2.3 + Nested blueprints now correctly apply subdomains. + + .. versionchanged:: 2.1 + Registering the same blueprint with the same name multiple + times is an error. + + .. versionchanged:: 2.0.1 + Nested blueprints are registered with their dotted name. + This allows different blueprints with the same name to be + nested at different locations. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + """ + name_prefix = options.get("name_prefix", "") + self_name = options.get("name", self.name) + name = f"{name_prefix}.{self_name}".lstrip(".") + + if name in app.blueprints: + bp_desc = "this" if app.blueprints[name] is self else "a different" + existing_at = f" '{name}'" if self_name != name else "" + + raise ValueError( + f"The name '{self_name}' is already registered for" + f" {bp_desc} blueprint{existing_at}. Use 'name=' to" + f" provide a unique name." + ) + + first_bp_registration = not any(bp is self for bp in app.blueprints.values()) + first_name_registration = name not in app.blueprints + + app.blueprints[name] = self + self._got_registered_once = True + state = self.make_setup_state(app, options, first_bp_registration) + + if self.has_static_folder: + state.add_url_rule( + f"{self.static_url_path}/", + view_func=self.send_static_file, # type: ignore[attr-defined] + endpoint="static", + ) + + # Merge blueprint data into parent. + if first_bp_registration or first_name_registration: + self._merge_blueprint_funcs(app, name) + + for deferred in self.deferred_functions: + deferred(state) + + cli_resolved_group = options.get("cli_group", self.cli_group) + + if self.cli.commands: + if cli_resolved_group is None: + app.cli.commands.update(self.cli.commands) + elif cli_resolved_group is _sentinel: + self.cli.name = name + app.cli.add_command(self.cli) + else: + self.cli.name = cli_resolved_group + app.cli.add_command(self.cli) + + for blueprint, bp_options in self._blueprints: + bp_options = bp_options.copy() + bp_url_prefix = bp_options.get("url_prefix") + bp_subdomain = bp_options.get("subdomain") + + if bp_subdomain is None: + bp_subdomain = blueprint.subdomain + + if state.subdomain is not None and bp_subdomain is not None: + bp_options["subdomain"] = bp_subdomain + "." + state.subdomain + elif bp_subdomain is not None: + bp_options["subdomain"] = bp_subdomain + elif state.subdomain is not None: + bp_options["subdomain"] = state.subdomain + + if bp_url_prefix is None: + bp_url_prefix = blueprint.url_prefix + + if state.url_prefix is not None and bp_url_prefix is not None: + bp_options["url_prefix"] = ( + state.url_prefix.rstrip("/") + "/" + bp_url_prefix.lstrip("/") + ) + elif bp_url_prefix is not None: + bp_options["url_prefix"] = bp_url_prefix + elif state.url_prefix is not None: + bp_options["url_prefix"] = state.url_prefix + + bp_options["name_prefix"] = name + blueprint.register(app, bp_options) + + def _merge_blueprint_funcs(self, app: App, name: str) -> None: + def extend( + bp_dict: dict[ft.AppOrBlueprintKey, list[t.Any]], + parent_dict: dict[ft.AppOrBlueprintKey, list[t.Any]], + ) -> None: + for key, values in bp_dict.items(): + key = name if key is None else f"{name}.{key}" + parent_dict[key].extend(values) + + for key, value in self.error_handler_spec.items(): + key = name if key is None else f"{name}.{key}" + value = defaultdict( + dict, + { + code: {exc_class: func for exc_class, func in code_values.items()} + for code, code_values in value.items() + }, + ) + app.error_handler_spec[key] = value + + for endpoint, func in self.view_functions.items(): + app.view_functions[endpoint] = func + + extend(self.before_request_funcs, app.before_request_funcs) + extend(self.after_request_funcs, app.after_request_funcs) + extend( + self.teardown_request_funcs, + app.teardown_request_funcs, + ) + extend(self.url_default_functions, app.url_default_functions) + extend(self.url_value_preprocessors, app.url_value_preprocessors) + extend(self.template_context_processors, app.template_context_processors) + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + """Register a URL rule with the blueprint. See :meth:`.Flask.add_url_rule` for + full documentation. + + The URL rule is prefixed with the blueprint's URL prefix. The endpoint name, + used with :func:`url_for`, is prefixed with the blueprint's name. + """ + if endpoint and "." in endpoint: + raise ValueError("'endpoint' may not contain a dot '.' character.") + + if view_func and hasattr(view_func, "__name__") and "." in view_func.__name__: + raise ValueError("'view_func' name may not contain a dot '.' character.") + + self.record( + lambda s: s.add_url_rule( + rule, + endpoint, + view_func, + provide_automatic_options=provide_automatic_options, + **options, + ) + ) + + @setupmethod + def app_template_filter( + self, name: str | None = None + ) -> t.Callable[[T_template_filter], T_template_filter]: + """Register a template filter, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_filter`. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f: T_template_filter) -> T_template_filter: + self.add_app_template_filter(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_filter( + self, f: ft.TemplateFilterCallable, name: str | None = None + ) -> None: + """Register a template filter, available in any template rendered by the + application. Works like the :meth:`app_template_filter` decorator. Equivalent to + :meth:`.Flask.add_template_filter`. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.filters[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def app_template_test( + self, name: str | None = None + ) -> t.Callable[[T_template_test], T_template_test]: + """Register a template test, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_test`. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f: T_template_test) -> T_template_test: + self.add_app_template_test(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_test( + self, f: ft.TemplateTestCallable, name: str | None = None + ) -> None: + """Register a template test, available in any template rendered by the + application. Works like the :meth:`app_template_test` decorator. Equivalent to + :meth:`.Flask.add_template_test`. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.tests[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def app_template_global( + self, name: str | None = None + ) -> t.Callable[[T_template_global], T_template_global]: + """Register a template global, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_global`. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def decorator(f: T_template_global) -> T_template_global: + self.add_app_template_global(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_global( + self, f: ft.TemplateGlobalCallable, name: str | None = None + ) -> None: + """Register a template global, available in any template rendered by the + application. Works like the :meth:`app_template_global` decorator. Equivalent to + :meth:`.Flask.add_template_global`. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.globals[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def before_app_request(self, f: T_before_request) -> T_before_request: + """Like :meth:`before_request`, but before every request, not only those handled + by the blueprint. Equivalent to :meth:`.Flask.before_request`. + """ + self.record_once( + lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def after_app_request(self, f: T_after_request) -> T_after_request: + """Like :meth:`after_request`, but after every request, not only those handled + by the blueprint. Equivalent to :meth:`.Flask.after_request`. + """ + self.record_once( + lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def teardown_app_request(self, f: T_teardown) -> T_teardown: + """Like :meth:`teardown_request`, but after every request, not only those + handled by the blueprint. Equivalent to :meth:`.Flask.teardown_request`. + """ + self.record_once( + lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_context_processor( + self, f: T_template_context_processor + ) -> T_template_context_processor: + """Like :meth:`context_processor`, but for templates rendered by every view, not + only by the blueprint. Equivalent to :meth:`.Flask.context_processor`. + """ + self.record_once( + lambda s: s.app.template_context_processors.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_errorhandler( + self, code: type[Exception] | int + ) -> t.Callable[[T_error_handler], T_error_handler]: + """Like :meth:`errorhandler`, but for every request, not only those handled by + the blueprint. Equivalent to :meth:`.Flask.errorhandler`. + """ + + def decorator(f: T_error_handler) -> T_error_handler: + def from_blueprint(state: BlueprintSetupState) -> None: + state.app.errorhandler(code)(f) + + self.record_once(from_blueprint) + return f + + return decorator + + @setupmethod + def app_url_value_preprocessor( + self, f: T_url_value_preprocessor + ) -> T_url_value_preprocessor: + """Like :meth:`url_value_preprocessor`, but for every request, not only those + handled by the blueprint. Equivalent to :meth:`.Flask.url_value_preprocessor`. + """ + self.record_once( + lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_url_defaults(self, f: T_url_defaults) -> T_url_defaults: + """Like :meth:`url_defaults`, but for every request, not only those handled by + the blueprint. Equivalent to :meth:`.Flask.url_defaults`. + """ + self.record_once( + lambda s: s.app.url_default_functions.setdefault(None, []).append(f) + ) + return f diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/scaffold.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/scaffold.py new file mode 100644 index 0000000..69e33a0 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/sansio/scaffold.py @@ -0,0 +1,801 @@ +from __future__ import annotations + +import importlib.util +import os +import pathlib +import sys +import typing as t +from collections import defaultdict +from functools import update_wrapper + +from jinja2 import BaseLoader +from jinja2 import FileSystemLoader +from werkzeug.exceptions import default_exceptions +from werkzeug.exceptions import HTTPException +from werkzeug.utils import cached_property + +from .. import typing as ft +from ..helpers import get_root_path +from ..templating import _default_template_ctx_processor + +if t.TYPE_CHECKING: # pragma: no cover + from click import Group + +# a singleton sentinel value for parameter defaults +_sentinel = object() + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) +T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable[t.Any]) +T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) +T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_context_processor = t.TypeVar( + "T_template_context_processor", bound=ft.TemplateContextProcessorCallable +) +T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) +T_url_value_preprocessor = t.TypeVar( + "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable +) +T_route = t.TypeVar("T_route", bound=ft.RouteCallable) + + +def setupmethod(f: F) -> F: + f_name = f.__name__ + + def wrapper_func(self: Scaffold, *args: t.Any, **kwargs: t.Any) -> t.Any: + self._check_setup_finished(f_name) + return f(self, *args, **kwargs) + + return t.cast(F, update_wrapper(wrapper_func, f)) + + +class Scaffold: + """Common behavior shared between :class:`~flask.Flask` and + :class:`~flask.blueprints.Blueprint`. + + :param import_name: The import name of the module where this object + is defined. Usually :attr:`__name__` should be used. + :param static_folder: Path to a folder of static files to serve. + If this is set, a static route will be added. + :param static_url_path: URL prefix for the static route. + :param template_folder: Path to a folder containing template files. + for rendering. If this is set, a Jinja loader will be added. + :param root_path: The path that static, template, and resource files + are relative to. Typically not set, it is discovered based on + the ``import_name``. + + .. versionadded:: 2.0 + """ + + cli: Group + name: str + _static_folder: str | None = None + _static_url_path: str | None = None + + def __init__( + self, + import_name: str, + static_folder: str | os.PathLike[str] | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike[str] | None = None, + root_path: str | None = None, + ): + #: The name of the package or module that this object belongs + #: to. Do not change this once it is set by the constructor. + self.import_name = import_name + + self.static_folder = static_folder # type: ignore + self.static_url_path = static_url_path + + #: The path to the templates folder, relative to + #: :attr:`root_path`, to add to the template loader. ``None`` if + #: templates should not be added. + self.template_folder = template_folder + + if root_path is None: + root_path = get_root_path(self.import_name) + + #: Absolute path to the package on the filesystem. Used to look + #: up resources contained in the package. + self.root_path = root_path + + #: A dictionary mapping endpoint names to view functions. + #: + #: To register a view function, use the :meth:`route` decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.view_functions: dict[str, ft.RouteCallable] = {} + + #: A data structure of registered error handlers, in the format + #: ``{scope: {code: {class: handler}}}``. The ``scope`` key is + #: the name of a blueprint the handlers are active for, or + #: ``None`` for all requests. The ``code`` key is the HTTP + #: status code for ``HTTPException``, or ``None`` for + #: other exceptions. The innermost dictionary maps exception + #: classes to handler functions. + #: + #: To register an error handler, use the :meth:`errorhandler` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.error_handler_spec: dict[ + ft.AppOrBlueprintKey, + dict[int | None, dict[type[Exception], ft.ErrorHandlerCallable]], + ] = defaultdict(lambda: defaultdict(dict)) + + #: A data structure of functions to call at the beginning of + #: each request, in the format ``{scope: [functions]}``. The + #: ``scope`` key is the name of a blueprint the functions are + #: active for, or ``None`` for all requests. + #: + #: To register a function, use the :meth:`before_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.before_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.BeforeRequestCallable] + ] = defaultdict(list) + + #: A data structure of functions to call at the end of each + #: request, in the format ``{scope: [functions]}``. The + #: ``scope`` key is the name of a blueprint the functions are + #: active for, or ``None`` for all requests. + #: + #: To register a function, use the :meth:`after_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.after_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.AfterRequestCallable[t.Any]] + ] = defaultdict(list) + + #: A data structure of functions to call at the end of each + #: request even if an exception is raised, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`teardown_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.teardown_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.TeardownCallable] + ] = defaultdict(list) + + #: A data structure of functions to call to pass extra context + #: values when rendering templates, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`context_processor` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.template_context_processors: dict[ + ft.AppOrBlueprintKey, list[ft.TemplateContextProcessorCallable] + ] = defaultdict(list, {None: [_default_template_ctx_processor]}) + + #: A data structure of functions to call to modify the keyword + #: arguments passed to the view function, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the + #: :meth:`url_value_preprocessor` decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.url_value_preprocessors: dict[ + ft.AppOrBlueprintKey, + list[ft.URLValuePreprocessorCallable], + ] = defaultdict(list) + + #: A data structure of functions to call to modify the keyword + #: arguments when generating URLs, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`url_defaults` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.url_default_functions: dict[ + ft.AppOrBlueprintKey, list[ft.URLDefaultCallable] + ] = defaultdict(list) + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.name!r}>" + + def _check_setup_finished(self, f_name: str) -> None: + raise NotImplementedError + + @property + def static_folder(self) -> str | None: + """The absolute path to the configured static folder. ``None`` + if no static folder is set. + """ + if self._static_folder is not None: + return os.path.join(self.root_path, self._static_folder) + else: + return None + + @static_folder.setter + def static_folder(self, value: str | os.PathLike[str] | None) -> None: + if value is not None: + value = os.fspath(value).rstrip(r"\/") + + self._static_folder = value + + @property + def has_static_folder(self) -> bool: + """``True`` if :attr:`static_folder` is set. + + .. versionadded:: 0.5 + """ + return self.static_folder is not None + + @property + def static_url_path(self) -> str | None: + """The URL prefix that the static route will be accessible from. + + If it was not configured during init, it is derived from + :attr:`static_folder`. + """ + if self._static_url_path is not None: + return self._static_url_path + + if self.static_folder is not None: + basename = os.path.basename(self.static_folder) + return f"/{basename}".rstrip("/") + + return None + + @static_url_path.setter + def static_url_path(self, value: str | None) -> None: + if value is not None: + value = value.rstrip("/") + + self._static_url_path = value + + @cached_property + def jinja_loader(self) -> BaseLoader | None: + """The Jinja loader for this object's templates. By default this + is a class :class:`jinja2.loaders.FileSystemLoader` to + :attr:`template_folder` if it is set. + + .. versionadded:: 0.5 + """ + if self.template_folder is not None: + return FileSystemLoader(os.path.join(self.root_path, self.template_folder)) + else: + return None + + def _method_route( + self, + method: str, + rule: str, + options: dict[str, t.Any], + ) -> t.Callable[[T_route], T_route]: + if "methods" in options: + raise TypeError("Use the 'route' decorator to use the 'methods' argument.") + + return self.route(rule, methods=[method], **options) + + @setupmethod + def get(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["GET"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("GET", rule, options) + + @setupmethod + def post(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["POST"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("POST", rule, options) + + @setupmethod + def put(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["PUT"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("PUT", rule, options) + + @setupmethod + def delete(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["DELETE"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("DELETE", rule, options) + + @setupmethod + def patch(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["PATCH"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("PATCH", rule, options) + + @setupmethod + def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Decorate a view function to register it with the given URL + rule and options. Calls :meth:`add_url_rule`, which has more + details about the implementation. + + .. code-block:: python + + @app.route("/") + def index(): + return "Hello, World!" + + See :ref:`url-route-registrations`. + + The endpoint name for the route defaults to the name of the view + function if the ``endpoint`` parameter isn't passed. + + The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` and + ``OPTIONS`` are added automatically. + + :param rule: The URL rule string. + :param options: Extra options passed to the + :class:`~werkzeug.routing.Rule` object. + """ + + def decorator(f: T_route) -> T_route: + endpoint = options.pop("endpoint", None) + self.add_url_rule(rule, endpoint, f, **options) + return f + + return decorator + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + """Register a rule for routing incoming requests and building + URLs. The :meth:`route` decorator is a shortcut to call this + with the ``view_func`` argument. These are equivalent: + + .. code-block:: python + + @app.route("/") + def index(): + ... + + .. code-block:: python + + def index(): + ... + + app.add_url_rule("/", view_func=index) + + See :ref:`url-route-registrations`. + + The endpoint name for the route defaults to the name of the view + function if the ``endpoint`` parameter isn't passed. An error + will be raised if a function has already been registered for the + endpoint. + + The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` is + always added automatically, and ``OPTIONS`` is added + automatically by default. + + ``view_func`` does not necessarily need to be passed, but if the + rule should participate in routing an endpoint name must be + associated with a view function at some point with the + :meth:`endpoint` decorator. + + .. code-block:: python + + app.add_url_rule("/", endpoint="index") + + @app.endpoint("index") + def index(): + ... + + If ``view_func`` has a ``required_methods`` attribute, those + methods are added to the passed and automatic methods. If it + has a ``provide_automatic_methods`` attribute, it is used as the + default if the parameter is not passed. + + :param rule: The URL rule string. + :param endpoint: The endpoint name to associate with the rule + and view function. Used when routing and building URLs. + Defaults to ``view_func.__name__``. + :param view_func: The view function to associate with the + endpoint name. + :param provide_automatic_options: Add the ``OPTIONS`` method and + respond to ``OPTIONS`` requests automatically. + :param options: Extra options passed to the + :class:`~werkzeug.routing.Rule` object. + """ + raise NotImplementedError + + @setupmethod + def endpoint(self, endpoint: str) -> t.Callable[[F], F]: + """Decorate a view function to register it for the given + endpoint. Used if a rule is added without a ``view_func`` with + :meth:`add_url_rule`. + + .. code-block:: python + + app.add_url_rule("/ex", endpoint="example") + + @app.endpoint("example") + def example(): + ... + + :param endpoint: The endpoint name to associate with the view + function. + """ + + def decorator(f: F) -> F: + self.view_functions[endpoint] = f + return f + + return decorator + + @setupmethod + def before_request(self, f: T_before_request) -> T_before_request: + """Register a function to run before each request. + + For example, this can be used to open a database connection, or + to load the logged in user from the session. + + .. code-block:: python + + @app.before_request + def load_user(): + if "user_id" in session: + g.user = db.session.get(session["user_id"]) + + The function will be called without any arguments. If it returns + a non-``None`` value, the value is handled as if it was the + return value from the view, and further request handling is + stopped. + + This is available on both app and blueprint objects. When used on an app, this + executes before every request. When used on a blueprint, this executes before + every request that the blueprint handles. To register with a blueprint and + execute before every request, use :meth:`.Blueprint.before_app_request`. + """ + self.before_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def after_request(self, f: T_after_request) -> T_after_request: + """Register a function to run after each request to this object. + + The function is called with the response object, and must return + a response object. This allows the functions to modify or + replace the response before it is sent. + + If a function raises an exception, any remaining + ``after_request`` functions will not be called. Therefore, this + should not be used for actions that must execute, such as to + close resources. Use :meth:`teardown_request` for that. + + This is available on both app and blueprint objects. When used on an app, this + executes after every request. When used on a blueprint, this executes after + every request that the blueprint handles. To register with a blueprint and + execute after every request, use :meth:`.Blueprint.after_app_request`. + """ + self.after_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_request(self, f: T_teardown) -> T_teardown: + """Register a function to be called when the request context is + popped. Typically this happens at the end of each request, but + contexts may be pushed manually as well during testing. + + .. code-block:: python + + with app.test_request_context(): + ... + + When the ``with`` block exits (or ``ctx.pop()`` is called), the + teardown functions are called just before the request context is + made inactive. + + When a teardown function was called because of an unhandled + exception it will be passed an error object. If an + :meth:`errorhandler` is registered, it will handle the exception + and the teardown will not receive it. + + Teardown functions must avoid raising exceptions. If they + execute code that might fail they must surround that code with a + ``try``/``except`` block and log any errors. + + The return values of teardown functions are ignored. + + This is available on both app and blueprint objects. When used on an app, this + executes after every request. When used on a blueprint, this executes after + every request that the blueprint handles. To register with a blueprint and + execute after every request, use :meth:`.Blueprint.teardown_app_request`. + """ + self.teardown_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def context_processor( + self, + f: T_template_context_processor, + ) -> T_template_context_processor: + """Registers a template context processor function. These functions run before + rendering a template. The keys of the returned dict are added as variables + available in the template. + + This is available on both app and blueprint objects. When used on an app, this + is called for every rendered template. When used on a blueprint, this is called + for templates rendered from the blueprint's views. To register with a blueprint + and affect every template, use :meth:`.Blueprint.app_context_processor`. + """ + self.template_context_processors[None].append(f) + return f + + @setupmethod + def url_value_preprocessor( + self, + f: T_url_value_preprocessor, + ) -> T_url_value_preprocessor: + """Register a URL value preprocessor function for all view + functions in the application. These functions will be called before the + :meth:`before_request` functions. + + The function can modify the values captured from the matched url before + they are passed to the view. For example, this can be used to pop a + common language code value and place it in ``g`` rather than pass it to + every view. + + The function is passed the endpoint name and values dict. The return + value is ignored. + + This is available on both app and blueprint objects. When used on an app, this + is called for every request. When used on a blueprint, this is called for + requests that the blueprint handles. To register with a blueprint and affect + every request, use :meth:`.Blueprint.app_url_value_preprocessor`. + """ + self.url_value_preprocessors[None].append(f) + return f + + @setupmethod + def url_defaults(self, f: T_url_defaults) -> T_url_defaults: + """Callback function for URL defaults for all view functions of the + application. It's called with the endpoint and values and should + update the values passed in place. + + This is available on both app and blueprint objects. When used on an app, this + is called for every request. When used on a blueprint, this is called for + requests that the blueprint handles. To register with a blueprint and affect + every request, use :meth:`.Blueprint.app_url_defaults`. + """ + self.url_default_functions[None].append(f) + return f + + @setupmethod + def errorhandler( + self, code_or_exception: type[Exception] | int + ) -> t.Callable[[T_error_handler], T_error_handler]: + """Register a function to handle errors by code or exception class. + + A decorator that is used to register a function given an + error code. Example:: + + @app.errorhandler(404) + def page_not_found(error): + return 'This page does not exist', 404 + + You can also register handlers for arbitrary exceptions:: + + @app.errorhandler(DatabaseError) + def special_exception_handler(error): + return 'Database connection failed', 500 + + This is available on both app and blueprint objects. When used on an app, this + can handle errors from every request. When used on a blueprint, this can handle + errors from requests that the blueprint handles. To register with a blueprint + and affect every request, use :meth:`.Blueprint.app_errorhandler`. + + .. versionadded:: 0.7 + Use :meth:`register_error_handler` instead of modifying + :attr:`error_handler_spec` directly, for application wide error + handlers. + + .. versionadded:: 0.7 + One can now additionally also register custom exception types + that do not necessarily have to be a subclass of the + :class:`~werkzeug.exceptions.HTTPException` class. + + :param code_or_exception: the code as integer for the handler, or + an arbitrary exception + """ + + def decorator(f: T_error_handler) -> T_error_handler: + self.register_error_handler(code_or_exception, f) + return f + + return decorator + + @setupmethod + def register_error_handler( + self, + code_or_exception: type[Exception] | int, + f: ft.ErrorHandlerCallable, + ) -> None: + """Alternative error attach function to the :meth:`errorhandler` + decorator that is more straightforward to use for non decorator + usage. + + .. versionadded:: 0.7 + """ + exc_class, code = self._get_exc_class_and_code(code_or_exception) + self.error_handler_spec[None][code][exc_class] = f + + @staticmethod + def _get_exc_class_and_code( + exc_class_or_code: type[Exception] | int, + ) -> tuple[type[Exception], int | None]: + """Get the exception class being handled. For HTTP status codes + or ``HTTPException`` subclasses, return both the exception and + status code. + + :param exc_class_or_code: Any exception class, or an HTTP status + code as an integer. + """ + exc_class: type[Exception] + + if isinstance(exc_class_or_code, int): + try: + exc_class = default_exceptions[exc_class_or_code] + except KeyError: + raise ValueError( + f"'{exc_class_or_code}' is not a recognized HTTP" + " error code. Use a subclass of HTTPException with" + " that code instead." + ) from None + else: + exc_class = exc_class_or_code + + if isinstance(exc_class, Exception): + raise TypeError( + f"{exc_class!r} is an instance, not a class. Handlers" + " can only be registered for Exception classes or HTTP" + " error codes." + ) + + if not issubclass(exc_class, Exception): + raise ValueError( + f"'{exc_class.__name__}' is not a subclass of Exception." + " Handlers can only be registered for Exception classes" + " or HTTP error codes." + ) + + if issubclass(exc_class, HTTPException): + return exc_class, exc_class.code + else: + return exc_class, None + + +def _endpoint_from_view_func(view_func: ft.RouteCallable) -> str: + """Internal helper that returns the default endpoint for a given + function. This always is the function name. + """ + assert view_func is not None, "expected view func if endpoint is not provided." + return view_func.__name__ + + +def _path_is_relative_to(path: pathlib.PurePath, base: str) -> bool: + # Path.is_relative_to doesn't exist until Python 3.9 + try: + path.relative_to(base) + return True + except ValueError: + return False + + +def _find_package_path(import_name: str) -> str: + """Find the path that contains the package or module.""" + root_mod_name, _, _ = import_name.partition(".") + + try: + root_spec = importlib.util.find_spec(root_mod_name) + + if root_spec is None: + raise ValueError("not found") + except (ImportError, ValueError): + # ImportError: the machinery told us it does not exist + # ValueError: + # - the module name was invalid + # - the module name is __main__ + # - we raised `ValueError` due to `root_spec` being `None` + return os.getcwd() + + if root_spec.submodule_search_locations: + if root_spec.origin is None or root_spec.origin == "namespace": + # namespace package + package_spec = importlib.util.find_spec(import_name) + + if package_spec is not None and package_spec.submodule_search_locations: + # Pick the path in the namespace that contains the submodule. + package_path = pathlib.Path( + os.path.commonpath(package_spec.submodule_search_locations) + ) + search_location = next( + location + for location in root_spec.submodule_search_locations + if _path_is_relative_to(package_path, location) + ) + else: + # Pick the first path. + search_location = root_spec.submodule_search_locations[0] + + return os.path.dirname(search_location) + else: + # package with __init__.py + return os.path.dirname(os.path.dirname(root_spec.origin)) + else: + # module + return os.path.dirname(root_spec.origin) # type: ignore[type-var, return-value] + + +def find_package(import_name: str) -> tuple[str | None, str]: + """Find the prefix that a package is installed under, and the path + that it would be imported from. + + The prefix is the directory containing the standard directory + hierarchy (lib, bin, etc.). If the package is not installed to the + system (:attr:`sys.prefix`) or a virtualenv (``site-packages``), + ``None`` is returned. + + The path is the entry in :attr:`sys.path` that contains the package + for import. If the package is not installed, it's assumed that the + package was imported from the current working directory. + """ + package_path = _find_package_path(import_name) + py_prefix = os.path.abspath(sys.prefix) + + # installed to the system + if _path_is_relative_to(pathlib.PurePath(package_path), py_prefix): + return py_prefix, package_path + + site_parent, site_folder = os.path.split(package_path) + + # installed to a virtualenv + if site_folder.lower() == "site-packages": + parent, folder = os.path.split(site_parent) + + # Windows (prefix/lib/site-packages) + if folder.lower() == "lib": + return parent, package_path + + # Unix (prefix/lib/pythonX.Y/site-packages) + if os.path.basename(parent).lower() == "lib": + return os.path.dirname(parent), package_path + + # something else (prefix/site-packages) + return site_parent, package_path + + # not installed + return None, package_path diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/sessions.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/sessions.py new file mode 100644 index 0000000..ee19ad6 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/sessions.py @@ -0,0 +1,379 @@ +from __future__ import annotations + +import hashlib +import typing as t +from collections.abc import MutableMapping +from datetime import datetime +from datetime import timezone + +from itsdangerous import BadSignature +from itsdangerous import URLSafeTimedSerializer +from werkzeug.datastructures import CallbackDict + +from .json.tag import TaggedJSONSerializer + +if t.TYPE_CHECKING: # pragma: no cover + import typing_extensions as te + + from .app import Flask + from .wrappers import Request + from .wrappers import Response + + +# TODO generic when Python > 3.8 +class SessionMixin(MutableMapping): # type: ignore[type-arg] + """Expands a basic dictionary with session attributes.""" + + @property + def permanent(self) -> bool: + """This reflects the ``'_permanent'`` key in the dict.""" + return self.get("_permanent", False) + + @permanent.setter + def permanent(self, value: bool) -> None: + self["_permanent"] = bool(value) + + #: Some implementations can detect whether a session is newly + #: created, but that is not guaranteed. Use with caution. The mixin + # default is hard-coded ``False``. + new = False + + #: Some implementations can detect changes to the session and set + #: this when that happens. The mixin default is hard coded to + #: ``True``. + modified = True + + #: Some implementations can detect when session data is read or + #: written and set this when that happens. The mixin default is hard + #: coded to ``True``. + accessed = True + + +# TODO generic when Python > 3.8 +class SecureCookieSession(CallbackDict, SessionMixin): # type: ignore[type-arg] + """Base class for sessions based on signed cookies. + + This session backend will set the :attr:`modified` and + :attr:`accessed` attributes. It cannot reliably track whether a + session is new (vs. empty), so :attr:`new` remains hard coded to + ``False``. + """ + + #: When data is changed, this is set to ``True``. Only the session + #: dictionary itself is tracked; if the session contains mutable + #: data (for example a nested dict) then this must be set to + #: ``True`` manually when modifying that data. The session cookie + #: will only be written to the response if this is ``True``. + modified = False + + #: When data is read or written, this is set to ``True``. Used by + # :class:`.SecureCookieSessionInterface` to add a ``Vary: Cookie`` + #: header, which allows caching proxies to cache different pages for + #: different users. + accessed = False + + def __init__(self, initial: t.Any = None) -> None: + def on_update(self: te.Self) -> None: + self.modified = True + self.accessed = True + + super().__init__(initial, on_update) + + def __getitem__(self, key: str) -> t.Any: + self.accessed = True + return super().__getitem__(key) + + def get(self, key: str, default: t.Any = None) -> t.Any: + self.accessed = True + return super().get(key, default) + + def setdefault(self, key: str, default: t.Any = None) -> t.Any: + self.accessed = True + return super().setdefault(key, default) + + +class NullSession(SecureCookieSession): + """Class used to generate nicer error messages if sessions are not + available. Will still allow read-only access to the empty session + but fail on setting. + """ + + def _fail(self, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: + raise RuntimeError( + "The session is unavailable because no secret " + "key was set. Set the secret_key on the " + "application to something unique and secret." + ) + + __setitem__ = __delitem__ = clear = pop = popitem = update = setdefault = _fail # type: ignore # noqa: B950 + del _fail + + +class SessionInterface: + """The basic interface you have to implement in order to replace the + default session interface which uses werkzeug's securecookie + implementation. The only methods you have to implement are + :meth:`open_session` and :meth:`save_session`, the others have + useful defaults which you don't need to change. + + The session object returned by the :meth:`open_session` method has to + provide a dictionary like interface plus the properties and methods + from the :class:`SessionMixin`. We recommend just subclassing a dict + and adding that mixin:: + + class Session(dict, SessionMixin): + pass + + If :meth:`open_session` returns ``None`` Flask will call into + :meth:`make_null_session` to create a session that acts as replacement + if the session support cannot work because some requirement is not + fulfilled. The default :class:`NullSession` class that is created + will complain that the secret key was not set. + + To replace the session interface on an application all you have to do + is to assign :attr:`flask.Flask.session_interface`:: + + app = Flask(__name__) + app.session_interface = MySessionInterface() + + Multiple requests with the same session may be sent and handled + concurrently. When implementing a new session interface, consider + whether reads or writes to the backing store must be synchronized. + There is no guarantee on the order in which the session for each + request is opened or saved, it will occur in the order that requests + begin and end processing. + + .. versionadded:: 0.8 + """ + + #: :meth:`make_null_session` will look here for the class that should + #: be created when a null session is requested. Likewise the + #: :meth:`is_null_session` method will perform a typecheck against + #: this type. + null_session_class = NullSession + + #: A flag that indicates if the session interface is pickle based. + #: This can be used by Flask extensions to make a decision in regards + #: to how to deal with the session object. + #: + #: .. versionadded:: 0.10 + pickle_based = False + + def make_null_session(self, app: Flask) -> NullSession: + """Creates a null session which acts as a replacement object if the + real session support could not be loaded due to a configuration + error. This mainly aids the user experience because the job of the + null session is to still support lookup without complaining but + modifications are answered with a helpful error message of what + failed. + + This creates an instance of :attr:`null_session_class` by default. + """ + return self.null_session_class() + + def is_null_session(self, obj: object) -> bool: + """Checks if a given object is a null session. Null sessions are + not asked to be saved. + + This checks if the object is an instance of :attr:`null_session_class` + by default. + """ + return isinstance(obj, self.null_session_class) + + def get_cookie_name(self, app: Flask) -> str: + """The name of the session cookie. Uses``app.config["SESSION_COOKIE_NAME"]``.""" + return app.config["SESSION_COOKIE_NAME"] # type: ignore[no-any-return] + + def get_cookie_domain(self, app: Flask) -> str | None: + """The value of the ``Domain`` parameter on the session cookie. If not set, + browsers will only send the cookie to the exact domain it was set from. + Otherwise, they will send it to any subdomain of the given value as well. + + Uses the :data:`SESSION_COOKIE_DOMAIN` config. + + .. versionchanged:: 2.3 + Not set by default, does not fall back to ``SERVER_NAME``. + """ + return app.config["SESSION_COOKIE_DOMAIN"] # type: ignore[no-any-return] + + def get_cookie_path(self, app: Flask) -> str: + """Returns the path for which the cookie should be valid. The + default implementation uses the value from the ``SESSION_COOKIE_PATH`` + config var if it's set, and falls back to ``APPLICATION_ROOT`` or + uses ``/`` if it's ``None``. + """ + return app.config["SESSION_COOKIE_PATH"] or app.config["APPLICATION_ROOT"] # type: ignore[no-any-return] + + def get_cookie_httponly(self, app: Flask) -> bool: + """Returns True if the session cookie should be httponly. This + currently just returns the value of the ``SESSION_COOKIE_HTTPONLY`` + config var. + """ + return app.config["SESSION_COOKIE_HTTPONLY"] # type: ignore[no-any-return] + + def get_cookie_secure(self, app: Flask) -> bool: + """Returns True if the cookie should be secure. This currently + just returns the value of the ``SESSION_COOKIE_SECURE`` setting. + """ + return app.config["SESSION_COOKIE_SECURE"] # type: ignore[no-any-return] + + def get_cookie_samesite(self, app: Flask) -> str | None: + """Return ``'Strict'`` or ``'Lax'`` if the cookie should use the + ``SameSite`` attribute. This currently just returns the value of + the :data:`SESSION_COOKIE_SAMESITE` setting. + """ + return app.config["SESSION_COOKIE_SAMESITE"] # type: ignore[no-any-return] + + def get_expiration_time(self, app: Flask, session: SessionMixin) -> datetime | None: + """A helper method that returns an expiration date for the session + or ``None`` if the session is linked to the browser session. The + default implementation returns now + the permanent session + lifetime configured on the application. + """ + if session.permanent: + return datetime.now(timezone.utc) + app.permanent_session_lifetime + return None + + def should_set_cookie(self, app: Flask, session: SessionMixin) -> bool: + """Used by session backends to determine if a ``Set-Cookie`` header + should be set for this session cookie for this response. If the session + has been modified, the cookie is set. If the session is permanent and + the ``SESSION_REFRESH_EACH_REQUEST`` config is true, the cookie is + always set. + + This check is usually skipped if the session was deleted. + + .. versionadded:: 0.11 + """ + + return session.modified or ( + session.permanent and app.config["SESSION_REFRESH_EACH_REQUEST"] + ) + + def open_session(self, app: Flask, request: Request) -> SessionMixin | None: + """This is called at the beginning of each request, after + pushing the request context, before matching the URL. + + This must return an object which implements a dictionary-like + interface as well as the :class:`SessionMixin` interface. + + This will return ``None`` to indicate that loading failed in + some way that is not immediately an error. The request + context will fall back to using :meth:`make_null_session` + in this case. + """ + raise NotImplementedError() + + def save_session( + self, app: Flask, session: SessionMixin, response: Response + ) -> None: + """This is called at the end of each request, after generating + a response, before removing the request context. It is skipped + if :meth:`is_null_session` returns ``True``. + """ + raise NotImplementedError() + + +session_json_serializer = TaggedJSONSerializer() + + +def _lazy_sha1(string: bytes = b"") -> t.Any: + """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include + SHA-1, in which case the import and use as a default would fail before the + developer can configure something else. + """ + return hashlib.sha1(string) + + +class SecureCookieSessionInterface(SessionInterface): + """The default session interface that stores sessions in signed cookies + through the :mod:`itsdangerous` module. + """ + + #: the salt that should be applied on top of the secret key for the + #: signing of cookie based sessions. + salt = "cookie-session" + #: the hash function to use for the signature. The default is sha1 + digest_method = staticmethod(_lazy_sha1) + #: the name of the itsdangerous supported key derivation. The default + #: is hmac. + key_derivation = "hmac" + #: A python serializer for the payload. The default is a compact + #: JSON derived serializer with support for some extra Python types + #: such as datetime objects or tuples. + serializer = session_json_serializer + session_class = SecureCookieSession + + def get_signing_serializer(self, app: Flask) -> URLSafeTimedSerializer | None: + if not app.secret_key: + return None + signer_kwargs = dict( + key_derivation=self.key_derivation, digest_method=self.digest_method + ) + return URLSafeTimedSerializer( + app.secret_key, + salt=self.salt, + serializer=self.serializer, + signer_kwargs=signer_kwargs, + ) + + def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None: + s = self.get_signing_serializer(app) + if s is None: + return None + val = request.cookies.get(self.get_cookie_name(app)) + if not val: + return self.session_class() + max_age = int(app.permanent_session_lifetime.total_seconds()) + try: + data = s.loads(val, max_age=max_age) + return self.session_class(data) + except BadSignature: + return self.session_class() + + def save_session( + self, app: Flask, session: SessionMixin, response: Response + ) -> None: + name = self.get_cookie_name(app) + domain = self.get_cookie_domain(app) + path = self.get_cookie_path(app) + secure = self.get_cookie_secure(app) + samesite = self.get_cookie_samesite(app) + httponly = self.get_cookie_httponly(app) + + # Add a "Vary: Cookie" header if the session was accessed at all. + if session.accessed: + response.vary.add("Cookie") + + # If the session is modified to be empty, remove the cookie. + # If the session is empty, return without setting the cookie. + if not session: + if session.modified: + response.delete_cookie( + name, + domain=domain, + path=path, + secure=secure, + samesite=samesite, + httponly=httponly, + ) + response.vary.add("Cookie") + + return + + if not self.should_set_cookie(app, session): + return + + expires = self.get_expiration_time(app, session) + val = self.get_signing_serializer(app).dumps(dict(session)) # type: ignore + response.set_cookie( + name, + val, # type: ignore + expires=expires, + httponly=httponly, + domain=domain, + path=path, + secure=secure, + samesite=samesite, + ) + response.vary.add("Cookie") diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/signals.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/signals.py new file mode 100644 index 0000000..444fda9 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/signals.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from blinker import Namespace + +# This namespace is only for signals provided by Flask itself. +_signals = Namespace() + +template_rendered = _signals.signal("template-rendered") +before_render_template = _signals.signal("before-render-template") +request_started = _signals.signal("request-started") +request_finished = _signals.signal("request-finished") +request_tearing_down = _signals.signal("request-tearing-down") +got_request_exception = _signals.signal("got-request-exception") +appcontext_tearing_down = _signals.signal("appcontext-tearing-down") +appcontext_pushed = _signals.signal("appcontext-pushed") +appcontext_popped = _signals.signal("appcontext-popped") +message_flashed = _signals.signal("message-flashed") diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/templating.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/templating.py new file mode 100644 index 0000000..618a3b3 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/templating.py @@ -0,0 +1,219 @@ +from __future__ import annotations + +import typing as t + +from jinja2 import BaseLoader +from jinja2 import Environment as BaseEnvironment +from jinja2 import Template +from jinja2 import TemplateNotFound + +from .globals import _cv_app +from .globals import _cv_request +from .globals import current_app +from .globals import request +from .helpers import stream_with_context +from .signals import before_render_template +from .signals import template_rendered + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .sansio.app import App + from .sansio.scaffold import Scaffold + + +def _default_template_ctx_processor() -> dict[str, t.Any]: + """Default template context processor. Injects `request`, + `session` and `g`. + """ + appctx = _cv_app.get(None) + reqctx = _cv_request.get(None) + rv: dict[str, t.Any] = {} + if appctx is not None: + rv["g"] = appctx.g + if reqctx is not None: + rv["request"] = reqctx.request + rv["session"] = reqctx.session + return rv + + +class Environment(BaseEnvironment): + """Works like a regular Jinja2 environment but has some additional + knowledge of how Flask's blueprint works so that it can prepend the + name of the blueprint to referenced templates if necessary. + """ + + def __init__(self, app: App, **options: t.Any) -> None: + if "loader" not in options: + options["loader"] = app.create_global_jinja_loader() + BaseEnvironment.__init__(self, **options) + self.app = app + + +class DispatchingJinjaLoader(BaseLoader): + """A loader that looks for templates in the application and all + the blueprint folders. + """ + + def __init__(self, app: App) -> None: + self.app = app + + def get_source( + self, environment: BaseEnvironment, template: str + ) -> tuple[str, str | None, t.Callable[[], bool] | None]: + if self.app.config["EXPLAIN_TEMPLATE_LOADING"]: + return self._get_source_explained(environment, template) + return self._get_source_fast(environment, template) + + def _get_source_explained( + self, environment: BaseEnvironment, template: str + ) -> tuple[str, str | None, t.Callable[[], bool] | None]: + attempts = [] + rv: tuple[str, str | None, t.Callable[[], bool] | None] | None + trv: None | (tuple[str, str | None, t.Callable[[], bool] | None]) = None + + for srcobj, loader in self._iter_loaders(template): + try: + rv = loader.get_source(environment, template) + if trv is None: + trv = rv + except TemplateNotFound: + rv = None + attempts.append((loader, srcobj, rv)) + + from .debughelpers import explain_template_loading_attempts + + explain_template_loading_attempts(self.app, template, attempts) + + if trv is not None: + return trv + raise TemplateNotFound(template) + + def _get_source_fast( + self, environment: BaseEnvironment, template: str + ) -> tuple[str, str | None, t.Callable[[], bool] | None]: + for _srcobj, loader in self._iter_loaders(template): + try: + return loader.get_source(environment, template) + except TemplateNotFound: + continue + raise TemplateNotFound(template) + + def _iter_loaders(self, template: str) -> t.Iterator[tuple[Scaffold, BaseLoader]]: + loader = self.app.jinja_loader + if loader is not None: + yield self.app, loader + + for blueprint in self.app.iter_blueprints(): + loader = blueprint.jinja_loader + if loader is not None: + yield blueprint, loader + + def list_templates(self) -> list[str]: + result = set() + loader = self.app.jinja_loader + if loader is not None: + result.update(loader.list_templates()) + + for blueprint in self.app.iter_blueprints(): + loader = blueprint.jinja_loader + if loader is not None: + for template in loader.list_templates(): + result.add(template) + + return list(result) + + +def _render(app: Flask, template: Template, context: dict[str, t.Any]) -> str: + app.update_template_context(context) + before_render_template.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + rv = template.render(context) + template_rendered.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + return rv + + +def render_template( + template_name_or_list: str | Template | list[str | Template], + **context: t.Any, +) -> str: + """Render a template by name with the given context. + + :param template_name_or_list: The name of the template to render. If + a list is given, the first name to exist will be rendered. + :param context: The variables to make available in the template. + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.get_or_select_template(template_name_or_list) + return _render(app, template, context) + + +def render_template_string(source: str, **context: t.Any) -> str: + """Render a template from the given source string with the given + context. + + :param source: The source code of the template to render. + :param context: The variables to make available in the template. + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.from_string(source) + return _render(app, template, context) + + +def _stream( + app: Flask, template: Template, context: dict[str, t.Any] +) -> t.Iterator[str]: + app.update_template_context(context) + before_render_template.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + + def generate() -> t.Iterator[str]: + yield from template.generate(context) + template_rendered.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + + rv = generate() + + # If a request context is active, keep it while generating. + if request: + rv = stream_with_context(rv) + + return rv + + +def stream_template( + template_name_or_list: str | Template | list[str | Template], + **context: t.Any, +) -> t.Iterator[str]: + """Render a template by name with the given context as a stream. + This returns an iterator of strings, which can be used as a + streaming response from a view. + + :param template_name_or_list: The name of the template to render. If + a list is given, the first name to exist will be rendered. + :param context: The variables to make available in the template. + + .. versionadded:: 2.2 + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.get_or_select_template(template_name_or_list) + return _stream(app, template, context) + + +def stream_template_string(source: str, **context: t.Any) -> t.Iterator[str]: + """Render a template from the given source string with the given + context as a stream. This returns an iterator of strings, which can + be used as a streaming response from a view. + + :param source: The source code of the template to render. + :param context: The variables to make available in the template. + + .. versionadded:: 2.2 + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.from_string(source) + return _stream(app, template, context) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/testing.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/testing.py new file mode 100644 index 0000000..a27b7c8 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/testing.py @@ -0,0 +1,298 @@ +from __future__ import annotations + +import importlib.metadata +import typing as t +from contextlib import contextmanager +from contextlib import ExitStack +from copy import copy +from types import TracebackType +from urllib.parse import urlsplit + +import werkzeug.test +from click.testing import CliRunner +from werkzeug.test import Client +from werkzeug.wrappers import Request as BaseRequest + +from .cli import ScriptInfo +from .sessions import SessionMixin + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import WSGIEnvironment + from werkzeug.test import TestResponse + + from .app import Flask + + +class EnvironBuilder(werkzeug.test.EnvironBuilder): + """An :class:`~werkzeug.test.EnvironBuilder`, that takes defaults from the + application. + + :param app: The Flask application to configure the environment from. + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + + def __init__( + self, + app: Flask, + path: str = "/", + base_url: str | None = None, + subdomain: str | None = None, + url_scheme: str | None = None, + *args: t.Any, + **kwargs: t.Any, + ) -> None: + assert not (base_url or subdomain or url_scheme) or ( + base_url is not None + ) != bool( + subdomain or url_scheme + ), 'Cannot pass "subdomain" or "url_scheme" with "base_url".' + + if base_url is None: + http_host = app.config.get("SERVER_NAME") or "localhost" + app_root = app.config["APPLICATION_ROOT"] + + if subdomain: + http_host = f"{subdomain}.{http_host}" + + if url_scheme is None: + url_scheme = app.config["PREFERRED_URL_SCHEME"] + + url = urlsplit(path) + base_url = ( + f"{url.scheme or url_scheme}://{url.netloc or http_host}" + f"/{app_root.lstrip('/')}" + ) + path = url.path + + if url.query: + sep = b"?" if isinstance(url.query, bytes) else "?" + path += sep + url.query + + self.app = app + super().__init__(path, base_url, *args, **kwargs) + + def json_dumps(self, obj: t.Any, **kwargs: t.Any) -> str: # type: ignore + """Serialize ``obj`` to a JSON-formatted string. + + The serialization will be configured according to the config associated + with this EnvironBuilder's ``app``. + """ + return self.app.json.dumps(obj, **kwargs) + + +_werkzeug_version = "" + + +def _get_werkzeug_version() -> str: + global _werkzeug_version + + if not _werkzeug_version: + _werkzeug_version = importlib.metadata.version("werkzeug") + + return _werkzeug_version + + +class FlaskClient(Client): + """Works like a regular Werkzeug test client but has knowledge about + Flask's contexts to defer the cleanup of the request context until + the end of a ``with`` block. For general information about how to + use this class refer to :class:`werkzeug.test.Client`. + + .. versionchanged:: 0.12 + `app.test_client()` includes preset default environment, which can be + set after instantiation of the `app.test_client()` object in + `client.environ_base`. + + Basic usage is outlined in the :doc:`/testing` chapter. + """ + + application: Flask + + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + super().__init__(*args, **kwargs) + self.preserve_context = False + self._new_contexts: list[t.ContextManager[t.Any]] = [] + self._context_stack = ExitStack() + self.environ_base = { + "REMOTE_ADDR": "127.0.0.1", + "HTTP_USER_AGENT": f"Werkzeug/{_get_werkzeug_version()}", + } + + @contextmanager + def session_transaction( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Iterator[SessionMixin]: + """When used in combination with a ``with`` statement this opens a + session transaction. This can be used to modify the session that + the test client uses. Once the ``with`` block is left the session is + stored back. + + :: + + with client.session_transaction() as session: + session['value'] = 42 + + Internally this is implemented by going through a temporary test + request context and since session handling could depend on + request variables this function accepts the same arguments as + :meth:`~flask.Flask.test_request_context` which are directly + passed through. + """ + if self._cookies is None: + raise TypeError( + "Cookies are disabled. Create a client with 'use_cookies=True'." + ) + + app = self.application + ctx = app.test_request_context(*args, **kwargs) + self._add_cookies_to_wsgi(ctx.request.environ) + + with ctx: + sess = app.session_interface.open_session(app, ctx.request) + + if sess is None: + raise RuntimeError("Session backend did not open a session.") + + yield sess + resp = app.response_class() + + if app.session_interface.is_null_session(sess): + return + + with ctx: + app.session_interface.save_session(app, sess, resp) + + self._update_cookies_from_response( + ctx.request.host.partition(":")[0], + ctx.request.path, + resp.headers.getlist("Set-Cookie"), + ) + + def _copy_environ(self, other: WSGIEnvironment) -> WSGIEnvironment: + out = {**self.environ_base, **other} + + if self.preserve_context: + out["werkzeug.debug.preserve_context"] = self._new_contexts.append + + return out + + def _request_from_builder_args( + self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] + ) -> BaseRequest: + kwargs["environ_base"] = self._copy_environ(kwargs.get("environ_base", {})) + builder = EnvironBuilder(self.application, *args, **kwargs) + + try: + return builder.get_request() + finally: + builder.close() + + def open( + self, + *args: t.Any, + buffered: bool = False, + follow_redirects: bool = False, + **kwargs: t.Any, + ) -> TestResponse: + if args and isinstance( + args[0], (werkzeug.test.EnvironBuilder, dict, BaseRequest) + ): + if isinstance(args[0], werkzeug.test.EnvironBuilder): + builder = copy(args[0]) + builder.environ_base = self._copy_environ(builder.environ_base or {}) # type: ignore[arg-type] + request = builder.get_request() + elif isinstance(args[0], dict): + request = EnvironBuilder.from_environ( + args[0], app=self.application, environ_base=self._copy_environ({}) + ).get_request() + else: + # isinstance(args[0], BaseRequest) + request = copy(args[0]) + request.environ = self._copy_environ(request.environ) + else: + # request is None + request = self._request_from_builder_args(args, kwargs) + + # Pop any previously preserved contexts. This prevents contexts + # from being preserved across redirects or multiple requests + # within a single block. + self._context_stack.close() + + response = super().open( + request, + buffered=buffered, + follow_redirects=follow_redirects, + ) + response.json_module = self.application.json # type: ignore[assignment] + + # Re-push contexts that were preserved during the request. + while self._new_contexts: + cm = self._new_contexts.pop() + self._context_stack.enter_context(cm) + + return response + + def __enter__(self) -> FlaskClient: + if self.preserve_context: + raise RuntimeError("Cannot nest client invocations") + self.preserve_context = True + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.preserve_context = False + self._context_stack.close() + + +class FlaskCliRunner(CliRunner): + """A :class:`~click.testing.CliRunner` for testing a Flask app's + CLI commands. Typically created using + :meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`. + """ + + def __init__(self, app: Flask, **kwargs: t.Any) -> None: + self.app = app + super().__init__(**kwargs) + + def invoke( # type: ignore + self, cli: t.Any = None, args: t.Any = None, **kwargs: t.Any + ) -> t.Any: + """Invokes a CLI command in an isolated environment. See + :meth:`CliRunner.invoke ` for + full method documentation. See :ref:`testing-cli` for examples. + + If the ``obj`` argument is not given, passes an instance of + :class:`~flask.cli.ScriptInfo` that knows how to load the Flask + app being tested. + + :param cli: Command object to invoke. Default is the app's + :attr:`~flask.app.Flask.cli` group. + :param args: List of strings to invoke the command with. + + :return: a :class:`~click.testing.Result` object. + """ + if cli is None: + cli = self.app.cli + + if "obj" not in kwargs: + kwargs["obj"] = ScriptInfo(create_app=lambda: self.app) + + return super().invoke(cli, args, **kwargs) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/typing.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/typing.py new file mode 100644 index 0000000..cf6d4ae --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/typing.py @@ -0,0 +1,90 @@ +from __future__ import annotations + +import typing as t + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import WSGIApplication # noqa: F401 + from werkzeug.datastructures import Headers # noqa: F401 + from werkzeug.sansio.response import Response # noqa: F401 + +# The possible types that are directly convertible or are a Response object. +ResponseValue = t.Union[ + "Response", + str, + bytes, + t.List[t.Any], + # Only dict is actually accepted, but Mapping allows for TypedDict. + t.Mapping[str, t.Any], + t.Iterator[str], + t.Iterator[bytes], +] + +# the possible types for an individual HTTP header +# This should be a Union, but mypy doesn't pass unless it's a TypeVar. +HeaderValue = t.Union[str, t.List[str], t.Tuple[str, ...]] + +# the possible types for HTTP headers +HeadersValue = t.Union[ + "Headers", + t.Mapping[str, HeaderValue], + t.Sequence[t.Tuple[str, HeaderValue]], +] + +# The possible types returned by a route function. +ResponseReturnValue = t.Union[ + ResponseValue, + t.Tuple[ResponseValue, HeadersValue], + t.Tuple[ResponseValue, int], + t.Tuple[ResponseValue, int, HeadersValue], + "WSGIApplication", +] + +# Allow any subclass of werkzeug.Response, such as the one from Flask, +# as a callback argument. Using werkzeug.Response directly makes a +# callback annotated with flask.Response fail type checking. +ResponseClass = t.TypeVar("ResponseClass", bound="Response") + +AppOrBlueprintKey = t.Optional[str] # The App key is None, whereas blueprints are named +AfterRequestCallable = t.Union[ + t.Callable[[ResponseClass], ResponseClass], + t.Callable[[ResponseClass], t.Awaitable[ResponseClass]], +] +BeforeFirstRequestCallable = t.Union[ + t.Callable[[], None], t.Callable[[], t.Awaitable[None]] +] +BeforeRequestCallable = t.Union[ + t.Callable[[], t.Optional[ResponseReturnValue]], + t.Callable[[], t.Awaitable[t.Optional[ResponseReturnValue]]], +] +ShellContextProcessorCallable = t.Callable[[], t.Dict[str, t.Any]] +TeardownCallable = t.Union[ + t.Callable[[t.Optional[BaseException]], None], + t.Callable[[t.Optional[BaseException]], t.Awaitable[None]], +] +TemplateContextProcessorCallable = t.Union[ + t.Callable[[], t.Dict[str, t.Any]], + t.Callable[[], t.Awaitable[t.Dict[str, t.Any]]], +] +TemplateFilterCallable = t.Callable[..., t.Any] +TemplateGlobalCallable = t.Callable[..., t.Any] +TemplateTestCallable = t.Callable[..., bool] +URLDefaultCallable = t.Callable[[str, t.Dict[str, t.Any]], None] +URLValuePreprocessorCallable = t.Callable[ + [t.Optional[str], t.Optional[t.Dict[str, t.Any]]], None +] + +# This should take Exception, but that either breaks typing the argument +# with a specific exception, or decorating multiple times with different +# exceptions (and using a union type on the argument). +# https://github.com/pallets/flask/issues/4095 +# https://github.com/pallets/flask/issues/4295 +# https://github.com/pallets/flask/issues/4297 +ErrorHandlerCallable = t.Union[ + t.Callable[[t.Any], ResponseReturnValue], + t.Callable[[t.Any], t.Awaitable[ResponseReturnValue]], +] + +RouteCallable = t.Union[ + t.Callable[..., ResponseReturnValue], + t.Callable[..., t.Awaitable[ResponseReturnValue]], +] diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/views.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/views.py new file mode 100644 index 0000000..794fdc0 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/views.py @@ -0,0 +1,191 @@ +from __future__ import annotations + +import typing as t + +from . import typing as ft +from .globals import current_app +from .globals import request + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + +http_method_funcs = frozenset( + ["get", "post", "head", "options", "delete", "put", "trace", "patch"] +) + + +class View: + """Subclass this class and override :meth:`dispatch_request` to + create a generic class-based view. Call :meth:`as_view` to create a + view function that creates an instance of the class with the given + arguments and calls its ``dispatch_request`` method with any URL + variables. + + See :doc:`views` for a detailed guide. + + .. code-block:: python + + class Hello(View): + init_every_request = False + + def dispatch_request(self, name): + return f"Hello, {name}!" + + app.add_url_rule( + "/hello/", view_func=Hello.as_view("hello") + ) + + Set :attr:`methods` on the class to change what methods the view + accepts. + + Set :attr:`decorators` on the class to apply a list of decorators to + the generated view function. Decorators applied to the class itself + will not be applied to the generated view function! + + Set :attr:`init_every_request` to ``False`` for efficiency, unless + you need to store request-global data on ``self``. + """ + + #: The methods this view is registered for. Uses the same default + #: (``["GET", "HEAD", "OPTIONS"]``) as ``route`` and + #: ``add_url_rule`` by default. + methods: t.ClassVar[t.Collection[str] | None] = None + + #: Control whether the ``OPTIONS`` method is handled automatically. + #: Uses the same default (``True``) as ``route`` and + #: ``add_url_rule`` by default. + provide_automatic_options: t.ClassVar[bool | None] = None + + #: A list of decorators to apply, in order, to the generated view + #: function. Remember that ``@decorator`` syntax is applied bottom + #: to top, so the first decorator in the list would be the bottom + #: decorator. + #: + #: .. versionadded:: 0.8 + decorators: t.ClassVar[list[t.Callable[[F], F]]] = [] + + #: Create a new instance of this view class for every request by + #: default. If a view subclass sets this to ``False``, the same + #: instance is used for every request. + #: + #: A single instance is more efficient, especially if complex setup + #: is done during init. However, storing data on ``self`` is no + #: longer safe across requests, and :data:`~flask.g` should be used + #: instead. + #: + #: .. versionadded:: 2.2 + init_every_request: t.ClassVar[bool] = True + + def dispatch_request(self) -> ft.ResponseReturnValue: + """The actual view function behavior. Subclasses must override + this and return a valid response. Any variables from the URL + rule are passed as keyword arguments. + """ + raise NotImplementedError() + + @classmethod + def as_view( + cls, name: str, *class_args: t.Any, **class_kwargs: t.Any + ) -> ft.RouteCallable: + """Convert the class into a view function that can be registered + for a route. + + By default, the generated view will create a new instance of the + view class for every request and call its + :meth:`dispatch_request` method. If the view class sets + :attr:`init_every_request` to ``False``, the same instance will + be used for every request. + + Except for ``name``, all other arguments passed to this method + are forwarded to the view class ``__init__`` method. + + .. versionchanged:: 2.2 + Added the ``init_every_request`` class attribute. + """ + if cls.init_every_request: + + def view(**kwargs: t.Any) -> ft.ResponseReturnValue: + self = view.view_class( # type: ignore[attr-defined] + *class_args, **class_kwargs + ) + return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] + + else: + self = cls(*class_args, **class_kwargs) + + def view(**kwargs: t.Any) -> ft.ResponseReturnValue: + return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] + + if cls.decorators: + view.__name__ = name + view.__module__ = cls.__module__ + for decorator in cls.decorators: + view = decorator(view) + + # We attach the view class to the view function for two reasons: + # first of all it allows us to easily figure out what class-based + # view this thing came from, secondly it's also used for instantiating + # the view class so you can actually replace it with something else + # for testing purposes and debugging. + view.view_class = cls # type: ignore + view.__name__ = name + view.__doc__ = cls.__doc__ + view.__module__ = cls.__module__ + view.methods = cls.methods # type: ignore + view.provide_automatic_options = cls.provide_automatic_options # type: ignore + return view + + +class MethodView(View): + """Dispatches request methods to the corresponding instance methods. + For example, if you implement a ``get`` method, it will be used to + handle ``GET`` requests. + + This can be useful for defining a REST API. + + :attr:`methods` is automatically set based on the methods defined on + the class. + + See :doc:`views` for a detailed guide. + + .. code-block:: python + + class CounterAPI(MethodView): + def get(self): + return str(session.get("counter", 0)) + + def post(self): + session["counter"] = session.get("counter", 0) + 1 + return redirect(url_for("counter")) + + app.add_url_rule( + "/counter", view_func=CounterAPI.as_view("counter") + ) + """ + + def __init_subclass__(cls, **kwargs: t.Any) -> None: + super().__init_subclass__(**kwargs) + + if "methods" not in cls.__dict__: + methods = set() + + for base in cls.__bases__: + if getattr(base, "methods", None): + methods.update(base.methods) # type: ignore[attr-defined] + + for key in http_method_funcs: + if hasattr(cls, key): + methods.add(key.upper()) + + if methods: + cls.methods = methods + + def dispatch_request(self, **kwargs: t.Any) -> ft.ResponseReturnValue: + meth = getattr(self, request.method.lower(), None) + + # If the request method is HEAD and we don't have a handler for it + # retry with GET. + if meth is None and request.method == "HEAD": + meth = getattr(self, "get", None) + + assert meth is not None, f"Unimplemented method {request.method!r}" + return current_app.ensure_sync(meth)(**kwargs) # type: ignore[no-any-return] diff --git a/stripe_config/.venv/lib/python3.12/site-packages/flask/wrappers.py b/stripe_config/.venv/lib/python3.12/site-packages/flask/wrappers.py new file mode 100644 index 0000000..c1eca80 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/flask/wrappers.py @@ -0,0 +1,174 @@ +from __future__ import annotations + +import typing as t + +from werkzeug.exceptions import BadRequest +from werkzeug.exceptions import HTTPException +from werkzeug.wrappers import Request as RequestBase +from werkzeug.wrappers import Response as ResponseBase + +from . import json +from .globals import current_app +from .helpers import _split_blueprint_path + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.routing import Rule + + +class Request(RequestBase): + """The request object used by default in Flask. Remembers the + matched endpoint and view arguments. + + It is what ends up as :class:`~flask.request`. If you want to replace + the request object used you can subclass this and set + :attr:`~flask.Flask.request_class` to your subclass. + + The request object is a :class:`~werkzeug.wrappers.Request` subclass and + provides all of the attributes Werkzeug defines plus a few Flask + specific ones. + """ + + json_module: t.Any = json + + #: The internal URL rule that matched the request. This can be + #: useful to inspect which methods are allowed for the URL from + #: a before/after handler (``request.url_rule.methods``) etc. + #: Though if the request's method was invalid for the URL rule, + #: the valid list is available in ``routing_exception.valid_methods`` + #: instead (an attribute of the Werkzeug exception + #: :exc:`~werkzeug.exceptions.MethodNotAllowed`) + #: because the request was never internally bound. + #: + #: .. versionadded:: 0.6 + url_rule: Rule | None = None + + #: A dict of view arguments that matched the request. If an exception + #: happened when matching, this will be ``None``. + view_args: dict[str, t.Any] | None = None + + #: If matching the URL failed, this is the exception that will be + #: raised / was raised as part of the request handling. This is + #: usually a :exc:`~werkzeug.exceptions.NotFound` exception or + #: something similar. + routing_exception: HTTPException | None = None + + @property + def max_content_length(self) -> int | None: # type: ignore[override] + """Read-only view of the ``MAX_CONTENT_LENGTH`` config key.""" + if current_app: + return current_app.config["MAX_CONTENT_LENGTH"] # type: ignore[no-any-return] + else: + return None + + @property + def endpoint(self) -> str | None: + """The endpoint that matched the request URL. + + This will be ``None`` if matching failed or has not been + performed yet. + + This in combination with :attr:`view_args` can be used to + reconstruct the same URL or a modified URL. + """ + if self.url_rule is not None: + return self.url_rule.endpoint + + return None + + @property + def blueprint(self) -> str | None: + """The registered name of the current blueprint. + + This will be ``None`` if the endpoint is not part of a + blueprint, or if URL matching failed or has not been performed + yet. + + This does not necessarily match the name the blueprint was + created with. It may have been nested, or registered with a + different name. + """ + endpoint = self.endpoint + + if endpoint is not None and "." in endpoint: + return endpoint.rpartition(".")[0] + + return None + + @property + def blueprints(self) -> list[str]: + """The registered names of the current blueprint upwards through + parent blueprints. + + This will be an empty list if there is no current blueprint, or + if URL matching failed. + + .. versionadded:: 2.0.1 + """ + name = self.blueprint + + if name is None: + return [] + + return _split_blueprint_path(name) + + def _load_form_data(self) -> None: + super()._load_form_data() + + # In debug mode we're replacing the files multidict with an ad-hoc + # subclass that raises a different error for key errors. + if ( + current_app + and current_app.debug + and self.mimetype != "multipart/form-data" + and not self.files + ): + from .debughelpers import attach_enctype_error_multidict + + attach_enctype_error_multidict(self) + + def on_json_loading_failed(self, e: ValueError | None) -> t.Any: + try: + return super().on_json_loading_failed(e) + except BadRequest as e: + if current_app and current_app.debug: + raise + + raise BadRequest() from e + + +class Response(ResponseBase): + """The response object that is used by default in Flask. Works like the + response object from Werkzeug but is set to have an HTML mimetype by + default. Quite often you don't have to create this object yourself because + :meth:`~flask.Flask.make_response` will take care of that for you. + + If you want to replace the response object used you can subclass this and + set :attr:`~flask.Flask.response_class` to your subclass. + + .. versionchanged:: 1.0 + JSON support is added to the response, like the request. This is useful + when testing to get the test client response data as JSON. + + .. versionchanged:: 1.0 + + Added :attr:`max_cookie_size`. + """ + + default_mimetype: str | None = "text/html" + + json_module = json + + autocorrect_location_header = False + + @property + def max_cookie_size(self) -> int: # type: ignore + """Read-only view of the :data:`MAX_COOKIE_SIZE` config key. + + See :attr:`~werkzeug.wrappers.Response.max_cookie_size` in + Werkzeug's docs. + """ + if current_app: + return current_app.config["MAX_COOKIE_SIZE"] # type: ignore[no-any-return] + + # return Werkzeug's default when not in an app context + return super().max_cookie_size diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/INSTALLER b/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/LICENSE.md b/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/LICENSE.md new file mode 100644 index 0000000..19b6b45 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/LICENSE.md @@ -0,0 +1,31 @@ +BSD 3-Clause License + +Copyright (c) 2013-2024, Kim Davies and contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/METADATA b/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/METADATA new file mode 100644 index 0000000..c42623e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/METADATA @@ -0,0 +1,250 @@ +Metadata-Version: 2.1 +Name: idna +Version: 3.10 +Summary: Internationalized Domain Names in Applications (IDNA) +Author-email: Kim Davies +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: Name Service (DNS) +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Utilities +Requires-Dist: ruff >= 0.6.2 ; extra == "all" +Requires-Dist: mypy >= 1.11.2 ; extra == "all" +Requires-Dist: pytest >= 8.3.2 ; extra == "all" +Requires-Dist: flake8 >= 7.1.1 ; extra == "all" +Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst +Project-URL: Issue tracker, https://github.com/kjd/idna/issues +Project-URL: Source, https://github.com/kjd/idna +Provides-Extra: all + +Internationalized Domain Names in Applications (IDNA) +===================================================== + +Support for the Internationalized Domain Names in +Applications (IDNA) protocol as specified in `RFC 5891 +`_. This is the latest version of +the protocol and is sometimes referred to as “IDNA 2008”. + +This library also provides support for Unicode Technical +Standard 46, `Unicode IDNA Compatibility Processing +`_. + +This acts as a suitable replacement for the “encodings.idna” +module that comes with the Python standard library, but which +only supports the older superseded IDNA specification (`RFC 3490 +`_). + +Basic functions are simply executed: + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + + +Installation +------------ + +This package is available for installation from PyPI: + +.. code-block:: bash + + $ python3 -m pip install idna + + +Usage +----- + +For typical usage, the ``encode`` and ``decode`` functions will take a +domain name argument and perform a conversion to A-labels or U-labels +respectively. + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + +You may use the codec encoding and decoding methods using the +``idna.codec`` module: + +.. code-block:: pycon + + >>> import idna.codec + >>> print('домен.испытание'.encode('idna2008')) + b'xn--d1acufc.xn--80akhbyknj4f' + >>> print(b'xn--d1acufc.xn--80akhbyknj4f'.decode('idna2008')) + домен.испытание + +Conversions can be applied at a per-label basis using the ``ulabel`` or +``alabel`` functions if necessary: + +.. code-block:: pycon + + >>> idna.alabel('测试') + b'xn--0zwm56d' + +Compatibility Mapping (UTS #46) ++++++++++++++++++++++++++++++++ + +As described in `RFC 5895 `_, the +IDNA specification does not normalize input from different potential +ways a user may input a domain name. This functionality, known as +a “mapping”, is considered by the specification to be a local +user-interface issue distinct from IDNA conversion functionality. + +This library provides one such mapping that was developed by the +Unicode Consortium. Known as `Unicode IDNA Compatibility Processing +`_, it provides for both a regular +mapping for typical applications, as well as a transitional mapping to +help migrate from older IDNA 2003 applications. Strings are +preprocessed according to Section 4.4 “Preprocessing for IDNA2008” +prior to the IDNA operations. + +For example, “Königsgäßchen” is not a permissible label as *LATIN +CAPITAL LETTER K* is not allowed (nor are capital letters in general). +UTS 46 will convert this into lower case prior to applying the IDNA +conversion. + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('Königsgäßchen') + ... + idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed + >>> idna.encode('Königsgäßchen', uts46=True) + b'xn--knigsgchen-b4a3dun' + >>> print(idna.decode('xn--knigsgchen-b4a3dun')) + königsgäßchen + +Transitional processing provides conversions to help transition from +the older 2003 standard to the current standard. For example, in the +original IDNA specification, the *LATIN SMALL LETTER SHARP S* (ß) was +converted into two *LATIN SMALL LETTER S* (ss), whereas in the current +IDNA specification this conversion is not performed. + +.. code-block:: pycon + + >>> idna.encode('Königsgäßchen', uts46=True, transitional=True) + 'xn--knigsgsschen-lcb0w' + +Implementers should use transitional processing with caution, only in +rare cases where conversion from legacy labels to current labels must be +performed (i.e. IDNA implementations that pre-date 2008). For typical +applications that just need to convert labels, transitional processing +is unlikely to be beneficial and could produce unexpected incompatible +results. + +``encodings.idna`` Compatibility +++++++++++++++++++++++++++++++++ + +Function calls from the Python built-in ``encodings.idna`` module are +mapped to their IDNA 2008 equivalents using the ``idna.compat`` module. +Simply substitute the ``import`` clause in your code to refer to the new +module name. + +Exceptions +---------- + +All errors raised during the conversion following the specification +should raise an exception derived from the ``idna.IDNAError`` base +class. + +More specific exceptions that may be generated as ``idna.IDNABidiError`` +when the error reflects an illegal combination of left-to-right and +right-to-left characters in a label; ``idna.InvalidCodepoint`` when +a specific codepoint is an illegal character in an IDN label (i.e. +INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is +illegal based on its positional context (i.e. it is CONTEXTO or CONTEXTJ +but the contextual requirements are not satisfied.) + +Building and Diagnostics +------------------------ + +The IDNA and UTS 46 functionality relies upon pre-calculated lookup +tables for performance. These tables are derived from computing against +eligibility criteria in the respective standards. These tables are +computed using the command-line script ``tools/idna-data``. + +This tool will fetch relevant codepoint data from the Unicode repository +and perform the required calculations to identify eligibility. There are +three main modes: + +* ``idna-data make-libdata``. Generates ``idnadata.py`` and + ``uts46data.py``, the pre-calculated lookup tables used for IDNA and + UTS 46 conversions. Implementers who wish to track this library against + a different Unicode version may use this tool to manually generate a + different version of the ``idnadata.py`` and ``uts46data.py`` files. + +* ``idna-data make-table``. Generate a table of the IDNA disposition + (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix + B.1 of RFC 5892 and the pre-computed tables published by `IANA + `_. + +* ``idna-data U+0061``. Prints debugging output on the various + properties associated with an individual Unicode codepoint (in this + case, U+0061), that are used to assess the IDNA and UTS 46 status of a + codepoint. This is helpful in debugging or analysis. + +The tool accepts a number of arguments, described using ``idna-data +-h``. Most notably, the ``--version`` argument allows the specification +of the version of Unicode to be used in computing the table data. For +example, ``idna-data --version 9.0.0 make-libdata`` will generate +library data against Unicode 9.0.0. + + +Additional Notes +---------------- + +* **Packages**. The latest tagged release version is published in the + `Python Package Index `_. + +* **Version support**. This library supports Python 3.6 and higher. + As this library serves as a low-level toolkit for a variety of + applications, many of which strive for broad compatibility with older + Python versions, there is no rush to remove older interpreter support. + Removing support for older versions should be well justified in that the + maintenance burden has become too high. + +* **Python 2**. Python 2 is supported by version 2.x of this library. + Use "idna<3" in your requirements file if you need this library for + a Python 2 application. Be advised that these versions are no longer + actively developed. + +* **Testing**. The library has a test suite based on each rule of the + IDNA specification, as well as tests that are provided as part of the + Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing + `_. + +* **Emoji**. It is an occasional request to support emoji domains in + this library. Encoding of symbols like emoji is expressly prohibited by + the technical standard IDNA 2008 and emoji domains are broadly phased + out across the domain industry due to associated security risks. For + now, applications that need to support these non-compliant labels + may wish to consider trying the encode/decode operation in this library + first, and then falling back to using `encodings.idna`. See `the Github + project `_ for more discussion. + diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/RECORD b/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/RECORD new file mode 100644 index 0000000..9cfce7f --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/RECORD @@ -0,0 +1,22 @@ +idna-3.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +idna-3.10.dist-info/LICENSE.md,sha256=pZ8LDvNjWHQQmkRhykT_enDVBpboFHZ7-vch1Mmw2w8,1541 +idna-3.10.dist-info/METADATA,sha256=URR5ZyDfQ1PCEGhkYoojqfi2Ra0tau2--lhwG4XSfjI,10158 +idna-3.10.dist-info/RECORD,, +idna-3.10.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868 +idna/__pycache__/__init__.cpython-312.pyc,, +idna/__pycache__/codec.cpython-312.pyc,, +idna/__pycache__/compat.cpython-312.pyc,, +idna/__pycache__/core.cpython-312.pyc,, +idna/__pycache__/idnadata.cpython-312.pyc,, +idna/__pycache__/intranges.cpython-312.pyc,, +idna/__pycache__/package_data.cpython-312.pyc,, +idna/__pycache__/uts46data.cpython-312.pyc,, +idna/codec.py,sha256=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422 +idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316 +idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239 +idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306 +idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898 +idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21 +idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/WHEEL b/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/WHEEL new file mode 100644 index 0000000..3b5e64b --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna-3.10.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/__init__.py b/stripe_config/.venv/lib/python3.12/site-packages/idna/__init__.py new file mode 100644 index 0000000..cfdc030 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna/__init__.py @@ -0,0 +1,45 @@ +from .core import ( + IDNABidiError, + IDNAError, + InvalidCodepoint, + InvalidCodepointContext, + alabel, + check_bidi, + check_hyphen_ok, + check_initial_combiner, + check_label, + check_nfc, + decode, + encode, + ulabel, + uts46_remap, + valid_contextj, + valid_contexto, + valid_label_length, + valid_string_length, +) +from .intranges import intranges_contain +from .package_data import __version__ + +__all__ = [ + "__version__", + "IDNABidiError", + "IDNAError", + "InvalidCodepoint", + "InvalidCodepointContext", + "alabel", + "check_bidi", + "check_hyphen_ok", + "check_initial_combiner", + "check_label", + "check_nfc", + "decode", + "encode", + "intranges_contain", + "ulabel", + "uts46_remap", + "valid_contextj", + "valid_contexto", + "valid_label_length", + "valid_string_length", +] diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bed1ae5078cfa7083b0c3406e0c7ad18440bbf4c GIT binary patch literal 865 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 H#W(x`zj(jo literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce919644b9eb5c83770bee72e983b1b9ea5090ae GIT binary patch literal 16155 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 OHp*mOvqO$-<^Ky=r4tqa literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f1a801275ec5fed9b19ffdc5f867f8d14c315b3 GIT binary patch literal 99455 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e85a586144f2c351e2c7fe68544e064335697e13 GIT binary patch literal 2617 zcmZuyO>7(07QXZ6xOSYxiJGK8G&c>P3>cf%eH1|o60KT^(xCq8DZHoY#B-et8PB+P z#+&s;*dz@S)~JF7Z_}M2tl0FObH`4aiYv|B^LNiZ z_uTKC`(rAVATXx?_<8=r9zuRYraNLCV*54_cZfx1h$UIFBh5%KD~?=JW|WdTqe{e5 znZmRKU}tGeWttT$%E%Q}tLF=KCT7J!whumyX~me809lWf6g*gitZUs1nz)q$P2bag zVBJ1g*ALo6Rn`a0eG(ywbM{Bfr6zT3KcHTb+HSz+822-@WLk_?$|#(i_sXnTah$3S zrhdtE9O_m|vy7wG@!UDeE3Tgarr^0gD^vn-`;@POS1MNm28%f>bLKNQFaz6jad|M$ zXwl=P#N?zOm^?U^q0F_8=@}aF#|3{}r`c>)&(bUN7_aN!gw1j3jSBOHtD`qfpWdP! z_X*n-YLDA^7=3@z@#ZEcMBKWbO+3bnn%3n|eGf7bYF8>{hlLuZ z#Ry}Z1r_dQ3y`s$5eG_vZ+ifwcSx|KtC9O1dP$liOR^;`DFIrF5oleiCUxz)^BMB* zYlJMRHPwCU`?v22o9VhTLBz-5ums*2^P}r7eS{)x~|PZvZU2y1nILQ z*w>ZRG)oblHB0LF1l4`m6-PHxiPY33<@P^S5+oxH#3FaKmx->Lhad@;y0;BC|182N zTo-_e!3DYnhDhM1JIDMt5)?)U492VC_KjC};9x}fFc2V!hz#{Bg?YGZGuU(C!b=y; z)Z~n^TV^3}s$k{$43M(BPTC`C@Pa*t(0ZdZg1E|>9gm89AgcrGT3!cR+Jc4h# zbIvZ-JD{agQ#5~^*3cJ(=z0O#1_&xYE4)2^0^>0Pg=22@SQzs?9xyA^L>@xLVQv^R z%Vls8rVL0DY-vO~O?c8{9KjSOqlE@$7_chB3=@tC(7nm+fQ6DBrV16#q3j|DKK3O{ zGo^o>%gw_na|O?tt>*lI+hvx^LR0uC=h(Bkauw3$=Cj9+=X`MWO4%$dm~cxu+j7ku zuvZDd7iC3{zHtp1}Tf0&$T^&hMsTm7VQX#HX{eede#c)n?Fj-Pzk zf3h_&+8Ui`yxUCQoo-%ykp9orjnOw(QmuI3*QwRix248~=J@9GCz_@IzO(t-xgW+i zUpv1w{N7LT3$6XbtBH0B_Jgo`(`&fD8uf`G(QAd2koAG`s7oE@WVjr5`PXRAJG;? z0f4gDE}-}rXkJ7UbdK?))&^J4t=*_!*c^FjBl+@%`f?PM3YTnfjCxO65QieTUx3)# z3@xeKJeK6$Hu#|mhR+OWSn`go0?kWWI0FeA4|W<>r=>xY!?fPV^T7BQq<2Y$)~41V zs$25HL0F~LG|?*MsshbQd8)zfv|XVe+3Wpp{Kn94)KsfVRn@h{Q)gJfc*%C5?u+y~ zrsO&;!mH@xo99sv6rGnXDi3^iu1Dnctf+U64fo1fT@!c+W3x6qn?ab2X2W5{KwJvP z;?a9Jg-N76jEUMeLZ$5ap^ApkG3>edAe0OrGlf+RL!d28?-nII&4FpVTnC$%;PXF& z-!l1M>R|muBfXWHSU&qGG4ONZ@Mhw0{aWMNRwA=}x*a3&7>7`=L?aNS4A3W?CeKa`Mh&BAX$*sZ6 zY7ZsOok2TJqxd&V}h?TjRi)rZ;yrbb>&>-lZu+HpzBtX)P?rhc`NUsoEhe+P?zZO8ki dbp3Rjz_h-9-EW>=zjbd+un(^MiBb{i{{gn|o1*{# literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09211f6a96540aa16657254747755c7788068160 GIT binary patch literal 196 zcmX@j%ge<81b&~cXNUsn#~=<2FhUuhIe?7m3@Hpz43&(UOjRt#dWHsmnvA!&u*uC&Da}c>D`Ep04RTH~$h9As Q85tRG@QE~X7qI}j0M&goX#fBK literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12b12a21d095448a6a0a82ab5699393c4831bef5 GIT binary patch literal 158825 zcmbT92b5K{*2ib=05(9u-mwEBy(5ARrHH7Ah=_E!bPgRwhbhd^d+)uMp_gH>A|L`* zbZoR~>QkSJ-RHOe$w}_s+i$Vf;CjqUe*feoCnwoE$tm}p5+yEt z5pn-r7zTc7c4b`L%(%{Ro#T7O^^R{7-#gMK(mSC|LVVmsah)S=igZrs65l1EOQcKD zF2%Y=uBB`?OtA#SEVH4`MN*2ixu8%vic*dX3zef7<+!L&IWC|a7Z)nWg_PrxLgl!K zauhFAj*BTri9+SLgmRQDRF2}5l%rIka$HI|N*5}}Wt8LcLggq$ zIj$&Fj?$Fl%0lJ1oN`=Ms2o>Nj;jlm<4VeLO`&pJMLDi5RF11D$909uaSi3TzEC-? zr5raDD#vw{!1mmE%UrQKnEiZlWBw6e`Efl;hSyq~%5hJja@i~%9FG?&$77VEMWJ#uryNfdD#zoL{EJYA?9Pf?Cmh04*Aay(P098Xh@){(d_&(gmO)`pt~6u!`fhZCdtMJj%= zieIAQ#Z|n7ikDRJOI7?b6)&aYrB(cL6~98ouT=4?RQzfczedHcRq^Xo{CX9?LB(%W z@taiqW)&}^;yttx(-ir=o{cc}QCDt?!WmsRm{Dqdd2?^f{&Dt?cOS5)yzDqdN| ztEhNY6|bh^)m6NPiq}-}S}I;!#p|eeT@|mV;`gd}eHFh?#T%%2LlwVY#UD`d2UYwb z6@OU88>#psD*mX7H&*c`D&ADZo2mF?D&AbhA6M}fD*l9uKdItRsd!5je_F*`srWN0 z-kQhP##_VKrp>Tc<(?@(q+CLFk!H~W1G9^^9MrE@m+YcX_lfrHGrU-p8WpQltejme z=rV9n(5I8lXa7d%{}SlmPuR7c8P|=rWS7K06<03Oyj} zE{x1BT!e*-vT!jLzJP^sIG6V#7Dinhzl4R0vv3I(F3G}|vhZarT#AKDv+(6Cd<6^B z4z;htRV;ip3tz*+*o<~{zK(^jXW<)I_(m4KiG^=w;W8|I3k%=M!nd*T?JRr;3*X7Y zcd>9;7B0uamnTX)Osv@FALXa;rm#)0Sh+wDV!buSay7eatQ?wKxk@6M~Xfe zi*};uL$PRQias2RcA;paShOoeABjb~QS{MRv^zx`$D&b+Hi<=hP!u%?tI?C9&0^7B z6n!if?M>0!#Eh(-HT^vPH>py*Sv=m3hgj70}h^yyf15Jg+X zqJt^=Oe{KtqOD`mp%i^K79B>>HnHe%>RZnt8eZ47Ec`qRw`1WKShzh4cR)DouN_&q zlMAno3(_h46a9<(|;`}XcqsZ-xx9fwsKFffSr>r$!W;4XazSLzk*SgGHzf!+J| zsaCN{)k*`R1H0VQuS2Jv9lCWHP$}BEPlrl_1`eoRvvY@m9V+%4mR;JC!ah+?9p9v2b@5 zjKydv+ye{oJis9_}0|fMuM)TKNL=4;baz0Vc}F39>v0GER0U&j)^Pn!edw% zy~FWwEIgitC$R8D7M{eylUaBQ3r}U?X)HXQg=etvOctKS!n0X;4hzp^;dv}PpM@8& z@IoI>C|HCruG}B-WvJN~BN~p=B`my@g_p7Lau!~}!Yh3^p6^SBDai2Qgo4coqp0lo zs$}f8xTx*B2?bjL*s(@ZqHQkGSr~>RnRNK=Kw&HG@Zp4lod~ltT}jz@f!QLfP;|G8 z2Hhz{$Jzs6j+Ic5>BK=rDOBau$du}oW$(Wz>YgQNHIp_{un#mm+N&;wsrVaA*mt`bDzsgods8HLb0 z(Letm+8@{W|251B1qVnnEp5+t6_tKaqSb^BNwkL0I})uWbXcNwgx-~CJ)t8KZ6I`1 zqK$-(NwkU3dlF?3dS9Z=gg%gH3!x7s+DhmniMA2?SfcIJ&5i?w9pe)z@1z``O009Ee<5}4{m3Qn@{DHcA>!e>}G zhlO)lIFE(%S-60Ozh>cYSom8O{tpX($HL#U@DD8fUl#t6g@0n)X8hK{y48kCLb7Z+lG#<$Im?#D&laooN=Z3so zM9Qfo7iDrWDW{Qq0h2G3@@SGTV)DgO9!v5iOfD|v@g$dEa!DyqB>7S%Unb?rB$r}x zX(>-7`En*-A?4{LU&-XFq&$=4tC@U_lxLHCEt9X4@?4UyXYvhFo=@_POuk9V3rW72 z$z`OxnB-fSe5;g~l6)JJZzON_hv#wU}H-%DYLf%j9}erWs50UMAOY{C;ve$vUdY}kaSnB3CIwrtphr(xWQXi=r_gby0EM%lsZO?) zTXYU@R4u@GFqZASywNmS6b9RLR+AZ0rgcqprbM**iOzD!o(_!3Y<7@&PPV5*OO@z+ zi8fP?1uVxxDbrFTy2v4028_mHmSc&OaUM&VyiCe48q1ly!pWwFhZ3p0l@8hRR#A>s zEXQgm+Z^bxYnZ&w$u>6(#d;=haI(#vPUUTM$mZBYIX1Bz8BVr2#!!yU5{)Ia#UXo; zt#pvB>>%5uOv|k6X=jffWo11RLYY`KE~wtq>O>}K9fI?@-&h^Wb#K+oh^Zh2!+vwH5vxEF0hJJj86YIlm92>eI)#MkqXRGqcQE-* zDZ?P##pJS5HVbPemzOdO!re@+AY~YYdzf5N$}k9(m|R)Pm_%1$a#bl~5?zhSb-fIa zbSi^3lcV)Kqd?pNvx;R|>I-@Q9LjN@NA@TysFVgQ%l%%bK-@vIie>VHLf((r#zPL7 z%XMfpp@$_JN2rlQ=BgdU@O}g+v>lI18N<6Vlbc8x!@DVyn@M>*$&WF)xs)*sA7}C= zCkJill&P*64wy4KNL%#L%?<_aY?>_|^s!*81NH=IcR0FDBH9X$ZWrhf-8+fya3~mR zkF?W+mjGzm0uVOTCkV6KC!^>HpDLC{EL$J-S+R^<@b1g=>qu6UfcaWlK0-24q zbb*f0O{M5)iRh+Mbc{r>y<>sG8jTb3Q7nhYGkJoP$I}5PN`%?`B%rXrO&0PIx;+)0 zA`#u5icXb?Zcjz0Nkq4&qSGb9nsJ6i+X>B-2z!pRB%-@i(b*0K*aaal#{t{ObdM@J zS0Wguc@71*Jw#x>12!Aop^7e$2uq@c5@CkANT8z_x{D>k&|Lx)UYn&-h6!3GQ3|2u z5~UKN_qc5@G<7@*Tewmpn8H;OVa2*yBKWK|4hJ?{ zkpt{2koX1@kGj0}aM+PK=1_ng90KoofUOq-?|Xnf2m&8?fNdfIA9{d22Lc~?Fvo(A zJ(vy?CtNe)*ZLKit`;^JqQpT+BGbVrTWZNE?^?kwQFP&@;ZkB;eJ|ShZ3}o^t zDVt>=lg~)mECZRGD`m3`WOBZg%`%Y5UrQOYzHgZPt(46&kjdXk8J6dJCja2%0J~{) z$^PpBwx|gF=t0<#eqz~w_F~vc@Cb+XzSz&B!hT_?e|4h020Kaqjmf_|*>>54=pPQ) z^k%)t(*G^wcVQ_0ClTGuj{YMNOhp`d+?aoOZxW$+i6#?@NHpafzOH6~U9==j5zfQc zB}5ZsQJ5YSkqA4lMIACd{5`C}i%Ept)(admjrJbK_Jt1FjI#(`k5hBxUQ54 zj_WFk;JB`q2#)I-iQu@db;z{WF-)MZbI6>~F}SYlB|?w9K_c|X8zn-Iyh$QBubU-; z^C~0Idx?Z@kqC3hTO~>&belx*VYf>JA9jaC@L_jK1Rr*nMDSr{C4vtt=aB7R@L}a0 zvK;_E>~4v$(^^3ytj_L{2-Ba65=|gf$st=J)=`y#Lg&(6$}sR9nB39HwsJ7=otWI& z$@btd@LibPRmw2%-I&~6$}sRzCijps417-}_mVOUd~YWAkunT?UncjHvRN81Igqkh z8ZddFl+C>{CJ&afSsE~TsFbm=7{=t`Qigedk;yMf8QXy)nEbMou^spdlM{vfK4x_z znLI|ym_3bU@;E7D%|4#V6Qqp3Hj&AboNPMN``9|0%;YIfHl6AHsU%Nj@-!)9@j0Ez zGo*~IvzbhuC1p&aW;1z?lrf2#%j9`d#w2RKlh5J*Y6WkR|NG{={oevvEGB0QU9mK@ z7fBgocQKQfNEu^yDU+8;8Dn=jlUGO?V|OK!S4kOTcQupOIN4rmjNP?NUgu8Dn=Zle46ZvAfU9k?5-khs&?mMA8qi<@dTznhM}-3Ml+#pG-!n~wDXjKpV5{#?ptrN!hgrEFGOOgRD*J(GWsG6wU1nf#-a zF_?d1^3PJnU_Q&_U!;t|{40}xlQIVL?@azf${5UlGWjnlV=({Cj)(nOscDX(V63DZ_4*VsdFI!){#8_#~zmzOf^#@$S=AZ6H%dzf5N%CH-iyiAK2ghOXoMI`-bG0lyt zNK205o@HA6hiPjLRClS4+ z5xrL;?6KFE2pj76NrVmc1`^@Xr-l+?H{pJXu$%CJMA%JuP$KLmJR}iz6CRcby9tdX z!fwJN5@9#tQHijd&{!huCNz-`WU+j zPe_E_geN7!Zo*R%VKaV~l^p`1g$CR*Isu-t+IyZ( zDu_gR{OLmf2PKOIAm7U6)Vp=pmC;qZLE zWW3}BF@71sVfvI6Qs>#v3x;mhpCszrc8V#(Of} zkMW6&&tm)(So%X8Yk|=vgs$5VbndV@C=LFC_K~R=MK#>+8Yp7AP-SM{7`1PI3(Vb$gnt8li} zS@Iezc}7%V7xBl_cH!4iFNzLxO~jPGVVi}5!Y-_Q6##t$)mgz;mHzsLA-#y?>^m+?Ot$M;m+^(ukz zTDstLO-nLfit*Bnmt(xV%}W{~w-fp-J-p|7ig7F|5FQ zU4c~DhZ%3gcw@$!Fy5T;rx|~S@z#t#$N2M%w`06L7;nsY6UJLG-jeaojCW-`k@1m?r!bz%_)NyOM&%S`XpyQa50{E#o5@Pi8!Y@l?h~F+P^@af~lxd^zJQ7+>i*y(5Nj z>{RxQKd~F9vehLymwBuj;1wyeO+StrqtNCti`D5>S0EMs7UTOFf1B|Gj2~tE7~|QV z(~1h=*m>?=dtx^pANu0o7<;r|vZI{vM~Ot^E~TTG*#bRNgs?dxJiv)eY?zl|`h#9K zbCSJDC$eyd;~}4f-Zw`$>?Dmnr`<7?b)3!GoF#cuC7EoKJjIecqms<9Nm{ccZB>%F zHp%lWNmM0CJduU_I6Zt4dawiG@HF~+o)8_NvSysvi@r6GB^mVZBxb8f;;hXlvar)P z#A8~j#+@L%H^VAJys69O+ZpD`k!ui6*fmQ)QB@DYl`e z`6Q9(EQG^WnC&?|^{cYZvso9gBuiA1#Wu-OmSm+$vce`=#geR3N!HpV>sgXrD#;{! zF?ahUbjKUv@HDa*f0ywijDN;>+-0s&Bhf_&o8!=1o(MOEy~I#CwH0?N4lw;)rQ>G9 z5wFubod|~)>o1oU4{gSsOrA$+|Mogf=u5eB=~*d+!^wT)(lOoy;gC0HyanUWFy5N+ zXBlt9css`1Gd`N}F^o@Od=ldsjBjRqJL5YU-^ci?jK9YC>x}Pb`~c&}8UKXwQkTct ztu(@Dw{v-gY5`t@?SP%=^YRK;u>!Ag1=2-+j`8OiAHjGc<8v5a#P~0s)2p8d`;K{X zB5uF@t{CpW{Gk|b!2GEg?!f$|7;M?!iotsR4=fyHaaT|{?2L(5#rQ~sLq4DJMU4N> zc-+;o^j9Gq9{*;>YcbxC@s^CYXS_G#eHic0c)<8T#uFLe%J_E1zhwLb<6krW1LJ=% z9(PUbe2XC*p6>;WUxIM>>QPCS=2FHlW9hGBY05A@jPXRq*D}6|@n0B^yEazOn-LD{ zS%&cnj8|s-Ud9_Tem~<6G2VyqevA)dJdyErjBjH65aY)f|BUf38NcDW*m>QAaM*8O zV7xu!BN%^$@iB}~Vtfwcix}U)_$J1WG9Gt*tUiw+9JYT8#$RDPk@24y|BLb3H^h!p z58?29n=t;E=Lyk7gqy-}ny*HrdlQNsgz@hWBo(a*Bz9f8rg3M2n z2lyNWfn*QxwFd$z9_+ASlm}TBqei< z#R|pnB*jX_@F>M9#qcb}YQ^v{#Tv!%G{suQ@HoXf#qd1Edd2WS#RkRjM8!tM@JPib z#o*L46oXUWtQeg77RBJyw<-pwzD+SaSg~C(JXx_rF+5taQ!zYSu}d*LT(Mg*e3EGo zSUAY`Djg3|WGRNHDE29aXWd=}3yszRghQivjPXAikGs*Or>V3+i~#*@C(rbOoSI9RSm6^bn92yW7EaR^s%6!2Z06mdoa*~ z2Rs;R!Gj)zjsK7X=IPLbu(S_L1Vh`%A#0De;)$3?91F} zr8w8xq(*=*=TxI*{`ss;=!qd$QrL{}FHb85|I*5_AiVU?co1Ic)*ggc`dJ6UL&IaV zaV&`1Q-98b!M3&9IuPc99e>_2_fl*-560NTyx;*oX+~Mvdl0_z+QEalHbqAd!U5LF zgRnDq_8>f?E*^xH?dn1Jwr)2M!ishGAbgKA>Ooks9v+yA(Mv}FVP_iZMSKm52JA2< z&UK>gnV4$Kb0}zGn{&Pc=2_~4m{KfoD7ezL#6l17MJ7tI$b(k)D2pAiM}bdY;*c#I z?t7_3xN^%J3cA}vFZZCE1uGn|$AL>->5%OL+wjEQD#uK+L+DGZ9kP{zLtW#M*-F`t zr`^_ihI?CwQ1^8X*)rie*E?hn1`oTzp`eGY>P81_8hFx862XyXI27Q^iUc-0V6(wF zZgI#|;1F!rR)+$7ago3_2TZp8m{)9fC>Uzf?C_wk1v?!GM-QykF2{m?HqmYmhFP%3 zgO}~~&UC<(eF!FauS77xSq=sL?Q!;bU|vHerwkBw<+z(D3@2-=w$nU;4i@SWr6*Hw zPhffxrJHBPnO;ok=3#NBU#N8Rv^di*R=Rmyoax1tZk`usdP$|52gaFxnbOS@<4iBD zbo0nK)2~pvd1jpHS1H{*G|u#Ely06HXZm$YH;;`o{RX9*=f;_SlhVzD<4iB3bo1mm z({EL}d34BH1AMJ*-g&#g+f~8lp>$U;b@MxwZk|eKdRe8L$I_WzUg_q!bf#BO zx_L02=@pf3o=j(YWu@blmMToIs&u^5QjO`=m5%Ma8ceULblmf)#q`=r$7?Nhm|j=u zc(0`%)9+O}UTmq)^!t>K*?t42H~NX^p;A8VR@SAt&|SK z@(j~kD;vubruR}h#(!_7_fa~=e_y8eQ#!_ff2IdY z$M_$>^npsp_#edd!Ai&YAHwvZO2_yg#`NJz$M}Dd=`SfA<9`IxUsgKC|0_&Sl=^Or z|B*~jQaZ+eGSgF(j`5$$^ifL3_)l~Cxg1li0N(~Jil^<*9cIt;;brms*s48cmKuTnY; z!D^48caGZ&Er8K?c(|D;DPOD;u-eUTG zrNa=s&GZ9G$9O%+^g~L=czuWIhn0@;`YzLtC>`VVDASKA9pm*qroXRrjMopC{-M$_ zUO!^`$4bXU;5gGiQ9339pE5mL>6i$7#`MpXj)}k*O#f2p82?`}{e;pn{!cRfl+rQ& zPc!|D(lP#Xn4YV2jQ>2Q=PMoKzkumqD;?wi8>WA&bd3N1F#S8FWBh;5^dFR-aW3an zJNTXqY@hRVPV~||EBHrMFbvC2O#fNwFf3=8{)^IKSbk;tZ%T(@`JL&1C>@67Pp1E+ zbQqSunf^be!?66r^b2nmTNjy$S3tQhunE>R4xX%<%u?`f7$3|m(v6~lL* zE>#Rh=rS;~jS`7og>ZO3nnzPZucpMdu|OB!}w?j7GCp42#44FQJHox`f6jv z&{vx%hQ8WVG4$1DilMJQrWhP$bFlE5w?H_oTWinh?J$)O4yp~)pHn&2Of(!NP0WUFqn5QN_^zdMJke*Hba{zg~)=|MgZ3{jZN==zo0`L;vds7S^@D z(}P4i5e}F*z>D}@8Ok}3iG#d|Uzj0rFcXJ(F~y2QnK;ag`0*LaIh=_vdeMAllzuIT zi6gw2W^=v_5O&E#C*o!9xRaTQ^xx_TStr2HC>%depGgZkS6qOfeV{fN?ZJ;0jPc+n3&whYUxuJ8<2*QP!FUhw z;}Dc$f(O4^Fwq12Fa)KTj8digTOiu@Jky6)_Z`T+aR#PgNrQK=mCClgUrY#fY7dOcH$so z4EAm^S9pt~=A#KmG7Q}6p!sORk#z)VK?)f9ne7ON$KBx*o8x9}H;35iso5LMf*0SV z7`*sy$@U`M9>=T&PKaiDfS(Pa6ng>aBL(gklQBoi@`=JvYwvT30{p-TrFhi=vrSRv zU3lKtJVWj2)8~f1?v53<)mC#(Z#Zh(YKMVuI%wN!gK4X`0K>N0k8s#lZ~Mfit@c@C zc)(NBR`g~=LiC_xfpIkSb4Cu>J(j(g#=PTLU>r_D^soo`p%Y5+E&v+JoJg6&Q_aWv zkNk^bVscbdY6^N_9yF}}2M9OC(dg)LNAMd-9|DDE`Y}uTiBD?IX&+|5pDKnKaJFQ7 zG3)xwu^@Dnp97de=rtRJ*%?hUXY}R2D9-3BP0bmd01eORG{Uhn!jEH}VRF8g?O80M zgBB=;dCS+5?Zww?zHuxFzYhMb1NI8;!vy6&VC-zt&DnhCXz+?Pncq9`M|^v#;tz<1 z?eQbR<_zqx&NRL9Cr3?JJv!RJpB*$^_2>lCRnPik(YLA*M$4ST7gwzu;FodCr%BFh zbM;qW3p)m^z4*;jI|gvG{&&X$Gb^HJ=N$;g0A9@g)3Lxzfat+_5AbU~l;Upyv~h5T z{t)<|1J({4#;m(P9wcuwRuz*jyEy z&Z$HUmC{VV8ewzYp_e&~h5I#Lk3?@rI6UrMjF1`VjhM_K$9iZ_nMZ)rezo3OmkAZ*UKcpN)5dv>i^!WR(c z?baT^Twc0=g>cyLof+@qIsMuQ!YC;_zA{y+zl#Rud8SA-U}*H&TNi&Bj8;A#uf zJixDDQHpdA@M9_jMtguC!XhvRz+BPmEg0)l;J2_S#Wc+lR0nI3esV3r5r z6OFSy2rt?k55mU<=X%gD&QyJ#2j=-f`oJ-OIZ=Am4&jtakMZi#{b2+6d z0e+)wHI;ULcl?URs@ADeU#dwl4h9jpz*Q|UkEceW7rJ_pc##vsdUqvuv19gGRoamB zAiUm}dhm3-IsMB#FqVWq{qKS40Fmew0O9qy(u?7>zsiB^NT0sca#yp&*E-ETMtYqG zy=>cG?}2#=lQt7s_A*Y)jtuBcCwGgFCk*V;i@>cOL%}l&TS zRs}GzFBR(%h`r(+v<5TE$KUi4C!%h#Lv`zVl2VrYH z>Ot6f8+*{sHeVBf@OUkpXci__PK``~$9v*m6rS!$Pm9rkkhTi^?o%FPA_-iLXiGt> zhV*GckrwW^m7quq`i!8}LfTr;>LGnrP#hP2yp5nWLi(JbNDHstR#21%`n;ex0%$uy zYlZX$Pm6@@KuOy>Xgf?ow1WfL^pFfC=;-6L6${YG1KPNxcxM+62IKN2M7ubU9T|)a zU41-ZusK3E4~h^#lJ1^FqUe}W7Y{Ej7Q%@KMz5QHwUw+Erm=;J}y zGy8fFj?8`@ggvvr2lz!vDmL%{zb8pxfCuS{9NJ)UsBl6 zFMAL+^eY~ihNd5x126-e9`r#toFSxmPLns6$qf9;)Q78)sTt!_&<~-roRd7Kn@+dV z5iwgZpGrBEzLx$+Epm^?bgFR{Lm}f1CA2q{d@9(GQ|TM%f0Vhh$2K!C6nc=8WiEGH zShAU0pH9RNyp&fA&m7zh7M}lIw^KMg|Aq*Mys76jND;;v1>evgI%o$EPFm2>15BhS zMJEr!33X==!U=U355fs`R}aDobvF;f33Yc5!U=WMf$WGewLMt83e}<~i&v$1FBXRp z?#<#@_Vi(KnApB74ujc`#o-6~vp5W2z~b--17h*2a0LSqw^PlsRmu?<#6VSm!3sf!Y8sF;E9!ga<{+QcDtfnG;jjS2!`1P2|MXb|fdJ zx=Eav`X+N?DxAWJsc|YNrplu@F?CL3gj$#SbvlUY%e0;E)ISo+cEAbEXP_g%0tPw( zEM%ZFz#;~^04!#pE5H&4x&bU@pgX`a2BHAV8R!A9f`Og@D;ekou!@1+0IM131F(jH zz5r_(=m)Tlf&KvN83+J2FfagMBLf2gHZd>=AcKLy0Gk;Y0=MU42)o259)w-uQxC!}k?lcydoG`O z5MH^@J?LyxeBnWO<-YVFymDW85MH?x9)wr!qzB=ZJLN%mGxoD7J-I5yf!Rtf*q!h!s<8JFyEC+d=F? z#dZ?ANHIKOaj{~!A9RUgc)7B;Vz{AELb1KXN-Bm2wl7s|AF<0M%Sa?vO0ki|N-Kst zp_eO$XOON?49_54sTiJ@yGk)UFL$+K_@TsW6vIUNTE#{ayG}9uR^s)FjU{%2V)(Vh z8x?XzVdxf5@#qhLoWw6j_wO2ZxHtxXmj!rk*X9uxH?BtNy-8#7qW2&=bHW?mG?ZS@I&B=B{ zEMpbv-I*R$`Wn)EFukYJ*OA_f>AjsEd>L<6c6~g^v!JgBUs%x3gHr(XvJpVoDuENj z`r?k_0HzO8`gYO>GyNr}2cgFu;lW_K+SFh#J1~g4LEHh@n^y!n2y>I@kul+$M^ZT> z!NPhbDIM9|Fh%Jfl6$78r@Oix!j*5#v_K1S(y7ho*Y$0;4}0*q(+1f}C$ zfQd|>q;zbgPG2s8hcLC-yeV)?s zF2H=IFHky0=R&40QaVQGVx})qI^G3X%JgMQ$GZT_nZ82lczkmu(^n}S?*go5`WmHU zqi8MD*C`$E0<35H2BqU&fQ?Mwr1T8ZGnl?v=@_S5n7&o%xV^rO>D!f#N0N6ieW%j# z=+-W#?^e2b7l`SZN{3zC%k(Uz2E3>}A=`XQymu)M?c!%Bx?d6(%&ln%pklh|4`{LEFUrbW2M8e9B29`N{3@67B-2kR9fsvJ)4x$V9P+nJ|BuqK3H%+?e^fdK?oVEiM1Mv&T7c0@$R0}{wcyusYhF9zYT5CkEQMJ)6yHejL&3z5#uWvU&Z)F z#y2s(gYlh=?_>N`#@}ZA0OLm)KgRfR#y?^FE5=VS-mYS-jS~?L+jtJ+b3LaWNrZj- zG7tvx+%p)9uE3=K{yVbc={x=vbHz>(7fEGwE_tQ0~Q&rQ(sqOB^$K zb5b#XF7BAkI|}Q?5{hBXQc^MGy;QO^)bBFKY#C`-gO_s5mXVG&E$x_1HwJ5#%N?`n z#$vsFg=FKfrn*uwtbwjl4D0u+9kXSO$NKmh$7~tn@im`o6q#F2e1K;iHdtIA+UTj*Xf-9kb=G$HMzA$u^)vl$C5FE?_yyHen%O-Z5LorX|Gg zcFdNs33)3xX47Thp5Q%>*>oA$aH=TT4s^syied0nRt$NoD2C0Os*>%(239r2FlehQ zhCy3HvOU<;s_B?Lk3A@(mSgrj=vM{k(Gtb5Nl{0#y=eQoiY+EqPcdA#dnMb4O{4mP z<)))g-lrJ)ZUe_mopVQ{ehnQnbS}2AMrzaFc-+fXtGiIJr40&5RX6v#EZU3}jc_U#XS~+Iw zmzR#O$vvYOu6b+4_7HnkG4$~^l8wgoeNHhr$+n8&+@6HER>1BCiosqDkZd*j z+Cax_o32H>406o2=~|4B!IEX5E<+^Sf^vsSmWlQoCfQzW@D7(O3;yjz$824)(9SOj zmY;~p!wAPr{qhsXook{{D|m$_3O8Ru^T~0AU!l^boGJ{RSaN#Kj*eSrP_7 zl4NO^JR~cI!JVQQ%1BiVcQZywmW~-~nquf+>55_SjFxOPI_DV0;5f%Bh6_DTve~!` zFkUejt_hMY#w25+W9CBVFGigwDTa2L?3lgK%h8FaIA-&%K!=^`m`%45*Jzq#t5EKA z$u{AR(+tTnaA#$vW44S8OtfY>X3NMx8_bq$GdA4kNVW|Qajs+bc-vr*<~e4Mw;k7a zzGS=6ehVD4dG}zTEOgA~&BFCvR&9qqhIvKhD@t0kKSXRt=HIWQn=6@x)qC)r#W{`Hd0M_o23 zwt(11#b9hVDYlwehGYxT*ETDLkF#!34A*k2WQ$<9wn?@Gb>1%7Qe4X&ieaqolx)Qe zV!ITB!``hJobw*Z)}Y)>$=1#ywpTHfnyoXTkxo>mAB(;pJ!0mA!A5rna&^GAF|k`kCy(@EyIrxT}; zUW@6qogVZgUrZILeHH{^RP69d{N_gTFE{brt_g2|+S^^`CqnjRZG6mMPs$#G})g&8*nMQTVQj&<(kZcsJNKM6H z`D#g)f>BjlFS`#d?Zm5W80~SeE*V!Q$Sh7^b%k6oVCMC|L?D(EWo?BZ|SpJgOMHY-7bR!kZ`tYtvLQY}GVVY!b1@ z6oZv(t{5!KmOoTCEg=7kfrAcPBHZHwu)hv{JdiDfbA4Re||wR^yl`9p+9#}4E?#IV(8DE6vNHS z&R{T%q<3+;F{~$3rV;C^7-qBGBuhiz?yea6c2qI+#U6^G-}O`sUaps7*e>d=7))m$ z$x`5{`bw6DnRP$KFgxilSqjnxiebh#K(R%{1}cVrJV-J0U9r@2Ir=)mesc8xJx@nZOJ7wOI{O&KU=+tH2BSDmF$}Wt zilNg@Pz*N_CxV&58i`IqIGkNgacP6jc8WCBgRT}#bHKRxGdtl@rVExc7mJ4(f}Pn3 zH#1W)bh%lI!S&2`%$Se7X}HXD91FVGip+JuBs#OxOn(%^Tw}gtrouVPFh&+QX7c9D zgN$q z6lhUR(?E-9IvVr>O~-;>sOdP+i!_}8daNvCxe#IbP8xmNx$A?+U!zE zze$>fw3jJ5b{S|XMdxRNmR59SI_Tw!Zkh&qg{0pmtpmMM(dj9mS1G!{oblC)Zd!%3 z*C@JcE9kY7{wLX-@pX!hGuPsJMW>r~xIxlymzp!a(NlE6vfs{H_U$55<(vK`{AVr+ zk?743LML6uCo+8(cekmowYo{8S7C=Gj}w@HeDPxN+4&+IlWeutzvsq2yUPD#(~ zG-Ki}NpWwQ(w3F<%&z&MnXZ^1=8LtY2I9Og!+=6$u!sP zK1uVp7z@`x(wy<8M>Ui*Z@KAF_e**v(_EnkB+XAVt^S~T7B3G= zwhLQGjT{RGT95RI114kM20YpIC|KxRTR1&Cq2ItRbc827h*Yg|j%h}<%E2)zqD^r+ z)_L7Mc#;)Vl?r}}#j8=gC5u<5_|q(2gW|1Nye7q;VewiNZ_VPhDgG>r*P(cuSiD+g zia*EVRVdz;#ZkZKSse9i$Kt5p3oMTMwRiDgs=X8)JeXlYM-OIO(8+_j7IgMtsRdm; zSY|<24^~>x&4bkzboXG51yK*ySV1os{JlJSKZx1$E(8mGO&)`34r6L%- zC#_T@Bi~6Y70JkR(n>`#@|(0$k&L`1tyBbq&!m-#WaKevr6L*mOIoQ&M&6QEDw2_} zq?L+b@RYPtk&OH#tyClBRvSG!bu(+uoouTgM${NIAE?6JRz-396O70;Rk7L;+RcGUXa!%js@NA z!O|VDiOBuY`oS@`r8&lf!8X@e4~APX&VykVjQ3!O1rt0NZNWqj`dBc@1H2%3oz>(34!ZCY1 za$~fj5G-#cI=~#srs4L`T*rdG_Qd8nU=CI=ay2EIFIY|rPIiH0XpyseX9iDP|Lk>-rjdRD+u0h2aCho?PPIy zyIm|^o#MM$9NumZi{r#ISsW+6m&I}7SuBnd-xrJ5fH!{C#m$|BDwr(OO)~+jTKKwv z)hv8N!0HyhDPRo?-x9EE{4BL7iD+X6`Trq6deWF+fu}>Alh|gAR8?nz6gO&VTF<9p>6oa++Qn9_nzETV~ zPftje49jp*F-$B@DK?7OX~ocY&nSkyryRww&y=eeCKh>$!5if(hOOoT#jr~FTCpj_ zzENyCv2PWFH~Noa*hBkHG3@4juNbzUe^3mwp8qNaZ~3EQ=%+s^hJO09V(6!56+=J$ zMKL(XUll{&{Y^3S-QN|%WbzNi(4YTQ4E^~p$Bbt>oeXFDw_@ny|8vZa%jC_({&CFQ z06nv3S^eSe=Bqb=wX*AW$o!Cswb{@aj)2- zs1T}TvTe)~{}$I%Hd~L9UbOXCcRHCwoZhAXR;WoZA};d^rv0arHk>vqlTserLv1h( zjFT}<3fHNEsj}1s zs83NZK&xEub=%CO(}~k5!=&EeMSDIOP?FH$Zd3|gWx4<`;WzzTp`&5Sf3sI?QQJ@n z^nHx9GG4R|w9O7CQx#mDTfA;F?=XEK9ErDj(bjX1%}m*D`+pUfi`%7QI*&cKJG^50 zPjcGnB>2-i6&`IXewV`3RWK6DDm>ku~wms&Xjz9wp?Qx$MZT04vNG*Hnr5B$Fh8udZ1*t#unLl~yyAurmZjA#z{@V^vTOiaca{aYdPgz3X0Ua{A2 zfoW74_H^Y@l}Ej9tFq8^PqJMQ8+*|<#zO1zns{uF34A&n6*%#xUbop6TPM}bV_Ouk zwcM2Fv44qZ#?WCj_o8hQGP)$9^&kI#6;z^yQfTr(^BkPj6JD|Ppt{5H*o*e07j4~1 zTuphN^4QjZy6iNn1Su`OVvj}&)r|%iD)F=z?a}CbVTD_HY#Wd;I_Bx5&9;Wmc-@vp z1|xKht-XQ=;VS2u;qk11RV-{HU{wpB6R?_vZ3V1u;qwC4u&|wgH7$HWz*-iz7qGU4 z9R#dnVMh<`n%2@zl7{EhS<>*Nx=0$HRaZ&F)9NN^cwXHl4Noj8X?SKmBn?lkr=;Pz z^%Asdc)5B@8lGDpNyBsND`|Lc{Ui;~t-qt$3Elg3pl%j;5b2EgfLOf4Ac_z4@q~^Y z0s@0Pi1fwce{d|`uM@?G#NwTMQ+%k8Cv@&zmB26#su39O0sRa##b0!Bvm(jawIw%w z65*Ew&YiX1E>uPcoU?2t?E{``mRBvPPP4q}=RM1NS(KMMYeMd3EbU+M7(<*kd~-4< zp2?hJcXSh-m>n^VJ~9^XgGNtsakG9qk_ndVSazg0;wiCsPsCGMyd%X&#p1mYPm9I7 zA)fBz37tChA~4#6B0Vh`<4L4nS4uH97Vm@jI2RAA2{v9a><>+FjH-_K#8|v1;*( z-8r#%AH?UncvuG5JjbXE#OKH2oe*CTi}yr)p^qo@Hp5|240JMJu?G5OY=>iX48(WF;yn@H<>EmH+d8`)po$Km z1bbrfK8R;QKzF(5o+O z&j%hvdJU!chb|t}vn71wKz2g!D6GQA4DxT+udl2ad z_xV{YJ^=C0SsdNzi&%UJTJ%d7HzRd0T?8EUD?vMi^n|CF_*KCJHneXnU{!+W@{ZMm z5!4L-J8$oJN|aX3R^haO)h#?DU=0g%1gvRcu7I^H%oDJ-h4}*3v9Q3y@P>$KmaioZ z8|xcM(OT4m-%1*u)qf-nPwP8L!}I!H((uH7kTg8A|4JI3+K-Zk=k}AJRV&;2{w!&D zZf7M8&+QjU!*lyp((v4VlQcZH-z5#t?GH)AbNf@$@ZA2AG(5Mz1+5mI+y5jD&+Q*a zvlF_}0 z^yW&(^I4BGy@k`yl1+&FdN#hi^#s$Obb5Gve0l3Brngi&zP$A`(_1MWU*39#>8+KH zFK<1|^fpSzm$#l{dRwLA%UjPgy`9qWwWAl9-d^c=P`m@vJ1QMt-s;5k&PvB8{kkx{ ztJ3jFziv$LuJqNUN15J3>G-5yPp0=$IzH*wo9T&CpM%allIclGN9RsvdWzD~xl@@w zO6lm_X-rRdy6ss>|C(byS;_QqN=N@5&-4jONB^G4^hruLpR9EHxx8eJ zAc;mqw~}NB#$on4n*Ma6fBrvuJR%Nb<|q0PQryhAZgHLCm&89s579R-hndwBRWJt5 zR97(R)0B>ZGo9%(ly1I-$@E!DH{Zf!`W&U3Z(%Zhp3{RY`vund9=vMJ%mSY}68#Nf zGyfsGyE0}QZ$&s}JLh3|+{X0Vm5$+Y2h;C#y6qnGFg)&JdReF2?lBL;qa4%AD;>k* zZl+gII)=wROs}Z)jigs%dR3+4!+6!0UR~*UDXa$5YbqUIw5-MS+DgY4E$cA7uF~;E z%X&<|SLyhoWqqdKr*wSLvH{Z@N`1cZeN2Bq>Bjdl{UN0r-^cVuN;kfb>5nSi_&%mL zQ98^+Q>Hglx^aI@Z?1IX{+QlE>Bjvr{Yj-8_s8^>N;mG0>8+G*+#l0hE8Vz1rngbL zaeqv2t90Z3nBGq5#{Dt9z0!^QV|quW8~4Zb&Pq4#kLg{NZrmT!yDQzeKc@Fkx^aI@ z@1=C({+Qm!>DIo?$N28c^nOkcQpuK+*q@2RoM?^D{N1DvXZnju&m{dNrjHQ%$!)lW z^|D}J&&Pm##pOAdKdKpwq8c7MZ-1013tnI*0 zO2;sq&-4XK$1q&T^hHX?FkH;^B}&IIT*~xiO2;r<&h!;Z$1q&U^i@j7FkH>_HBJwP z+sVRO55BTsod>5aSnq)S1pPYdVjCO^a_lAE2oSEaHaXFJf&CC3a>W>8~ptL-h@&zbW+vc$oMt$AWy@aQhuF4R>-o9;bL)u&)>56Bq};!iGDj zbbLkQkk{#x& z;ZxHTbd{?N{rm&M<|vV9UB(+SK9uo9#`iORgz;>~PcYtcby)7XJWZ`&GUXWjvnBap!db!eO}=F@7oIr5L}O@iL6x#dul9D=}W#b9!kE;il9jgA~kH=&dma zY`@M9wsTTkp|#WoOoMKL^wlc*S;d>yG69^*|?Y%{TB#kLSjQEV%*RK@T} z`zXb>6H8MJeJ5QpJX|$eG0bDfD29(=j#Uiz%*QE)M`gwi_0lGIwo@H)Xd#pV%PuNa=D-JsZlb9uOU~0n z(%W9DFuc#ONii7K48>qrH!B9ix zD+a^5M===IOvPYW_bLX%nxz;F>psP>s(%$MoOOJMF#W@V{s+eYU_5SJEd8?MvGkh| z4v+ITYkmd>e7s<}b77Ptjs>HvQ%-QeX54~|MFh*;gOONN zuroX135p4pGZ7c^0>^@hwt$NqFa_i+$H6XkEC^q7y~F{V$b4+PxMa&wvl5P-h2PIj zga0V$n8}+r8<+o5$+BQOFB2?(7VLN_$riwWl$LBMe9z^A6(qriUE!Fm%PQFRD;+a+ z$=!;vf0bZ)$*>z&OEwYf%xeV8p9Ft&tzZSI=*HJcwi15&dcn@@MqO?YEN49Y?~Q`x zu7jVsNwB`gs-?=vgI%hcL+b5lmNE$ISJ}G2h88Cs^)0*!J>{*=w{7ZF;w0d1Em@s32H@dD8zL z!OmpC|5g+%XB6fyl_VRBwyG>x?o_mW70K4ZmsJ%k&peS>O|rQ#h1DGkUbZ8xh6Cor z@@JuPH61gJl0O@crsT;>t`~vl9WY%#e=Q1a=a}i4XLe$p@`7U~UCu^~-}a7~bh-4+T>1*6VC*Nkt(yDX@HzPm>eeymOB$Os}#xhp+Qpx%UgykHcGI98JJb1Nwym4(k0uC-aT5fJy==l~}4>(S;^{`Rn1$>iGt;h!t`d6WadY-CQCL2Hgt+) znOF@?6)Z0mJz$z-Q^2N6wh~TehGV9O=Iy|2ex_sQeDg=5SIm+u6Dz6Nl1)Vqog-L5 zBI-9+vhgT)o?toYxES*#8-u(HB%6Zi>q5cu%*$?z1j}EFp10VsV2-t`OB@J$9vWq- zWc$#KmkE|T9yV{eWE*g@D+J5igdVz5GBZD3B^bS;PU%()mNOUje2rtl3|rx~4%iBB zhcQ|wSZ*S`)Ox}4CTu>(w17U1vVe|0@Vuu58)RXVS5pNxN|uGLx=FD7kr*}^f)%8r zyKR>S#B%2QdyH&D9n2u}{>`WHi{dU3fR^UqQ5UgMn%H1j19C)2wg5@S-Q)0JZ zXLjQ}_6U}fjPuQuY$M9uE7>M^$}GpskjtHcmD@hY+!Wwd2h5evOPfH6UXyG#`uOXD zuD;<$+G1h=bCEE&PdQ7kaGbeb@vEYPlfcG7+ z6-md*ejr%EY;=ha1IF+RVPY!V#!SCVC5(s4qt+*z2)pOkDqy5cFxmaHOn zS~Bx%8)pQ|n}qu1NH!C0GFP&_u!ebpCQ^F0|xIG!Sd5^F@AL{c*!=(Zw{D7$yF<(l##HYQ$;KuU`%^OW!xVoB zmcJei@V8)R_8{;71j`=>>;8{mIq7JqxIet^F zCJ2_d1*`TVg5_+$jIyX;xm&STC??q)c!moE%QwH7a-n0vNZX(nIbeI4`Jt+d9Sf3e zqDvgGXRrsgEiRe)hI$FfW+u|+Zb`84Cgx>Mx2>}nzXDQ<>7|99JA3Q7CID4}<Rm0_T+9Klam?h+TLwRMtz^q_yz3N$p}O8N zTgD0)hZ_Vdn2&C7qhq#=&6uLyU2|Z{@R_S z-^TPigkF#c7jma#=9mS^cxL7Bb8AR89vk&FC7S^wTT3#t%~;zp z({4GlalUmVGr#**S2E*`>PeP?y4>qn(BBTv`VN=|$W59?iSBdE6q=igLK`?{(~W`) zY$#dUW@7hCX1+B1fMfP}#@#*Wm_6PcG|EGgErG#$Sh8)nXpJ1R$J>di=Od2U<7L9* zJt|mUDlTqg$4uV5bj)R%NHz(1n@Y9>^=sx>aLP8`V-DDZEyt{_xnk+W9#;(RvxQ@( z!g6ks(YPg-J9kY4YVCvb*F`I59(mmr?FyGFo zT03Af(s$8mb5F8eI9MCW_TutC=a?xVKM|L(tz+hR`DxglcwRE|G1M0vvw0`O*|&Gh z=3R!C>)@D8XMV4(qh#w)zfOu_M%CFdd%P|1MqM1U$J>f4*3~haE(<=pn`6N`+fdyd zFc}NX7eS+vEyOIVhh&SeSm^1PDIj+w7Tvu(D?$^1AC`?phwbelW(E1_v&eGx0W&v1 zX}3=3XLe$S(BCmrv7Avjc;J{RFvkq)0fL>$LU$M_SWYUg;2_CHA>CldY#C!QTN$Dl zW;H_{3%1x+8|Hwm$n@!yXt-ncU}i!1qGL9lu^KNq7A&QMoy)^l4USNXMx`j#dF}j< za3$H&mu#V0zAV{ttWjQ34E8fovemFBBPCl0o0=rq9!x%y6~nqJMY6qE&ZJ6~g+Vn+ zu-s%!NYflMEt{JPYmx4lIk(&tbokMZ1>5aq8smUXl)8u#jdd*8VH1sWz$P-A8RI3J zh*p{)*(5A^CrUOMXFo}@=`f0u9SfG(LZ^5z$%3g4*mImWmvT*W%+}1zgr++d47KKU zh6i))k!E_Z*n(LO*u(6>p=Ud0i`#<*$Q;LlOq+48113>kB4%;(91Hf^MDramN6%Y; znZ^RgY{qnq-Gz?XbYn0(TI5);(jIKF12*Gi+>=@2n9Vp1i_fKs!5S@-Y!;>?%N4_V zY=vXNDqHAE2W$c6XL43KW-DSIk610)d`y1VIA-(ChgDhYn9aKs_eRz^X49>~iLG}m zc-2;9g9A2E2F_}uWZQ7@HaX_JU4{cTVYvq#_JfJu};9({GIWD{{wwmEi| z^2O!Phs)XSn9aK!u4#v4D{x(QIu^WP3*F^_&A0}xWVd6%TAOH(1OM0FeFs@leDCAG zd&vkYIZ05=ksJgC1A?N62^9mVh^`R_F^45*SaOCX=bW=S2QUKaTXcy=%!=vTPoLAz z?QZHr{fhs7RZ_*Rnb-8p^vpTk(=#`$6taJ1dV{m%B`LI#FiK#PgI~;iYTtbH9-Eyd zFH52497v%>h}rYbl2@eA3l5~v1`PIJbk+@9-`^brgO@_HKmPr4X#H`KeI>MU81%pD zEO}LS`Wj)L!0QfVkM{3=zu_!-O$xo~z*cpC9@_0&&XU)q(Ay5A&;msI9cS*NH}5*I zzb<`X+EkpHEit0w+Zy8Zp}5+;=g{sWe-T>S`_AkU?8-sk{ed%EZdVSn=|g9->zVyA zI{PTX<+4mY)bV^33XduW@6m=VSfn2s<~f0}801ZqdRb7xaN%bU+O z^J#DXJ~Ll{^94G0MuCDpphO`;y6eM-yNcIM_L_PwKEkVbI=cvVq=!+)?bM#R4_ADM zbSoPp?ySqjh?|7+A#Sp(R|s*%hxme8MWF7qYEal%Na!AO=Q$oUE<&}R=hru(6g>A`?HrTRf9m*(uHrZ}B*Pf(vVno+dD@ODm zwL={C5wK2(!!6bgafHQsA&#_IKg3ZM8-zI8p!q&9P}8ANSYWJOt8s|qES?+Uc#BO! zoM5qOh!YK(F9`#6r{{+SCffqdyaLU`0(o|`7lb&~u63ce)2|G)L!4pPYT>PQ zNmyW(U8`k?vn{p?agN1HL!4{zvJmH4Y#rjLkI;Kw9^$Z%a811;#0eJLggC?El_BPS zjONpph{n1dqm!#c!dRqTNEl_b4`>I5Keq<79rsVShlC1u4haW#Pe42HsON!@a9@~& zgbUOoA>n%PL`WE$JQEV`^?HPaClkFw!q}}(NcQd{B;0%q2npA|K_TJs%aD+87c@L1 z48cZ+g!{JfAt6GO9oerh?!bx8b7cF^9SGWtfIdNlW`%?fZeBn;5ZXlneS$&6l92Ef z)@305Eb@z()&~22P;>_dXCDXj2?DS^B!uackZ@{0bChh6FRuO1fj!JmFbLWi67KlF z3<-mbT_ItJvCok`i`)Aj?owVa`Py8{E1F*mKe8M0uiU=u<$K$#ZMa$bCc;lJy!tM} z?KlqyBDAOQ#~5)Ee~uBW{~99>{||@1;Ig!B)^?nxzZ}Z>MI%W4We&QvDWc`JEijlB zBf^}Ha64jAz+v*Oj8O|ZaQnsZvrve0>`n^Dh@BLP5s#UQMrik3EJhq)@ffl9qe7f# z_g*4K?7d`+*!$5D+PxnWBldo5jM#fAhmsrf?cPf}l(RJ7ZnI2`*k;)nvCVQJF4%_3 zmyghHvqFdq?cOU!XiHWKagi-q*`ZW^k=;=hhf?`PcJ<>zTy9sd8YAjiEk>N=>Ji#) z)(CN>-TUzo+L9-PxXSLmW{lYTi7{gDCq-ztd2)!W?cPs`(3U(k#5ERA3vsQj(&-V} zl4pdt&XzngLR<2z0JnFyCC`o#hj~tnILulR+HKa35m{F!Mr2*x5PR4YQZGWg&H6E7 zn+;;bHXDZ6)ApQ=Vnm}En~#qTSaL1eyKy-w72)R7l_MZ#NJyw zwC#O+AG`OyJT-DbNOaYWb0h$FfoLc8}HW5f})k8!}^h9UKn3(dv4`w?MqA* zZVqv&#akT83FvR}Rv>Pf?QenB*gj}GMz$Ry9c;B@q(iLU7U@u{w?~?5^^Qn~**bKB zVmKm)Fl!qI#COJshjyJECI@8XahC&Kbvp)3cRO_BlWf8dvf4ckWVJbVkN3uiJ>KUq z!80!d_dC#4?H(U+nEWcG9whuG(8YnQHqY+yp%}5p#9{KMtlHIqu4?!Au*2jpDb zlV-B&NC&#At->gWNpmSRns9-@7{Ygw2xAG~3ygDMH*9W=(1DJ3=-TcC2fvu@;%)^u zkrN#zKgzZy5q=VwO!!$~3PGD_o&(wN9J}GE4wK(ywP}Pu1f~-X3d|sAOPuLIHayR6 zc$P!gdS(-{@3JA<26cm_GC?v3eP*`9gp@_gDLQ#Rmgkl0q2*m}K5{?pB z=0F0s(gtq1!=!|iT0tl&u##}Jz$(Hq0;>tf3alZN5?D(pBe0H8R$x7$oWKS`d4Y|D z3Idx56%8EjGTb0(WlDT?#FydC+*2jl^>c*E0?!kw2)sb3Ch#Jmy1+|>ngTBqP84{B zaFW2Q1nn+gBWQQ|I^lF#0$T`m z1hx{iLw%1>PfEN`s4wsVp@G1M1npTra`1~OklNnIR_vB&~EmB4x~N;U+y7}1A+?J&_C{Dz=8_$@&b z>N|o4@q5B$awrD~dRl)Vw3ZS-IhItQ;KJ=F znHAy!TQVIZN)`xlku6y;MwBcR;!0bxaEvHfB*ay=WYHK=vRH^K?44Zk7;z_eRE!vi zlyI0_A&FDcfy8`;9YP%);&O|}gt*e;u_3OqSju5?rR=0Mp{+m}!c_ug30Di0BU~d; zo^Y)|1;TX#6$$MGDiN+1s7$y)pbFtef#V461*#Hm5~xPFS)e-M7J(XsTLq3MbPza! z(9yu*F3k;-drXOI%9v6|^vSuJ+|zBc>k|pL3!Fr_L*QgWCxKH4cM6ch&TNc2Z^xMoseR~nQ zDrR}&ea#_kOJ5taJj=c=Vsp!fCy?z9W&4QeP__?=LN?X2&r92fywE&&LqB%Yp^WE8 zH;24@n;gz9G0Qsuw;sZ_cKyDD5HXphrCWpKXE8ymrowb*vL}>n|A=@D4%g`E4aOf z9_6!+Z3V%$-Z_q?bT5rgcgIp1jGFW~lu?tOF)y%sbxjg8C+dAT`C@Z6A1FK4$sFJyFQ zhkcOWDCuG@TN{pem@+@yAG$c4>;(aDH*Z2&UKp{SkVPR6(2XpPSvImHV%^BnkWK$# zceyNNbS$Xg@{p0-;1!OO2V_vOlJKCwDhIaf*@m7JE3OWBdr##xj-~%HZ%El|(OSpS zf0>Jj-N-t}QW|Fs*P`_yW82^jj+3rZwT*;CV3Px>tJ$~R&E}9zM`roCfYCQtem>;x zdSovIY#N_z`$fme!%~Nr2=@!TOt??r6$esFBsk9Ks{!M^Jj3Rfw!yZWOJ~1}Y5nBS z7P|SAO0ep-mD_vS&kp?%u(`$v|47C=N@f7pOCJsW6ffv$4ioS4{2VO61;YHtr>1@h z7GTFn5VPRdaKTdZbfTYqv-h`f!CJFxdDQZIuwZ*XvqmqwsXw?t$1%NZe{c|N-x50> zM`3ooy?+gNFf~jy?1pQ28~T%L;O{D%)7z^CUhFz}Ao3S?WY5dePX=L;3Bli3pr<|c zkD1-dgK#mMmM=apcZFEuc&6|Y4%pKNvO;h9zH%N%^@w~jNr z{V#Ly6}P%D9N>`8k8kS{Ft(*w{tRv}Qw$ zT^t$ym`n?p-VU|Iv}DOmrg*E&>@8;YQa78Fk*Zulcv8BHwglX8nN_X=;4~(W0Mgl4 z18m66S2|f*v+6p+qq2HC!s7zh6CM+|0bqCVgusm~p@DBt(7@kBcuH2eneep0EdaaG zX9R8~JS)(_t#UA{ra8=xnc0)g>}_s#N7m_wdk)b!>1#H3QdzUNBYF;TyW5ZZbow0t zRQzDpS*9MH-1382P0j3`nc4HrY-cx{R7E(=Uv&d$Z0>do4`$tL%4TO~Pc*alWM)q? zv-f6Zo15+2hgscD7q`e}VGVNwZoaz-LoMxHxp}M#OrnDL>ndGgnwk$s%kdNM-C(+- zN229O_eWv=j)0Fv1&11YJT3@)A}WZc{bXDa_*7I7?fvPvAn=)};BaHl#sz^nL=&0R zwyB1?hlDRo^b85VI?_8Nd`P-)NHY!f4{4U6!H(?bT({wqr$a-UV`zjU`^nF3a}AAh zBrDD{G%lq1h9-rCJDaH?;Tg!xkZ|`tHzZuh=ZAz(rz{K!;qB_BA>nh=D??gg zXl+O<4Q&hw->P{&Bz&di<&f}Qjn_lM$JpNv2_MVe8qoIchCU1l-w@dz5(D|!3+2M0FRb|mGLv z7$Q)Z&|9F0gM(S8m`xUSvu;RHjG$MR;)Fi3g`)`i^`R03y+D=(po>cS%PL0`a^)g> zj9cYk);XpY$8vdDSze0pwb_g*QJV0DKp6r~m?=?~P)@c{j!<5pJfVU>1wuuEiiAo6 zl?asuDg$hY^lDy(px6832m|Ecs}k%b$$ZL}Fwm4Z%(b+Btz@w&G31D^rPaA79ct7d z43)|q53r%STu$Q&gf;>-3Hn!gP9$6{B~Bt-D{wNQoxmxC8w5@zv==yyaI?Vagj)s9 zAaoQslW@DhS%gjkXA?RLoI|)9uVC*4h$)D2362e~sT?u~+JWTjUpc~;|fkz1V z+s9@vj}o#39wVd$9w!tKc!E$+;7LLufu{(C1)e4p5qO4BRNz@cF@YRHae?lHqXc>o zN*FlY)v~ALl?8?ost61x949b>P*q?gp_;%bLUn=Bgc<^4 z2*(SIC7d8Ij!;uzJmExv351gbCK65-nB+iv4BYih4$c15Xs)X zq#;csj1-to7$q=+Fj`;4fZ*bviDg7p4jlf%kwE}Mw)(N~rSTFD{VFMtYy#=6qe2)t^O6m6rn*=@}Y!>*C z@SMO$gy#i5CcFShXKw@O9(Qozi&FX%!b<|55?+?oKl4`K=@!~s^A~Uz{zXW*LVp<& z9>e5=?C9q+Y3RGcGI%(&J0x7!_c*fM%9lOx_jdQf^lxx7bP&Q zUefbZJU`X*CZ0F-{Cv-wdEUnJww~YWd5-6QdY;P4)UyDlwVp*hujhF~&xd-R>-i+l z^E{vG`4-Rr@jNG;sm~-#Ykl%O-|G2J&;Rl~RUosS6EUsZIm`3bp11YW+iK1TcmMuiyh%Ow>f9F}9SQjB=UTRBGbkyT>E z&Czi&;z@7S7;)cOEk@jUR*wmNLyM>ju0f@!bajlfT>ERAuT!DTUyH@G~;2?kfh zIMLwB81bu8t74pNaCMAR46cbW&*0h^rylN-RyWyb`j*#^_>#6R-Wx^@>tn>YVMB~~ zV`*cI7#D1c5#xu=G2$t}b1|ZWd_G2WkT1lD4)Vnq(LufxBRa^JV?+n}N{r|rUyTtR zSK2Dc5<+7SQpJXI*;r(#;m*YdoR=MU1&Qy)xwjdk=GQ%0L<{a3 zBUf}AB_<$_^}w#f*+3&E%=ETr<&9FB+#A~^JZ~e0PXAP7}36- zi4pDV*%;Bja$-dL>K-H7SC1IczIw)p_SGv!w6ESVqJ8y=5$&sQjA&o|VnqAuA0yh= zfEbsW(>M^Qr*TkR0L^M}jA&LvVnnkV8Y7xjZj5MF!(v3U8Xn_XQ@s&Dt=`DE0EQc* zV#LqbjpkbE>@k?uCN|CU>7Fn1e7WcAJYVnmM$c1)Guv-i#ML&P-5k@p-*%pN^!#qm zbLb|`Fm0Q#xhYM(nQM--M@YD(>*)xOaPic&mxFFt?G3c%-j0%+@gcKxb{~MA(7tY= zlt-iKM>0>kQeQ1ZOXyFtn?;Km5E5F}Ku5`~@^Q97gboG{cg?MrY&O^2I^~b_Hgd4r zlf7^LViiu#5E?4|I=Z`|A)yb-4d@Lt++hK|jzb$B60YbY93^+i(T;Q==Mw$nC`ZY4 zQf9ORDTD5EOhB)rj~N@#8@&vT3khAx_>j<%OmLL+)902Bh&IBLF-V+D zvnLDP$`q2l)ta;cBjG%v%>=AEm89h`IG*M(IZ=*$x&wRUucKp_5fZwEnT`^Ddux^h zSq+!e*(BW`hS+l)CbyZ28JO!pR>Y0PJV(iWQm6S2BpT?+7lef5Ur3S$fe0<4+0y`8 z>?nCaw!XxHJj+>%zIG{0+ukxRx7!$Mwy``Uyu-92BxK&okdWA`0(v#a(CUzIYqTaL z+!(DT>B+=h$hsIOo2st|+NztUGDXd__H2bQtzOjgVxAZGyn*KpJ#XxJQ_s)yyqV|i zJip%aDW1>ve2M2fJ^#t`pFRK8^FKX5u2|-Ht7BTv!?~U}^Srs|Ii9cae1qp(Jb%yg zg2glYEre;^ZxPQ+cwW}?a-LW8yprb)Ja6QA6VID@eyQheJ-^ZOj-Kav{+#D~J^$MC z-#kwprN?`?Ye@a%d6UBvj_?|i&TfF6Xd*XuJ2Z*k&hr~Q@9Ozuo)7nYoad7~pX>P& z&r>BbfxQ&d+E?UYy0y8C>0__uXyM&sL>uoBBU*XS81eX{SB$vM^o|joexDf8!}pD` zufcvXqHpdWBOZSYh!Gvnz!>rPV^EBE{4qF2JpLFGBQ8%vV?;-r8zTl-!(zlJVt9;r zY(64JJU1U1<4A*}VjN{~bc~}7j)@UBZDV6ZXFo1R4D-gvh?}+vF=9|MF-D9+CdG)G zw#hMKz%(UB+_dGzm}hWmjJTdnixF3}=`ms;IwM95#Ae2bvFNNAaoL_7BQDZ&V#GCn zZj2ZN&WjO4uK6)y(6t~&+`TP~5qEEkV#F|Oag4ZoTM{Gg-j>FQrz6W^TxPngG5e3|Eedw%LMneErY zwAQD+=UqG>;Q12I-|~E?=f8QLIySTYHkj7qy4v$cJb%{njh=7v{6){Vc)s8B1I`b3 zO>2<6Xs&4mD;(Ks>!&s%xk*7HX_&+&Yx=U;gKi|47*nf;c= zwC=Zz=NEdO<9T1t`+45q^8ua@@qDP~lRcl}`8>~;c>cBL2RuLMd8$n2xC&xgkE@X9 zB|SgJ^HQFd@%%K;PxrjG=XE@<=Xrh4&-J{C=Pf*M>G`FexAwe^=WRW|%Jb_zzrpic zJn!UrXV35Vyo=}EJWrL)oadV{t>^g`&u{lU$Me@b-{ScW&vVLUw!aF~y8Sht|IhPO z`Aqp1nAY-bJ#X)MN6+u~Jje5OoT7-LS45o635F=C84Ge(RtXT^vy=Ij_T#+(x)#+Y+s z#29m4jEDPPc>RXS%cifr{|Nh9GdPI%hQaHC7%_NV7$XL+i(xLLH zc-~v4Osg07yrJifJio;Aww~Ybc^A)fJs0)brw= zALV&N&(HO|iRVo{Ki~6ap11P6t>^7M@924F&+qa)+w*%oAL@Co=fgc8;rTev^E{vD z`Oa#Y^Y#a(UEHf@ycDL@OMBkL^Yfh_Zp7RudDZmdA01&Yp3ZLX?Qn_Pq3I-+dj6c} zKYISJ=i_T;4k%@wfx8alK}_p`cJaKM=Q*BVd{U--?m3z5{Df(DB5P&5R=tcj$Fz1- z?L1Fiobi^IWXh-R&UoW{GTt21x}6T5cl7)o&mZu7v**uw{)XpUJpaz~1D^ltdFtLw zeJ;VYo`<%cxA*)e&u{nq4$mL+{Atf~>E_Q?KVbINnj@sqYw?uhf*A3XAL%F!}LJmqK=Bc5_x8Y7-^ToxmqaG^KY4|x8g=cz84{r=uJv)@#|jDIx9^T8P}hH0(mfyEjB8Pn>& zc>b5?e>*?ig`#oty17s^t9Yc3R{r&Nm|BvlV9lkO3f9522Bfa%Z9Tun^Xois=Xod3 z@AkZl=YK8B>^HR`v)_9$ttYID=TCc{<9UD2b3GsL`9#n2FulWciY5VPcx6)WX6kS@ zrnL^WJa6fFThCweJhdgWonJAn+evNB_$ioHKaFmh4yIe9!^TJP4@~Mk#{5TL+96&r zRu^>Sf)cWZU0@cX6T9vIT8Pf<_Wx@kI<-6guZ8H`I{jY@@hJCBEYuY0ifKK}C+X%+ zi5rl^?6X#nW<$JSoi5nO1#+0Oh92goc%fZO7jBLh+I^XYI0w(g3*DNF&5=Bhg?c1k zW7-Asy^LRiY4ztk|G@K|p8xE5>ix`iuE(@)r=#bO)6GZ8KQLulnE}g$erA;vxk7YH?A5ezmw5LBCpDoX}A=dKBSyff9sH z0woFh)#9TGcT0(52>R9HV+s1%i&6yrYH?|Tezmv^LBCpDmY`oPE=PDoc3YmHUoEac z(61I(B7ja)*|$aN)XqXGW^(JWK z`Vcg7eF+-5egs7BaM!)s$=d}}sZy1W>^97NxQKhwlo&wJlo&|Rlo&+Nlo(9Vlo&$L zlo(3Tl*lD$N(>`tN(?7xN{k?AN{l3EN{k|CN{l9GN{k_BN{l6FN{l0DN{lCHN=zVV zN=zi!lt^b!0%+ejnF}==rVwm4n4dH7N>AfL+hWt%)4hc=xljW!i(mth&Yta+p38-L z%I6XEl+P#VDPKUar#zj#5TFOLhzs>>FDB^OUP92by_BG5dl^B`_Hu%r?G*$)+baor zwpS6f0j?%!16)JUQ@)m_+P0U@-rz0V$c5TEHW9RSY$j+>o+D`Mc%GoG z;{}4Yju#0wRO#%O09wD7xlp6@3PBsjs|0NruMspZxA$8ZxS?AZxJ+9Zxb|B z?+`Rp?-DdrTL>Detpp9#djt*D`ve=R0@)uBw6FY-VB=LF`y+yFGv-gW6EtYs2pY8Q z1P$5_f(Gpqf(GqVf(Gp~g0`>!5wv}MPSD8hBxvNmAZX;iBxvOF2^zUw1dZHof<|r+ zK_j=9ppn~0(8%p4Xym>kXym>oXym>jXym>nXym>lXym>pAaaMhsMSf{H5aufj`*T> zfP2!E_<^7)@gqS~;wOTp#LomxiC+ks62B5OC4M7lO8idHl=y?7DRGdXDe)&kQ{pdz zro`U_O^JU9niBsKG$m3Wn*O9UPP(Q<7C}=YP0*AmK+u#ZNYIohM6fB5&MpklUaJTf zYBm%lXf_lhXge-Wut7^_9|h3umE=MV&(Q=8&oKlI&#?pzPbq?ir!+ysQ-+}7DNC^7 zNoSV>Xr0P)p+=?xK_gRGxa(QnWNSh5_Y98sdUiecq`|#`pe^!7g0{%^1dZ@b1dZ^`1dZ@51dZ^m z1Z|NW2-+e$60}9$M$i^{J3(9I9RzKWod}u@cM>!kIukS-?jmS5+)dDI$R=nu+(Xb7 zc`rd*rT+f^&n{EdJ;5py$Bk) z-UN+YAA&}%FF_;MkD!t3PteE>AZX+U5;Ssy2pYM;1dZGff<|sAK_iz-(8vuVXyk?y zG;$*d8o7}Kjoc`LMs74gBR7ViksC|U$c-at5=>(1341z{(CP5=Ni=dI4P0+~AA!y|05;Su22pYNh1dZGRf<|s3 zK_j<_ppjcl(8w(zXyld>G;+%b8oA{Jjob=?Ms6iRBe#m6ky}mB$gLr0M^^*4src#$zHl+rkXn*r^hxyNcX)}edhW}LDyo^cRmFko=E$bTdd5AWrbu#bo ztmmFIB{mQ=B{mW?B{mT>B{mZ@C7vT_N<2@{lz4%lDe)pfQ{p8;M^kZA)0YXF60Z<6 zC0-?HO1wtUlz5$>De(qDQ{qj6ro>wWO^LS&niB62G$r08Xi97$Xi97)XiB_C(3E(e zpegYI0V!e5$A<)s+(!hB+{Xls+%|$nZaYCEw}YUO`-Gs8`;?%O`;4HG`yW9g_c=i$ zx09fe`+}g6`;wrM%O_~$b`dmky9pY(Jp_&1UV=t$A3-CxpP-TZilCAEnxK*UhMvLeR+lO3=vtM$pLpPSD8xLD0w@ zBxvORBxvORB536PCTQgTA!y|OC1~VQADMfJ)+Wspja(K%BbO#<$*xk3bu zTw#Jnt_VRRSCpWUD@M@B6(?xqjv{E}N)R-1B?%h2qX`hG$l?XXiA(!(3Citpeb<*K~v&Xf~Lf2 z1Wk$437QgT5HuyuBxp*UMbMNuo1iIi4nb3*7C}>@HbGOO4nb3*EMBlm@rge3E@eB zrG#98WrSe@%L#i-J2ZP)K^QJ2RuV=CtRjpQSWOruu!b;NU@bvwx{feLN~|Z071%%+ zC$Nz)USJbpg1~0NM1kiBlLVf3@CzOlec2DcWblGB7rYk<8oZYX8oZYY8oXBs8oXBt z8obvC8obvDdP?3PXz<=7Xz<=5Xz<=9Xz<=4Xz<=8Xz;cWG zNYGe)M9^4$Owd?uBWSF)6Es#k2pX$T9B8cY^A?{vOY}T{M$ohPKZ2gL&k0(UorKYH zd|wds417t@=A2K^jMzocjMz=kjMzian(ifNM(iUXBMx^3Y?ypvu7G`y_zJk6d(xBi z6+u(&Yl5D&ZwQ)d-x4&{z9VR=eNWI-J3!D>`+=Y*`bWZO3B^wYt?ADM⩓ntQ(z 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 V(pQ<;p9)-)RWjYZn0-S0{{RJqPVxW% literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/codec.py b/stripe_config/.venv/lib/python3.12/site-packages/idna/codec.py new file mode 100644 index 0000000..913abfd --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna/codec.py @@ -0,0 +1,122 @@ +import codecs +import re +from typing import Any, Optional, Tuple + +from .core import IDNAError, alabel, decode, encode, ulabel + +_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") + + +class Codec(codecs.Codec): + def encode(self, data: str, errors: str = "strict") -> Tuple[bytes, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return b"", 0 + + return encode(data), len(data) + + def decode(self, data: bytes, errors: str = "strict") -> Tuple[str, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return "", 0 + + return decode(data), len(data) + + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return b"", 0 + + labels = _unicode_dots_re.split(data) + trailing_dot = b"" + if labels: + if not labels[-1]: + trailing_dot = b"." + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = b"." + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result_bytes = b".".join(result) + trailing_dot + size += len(trailing_dot) + return result_bytes, size + + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return ("", 0) + + if not isinstance(data, str): + data = str(data, "ascii") + + labels = _unicode_dots_re.split(data) + trailing_dot = "" + if labels: + if not labels[-1]: + trailing_dot = "." + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = "." + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result_str = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result_str, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + + +class StreamReader(Codec, codecs.StreamReader): + pass + + +def search_function(name: str) -> Optional[codecs.CodecInfo]: + if name != "idna2008": + return None + return codecs.CodecInfo( + name=name, + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) + + +codecs.register(search_function) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/compat.py b/stripe_config/.venv/lib/python3.12/site-packages/idna/compat.py new file mode 100644 index 0000000..1df9f2a --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna/compat.py @@ -0,0 +1,15 @@ +from typing import Any, Union + +from .core import decode, encode + + +def ToASCII(label: str) -> bytes: + return encode(label) + + +def ToUnicode(label: Union[bytes, bytearray]) -> str: + return decode(label) + + +def nameprep(s: Any) -> None: + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/core.py b/stripe_config/.venv/lib/python3.12/site-packages/idna/core.py new file mode 100644 index 0000000..9115f12 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna/core.py @@ -0,0 +1,437 @@ +import bisect +import re +import unicodedata +from typing import Optional, Union + +from . import idnadata +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b"xn--" +_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") + + +class IDNAError(UnicodeError): + """Base exception for all IDNA-encoding related problems""" + + pass + + +class IDNABidiError(IDNAError): + """Exception when bidirectional requirements are not satisfied""" + + pass + + +class InvalidCodepoint(IDNAError): + """Exception when a disallowed or unallocated codepoint is used""" + + pass + + +class InvalidCodepointContext(IDNAError): + """Exception when the codepoint is not valid in the context it is used""" + + pass + + +def _combining_class(cp: int) -> int: + v = unicodedata.combining(chr(cp)) + if v == 0: + if not unicodedata.name(chr(cp)): + raise ValueError("Unknown character in unicodedata") + return v + + +def _is_script(cp: str, script: str) -> bool: + return intranges_contain(ord(cp), idnadata.scripts[script]) + + +def _punycode(s: str) -> bytes: + return s.encode("punycode") + + +def _unot(s: int) -> str: + return "U+{:04X}".format(s) + + +def valid_label_length(label: Union[bytes, str]) -> bool: + if len(label) > 63: + return False + return True + + +def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool: + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label: str, check_ltr: bool = False) -> bool: + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for idx, cp in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == "": + # String likely comes from a newer version of Unicode + raise IDNABidiError("Unknown directionality in label {} at position {}".format(repr(label), idx)) + if direction in ["R", "AL", "AN"]: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ["R", "AL"]: + rtl = True + elif direction == "L": + rtl = False + else: + raise IDNABidiError("First codepoint in label {} must be directionality L, R or AL".format(repr(label))) + + valid_ending = False + number_type: Optional[str] = None + for idx, cp in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if direction not in [ + "R", + "AL", + "AN", + "EN", + "ES", + "CS", + "ET", + "ON", + "BN", + "NSM", + ]: + raise IDNABidiError("Invalid direction for codepoint at position {} in a right-to-left label".format(idx)) + # Bidi rule 3 + if direction in ["R", "AL", "EN", "AN"]: + valid_ending = True + elif direction != "NSM": + valid_ending = False + # Bidi rule 4 + if direction in ["AN", "EN"]: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError("Can not mix numeral types in a right-to-left label") + else: + # Bidi rule 5 + if direction not in ["L", "EN", "ES", "CS", "ET", "ON", "BN", "NSM"]: + raise IDNABidiError("Invalid direction for codepoint at position {} in a left-to-right label".format(idx)) + # Bidi rule 6 + if direction in ["L", "EN"]: + valid_ending = True + elif direction != "NSM": + valid_ending = False + + if not valid_ending: + raise IDNABidiError("Label ends with illegal codepoint directionality") + + return True + + +def check_initial_combiner(label: str) -> bool: + if unicodedata.category(label[0])[0] == "M": + raise IDNAError("Label begins with an illegal combining character") + return True + + +def check_hyphen_ok(label: str) -> bool: + if label[2:4] == "--": + raise IDNAError("Label has disallowed hyphens in 3rd and 4th position") + if label[0] == "-" or label[-1] == "-": + raise IDNAError("Label must not start or end with a hyphen") + return True + + +def check_nfc(label: str) -> None: + if unicodedata.normalize("NFC", label) != label: + raise IDNAError("Label must be in Normalization Form C") + + +def valid_contextj(label: str, pos: int) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x200C: + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos - 1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord("T"): + continue + elif joining_type in [ord("L"), ord("D")]: + ok = True + break + else: + break + + if not ok: + return False + + ok = False + for i in range(pos + 1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord("T"): + continue + elif joining_type in [ord("R"), ord("D")]: + ok = True + break + else: + break + return ok + + if cp_value == 0x200D: + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + return False + + +def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x00B7: + if 0 < pos < len(label) - 1: + if ord(label[pos - 1]) == 0x006C and ord(label[pos + 1]) == 0x006C: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label) - 1 and len(label) > 1: + return _is_script(label[pos + 1], "Greek") + return False + + elif cp_value == 0x05F3 or cp_value == 0x05F4: + if pos > 0: + return _is_script(label[pos - 1], "Hebrew") + return False + + elif cp_value == 0x30FB: + for cp in label: + if cp == "\u30fb": + continue + if _is_script(cp, "Hiragana") or _is_script(cp, "Katakana") or _is_script(cp, "Han"): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6F0 <= ord(cp) <= 0x06F9: + return False + return True + + elif 0x6F0 <= cp_value <= 0x6F9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + return False + + +def check_label(label: Union[str, bytes, bytearray]) -> None: + if isinstance(label, (bytes, bytearray)): + label = label.decode("utf-8") + if len(label) == 0: + raise IDNAError("Empty Label") + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for pos, cp in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes["PVALID"]): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTJ"]): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext( + "Joiner {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) + ) + except ValueError: + raise IDNAError( + "Unknown codepoint adjacent to joiner {} at position {} in {}".format( + _unot(cp_value), pos + 1, repr(label) + ) + ) + elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTO"]): + if not valid_contexto(label, pos): + raise InvalidCodepointContext( + "Codepoint {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) + ) + else: + raise InvalidCodepoint( + "Codepoint {} at position {} of {} not allowed".format(_unot(cp_value), pos + 1, repr(label)) + ) + + check_bidi(label) + + +def alabel(label: str) -> bytes: + try: + label_bytes = label.encode("ascii") + ulabel(label_bytes) + if not valid_label_length(label_bytes): + raise IDNAError("Label too long") + return label_bytes + except UnicodeEncodeError: + pass + + check_label(label) + label_bytes = _alabel_prefix + _punycode(label) + + if not valid_label_length(label_bytes): + raise IDNAError("Label too long") + + return label_bytes + + +def ulabel(label: Union[str, bytes, bytearray]) -> str: + if not isinstance(label, (bytes, bytearray)): + try: + label_bytes = label.encode("ascii") + except UnicodeEncodeError: + check_label(label) + return label + else: + label_bytes = label + + label_bytes = label_bytes.lower() + if label_bytes.startswith(_alabel_prefix): + label_bytes = label_bytes[len(_alabel_prefix) :] + if not label_bytes: + raise IDNAError("Malformed A-label, no Punycode eligible content found") + if label_bytes.decode("ascii")[-1] == "-": + raise IDNAError("A-label must not end with a hyphen") + else: + check_label(label_bytes) + return label_bytes.decode("ascii") + + try: + label = label_bytes.decode("punycode") + except UnicodeError: + raise IDNAError("Invalid A-label") + check_label(label) + return label + + +def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + + output = "" + + for pos, char in enumerate(domain): + code_point = ord(char) + try: + uts46row = uts46data[code_point if code_point < 256 else bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement: Optional[str] = None + if len(uts46row) == 3: + replacement = uts46row[2] + if ( + status == "V" + or (status == "D" and not transitional) + or (status == "3" and not std3_rules and replacement is None) + ): + output += char + elif replacement is not None and ( + status == "M" or (status == "3" and not std3_rules) or (status == "D" and transitional) + ): + output += replacement + elif status != "I": + raise IndexError() + except IndexError: + raise InvalidCodepoint( + "Codepoint {} not allowed at position {} in {}".format(_unot(code_point), pos + 1, repr(domain)) + ) + + return unicodedata.normalize("NFC", output) + + +def encode( + s: Union[str, bytes, bytearray], + strict: bool = False, + uts46: bool = False, + std3_rules: bool = False, + transitional: bool = False, +) -> bytes: + if not isinstance(s, str): + try: + s = str(s, "ascii") + except UnicodeDecodeError: + raise IDNAError("should pass a unicode string to the function rather than a byte string.") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split(".") + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == [""]: + raise IDNAError("Empty domain") + if labels[-1] == "": + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError("Empty label") + if trailing_dot: + result.append(b"") + s = b".".join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError("Domain too long") + return s + + +def decode( + s: Union[str, bytes, bytearray], + strict: bool = False, + uts46: bool = False, + std3_rules: bool = False, +) -> str: + try: + if not isinstance(s, str): + s = str(s, "ascii") + except UnicodeDecodeError: + raise IDNAError("Invalid ASCII in A-label") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(".") + if not labels or labels == [""]: + raise IDNAError("Empty domain") + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError("Empty label") + if trailing_dot: + result.append("") + return ".".join(result) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/idnadata.py b/stripe_config/.venv/lib/python3.12/site-packages/idna/idnadata.py new file mode 100644 index 0000000..4be6004 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna/idnadata.py @@ -0,0 +1,4243 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "15.1.0" +scripts = { + "Greek": ( + 0x37000000374, + 0x37500000378, + 0x37A0000037E, + 0x37F00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038B, + 0x38C0000038D, + 0x38E000003A2, + 0x3A3000003E2, + 0x3F000000400, + 0x1D2600001D2B, + 0x1D5D00001D62, + 0x1D6600001D6B, + 0x1DBF00001DC0, + 0x1F0000001F16, + 0x1F1800001F1E, + 0x1F2000001F46, + 0x1F4800001F4E, + 0x1F5000001F58, + 0x1F5900001F5A, + 0x1F5B00001F5C, + 0x1F5D00001F5E, + 0x1F5F00001F7E, + 0x1F8000001FB5, + 0x1FB600001FC5, + 0x1FC600001FD4, + 0x1FD600001FDC, + 0x1FDD00001FF0, + 0x1FF200001FF5, + 0x1FF600001FFF, + 0x212600002127, + 0xAB650000AB66, + 0x101400001018F, + 0x101A0000101A1, + 0x1D2000001D246, + ), + "Han": ( + 0x2E8000002E9A, + 0x2E9B00002EF4, + 0x2F0000002FD6, + 0x300500003006, + 0x300700003008, + 0x30210000302A, + 0x30380000303C, + 0x340000004DC0, + 0x4E000000A000, + 0xF9000000FA6E, + 0xFA700000FADA, + 0x16FE200016FE4, + 0x16FF000016FF2, + 0x200000002A6E0, + 0x2A7000002B73A, + 0x2B7400002B81E, + 0x2B8200002CEA2, + 0x2CEB00002EBE1, + 0x2EBF00002EE5E, + 0x2F8000002FA1E, + 0x300000003134B, + 0x31350000323B0, + ), + "Hebrew": ( + 0x591000005C8, + 0x5D0000005EB, + 0x5EF000005F5, + 0xFB1D0000FB37, + 0xFB380000FB3D, + 0xFB3E0000FB3F, + 0xFB400000FB42, + 0xFB430000FB45, + 0xFB460000FB50, + ), + "Hiragana": ( + 0x304100003097, + 0x309D000030A0, + 0x1B0010001B120, + 0x1B1320001B133, + 0x1B1500001B153, + 0x1F2000001F201, + ), + "Katakana": ( + 0x30A1000030FB, + 0x30FD00003100, + 0x31F000003200, + 0x32D0000032FF, + 0x330000003358, + 0xFF660000FF70, + 0xFF710000FF9E, + 0x1AFF00001AFF4, + 0x1AFF50001AFFC, + 0x1AFFD0001AFFF, + 0x1B0000001B001, + 0x1B1200001B123, + 0x1B1550001B156, + 0x1B1640001B168, + ), +} +joining_types = { + 0xAD: 84, + 0x300: 84, + 0x301: 84, + 0x302: 84, + 0x303: 84, + 0x304: 84, + 0x305: 84, + 0x306: 84, + 0x307: 84, + 0x308: 84, + 0x309: 84, + 0x30A: 84, + 0x30B: 84, + 0x30C: 84, + 0x30D: 84, + 0x30E: 84, + 0x30F: 84, + 0x310: 84, + 0x311: 84, + 0x312: 84, + 0x313: 84, + 0x314: 84, + 0x315: 84, + 0x316: 84, + 0x317: 84, + 0x318: 84, + 0x319: 84, + 0x31A: 84, + 0x31B: 84, + 0x31C: 84, + 0x31D: 84, + 0x31E: 84, + 0x31F: 84, + 0x320: 84, + 0x321: 84, + 0x322: 84, + 0x323: 84, + 0x324: 84, + 0x325: 84, + 0x326: 84, + 0x327: 84, + 0x328: 84, + 0x329: 84, + 0x32A: 84, + 0x32B: 84, + 0x32C: 84, + 0x32D: 84, + 0x32E: 84, + 0x32F: 84, + 0x330: 84, + 0x331: 84, + 0x332: 84, + 0x333: 84, + 0x334: 84, + 0x335: 84, + 0x336: 84, + 0x337: 84, + 0x338: 84, + 0x339: 84, + 0x33A: 84, + 0x33B: 84, + 0x33C: 84, + 0x33D: 84, + 0x33E: 84, + 0x33F: 84, + 0x340: 84, + 0x341: 84, + 0x342: 84, + 0x343: 84, + 0x344: 84, + 0x345: 84, + 0x346: 84, + 0x347: 84, + 0x348: 84, + 0x349: 84, + 0x34A: 84, + 0x34B: 84, + 0x34C: 84, + 0x34D: 84, + 0x34E: 84, + 0x34F: 84, + 0x350: 84, + 0x351: 84, + 0x352: 84, + 0x353: 84, + 0x354: 84, + 0x355: 84, + 0x356: 84, + 0x357: 84, + 0x358: 84, + 0x359: 84, + 0x35A: 84, + 0x35B: 84, + 0x35C: 84, + 0x35D: 84, + 0x35E: 84, + 0x35F: 84, + 0x360: 84, + 0x361: 84, + 0x362: 84, + 0x363: 84, + 0x364: 84, + 0x365: 84, + 0x366: 84, + 0x367: 84, + 0x368: 84, + 0x369: 84, + 0x36A: 84, + 0x36B: 84, + 0x36C: 84, + 0x36D: 84, + 0x36E: 84, + 0x36F: 84, + 0x483: 84, + 0x484: 84, + 0x485: 84, + 0x486: 84, + 0x487: 84, + 0x488: 84, + 0x489: 84, + 0x591: 84, + 0x592: 84, + 0x593: 84, + 0x594: 84, + 0x595: 84, + 0x596: 84, + 0x597: 84, + 0x598: 84, + 0x599: 84, + 0x59A: 84, + 0x59B: 84, + 0x59C: 84, + 0x59D: 84, + 0x59E: 84, + 0x59F: 84, + 0x5A0: 84, + 0x5A1: 84, + 0x5A2: 84, + 0x5A3: 84, + 0x5A4: 84, + 0x5A5: 84, + 0x5A6: 84, + 0x5A7: 84, + 0x5A8: 84, + 0x5A9: 84, + 0x5AA: 84, + 0x5AB: 84, + 0x5AC: 84, + 0x5AD: 84, + 0x5AE: 84, + 0x5AF: 84, + 0x5B0: 84, + 0x5B1: 84, + 0x5B2: 84, + 0x5B3: 84, + 0x5B4: 84, + 0x5B5: 84, + 0x5B6: 84, + 0x5B7: 84, + 0x5B8: 84, + 0x5B9: 84, + 0x5BA: 84, + 0x5BB: 84, + 0x5BC: 84, + 0x5BD: 84, + 0x5BF: 84, + 0x5C1: 84, + 0x5C2: 84, + 0x5C4: 84, + 0x5C5: 84, + 0x5C7: 84, + 0x610: 84, + 0x611: 84, + 0x612: 84, + 0x613: 84, + 0x614: 84, + 0x615: 84, + 0x616: 84, + 0x617: 84, + 0x618: 84, + 0x619: 84, + 0x61A: 84, + 0x61C: 84, + 0x620: 68, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62A: 68, + 0x62B: 68, + 0x62C: 68, + 0x62D: 68, + 0x62E: 68, + 0x62F: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63A: 68, + 0x63B: 68, + 0x63C: 68, + 0x63D: 68, + 0x63E: 68, + 0x63F: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64A: 68, + 0x64B: 84, + 0x64C: 84, + 0x64D: 84, + 0x64E: 84, + 0x64F: 84, + 0x650: 84, + 0x651: 84, + 0x652: 84, + 0x653: 84, + 0x654: 84, + 0x655: 84, + 0x656: 84, + 0x657: 84, + 0x658: 84, + 0x659: 84, + 0x65A: 84, + 0x65B: 84, + 0x65C: 84, + 0x65D: 84, + 0x65E: 84, + 0x65F: 84, + 0x66E: 68, + 0x66F: 68, + 0x670: 84, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67A: 68, + 0x67B: 68, + 0x67C: 68, + 0x67D: 68, + 0x67E: 68, + 0x67F: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68A: 82, + 0x68B: 82, + 0x68C: 82, + 0x68D: 82, + 0x68E: 82, + 0x68F: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69A: 68, + 0x69B: 68, + 0x69C: 68, + 0x69D: 68, + 0x69E: 68, + 0x69F: 68, + 0x6A0: 68, + 0x6A1: 68, + 0x6A2: 68, + 0x6A3: 68, + 0x6A4: 68, + 0x6A5: 68, + 0x6A6: 68, + 0x6A7: 68, + 0x6A8: 68, + 0x6A9: 68, + 0x6AA: 68, + 0x6AB: 68, + 0x6AC: 68, + 0x6AD: 68, + 0x6AE: 68, + 0x6AF: 68, + 0x6B0: 68, + 0x6B1: 68, + 0x6B2: 68, + 0x6B3: 68, + 0x6B4: 68, + 0x6B5: 68, + 0x6B6: 68, + 0x6B7: 68, + 0x6B8: 68, + 0x6B9: 68, + 0x6BA: 68, + 0x6BB: 68, + 0x6BC: 68, + 0x6BD: 68, + 0x6BE: 68, + 0x6BF: 68, + 0x6C0: 82, + 0x6C1: 68, + 0x6C2: 68, + 0x6C3: 82, + 0x6C4: 82, + 0x6C5: 82, + 0x6C6: 82, + 0x6C7: 82, + 0x6C8: 82, + 0x6C9: 82, + 0x6CA: 82, + 0x6CB: 82, + 0x6CC: 68, + 0x6CD: 82, + 0x6CE: 68, + 0x6CF: 82, + 0x6D0: 68, + 0x6D1: 68, + 0x6D2: 82, + 0x6D3: 82, + 0x6D5: 82, + 0x6D6: 84, + 0x6D7: 84, + 0x6D8: 84, + 0x6D9: 84, + 0x6DA: 84, + 0x6DB: 84, + 0x6DC: 84, + 0x6DF: 84, + 0x6E0: 84, + 0x6E1: 84, + 0x6E2: 84, + 0x6E3: 84, + 0x6E4: 84, + 0x6E7: 84, + 0x6E8: 84, + 0x6EA: 84, + 0x6EB: 84, + 0x6EC: 84, + 0x6ED: 84, + 0x6EE: 82, + 0x6EF: 82, + 0x6FA: 68, + 0x6FB: 68, + 0x6FC: 68, + 0x6FF: 68, + 0x70F: 84, + 0x710: 82, + 0x711: 84, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71A: 68, + 0x71B: 68, + 0x71C: 68, + 0x71D: 68, + 0x71E: 82, + 0x71F: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72A: 82, + 0x72B: 68, + 0x72C: 82, + 0x72D: 68, + 0x72E: 68, + 0x72F: 82, + 0x730: 84, + 0x731: 84, + 0x732: 84, + 0x733: 84, + 0x734: 84, + 0x735: 84, + 0x736: 84, + 0x737: 84, + 0x738: 84, + 0x739: 84, + 0x73A: 84, + 0x73B: 84, + 0x73C: 84, + 0x73D: 84, + 0x73E: 84, + 0x73F: 84, + 0x740: 84, + 0x741: 84, + 0x742: 84, + 0x743: 84, + 0x744: 84, + 0x745: 84, + 0x746: 84, + 0x747: 84, + 0x748: 84, + 0x749: 84, + 0x74A: 84, + 0x74D: 82, + 0x74E: 68, + 0x74F: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75A: 82, + 0x75B: 82, + 0x75C: 68, + 0x75D: 68, + 0x75E: 68, + 0x75F: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76A: 68, + 0x76B: 82, + 0x76C: 82, + 0x76D: 68, + 0x76E: 68, + 0x76F: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77A: 68, + 0x77B: 68, + 0x77C: 68, + 0x77D: 68, + 0x77E: 68, + 0x77F: 68, + 0x7A6: 84, + 0x7A7: 84, + 0x7A8: 84, + 0x7A9: 84, + 0x7AA: 84, + 0x7AB: 84, + 0x7AC: 84, + 0x7AD: 84, + 0x7AE: 84, + 0x7AF: 84, + 0x7B0: 84, + 0x7CA: 68, + 0x7CB: 68, + 0x7CC: 68, + 0x7CD: 68, + 0x7CE: 68, + 0x7CF: 68, + 0x7D0: 68, + 0x7D1: 68, + 0x7D2: 68, + 0x7D3: 68, + 0x7D4: 68, + 0x7D5: 68, + 0x7D6: 68, + 0x7D7: 68, + 0x7D8: 68, + 0x7D9: 68, + 0x7DA: 68, + 0x7DB: 68, + 0x7DC: 68, + 0x7DD: 68, + 0x7DE: 68, + 0x7DF: 68, + 0x7E0: 68, + 0x7E1: 68, + 0x7E2: 68, + 0x7E3: 68, + 0x7E4: 68, + 0x7E5: 68, + 0x7E6: 68, + 0x7E7: 68, + 0x7E8: 68, + 0x7E9: 68, + 0x7EA: 68, + 0x7EB: 84, + 0x7EC: 84, + 0x7ED: 84, + 0x7EE: 84, + 0x7EF: 84, + 0x7F0: 84, + 0x7F1: 84, + 0x7F2: 84, + 0x7F3: 84, + 0x7FA: 67, + 0x7FD: 84, + 0x816: 84, + 0x817: 84, + 0x818: 84, + 0x819: 84, + 0x81B: 84, + 0x81C: 84, + 0x81D: 84, + 0x81E: 84, + 0x81F: 84, + 0x820: 84, + 0x821: 84, + 0x822: 84, + 0x823: 84, + 0x825: 84, + 0x826: 84, + 0x827: 84, + 0x829: 84, + 0x82A: 84, + 0x82B: 84, + 0x82C: 84, + 0x82D: 84, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84A: 68, + 0x84B: 68, + 0x84C: 68, + 0x84D: 68, + 0x84E: 68, + 0x84F: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 82, + 0x857: 82, + 0x858: 82, + 0x859: 84, + 0x85A: 84, + 0x85B: 84, + 0x860: 68, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86A: 82, + 0x870: 82, + 0x871: 82, + 0x872: 82, + 0x873: 82, + 0x874: 82, + 0x875: 82, + 0x876: 82, + 0x877: 82, + 0x878: 82, + 0x879: 82, + 0x87A: 82, + 0x87B: 82, + 0x87C: 82, + 0x87D: 82, + 0x87E: 82, + 0x87F: 82, + 0x880: 82, + 0x881: 82, + 0x882: 82, + 0x883: 67, + 0x884: 67, + 0x885: 67, + 0x886: 68, + 0x889: 68, + 0x88A: 68, + 0x88B: 68, + 0x88C: 68, + 0x88D: 68, + 0x88E: 82, + 0x898: 84, + 0x899: 84, + 0x89A: 84, + 0x89B: 84, + 0x89C: 84, + 0x89D: 84, + 0x89E: 84, + 0x89F: 84, + 0x8A0: 68, + 0x8A1: 68, + 0x8A2: 68, + 0x8A3: 68, + 0x8A4: 68, + 0x8A5: 68, + 0x8A6: 68, + 0x8A7: 68, + 0x8A8: 68, + 0x8A9: 68, + 0x8AA: 82, + 0x8AB: 82, + 0x8AC: 82, + 0x8AE: 82, + 0x8AF: 68, + 0x8B0: 68, + 0x8B1: 82, + 0x8B2: 82, + 0x8B3: 68, + 0x8B4: 68, + 0x8B5: 68, + 0x8B6: 68, + 0x8B7: 68, + 0x8B8: 68, + 0x8B9: 82, + 0x8BA: 68, + 0x8BB: 68, + 0x8BC: 68, + 0x8BD: 68, + 0x8BE: 68, + 0x8BF: 68, + 0x8C0: 68, + 0x8C1: 68, + 0x8C2: 68, + 0x8C3: 68, + 0x8C4: 68, + 0x8C5: 68, + 0x8C6: 68, + 0x8C7: 68, + 0x8C8: 68, + 0x8CA: 84, + 0x8CB: 84, + 0x8CC: 84, + 0x8CD: 84, + 0x8CE: 84, + 0x8CF: 84, + 0x8D0: 84, + 0x8D1: 84, + 0x8D2: 84, + 0x8D3: 84, + 0x8D4: 84, + 0x8D5: 84, + 0x8D6: 84, + 0x8D7: 84, + 0x8D8: 84, + 0x8D9: 84, + 0x8DA: 84, + 0x8DB: 84, + 0x8DC: 84, + 0x8DD: 84, + 0x8DE: 84, + 0x8DF: 84, + 0x8E0: 84, + 0x8E1: 84, + 0x8E3: 84, + 0x8E4: 84, + 0x8E5: 84, + 0x8E6: 84, + 0x8E7: 84, + 0x8E8: 84, + 0x8E9: 84, + 0x8EA: 84, + 0x8EB: 84, + 0x8EC: 84, + 0x8ED: 84, + 0x8EE: 84, + 0x8EF: 84, + 0x8F0: 84, + 0x8F1: 84, + 0x8F2: 84, + 0x8F3: 84, + 0x8F4: 84, + 0x8F5: 84, + 0x8F6: 84, + 0x8F7: 84, + 0x8F8: 84, + 0x8F9: 84, + 0x8FA: 84, + 0x8FB: 84, + 0x8FC: 84, + 0x8FD: 84, + 0x8FE: 84, + 0x8FF: 84, + 0x900: 84, + 0x901: 84, + 0x902: 84, + 0x93A: 84, + 0x93C: 84, + 0x941: 84, + 0x942: 84, + 0x943: 84, + 0x944: 84, + 0x945: 84, + 0x946: 84, + 0x947: 84, + 0x948: 84, + 0x94D: 84, + 0x951: 84, + 0x952: 84, + 0x953: 84, + 0x954: 84, + 0x955: 84, + 0x956: 84, + 0x957: 84, + 0x962: 84, + 0x963: 84, + 0x981: 84, + 0x9BC: 84, + 0x9C1: 84, + 0x9C2: 84, + 0x9C3: 84, + 0x9C4: 84, + 0x9CD: 84, + 0x9E2: 84, + 0x9E3: 84, + 0x9FE: 84, + 0xA01: 84, + 0xA02: 84, + 0xA3C: 84, + 0xA41: 84, + 0xA42: 84, + 0xA47: 84, + 0xA48: 84, + 0xA4B: 84, + 0xA4C: 84, + 0xA4D: 84, + 0xA51: 84, + 0xA70: 84, + 0xA71: 84, + 0xA75: 84, + 0xA81: 84, + 0xA82: 84, + 0xABC: 84, + 0xAC1: 84, + 0xAC2: 84, + 0xAC3: 84, + 0xAC4: 84, + 0xAC5: 84, + 0xAC7: 84, + 0xAC8: 84, + 0xACD: 84, + 0xAE2: 84, + 0xAE3: 84, + 0xAFA: 84, + 0xAFB: 84, + 0xAFC: 84, + 0xAFD: 84, + 0xAFE: 84, + 0xAFF: 84, + 0xB01: 84, + 0xB3C: 84, + 0xB3F: 84, + 0xB41: 84, + 0xB42: 84, + 0xB43: 84, + 0xB44: 84, + 0xB4D: 84, + 0xB55: 84, + 0xB56: 84, + 0xB62: 84, + 0xB63: 84, + 0xB82: 84, + 0xBC0: 84, + 0xBCD: 84, + 0xC00: 84, + 0xC04: 84, + 0xC3C: 84, + 0xC3E: 84, + 0xC3F: 84, + 0xC40: 84, + 0xC46: 84, + 0xC47: 84, + 0xC48: 84, + 0xC4A: 84, + 0xC4B: 84, + 0xC4C: 84, + 0xC4D: 84, + 0xC55: 84, + 0xC56: 84, + 0xC62: 84, + 0xC63: 84, + 0xC81: 84, + 0xCBC: 84, + 0xCBF: 84, + 0xCC6: 84, + 0xCCC: 84, + 0xCCD: 84, + 0xCE2: 84, + 0xCE3: 84, + 0xD00: 84, + 0xD01: 84, + 0xD3B: 84, + 0xD3C: 84, + 0xD41: 84, + 0xD42: 84, + 0xD43: 84, + 0xD44: 84, + 0xD4D: 84, + 0xD62: 84, + 0xD63: 84, + 0xD81: 84, + 0xDCA: 84, + 0xDD2: 84, + 0xDD3: 84, + 0xDD4: 84, + 0xDD6: 84, + 0xE31: 84, + 0xE34: 84, + 0xE35: 84, + 0xE36: 84, + 0xE37: 84, + 0xE38: 84, + 0xE39: 84, + 0xE3A: 84, + 0xE47: 84, + 0xE48: 84, + 0xE49: 84, + 0xE4A: 84, + 0xE4B: 84, + 0xE4C: 84, + 0xE4D: 84, + 0xE4E: 84, + 0xEB1: 84, + 0xEB4: 84, + 0xEB5: 84, + 0xEB6: 84, + 0xEB7: 84, + 0xEB8: 84, + 0xEB9: 84, + 0xEBA: 84, + 0xEBB: 84, + 0xEBC: 84, + 0xEC8: 84, + 0xEC9: 84, + 0xECA: 84, + 0xECB: 84, + 0xECC: 84, + 0xECD: 84, + 0xECE: 84, + 0xF18: 84, + 0xF19: 84, + 0xF35: 84, + 0xF37: 84, + 0xF39: 84, + 0xF71: 84, + 0xF72: 84, + 0xF73: 84, + 0xF74: 84, + 0xF75: 84, + 0xF76: 84, + 0xF77: 84, + 0xF78: 84, + 0xF79: 84, + 0xF7A: 84, + 0xF7B: 84, + 0xF7C: 84, + 0xF7D: 84, + 0xF7E: 84, + 0xF80: 84, + 0xF81: 84, + 0xF82: 84, + 0xF83: 84, + 0xF84: 84, + 0xF86: 84, + 0xF87: 84, + 0xF8D: 84, + 0xF8E: 84, + 0xF8F: 84, + 0xF90: 84, + 0xF91: 84, + 0xF92: 84, + 0xF93: 84, + 0xF94: 84, + 0xF95: 84, + 0xF96: 84, + 0xF97: 84, + 0xF99: 84, + 0xF9A: 84, + 0xF9B: 84, + 0xF9C: 84, + 0xF9D: 84, + 0xF9E: 84, + 0xF9F: 84, + 0xFA0: 84, + 0xFA1: 84, + 0xFA2: 84, + 0xFA3: 84, + 0xFA4: 84, + 0xFA5: 84, + 0xFA6: 84, + 0xFA7: 84, + 0xFA8: 84, + 0xFA9: 84, + 0xFAA: 84, + 0xFAB: 84, + 0xFAC: 84, + 0xFAD: 84, + 0xFAE: 84, + 0xFAF: 84, + 0xFB0: 84, + 0xFB1: 84, + 0xFB2: 84, + 0xFB3: 84, + 0xFB4: 84, + 0xFB5: 84, + 0xFB6: 84, + 0xFB7: 84, + 0xFB8: 84, + 0xFB9: 84, + 0xFBA: 84, + 0xFBB: 84, + 0xFBC: 84, + 0xFC6: 84, + 0x102D: 84, + 0x102E: 84, + 0x102F: 84, + 0x1030: 84, + 0x1032: 84, + 0x1033: 84, + 0x1034: 84, + 0x1035: 84, + 0x1036: 84, + 0x1037: 84, + 0x1039: 84, + 0x103A: 84, + 0x103D: 84, + 0x103E: 84, + 0x1058: 84, + 0x1059: 84, + 0x105E: 84, + 0x105F: 84, + 0x1060: 84, + 0x1071: 84, + 0x1072: 84, + 0x1073: 84, + 0x1074: 84, + 0x1082: 84, + 0x1085: 84, + 0x1086: 84, + 0x108D: 84, + 0x109D: 84, + 0x135D: 84, + 0x135E: 84, + 0x135F: 84, + 0x1712: 84, + 0x1713: 84, + 0x1714: 84, + 0x1732: 84, + 0x1733: 84, + 0x1752: 84, + 0x1753: 84, + 0x1772: 84, + 0x1773: 84, + 0x17B4: 84, + 0x17B5: 84, + 0x17B7: 84, + 0x17B8: 84, + 0x17B9: 84, + 0x17BA: 84, + 0x17BB: 84, + 0x17BC: 84, + 0x17BD: 84, + 0x17C6: 84, + 0x17C9: 84, + 0x17CA: 84, + 0x17CB: 84, + 0x17CC: 84, + 0x17CD: 84, + 0x17CE: 84, + 0x17CF: 84, + 0x17D0: 84, + 0x17D1: 84, + 0x17D2: 84, + 0x17D3: 84, + 0x17DD: 84, + 0x1807: 68, + 0x180A: 67, + 0x180B: 84, + 0x180C: 84, + 0x180D: 84, + 0x180F: 84, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182A: 68, + 0x182B: 68, + 0x182C: 68, + 0x182D: 68, + 0x182E: 68, + 0x182F: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183A: 68, + 0x183B: 68, + 0x183C: 68, + 0x183D: 68, + 0x183E: 68, + 0x183F: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184A: 68, + 0x184B: 68, + 0x184C: 68, + 0x184D: 68, + 0x184E: 68, + 0x184F: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185A: 68, + 0x185B: 68, + 0x185C: 68, + 0x185D: 68, + 0x185E: 68, + 0x185F: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186A: 68, + 0x186B: 68, + 0x186C: 68, + 0x186D: 68, + 0x186E: 68, + 0x186F: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188A: 68, + 0x188B: 68, + 0x188C: 68, + 0x188D: 68, + 0x188E: 68, + 0x188F: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189A: 68, + 0x189B: 68, + 0x189C: 68, + 0x189D: 68, + 0x189E: 68, + 0x189F: 68, + 0x18A0: 68, + 0x18A1: 68, + 0x18A2: 68, + 0x18A3: 68, + 0x18A4: 68, + 0x18A5: 68, + 0x18A6: 68, + 0x18A7: 68, + 0x18A8: 68, + 0x18A9: 84, + 0x18AA: 68, + 0x1920: 84, + 0x1921: 84, + 0x1922: 84, + 0x1927: 84, + 0x1928: 84, + 0x1932: 84, + 0x1939: 84, + 0x193A: 84, + 0x193B: 84, + 0x1A17: 84, + 0x1A18: 84, + 0x1A1B: 84, + 0x1A56: 84, + 0x1A58: 84, + 0x1A59: 84, + 0x1A5A: 84, + 0x1A5B: 84, + 0x1A5C: 84, + 0x1A5D: 84, + 0x1A5E: 84, + 0x1A60: 84, + 0x1A62: 84, + 0x1A65: 84, + 0x1A66: 84, + 0x1A67: 84, + 0x1A68: 84, + 0x1A69: 84, + 0x1A6A: 84, + 0x1A6B: 84, + 0x1A6C: 84, + 0x1A73: 84, + 0x1A74: 84, + 0x1A75: 84, + 0x1A76: 84, + 0x1A77: 84, + 0x1A78: 84, + 0x1A79: 84, + 0x1A7A: 84, + 0x1A7B: 84, + 0x1A7C: 84, + 0x1A7F: 84, + 0x1AB0: 84, + 0x1AB1: 84, + 0x1AB2: 84, + 0x1AB3: 84, + 0x1AB4: 84, + 0x1AB5: 84, + 0x1AB6: 84, + 0x1AB7: 84, + 0x1AB8: 84, + 0x1AB9: 84, + 0x1ABA: 84, + 0x1ABB: 84, + 0x1ABC: 84, + 0x1ABD: 84, + 0x1ABE: 84, + 0x1ABF: 84, + 0x1AC0: 84, + 0x1AC1: 84, + 0x1AC2: 84, + 0x1AC3: 84, + 0x1AC4: 84, + 0x1AC5: 84, + 0x1AC6: 84, + 0x1AC7: 84, + 0x1AC8: 84, + 0x1AC9: 84, + 0x1ACA: 84, + 0x1ACB: 84, + 0x1ACC: 84, + 0x1ACD: 84, + 0x1ACE: 84, + 0x1B00: 84, + 0x1B01: 84, + 0x1B02: 84, + 0x1B03: 84, + 0x1B34: 84, + 0x1B36: 84, + 0x1B37: 84, + 0x1B38: 84, + 0x1B39: 84, + 0x1B3A: 84, + 0x1B3C: 84, + 0x1B42: 84, + 0x1B6B: 84, + 0x1B6C: 84, + 0x1B6D: 84, + 0x1B6E: 84, + 0x1B6F: 84, + 0x1B70: 84, + 0x1B71: 84, + 0x1B72: 84, + 0x1B73: 84, + 0x1B80: 84, + 0x1B81: 84, + 0x1BA2: 84, + 0x1BA3: 84, + 0x1BA4: 84, + 0x1BA5: 84, + 0x1BA8: 84, + 0x1BA9: 84, + 0x1BAB: 84, + 0x1BAC: 84, + 0x1BAD: 84, + 0x1BE6: 84, + 0x1BE8: 84, + 0x1BE9: 84, + 0x1BED: 84, + 0x1BEF: 84, + 0x1BF0: 84, + 0x1BF1: 84, + 0x1C2C: 84, + 0x1C2D: 84, + 0x1C2E: 84, + 0x1C2F: 84, + 0x1C30: 84, + 0x1C31: 84, + 0x1C32: 84, + 0x1C33: 84, + 0x1C36: 84, + 0x1C37: 84, + 0x1CD0: 84, + 0x1CD1: 84, + 0x1CD2: 84, + 0x1CD4: 84, + 0x1CD5: 84, + 0x1CD6: 84, + 0x1CD7: 84, + 0x1CD8: 84, + 0x1CD9: 84, + 0x1CDA: 84, + 0x1CDB: 84, + 0x1CDC: 84, + 0x1CDD: 84, + 0x1CDE: 84, + 0x1CDF: 84, + 0x1CE0: 84, + 0x1CE2: 84, + 0x1CE3: 84, + 0x1CE4: 84, + 0x1CE5: 84, + 0x1CE6: 84, + 0x1CE7: 84, + 0x1CE8: 84, + 0x1CED: 84, + 0x1CF4: 84, + 0x1CF8: 84, + 0x1CF9: 84, + 0x1DC0: 84, + 0x1DC1: 84, + 0x1DC2: 84, + 0x1DC3: 84, + 0x1DC4: 84, + 0x1DC5: 84, + 0x1DC6: 84, + 0x1DC7: 84, + 0x1DC8: 84, + 0x1DC9: 84, + 0x1DCA: 84, + 0x1DCB: 84, + 0x1DCC: 84, + 0x1DCD: 84, + 0x1DCE: 84, + 0x1DCF: 84, + 0x1DD0: 84, + 0x1DD1: 84, + 0x1DD2: 84, + 0x1DD3: 84, + 0x1DD4: 84, + 0x1DD5: 84, + 0x1DD6: 84, + 0x1DD7: 84, + 0x1DD8: 84, + 0x1DD9: 84, + 0x1DDA: 84, + 0x1DDB: 84, + 0x1DDC: 84, + 0x1DDD: 84, + 0x1DDE: 84, + 0x1DDF: 84, + 0x1DE0: 84, + 0x1DE1: 84, + 0x1DE2: 84, + 0x1DE3: 84, + 0x1DE4: 84, + 0x1DE5: 84, + 0x1DE6: 84, + 0x1DE7: 84, + 0x1DE8: 84, + 0x1DE9: 84, + 0x1DEA: 84, + 0x1DEB: 84, + 0x1DEC: 84, + 0x1DED: 84, + 0x1DEE: 84, + 0x1DEF: 84, + 0x1DF0: 84, + 0x1DF1: 84, + 0x1DF2: 84, + 0x1DF3: 84, + 0x1DF4: 84, + 0x1DF5: 84, + 0x1DF6: 84, + 0x1DF7: 84, + 0x1DF8: 84, + 0x1DF9: 84, + 0x1DFA: 84, + 0x1DFB: 84, + 0x1DFC: 84, + 0x1DFD: 84, + 0x1DFE: 84, + 0x1DFF: 84, + 0x200B: 84, + 0x200D: 67, + 0x200E: 84, + 0x200F: 84, + 0x202A: 84, + 0x202B: 84, + 0x202C: 84, + 0x202D: 84, + 0x202E: 84, + 0x2060: 84, + 0x2061: 84, + 0x2062: 84, + 0x2063: 84, + 0x2064: 84, + 0x206A: 84, + 0x206B: 84, + 0x206C: 84, + 0x206D: 84, + 0x206E: 84, + 0x206F: 84, + 0x20D0: 84, + 0x20D1: 84, + 0x20D2: 84, + 0x20D3: 84, + 0x20D4: 84, + 0x20D5: 84, + 0x20D6: 84, + 0x20D7: 84, + 0x20D8: 84, + 0x20D9: 84, + 0x20DA: 84, + 0x20DB: 84, + 0x20DC: 84, + 0x20DD: 84, + 0x20DE: 84, + 0x20DF: 84, + 0x20E0: 84, + 0x20E1: 84, + 0x20E2: 84, + 0x20E3: 84, + 0x20E4: 84, + 0x20E5: 84, + 0x20E6: 84, + 0x20E7: 84, + 0x20E8: 84, + 0x20E9: 84, + 0x20EA: 84, + 0x20EB: 84, + 0x20EC: 84, + 0x20ED: 84, + 0x20EE: 84, + 0x20EF: 84, + 0x20F0: 84, + 0x2CEF: 84, + 0x2CF0: 84, + 0x2CF1: 84, + 0x2D7F: 84, + 0x2DE0: 84, + 0x2DE1: 84, + 0x2DE2: 84, + 0x2DE3: 84, + 0x2DE4: 84, + 0x2DE5: 84, + 0x2DE6: 84, + 0x2DE7: 84, + 0x2DE8: 84, + 0x2DE9: 84, + 0x2DEA: 84, + 0x2DEB: 84, + 0x2DEC: 84, + 0x2DED: 84, + 0x2DEE: 84, + 0x2DEF: 84, + 0x2DF0: 84, + 0x2DF1: 84, + 0x2DF2: 84, + 0x2DF3: 84, + 0x2DF4: 84, + 0x2DF5: 84, + 0x2DF6: 84, + 0x2DF7: 84, + 0x2DF8: 84, + 0x2DF9: 84, + 0x2DFA: 84, + 0x2DFB: 84, + 0x2DFC: 84, + 0x2DFD: 84, + 0x2DFE: 84, + 0x2DFF: 84, + 0x302A: 84, + 0x302B: 84, + 0x302C: 84, + 0x302D: 84, + 0x3099: 84, + 0x309A: 84, + 0xA66F: 84, + 0xA670: 84, + 0xA671: 84, + 0xA672: 84, + 0xA674: 84, + 0xA675: 84, + 0xA676: 84, + 0xA677: 84, + 0xA678: 84, + 0xA679: 84, + 0xA67A: 84, + 0xA67B: 84, + 0xA67C: 84, + 0xA67D: 84, + 0xA69E: 84, + 0xA69F: 84, + 0xA6F0: 84, + 0xA6F1: 84, + 0xA802: 84, + 0xA806: 84, + 0xA80B: 84, + 0xA825: 84, + 0xA826: 84, + 0xA82C: 84, + 0xA840: 68, + 0xA841: 68, + 0xA842: 68, + 0xA843: 68, + 0xA844: 68, + 0xA845: 68, + 0xA846: 68, + 0xA847: 68, + 0xA848: 68, + 0xA849: 68, + 0xA84A: 68, + 0xA84B: 68, + 0xA84C: 68, + 0xA84D: 68, + 0xA84E: 68, + 0xA84F: 68, + 0xA850: 68, + 0xA851: 68, + 0xA852: 68, + 0xA853: 68, + 0xA854: 68, + 0xA855: 68, + 0xA856: 68, + 0xA857: 68, + 0xA858: 68, + 0xA859: 68, + 0xA85A: 68, + 0xA85B: 68, + 0xA85C: 68, + 0xA85D: 68, + 0xA85E: 68, + 0xA85F: 68, + 0xA860: 68, + 0xA861: 68, + 0xA862: 68, + 0xA863: 68, + 0xA864: 68, + 0xA865: 68, + 0xA866: 68, + 0xA867: 68, + 0xA868: 68, + 0xA869: 68, + 0xA86A: 68, + 0xA86B: 68, + 0xA86C: 68, + 0xA86D: 68, + 0xA86E: 68, + 0xA86F: 68, + 0xA870: 68, + 0xA871: 68, + 0xA872: 76, + 0xA8C4: 84, + 0xA8C5: 84, + 0xA8E0: 84, + 0xA8E1: 84, + 0xA8E2: 84, + 0xA8E3: 84, + 0xA8E4: 84, + 0xA8E5: 84, + 0xA8E6: 84, + 0xA8E7: 84, + 0xA8E8: 84, + 0xA8E9: 84, + 0xA8EA: 84, + 0xA8EB: 84, + 0xA8EC: 84, + 0xA8ED: 84, + 0xA8EE: 84, + 0xA8EF: 84, + 0xA8F0: 84, + 0xA8F1: 84, + 0xA8FF: 84, + 0xA926: 84, + 0xA927: 84, + 0xA928: 84, + 0xA929: 84, + 0xA92A: 84, + 0xA92B: 84, + 0xA92C: 84, + 0xA92D: 84, + 0xA947: 84, + 0xA948: 84, + 0xA949: 84, + 0xA94A: 84, + 0xA94B: 84, + 0xA94C: 84, + 0xA94D: 84, + 0xA94E: 84, + 0xA94F: 84, + 0xA950: 84, + 0xA951: 84, + 0xA980: 84, + 0xA981: 84, + 0xA982: 84, + 0xA9B3: 84, + 0xA9B6: 84, + 0xA9B7: 84, + 0xA9B8: 84, + 0xA9B9: 84, + 0xA9BC: 84, + 0xA9BD: 84, + 0xA9E5: 84, + 0xAA29: 84, + 0xAA2A: 84, + 0xAA2B: 84, + 0xAA2C: 84, + 0xAA2D: 84, + 0xAA2E: 84, + 0xAA31: 84, + 0xAA32: 84, + 0xAA35: 84, + 0xAA36: 84, + 0xAA43: 84, + 0xAA4C: 84, + 0xAA7C: 84, + 0xAAB0: 84, + 0xAAB2: 84, + 0xAAB3: 84, + 0xAAB4: 84, + 0xAAB7: 84, + 0xAAB8: 84, + 0xAABE: 84, + 0xAABF: 84, + 0xAAC1: 84, + 0xAAEC: 84, + 0xAAED: 84, + 0xAAF6: 84, + 0xABE5: 84, + 0xABE8: 84, + 0xABED: 84, + 0xFB1E: 84, + 0xFE00: 84, + 0xFE01: 84, + 0xFE02: 84, + 0xFE03: 84, + 0xFE04: 84, + 0xFE05: 84, + 0xFE06: 84, + 0xFE07: 84, + 0xFE08: 84, + 0xFE09: 84, + 0xFE0A: 84, + 0xFE0B: 84, + 0xFE0C: 84, + 0xFE0D: 84, + 0xFE0E: 84, + 0xFE0F: 84, + 0xFE20: 84, + 0xFE21: 84, + 0xFE22: 84, + 0xFE23: 84, + 0xFE24: 84, + 0xFE25: 84, + 0xFE26: 84, + 0xFE27: 84, + 0xFE28: 84, + 0xFE29: 84, + 0xFE2A: 84, + 0xFE2B: 84, + 0xFE2C: 84, + 0xFE2D: 84, + 0xFE2E: 84, + 0xFE2F: 84, + 0xFEFF: 84, + 0xFFF9: 84, + 0xFFFA: 84, + 0xFFFB: 84, + 0x101FD: 84, + 0x102E0: 84, + 0x10376: 84, + 0x10377: 84, + 0x10378: 84, + 0x10379: 84, + 0x1037A: 84, + 0x10A01: 84, + 0x10A02: 84, + 0x10A03: 84, + 0x10A05: 84, + 0x10A06: 84, + 0x10A0C: 84, + 0x10A0D: 84, + 0x10A0E: 84, + 0x10A0F: 84, + 0x10A38: 84, + 0x10A39: 84, + 0x10A3A: 84, + 0x10A3F: 84, + 0x10AC0: 68, + 0x10AC1: 68, + 0x10AC2: 68, + 0x10AC3: 68, + 0x10AC4: 68, + 0x10AC5: 82, + 0x10AC7: 82, + 0x10AC9: 82, + 0x10ACA: 82, + 0x10ACD: 76, + 0x10ACE: 82, + 0x10ACF: 82, + 0x10AD0: 82, + 0x10AD1: 82, + 0x10AD2: 82, + 0x10AD3: 68, + 0x10AD4: 68, + 0x10AD5: 68, + 0x10AD6: 68, + 0x10AD7: 76, + 0x10AD8: 68, + 0x10AD9: 68, + 0x10ADA: 68, + 0x10ADB: 68, + 0x10ADC: 68, + 0x10ADD: 82, + 0x10ADE: 68, + 0x10ADF: 68, + 0x10AE0: 68, + 0x10AE1: 82, + 0x10AE4: 82, + 0x10AE5: 84, + 0x10AE6: 84, + 0x10AEB: 68, + 0x10AEC: 68, + 0x10AED: 68, + 0x10AEE: 68, + 0x10AEF: 82, + 0x10B80: 68, + 0x10B81: 82, + 0x10B82: 68, + 0x10B83: 82, + 0x10B84: 82, + 0x10B85: 82, + 0x10B86: 68, + 0x10B87: 68, + 0x10B88: 68, + 0x10B89: 82, + 0x10B8A: 68, + 0x10B8B: 68, + 0x10B8C: 82, + 0x10B8D: 68, + 0x10B8E: 82, + 0x10B8F: 82, + 0x10B90: 68, + 0x10B91: 82, + 0x10BA9: 82, + 0x10BAA: 82, + 0x10BAB: 82, + 0x10BAC: 82, + 0x10BAD: 68, + 0x10BAE: 68, + 0x10D00: 76, + 0x10D01: 68, + 0x10D02: 68, + 0x10D03: 68, + 0x10D04: 68, + 0x10D05: 68, + 0x10D06: 68, + 0x10D07: 68, + 0x10D08: 68, + 0x10D09: 68, + 0x10D0A: 68, + 0x10D0B: 68, + 0x10D0C: 68, + 0x10D0D: 68, + 0x10D0E: 68, + 0x10D0F: 68, + 0x10D10: 68, + 0x10D11: 68, + 0x10D12: 68, + 0x10D13: 68, + 0x10D14: 68, + 0x10D15: 68, + 0x10D16: 68, + 0x10D17: 68, + 0x10D18: 68, + 0x10D19: 68, + 0x10D1A: 68, + 0x10D1B: 68, + 0x10D1C: 68, + 0x10D1D: 68, + 0x10D1E: 68, + 0x10D1F: 68, + 0x10D20: 68, + 0x10D21: 68, + 0x10D22: 82, + 0x10D23: 68, + 0x10D24: 84, + 0x10D25: 84, + 0x10D26: 84, + 0x10D27: 84, + 0x10EAB: 84, + 0x10EAC: 84, + 0x10EFD: 84, + 0x10EFE: 84, + 0x10EFF: 84, + 0x10F30: 68, + 0x10F31: 68, + 0x10F32: 68, + 0x10F33: 82, + 0x10F34: 68, + 0x10F35: 68, + 0x10F36: 68, + 0x10F37: 68, + 0x10F38: 68, + 0x10F39: 68, + 0x10F3A: 68, + 0x10F3B: 68, + 0x10F3C: 68, + 0x10F3D: 68, + 0x10F3E: 68, + 0x10F3F: 68, + 0x10F40: 68, + 0x10F41: 68, + 0x10F42: 68, + 0x10F43: 68, + 0x10F44: 68, + 0x10F46: 84, + 0x10F47: 84, + 0x10F48: 84, + 0x10F49: 84, + 0x10F4A: 84, + 0x10F4B: 84, + 0x10F4C: 84, + 0x10F4D: 84, + 0x10F4E: 84, + 0x10F4F: 84, + 0x10F50: 84, + 0x10F51: 68, + 0x10F52: 68, + 0x10F53: 68, + 0x10F54: 82, + 0x10F70: 68, + 0x10F71: 68, + 0x10F72: 68, + 0x10F73: 68, + 0x10F74: 82, + 0x10F75: 82, + 0x10F76: 68, + 0x10F77: 68, + 0x10F78: 68, + 0x10F79: 68, + 0x10F7A: 68, + 0x10F7B: 68, + 0x10F7C: 68, + 0x10F7D: 68, + 0x10F7E: 68, + 0x10F7F: 68, + 0x10F80: 68, + 0x10F81: 68, + 0x10F82: 84, + 0x10F83: 84, + 0x10F84: 84, + 0x10F85: 84, + 0x10FB0: 68, + 0x10FB2: 68, + 0x10FB3: 68, + 0x10FB4: 82, + 0x10FB5: 82, + 0x10FB6: 82, + 0x10FB8: 68, + 0x10FB9: 82, + 0x10FBA: 82, + 0x10FBB: 68, + 0x10FBC: 68, + 0x10FBD: 82, + 0x10FBE: 68, + 0x10FBF: 68, + 0x10FC1: 68, + 0x10FC2: 82, + 0x10FC3: 82, + 0x10FC4: 68, + 0x10FC9: 82, + 0x10FCA: 68, + 0x10FCB: 76, + 0x11001: 84, + 0x11038: 84, + 0x11039: 84, + 0x1103A: 84, + 0x1103B: 84, + 0x1103C: 84, + 0x1103D: 84, + 0x1103E: 84, + 0x1103F: 84, + 0x11040: 84, + 0x11041: 84, + 0x11042: 84, + 0x11043: 84, + 0x11044: 84, + 0x11045: 84, + 0x11046: 84, + 0x11070: 84, + 0x11073: 84, + 0x11074: 84, + 0x1107F: 84, + 0x11080: 84, + 0x11081: 84, + 0x110B3: 84, + 0x110B4: 84, + 0x110B5: 84, + 0x110B6: 84, + 0x110B9: 84, + 0x110BA: 84, + 0x110C2: 84, + 0x11100: 84, + 0x11101: 84, + 0x11102: 84, + 0x11127: 84, + 0x11128: 84, + 0x11129: 84, + 0x1112A: 84, + 0x1112B: 84, + 0x1112D: 84, + 0x1112E: 84, + 0x1112F: 84, + 0x11130: 84, + 0x11131: 84, + 0x11132: 84, + 0x11133: 84, + 0x11134: 84, + 0x11173: 84, + 0x11180: 84, + 0x11181: 84, + 0x111B6: 84, + 0x111B7: 84, + 0x111B8: 84, + 0x111B9: 84, + 0x111BA: 84, + 0x111BB: 84, + 0x111BC: 84, + 0x111BD: 84, + 0x111BE: 84, + 0x111C9: 84, + 0x111CA: 84, + 0x111CB: 84, + 0x111CC: 84, + 0x111CF: 84, + 0x1122F: 84, + 0x11230: 84, + 0x11231: 84, + 0x11234: 84, + 0x11236: 84, + 0x11237: 84, + 0x1123E: 84, + 0x11241: 84, + 0x112DF: 84, + 0x112E3: 84, + 0x112E4: 84, + 0x112E5: 84, + 0x112E6: 84, + 0x112E7: 84, + 0x112E8: 84, + 0x112E9: 84, + 0x112EA: 84, + 0x11300: 84, + 0x11301: 84, + 0x1133B: 84, + 0x1133C: 84, + 0x11340: 84, + 0x11366: 84, + 0x11367: 84, + 0x11368: 84, + 0x11369: 84, + 0x1136A: 84, + 0x1136B: 84, + 0x1136C: 84, + 0x11370: 84, + 0x11371: 84, + 0x11372: 84, + 0x11373: 84, + 0x11374: 84, + 0x11438: 84, + 0x11439: 84, + 0x1143A: 84, + 0x1143B: 84, + 0x1143C: 84, + 0x1143D: 84, + 0x1143E: 84, + 0x1143F: 84, + 0x11442: 84, + 0x11443: 84, + 0x11444: 84, + 0x11446: 84, + 0x1145E: 84, + 0x114B3: 84, + 0x114B4: 84, + 0x114B5: 84, + 0x114B6: 84, + 0x114B7: 84, + 0x114B8: 84, + 0x114BA: 84, + 0x114BF: 84, + 0x114C0: 84, + 0x114C2: 84, + 0x114C3: 84, + 0x115B2: 84, + 0x115B3: 84, + 0x115B4: 84, + 0x115B5: 84, + 0x115BC: 84, + 0x115BD: 84, + 0x115BF: 84, + 0x115C0: 84, + 0x115DC: 84, + 0x115DD: 84, + 0x11633: 84, + 0x11634: 84, + 0x11635: 84, + 0x11636: 84, + 0x11637: 84, + 0x11638: 84, + 0x11639: 84, + 0x1163A: 84, + 0x1163D: 84, + 0x1163F: 84, + 0x11640: 84, + 0x116AB: 84, + 0x116AD: 84, + 0x116B0: 84, + 0x116B1: 84, + 0x116B2: 84, + 0x116B3: 84, + 0x116B4: 84, + 0x116B5: 84, + 0x116B7: 84, + 0x1171D: 84, + 0x1171E: 84, + 0x1171F: 84, + 0x11722: 84, + 0x11723: 84, + 0x11724: 84, + 0x11725: 84, + 0x11727: 84, + 0x11728: 84, + 0x11729: 84, + 0x1172A: 84, + 0x1172B: 84, + 0x1182F: 84, + 0x11830: 84, + 0x11831: 84, + 0x11832: 84, + 0x11833: 84, + 0x11834: 84, + 0x11835: 84, + 0x11836: 84, + 0x11837: 84, + 0x11839: 84, + 0x1183A: 84, + 0x1193B: 84, + 0x1193C: 84, + 0x1193E: 84, + 0x11943: 84, + 0x119D4: 84, + 0x119D5: 84, + 0x119D6: 84, + 0x119D7: 84, + 0x119DA: 84, + 0x119DB: 84, + 0x119E0: 84, + 0x11A01: 84, + 0x11A02: 84, + 0x11A03: 84, + 0x11A04: 84, + 0x11A05: 84, + 0x11A06: 84, + 0x11A07: 84, + 0x11A08: 84, + 0x11A09: 84, + 0x11A0A: 84, + 0x11A33: 84, + 0x11A34: 84, + 0x11A35: 84, + 0x11A36: 84, + 0x11A37: 84, + 0x11A38: 84, + 0x11A3B: 84, + 0x11A3C: 84, + 0x11A3D: 84, + 0x11A3E: 84, + 0x11A47: 84, + 0x11A51: 84, + 0x11A52: 84, + 0x11A53: 84, + 0x11A54: 84, + 0x11A55: 84, + 0x11A56: 84, + 0x11A59: 84, + 0x11A5A: 84, + 0x11A5B: 84, + 0x11A8A: 84, + 0x11A8B: 84, + 0x11A8C: 84, + 0x11A8D: 84, + 0x11A8E: 84, + 0x11A8F: 84, + 0x11A90: 84, + 0x11A91: 84, + 0x11A92: 84, + 0x11A93: 84, + 0x11A94: 84, + 0x11A95: 84, + 0x11A96: 84, + 0x11A98: 84, + 0x11A99: 84, + 0x11C30: 84, + 0x11C31: 84, + 0x11C32: 84, + 0x11C33: 84, + 0x11C34: 84, + 0x11C35: 84, + 0x11C36: 84, + 0x11C38: 84, + 0x11C39: 84, + 0x11C3A: 84, + 0x11C3B: 84, + 0x11C3C: 84, + 0x11C3D: 84, + 0x11C3F: 84, + 0x11C92: 84, + 0x11C93: 84, + 0x11C94: 84, + 0x11C95: 84, + 0x11C96: 84, + 0x11C97: 84, + 0x11C98: 84, + 0x11C99: 84, + 0x11C9A: 84, + 0x11C9B: 84, + 0x11C9C: 84, + 0x11C9D: 84, + 0x11C9E: 84, + 0x11C9F: 84, + 0x11CA0: 84, + 0x11CA1: 84, + 0x11CA2: 84, + 0x11CA3: 84, + 0x11CA4: 84, + 0x11CA5: 84, + 0x11CA6: 84, + 0x11CA7: 84, + 0x11CAA: 84, + 0x11CAB: 84, + 0x11CAC: 84, + 0x11CAD: 84, + 0x11CAE: 84, + 0x11CAF: 84, + 0x11CB0: 84, + 0x11CB2: 84, + 0x11CB3: 84, + 0x11CB5: 84, + 0x11CB6: 84, + 0x11D31: 84, + 0x11D32: 84, + 0x11D33: 84, + 0x11D34: 84, + 0x11D35: 84, + 0x11D36: 84, + 0x11D3A: 84, + 0x11D3C: 84, + 0x11D3D: 84, + 0x11D3F: 84, + 0x11D40: 84, + 0x11D41: 84, + 0x11D42: 84, + 0x11D43: 84, + 0x11D44: 84, + 0x11D45: 84, + 0x11D47: 84, + 0x11D90: 84, + 0x11D91: 84, + 0x11D95: 84, + 0x11D97: 84, + 0x11EF3: 84, + 0x11EF4: 84, + 0x11F00: 84, + 0x11F01: 84, + 0x11F36: 84, + 0x11F37: 84, + 0x11F38: 84, + 0x11F39: 84, + 0x11F3A: 84, + 0x11F40: 84, + 0x11F42: 84, + 0x13430: 84, + 0x13431: 84, + 0x13432: 84, + 0x13433: 84, + 0x13434: 84, + 0x13435: 84, + 0x13436: 84, + 0x13437: 84, + 0x13438: 84, + 0x13439: 84, + 0x1343A: 84, + 0x1343B: 84, + 0x1343C: 84, + 0x1343D: 84, + 0x1343E: 84, + 0x1343F: 84, + 0x13440: 84, + 0x13447: 84, + 0x13448: 84, + 0x13449: 84, + 0x1344A: 84, + 0x1344B: 84, + 0x1344C: 84, + 0x1344D: 84, + 0x1344E: 84, + 0x1344F: 84, + 0x13450: 84, + 0x13451: 84, + 0x13452: 84, + 0x13453: 84, + 0x13454: 84, + 0x13455: 84, + 0x16AF0: 84, + 0x16AF1: 84, + 0x16AF2: 84, + 0x16AF3: 84, + 0x16AF4: 84, + 0x16B30: 84, + 0x16B31: 84, + 0x16B32: 84, + 0x16B33: 84, + 0x16B34: 84, + 0x16B35: 84, + 0x16B36: 84, + 0x16F4F: 84, + 0x16F8F: 84, + 0x16F90: 84, + 0x16F91: 84, + 0x16F92: 84, + 0x16FE4: 84, + 0x1BC9D: 84, + 0x1BC9E: 84, + 0x1BCA0: 84, + 0x1BCA1: 84, + 0x1BCA2: 84, + 0x1BCA3: 84, + 0x1CF00: 84, + 0x1CF01: 84, + 0x1CF02: 84, + 0x1CF03: 84, + 0x1CF04: 84, + 0x1CF05: 84, + 0x1CF06: 84, + 0x1CF07: 84, + 0x1CF08: 84, + 0x1CF09: 84, + 0x1CF0A: 84, + 0x1CF0B: 84, + 0x1CF0C: 84, + 0x1CF0D: 84, + 0x1CF0E: 84, + 0x1CF0F: 84, + 0x1CF10: 84, + 0x1CF11: 84, + 0x1CF12: 84, + 0x1CF13: 84, + 0x1CF14: 84, + 0x1CF15: 84, + 0x1CF16: 84, + 0x1CF17: 84, + 0x1CF18: 84, + 0x1CF19: 84, + 0x1CF1A: 84, + 0x1CF1B: 84, + 0x1CF1C: 84, + 0x1CF1D: 84, + 0x1CF1E: 84, + 0x1CF1F: 84, + 0x1CF20: 84, + 0x1CF21: 84, + 0x1CF22: 84, + 0x1CF23: 84, + 0x1CF24: 84, + 0x1CF25: 84, + 0x1CF26: 84, + 0x1CF27: 84, + 0x1CF28: 84, + 0x1CF29: 84, + 0x1CF2A: 84, + 0x1CF2B: 84, + 0x1CF2C: 84, + 0x1CF2D: 84, + 0x1CF30: 84, + 0x1CF31: 84, + 0x1CF32: 84, + 0x1CF33: 84, + 0x1CF34: 84, + 0x1CF35: 84, + 0x1CF36: 84, + 0x1CF37: 84, + 0x1CF38: 84, + 0x1CF39: 84, + 0x1CF3A: 84, + 0x1CF3B: 84, + 0x1CF3C: 84, + 0x1CF3D: 84, + 0x1CF3E: 84, + 0x1CF3F: 84, + 0x1CF40: 84, + 0x1CF41: 84, + 0x1CF42: 84, + 0x1CF43: 84, + 0x1CF44: 84, + 0x1CF45: 84, + 0x1CF46: 84, + 0x1D167: 84, + 0x1D168: 84, + 0x1D169: 84, + 0x1D173: 84, + 0x1D174: 84, + 0x1D175: 84, + 0x1D176: 84, + 0x1D177: 84, + 0x1D178: 84, + 0x1D179: 84, + 0x1D17A: 84, + 0x1D17B: 84, + 0x1D17C: 84, + 0x1D17D: 84, + 0x1D17E: 84, + 0x1D17F: 84, + 0x1D180: 84, + 0x1D181: 84, + 0x1D182: 84, + 0x1D185: 84, + 0x1D186: 84, + 0x1D187: 84, + 0x1D188: 84, + 0x1D189: 84, + 0x1D18A: 84, + 0x1D18B: 84, + 0x1D1AA: 84, + 0x1D1AB: 84, + 0x1D1AC: 84, + 0x1D1AD: 84, + 0x1D242: 84, + 0x1D243: 84, + 0x1D244: 84, + 0x1DA00: 84, + 0x1DA01: 84, + 0x1DA02: 84, + 0x1DA03: 84, + 0x1DA04: 84, + 0x1DA05: 84, + 0x1DA06: 84, + 0x1DA07: 84, + 0x1DA08: 84, + 0x1DA09: 84, + 0x1DA0A: 84, + 0x1DA0B: 84, + 0x1DA0C: 84, + 0x1DA0D: 84, + 0x1DA0E: 84, + 0x1DA0F: 84, + 0x1DA10: 84, + 0x1DA11: 84, + 0x1DA12: 84, + 0x1DA13: 84, + 0x1DA14: 84, + 0x1DA15: 84, + 0x1DA16: 84, + 0x1DA17: 84, + 0x1DA18: 84, + 0x1DA19: 84, + 0x1DA1A: 84, + 0x1DA1B: 84, + 0x1DA1C: 84, + 0x1DA1D: 84, + 0x1DA1E: 84, + 0x1DA1F: 84, + 0x1DA20: 84, + 0x1DA21: 84, + 0x1DA22: 84, + 0x1DA23: 84, + 0x1DA24: 84, + 0x1DA25: 84, + 0x1DA26: 84, + 0x1DA27: 84, + 0x1DA28: 84, + 0x1DA29: 84, + 0x1DA2A: 84, + 0x1DA2B: 84, + 0x1DA2C: 84, + 0x1DA2D: 84, + 0x1DA2E: 84, + 0x1DA2F: 84, + 0x1DA30: 84, + 0x1DA31: 84, + 0x1DA32: 84, + 0x1DA33: 84, + 0x1DA34: 84, + 0x1DA35: 84, + 0x1DA36: 84, + 0x1DA3B: 84, + 0x1DA3C: 84, + 0x1DA3D: 84, + 0x1DA3E: 84, + 0x1DA3F: 84, + 0x1DA40: 84, + 0x1DA41: 84, + 0x1DA42: 84, + 0x1DA43: 84, + 0x1DA44: 84, + 0x1DA45: 84, + 0x1DA46: 84, + 0x1DA47: 84, + 0x1DA48: 84, + 0x1DA49: 84, + 0x1DA4A: 84, + 0x1DA4B: 84, + 0x1DA4C: 84, + 0x1DA4D: 84, + 0x1DA4E: 84, + 0x1DA4F: 84, + 0x1DA50: 84, + 0x1DA51: 84, + 0x1DA52: 84, + 0x1DA53: 84, + 0x1DA54: 84, + 0x1DA55: 84, + 0x1DA56: 84, + 0x1DA57: 84, + 0x1DA58: 84, + 0x1DA59: 84, + 0x1DA5A: 84, + 0x1DA5B: 84, + 0x1DA5C: 84, + 0x1DA5D: 84, + 0x1DA5E: 84, + 0x1DA5F: 84, + 0x1DA60: 84, + 0x1DA61: 84, + 0x1DA62: 84, + 0x1DA63: 84, + 0x1DA64: 84, + 0x1DA65: 84, + 0x1DA66: 84, + 0x1DA67: 84, + 0x1DA68: 84, + 0x1DA69: 84, + 0x1DA6A: 84, + 0x1DA6B: 84, + 0x1DA6C: 84, + 0x1DA75: 84, + 0x1DA84: 84, + 0x1DA9B: 84, + 0x1DA9C: 84, + 0x1DA9D: 84, + 0x1DA9E: 84, + 0x1DA9F: 84, + 0x1DAA1: 84, + 0x1DAA2: 84, + 0x1DAA3: 84, + 0x1DAA4: 84, + 0x1DAA5: 84, + 0x1DAA6: 84, + 0x1DAA7: 84, + 0x1DAA8: 84, + 0x1DAA9: 84, + 0x1DAAA: 84, + 0x1DAAB: 84, + 0x1DAAC: 84, + 0x1DAAD: 84, + 0x1DAAE: 84, + 0x1DAAF: 84, + 0x1E000: 84, + 0x1E001: 84, + 0x1E002: 84, + 0x1E003: 84, + 0x1E004: 84, + 0x1E005: 84, + 0x1E006: 84, + 0x1E008: 84, + 0x1E009: 84, + 0x1E00A: 84, + 0x1E00B: 84, + 0x1E00C: 84, + 0x1E00D: 84, + 0x1E00E: 84, + 0x1E00F: 84, + 0x1E010: 84, + 0x1E011: 84, + 0x1E012: 84, + 0x1E013: 84, + 0x1E014: 84, + 0x1E015: 84, + 0x1E016: 84, + 0x1E017: 84, + 0x1E018: 84, + 0x1E01B: 84, + 0x1E01C: 84, + 0x1E01D: 84, + 0x1E01E: 84, + 0x1E01F: 84, + 0x1E020: 84, + 0x1E021: 84, + 0x1E023: 84, + 0x1E024: 84, + 0x1E026: 84, + 0x1E027: 84, + 0x1E028: 84, + 0x1E029: 84, + 0x1E02A: 84, + 0x1E08F: 84, + 0x1E130: 84, + 0x1E131: 84, + 0x1E132: 84, + 0x1E133: 84, + 0x1E134: 84, + 0x1E135: 84, + 0x1E136: 84, + 0x1E2AE: 84, + 0x1E2EC: 84, + 0x1E2ED: 84, + 0x1E2EE: 84, + 0x1E2EF: 84, + 0x1E4EC: 84, + 0x1E4ED: 84, + 0x1E4EE: 84, + 0x1E4EF: 84, + 0x1E8D0: 84, + 0x1E8D1: 84, + 0x1E8D2: 84, + 0x1E8D3: 84, + 0x1E8D4: 84, + 0x1E8D5: 84, + 0x1E8D6: 84, + 0x1E900: 68, + 0x1E901: 68, + 0x1E902: 68, + 0x1E903: 68, + 0x1E904: 68, + 0x1E905: 68, + 0x1E906: 68, + 0x1E907: 68, + 0x1E908: 68, + 0x1E909: 68, + 0x1E90A: 68, + 0x1E90B: 68, + 0x1E90C: 68, + 0x1E90D: 68, + 0x1E90E: 68, + 0x1E90F: 68, + 0x1E910: 68, + 0x1E911: 68, + 0x1E912: 68, + 0x1E913: 68, + 0x1E914: 68, + 0x1E915: 68, + 0x1E916: 68, + 0x1E917: 68, + 0x1E918: 68, + 0x1E919: 68, + 0x1E91A: 68, + 0x1E91B: 68, + 0x1E91C: 68, + 0x1E91D: 68, + 0x1E91E: 68, + 0x1E91F: 68, + 0x1E920: 68, + 0x1E921: 68, + 0x1E922: 68, + 0x1E923: 68, + 0x1E924: 68, + 0x1E925: 68, + 0x1E926: 68, + 0x1E927: 68, + 0x1E928: 68, + 0x1E929: 68, + 0x1E92A: 68, + 0x1E92B: 68, + 0x1E92C: 68, + 0x1E92D: 68, + 0x1E92E: 68, + 0x1E92F: 68, + 0x1E930: 68, + 0x1E931: 68, + 0x1E932: 68, + 0x1E933: 68, + 0x1E934: 68, + 0x1E935: 68, + 0x1E936: 68, + 0x1E937: 68, + 0x1E938: 68, + 0x1E939: 68, + 0x1E93A: 68, + 0x1E93B: 68, + 0x1E93C: 68, + 0x1E93D: 68, + 0x1E93E: 68, + 0x1E93F: 68, + 0x1E940: 68, + 0x1E941: 68, + 0x1E942: 68, + 0x1E943: 68, + 0x1E944: 84, + 0x1E945: 84, + 0x1E946: 84, + 0x1E947: 84, + 0x1E948: 84, + 0x1E949: 84, + 0x1E94A: 84, + 0x1E94B: 84, + 0xE0001: 84, + 0xE0020: 84, + 0xE0021: 84, + 0xE0022: 84, + 0xE0023: 84, + 0xE0024: 84, + 0xE0025: 84, + 0xE0026: 84, + 0xE0027: 84, + 0xE0028: 84, + 0xE0029: 84, + 0xE002A: 84, + 0xE002B: 84, + 0xE002C: 84, + 0xE002D: 84, + 0xE002E: 84, + 0xE002F: 84, + 0xE0030: 84, + 0xE0031: 84, + 0xE0032: 84, + 0xE0033: 84, + 0xE0034: 84, + 0xE0035: 84, + 0xE0036: 84, + 0xE0037: 84, + 0xE0038: 84, + 0xE0039: 84, + 0xE003A: 84, + 0xE003B: 84, + 0xE003C: 84, + 0xE003D: 84, + 0xE003E: 84, + 0xE003F: 84, + 0xE0040: 84, + 0xE0041: 84, + 0xE0042: 84, + 0xE0043: 84, + 0xE0044: 84, + 0xE0045: 84, + 0xE0046: 84, + 0xE0047: 84, + 0xE0048: 84, + 0xE0049: 84, + 0xE004A: 84, + 0xE004B: 84, + 0xE004C: 84, + 0xE004D: 84, + 0xE004E: 84, + 0xE004F: 84, + 0xE0050: 84, + 0xE0051: 84, + 0xE0052: 84, + 0xE0053: 84, + 0xE0054: 84, + 0xE0055: 84, + 0xE0056: 84, + 0xE0057: 84, + 0xE0058: 84, + 0xE0059: 84, + 0xE005A: 84, + 0xE005B: 84, + 0xE005C: 84, + 0xE005D: 84, + 0xE005E: 84, + 0xE005F: 84, + 0xE0060: 84, + 0xE0061: 84, + 0xE0062: 84, + 0xE0063: 84, + 0xE0064: 84, + 0xE0065: 84, + 0xE0066: 84, + 0xE0067: 84, + 0xE0068: 84, + 0xE0069: 84, + 0xE006A: 84, + 0xE006B: 84, + 0xE006C: 84, + 0xE006D: 84, + 0xE006E: 84, + 0xE006F: 84, + 0xE0070: 84, + 0xE0071: 84, + 0xE0072: 84, + 0xE0073: 84, + 0xE0074: 84, + 0xE0075: 84, + 0xE0076: 84, + 0xE0077: 84, + 0xE0078: 84, + 0xE0079: 84, + 0xE007A: 84, + 0xE007B: 84, + 0xE007C: 84, + 0xE007D: 84, + 0xE007E: 84, + 0xE007F: 84, + 0xE0100: 84, + 0xE0101: 84, + 0xE0102: 84, + 0xE0103: 84, + 0xE0104: 84, + 0xE0105: 84, + 0xE0106: 84, + 0xE0107: 84, + 0xE0108: 84, + 0xE0109: 84, + 0xE010A: 84, + 0xE010B: 84, + 0xE010C: 84, + 0xE010D: 84, + 0xE010E: 84, + 0xE010F: 84, + 0xE0110: 84, + 0xE0111: 84, + 0xE0112: 84, + 0xE0113: 84, + 0xE0114: 84, + 0xE0115: 84, + 0xE0116: 84, + 0xE0117: 84, + 0xE0118: 84, + 0xE0119: 84, + 0xE011A: 84, + 0xE011B: 84, + 0xE011C: 84, + 0xE011D: 84, + 0xE011E: 84, + 0xE011F: 84, + 0xE0120: 84, + 0xE0121: 84, + 0xE0122: 84, + 0xE0123: 84, + 0xE0124: 84, + 0xE0125: 84, + 0xE0126: 84, + 0xE0127: 84, + 0xE0128: 84, + 0xE0129: 84, + 0xE012A: 84, + 0xE012B: 84, + 0xE012C: 84, + 0xE012D: 84, + 0xE012E: 84, + 0xE012F: 84, + 0xE0130: 84, + 0xE0131: 84, + 0xE0132: 84, + 0xE0133: 84, + 0xE0134: 84, + 0xE0135: 84, + 0xE0136: 84, + 0xE0137: 84, + 0xE0138: 84, + 0xE0139: 84, + 0xE013A: 84, + 0xE013B: 84, + 0xE013C: 84, + 0xE013D: 84, + 0xE013E: 84, + 0xE013F: 84, + 0xE0140: 84, + 0xE0141: 84, + 0xE0142: 84, + 0xE0143: 84, + 0xE0144: 84, + 0xE0145: 84, + 0xE0146: 84, + 0xE0147: 84, + 0xE0148: 84, + 0xE0149: 84, + 0xE014A: 84, + 0xE014B: 84, + 0xE014C: 84, + 0xE014D: 84, + 0xE014E: 84, + 0xE014F: 84, + 0xE0150: 84, + 0xE0151: 84, + 0xE0152: 84, + 0xE0153: 84, + 0xE0154: 84, + 0xE0155: 84, + 0xE0156: 84, + 0xE0157: 84, + 0xE0158: 84, + 0xE0159: 84, + 0xE015A: 84, + 0xE015B: 84, + 0xE015C: 84, + 0xE015D: 84, + 0xE015E: 84, + 0xE015F: 84, + 0xE0160: 84, + 0xE0161: 84, + 0xE0162: 84, + 0xE0163: 84, + 0xE0164: 84, + 0xE0165: 84, + 0xE0166: 84, + 0xE0167: 84, + 0xE0168: 84, + 0xE0169: 84, + 0xE016A: 84, + 0xE016B: 84, + 0xE016C: 84, + 0xE016D: 84, + 0xE016E: 84, + 0xE016F: 84, + 0xE0170: 84, + 0xE0171: 84, + 0xE0172: 84, + 0xE0173: 84, + 0xE0174: 84, + 0xE0175: 84, + 0xE0176: 84, + 0xE0177: 84, + 0xE0178: 84, + 0xE0179: 84, + 0xE017A: 84, + 0xE017B: 84, + 0xE017C: 84, + 0xE017D: 84, + 0xE017E: 84, + 0xE017F: 84, + 0xE0180: 84, + 0xE0181: 84, + 0xE0182: 84, + 0xE0183: 84, + 0xE0184: 84, + 0xE0185: 84, + 0xE0186: 84, + 0xE0187: 84, + 0xE0188: 84, + 0xE0189: 84, + 0xE018A: 84, + 0xE018B: 84, + 0xE018C: 84, + 0xE018D: 84, + 0xE018E: 84, + 0xE018F: 84, + 0xE0190: 84, + 0xE0191: 84, + 0xE0192: 84, + 0xE0193: 84, + 0xE0194: 84, + 0xE0195: 84, + 0xE0196: 84, + 0xE0197: 84, + 0xE0198: 84, + 0xE0199: 84, + 0xE019A: 84, + 0xE019B: 84, + 0xE019C: 84, + 0xE019D: 84, + 0xE019E: 84, + 0xE019F: 84, + 0xE01A0: 84, + 0xE01A1: 84, + 0xE01A2: 84, + 0xE01A3: 84, + 0xE01A4: 84, + 0xE01A5: 84, + 0xE01A6: 84, + 0xE01A7: 84, + 0xE01A8: 84, + 0xE01A9: 84, + 0xE01AA: 84, + 0xE01AB: 84, + 0xE01AC: 84, + 0xE01AD: 84, + 0xE01AE: 84, + 0xE01AF: 84, + 0xE01B0: 84, + 0xE01B1: 84, + 0xE01B2: 84, + 0xE01B3: 84, + 0xE01B4: 84, + 0xE01B5: 84, + 0xE01B6: 84, + 0xE01B7: 84, + 0xE01B8: 84, + 0xE01B9: 84, + 0xE01BA: 84, + 0xE01BB: 84, + 0xE01BC: 84, + 0xE01BD: 84, + 0xE01BE: 84, + 0xE01BF: 84, + 0xE01C0: 84, + 0xE01C1: 84, + 0xE01C2: 84, + 0xE01C3: 84, + 0xE01C4: 84, + 0xE01C5: 84, + 0xE01C6: 84, + 0xE01C7: 84, + 0xE01C8: 84, + 0xE01C9: 84, + 0xE01CA: 84, + 0xE01CB: 84, + 0xE01CC: 84, + 0xE01CD: 84, + 0xE01CE: 84, + 0xE01CF: 84, + 0xE01D0: 84, + 0xE01D1: 84, + 0xE01D2: 84, + 0xE01D3: 84, + 0xE01D4: 84, + 0xE01D5: 84, + 0xE01D6: 84, + 0xE01D7: 84, + 0xE01D8: 84, + 0xE01D9: 84, + 0xE01DA: 84, + 0xE01DB: 84, + 0xE01DC: 84, + 0xE01DD: 84, + 0xE01DE: 84, + 0xE01DF: 84, + 0xE01E0: 84, + 0xE01E1: 84, + 0xE01E2: 84, + 0xE01E3: 84, + 0xE01E4: 84, + 0xE01E5: 84, + 0xE01E6: 84, + 0xE01E7: 84, + 0xE01E8: 84, + 0xE01E9: 84, + 0xE01EA: 84, + 0xE01EB: 84, + 0xE01EC: 84, + 0xE01ED: 84, + 0xE01EE: 84, + 0xE01EF: 84, +} +codepoint_classes = { + "PVALID": ( + 0x2D0000002E, + 0x300000003A, + 0x610000007B, + 0xDF000000F7, + 0xF800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010A, + 0x10B0000010C, + 0x10D0000010E, + 0x10F00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011A, + 0x11B0000011C, + 0x11D0000011E, + 0x11F00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012A, + 0x12B0000012C, + 0x12D0000012E, + 0x12F00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13A0000013B, + 0x13C0000013D, + 0x13E0000013F, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14B0000014C, + 0x14D0000014E, + 0x14F00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015A, + 0x15B0000015C, + 0x15D0000015E, + 0x15F00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016A, + 0x16B0000016C, + 0x16D0000016E, + 0x16F00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17A0000017B, + 0x17C0000017D, + 0x17E0000017F, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18C0000018E, + 0x19200000193, + 0x19500000196, + 0x1990000019C, + 0x19E0000019F, + 0x1A1000001A2, + 0x1A3000001A4, + 0x1A5000001A6, + 0x1A8000001A9, + 0x1AA000001AC, + 0x1AD000001AE, + 0x1B0000001B1, + 0x1B4000001B5, + 0x1B6000001B7, + 0x1B9000001BC, + 0x1BD000001C4, + 0x1CE000001CF, + 0x1D0000001D1, + 0x1D2000001D3, + 0x1D4000001D5, + 0x1D6000001D7, + 0x1D8000001D9, + 0x1DA000001DB, + 0x1DC000001DE, + 0x1DF000001E0, + 0x1E1000001E2, + 0x1E3000001E4, + 0x1E5000001E6, + 0x1E7000001E8, + 0x1E9000001EA, + 0x1EB000001EC, + 0x1ED000001EE, + 0x1EF000001F1, + 0x1F5000001F6, + 0x1F9000001FA, + 0x1FB000001FC, + 0x1FD000001FE, + 0x1FF00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020A, + 0x20B0000020C, + 0x20D0000020E, + 0x20F00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021A, + 0x21B0000021C, + 0x21D0000021E, + 0x21F00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022A, + 0x22B0000022C, + 0x22D0000022E, + 0x22F00000230, + 0x23100000232, + 0x2330000023A, + 0x23C0000023D, + 0x23F00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024A, + 0x24B0000024C, + 0x24D0000024E, + 0x24F000002B0, + 0x2B9000002C2, + 0x2C6000002D2, + 0x2EC000002ED, + 0x2EE000002EF, + 0x30000000340, + 0x34200000343, + 0x3460000034F, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37B0000037E, + 0x39000000391, + 0x3AC000003CF, + 0x3D7000003D8, + 0x3D9000003DA, + 0x3DB000003DC, + 0x3DD000003DE, + 0x3DF000003E0, + 0x3E1000003E2, + 0x3E3000003E4, + 0x3E5000003E6, + 0x3E7000003E8, + 0x3E9000003EA, + 0x3EB000003EC, + 0x3ED000003EE, + 0x3EF000003F0, + 0x3F3000003F4, + 0x3F8000003F9, + 0x3FB000003FD, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046A, + 0x46B0000046C, + 0x46D0000046E, + 0x46F00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047A, + 0x47B0000047C, + 0x47D0000047E, + 0x47F00000480, + 0x48100000482, + 0x48300000488, + 0x48B0000048C, + 0x48D0000048E, + 0x48F00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049A, + 0x49B0000049C, + 0x49D0000049E, + 0x49F000004A0, + 0x4A1000004A2, + 0x4A3000004A4, + 0x4A5000004A6, + 0x4A7000004A8, + 0x4A9000004AA, + 0x4AB000004AC, + 0x4AD000004AE, + 0x4AF000004B0, + 0x4B1000004B2, + 0x4B3000004B4, + 0x4B5000004B6, + 0x4B7000004B8, + 0x4B9000004BA, + 0x4BB000004BC, + 0x4BD000004BE, + 0x4BF000004C0, + 0x4C2000004C3, + 0x4C4000004C5, + 0x4C6000004C7, + 0x4C8000004C9, + 0x4CA000004CB, + 0x4CC000004CD, + 0x4CE000004D0, + 0x4D1000004D2, + 0x4D3000004D4, + 0x4D5000004D6, + 0x4D7000004D8, + 0x4D9000004DA, + 0x4DB000004DC, + 0x4DD000004DE, + 0x4DF000004E0, + 0x4E1000004E2, + 0x4E3000004E4, + 0x4E5000004E6, + 0x4E7000004E8, + 0x4E9000004EA, + 0x4EB000004EC, + 0x4ED000004EE, + 0x4EF000004F0, + 0x4F1000004F2, + 0x4F3000004F4, + 0x4F5000004F6, + 0x4F7000004F8, + 0x4F9000004FA, + 0x4FB000004FC, + 0x4FD000004FE, + 0x4FF00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050A, + 0x50B0000050C, + 0x50D0000050E, + 0x50F00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051A, + 0x51B0000051C, + 0x51D0000051E, + 0x51F00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052A, + 0x52B0000052C, + 0x52D0000052E, + 0x52F00000530, + 0x5590000055A, + 0x56000000587, + 0x58800000589, + 0x591000005BE, + 0x5BF000005C0, + 0x5C1000005C3, + 0x5C4000005C6, + 0x5C7000005C8, + 0x5D0000005EB, + 0x5EF000005F3, + 0x6100000061B, + 0x62000000640, + 0x64100000660, + 0x66E00000675, + 0x679000006D4, + 0x6D5000006DD, + 0x6DF000006E9, + 0x6EA000006F0, + 0x6FA00000700, + 0x7100000074B, + 0x74D000007B2, + 0x7C0000007F6, + 0x7FD000007FE, + 0x8000000082E, + 0x8400000085C, + 0x8600000086B, + 0x87000000888, + 0x8890000088F, + 0x898000008E2, + 0x8E300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098D, + 0x98F00000991, + 0x993000009A9, + 0x9AA000009B1, + 0x9B2000009B3, + 0x9B6000009BA, + 0x9BC000009C5, + 0x9C7000009C9, + 0x9CB000009CF, + 0x9D7000009D8, + 0x9E0000009E4, + 0x9E6000009F2, + 0x9FC000009FD, + 0x9FE000009FF, + 0xA0100000A04, + 0xA0500000A0B, + 0xA0F00000A11, + 0xA1300000A29, + 0xA2A00000A31, + 0xA3200000A33, + 0xA3500000A36, + 0xA3800000A3A, + 0xA3C00000A3D, + 0xA3E00000A43, + 0xA4700000A49, + 0xA4B00000A4E, + 0xA5100000A52, + 0xA5C00000A5D, + 0xA6600000A76, + 0xA8100000A84, + 0xA8500000A8E, + 0xA8F00000A92, + 0xA9300000AA9, + 0xAAA00000AB1, + 0xAB200000AB4, + 0xAB500000ABA, + 0xABC00000AC6, + 0xAC700000ACA, + 0xACB00000ACE, + 0xAD000000AD1, + 0xAE000000AE4, + 0xAE600000AF0, + 0xAF900000B00, + 0xB0100000B04, + 0xB0500000B0D, + 0xB0F00000B11, + 0xB1300000B29, + 0xB2A00000B31, + 0xB3200000B34, + 0xB3500000B3A, + 0xB3C00000B45, + 0xB4700000B49, + 0xB4B00000B4E, + 0xB5500000B58, + 0xB5F00000B64, + 0xB6600000B70, + 0xB7100000B72, + 0xB8200000B84, + 0xB8500000B8B, + 0xB8E00000B91, + 0xB9200000B96, + 0xB9900000B9B, + 0xB9C00000B9D, + 0xB9E00000BA0, + 0xBA300000BA5, + 0xBA800000BAB, + 0xBAE00000BBA, + 0xBBE00000BC3, + 0xBC600000BC9, + 0xBCA00000BCE, + 0xBD000000BD1, + 0xBD700000BD8, + 0xBE600000BF0, + 0xC0000000C0D, + 0xC0E00000C11, + 0xC1200000C29, + 0xC2A00000C3A, + 0xC3C00000C45, + 0xC4600000C49, + 0xC4A00000C4E, + 0xC5500000C57, + 0xC5800000C5B, + 0xC5D00000C5E, + 0xC6000000C64, + 0xC6600000C70, + 0xC8000000C84, + 0xC8500000C8D, + 0xC8E00000C91, + 0xC9200000CA9, + 0xCAA00000CB4, + 0xCB500000CBA, + 0xCBC00000CC5, + 0xCC600000CC9, + 0xCCA00000CCE, + 0xCD500000CD7, + 0xCDD00000CDF, + 0xCE000000CE4, + 0xCE600000CF0, + 0xCF100000CF4, + 0xD0000000D0D, + 0xD0E00000D11, + 0xD1200000D45, + 0xD4600000D49, + 0xD4A00000D4F, + 0xD5400000D58, + 0xD5F00000D64, + 0xD6600000D70, + 0xD7A00000D80, + 0xD8100000D84, + 0xD8500000D97, + 0xD9A00000DB2, + 0xDB300000DBC, + 0xDBD00000DBE, + 0xDC000000DC7, + 0xDCA00000DCB, + 0xDCF00000DD5, + 0xDD600000DD7, + 0xDD800000DE0, + 0xDE600000DF0, + 0xDF200000DF4, + 0xE0100000E33, + 0xE3400000E3B, + 0xE4000000E4F, + 0xE5000000E5A, + 0xE8100000E83, + 0xE8400000E85, + 0xE8600000E8B, + 0xE8C00000EA4, + 0xEA500000EA6, + 0xEA700000EB3, + 0xEB400000EBE, + 0xEC000000EC5, + 0xEC600000EC7, + 0xEC800000ECF, + 0xED000000EDA, + 0xEDE00000EE0, + 0xF0000000F01, + 0xF0B00000F0C, + 0xF1800000F1A, + 0xF2000000F2A, + 0xF3500000F36, + 0xF3700000F38, + 0xF3900000F3A, + 0xF3E00000F43, + 0xF4400000F48, + 0xF4900000F4D, + 0xF4E00000F52, + 0xF5300000F57, + 0xF5800000F5C, + 0xF5D00000F69, + 0xF6A00000F6D, + 0xF7100000F73, + 0xF7400000F75, + 0xF7A00000F81, + 0xF8200000F85, + 0xF8600000F93, + 0xF9400000F98, + 0xF9900000F9D, + 0xF9E00000FA2, + 0xFA300000FA7, + 0xFA800000FAC, + 0xFAD00000FB9, + 0xFBA00000FBD, + 0xFC600000FC7, + 0x10000000104A, + 0x10500000109E, + 0x10D0000010FB, + 0x10FD00001100, + 0x120000001249, + 0x124A0000124E, + 0x125000001257, + 0x125800001259, + 0x125A0000125E, + 0x126000001289, + 0x128A0000128E, + 0x1290000012B1, + 0x12B2000012B6, + 0x12B8000012BF, + 0x12C0000012C1, + 0x12C2000012C6, + 0x12C8000012D7, + 0x12D800001311, + 0x131200001316, + 0x13180000135B, + 0x135D00001360, + 0x138000001390, + 0x13A0000013F6, + 0x14010000166D, + 0x166F00001680, + 0x16810000169B, + 0x16A0000016EB, + 0x16F1000016F9, + 0x170000001716, + 0x171F00001735, + 0x174000001754, + 0x17600000176D, + 0x176E00001771, + 0x177200001774, + 0x1780000017B4, + 0x17B6000017D4, + 0x17D7000017D8, + 0x17DC000017DE, + 0x17E0000017EA, + 0x18100000181A, + 0x182000001879, + 0x1880000018AB, + 0x18B0000018F6, + 0x19000000191F, + 0x19200000192C, + 0x19300000193C, + 0x19460000196E, + 0x197000001975, + 0x1980000019AC, + 0x19B0000019CA, + 0x19D0000019DA, + 0x1A0000001A1C, + 0x1A2000001A5F, + 0x1A6000001A7D, + 0x1A7F00001A8A, + 0x1A9000001A9A, + 0x1AA700001AA8, + 0x1AB000001ABE, + 0x1ABF00001ACF, + 0x1B0000001B4D, + 0x1B5000001B5A, + 0x1B6B00001B74, + 0x1B8000001BF4, + 0x1C0000001C38, + 0x1C4000001C4A, + 0x1C4D00001C7E, + 0x1CD000001CD3, + 0x1CD400001CFB, + 0x1D0000001D2C, + 0x1D2F00001D30, + 0x1D3B00001D3C, + 0x1D4E00001D4F, + 0x1D6B00001D78, + 0x1D7900001D9B, + 0x1DC000001E00, + 0x1E0100001E02, + 0x1E0300001E04, + 0x1E0500001E06, + 0x1E0700001E08, + 0x1E0900001E0A, + 0x1E0B00001E0C, + 0x1E0D00001E0E, + 0x1E0F00001E10, + 0x1E1100001E12, + 0x1E1300001E14, + 0x1E1500001E16, + 0x1E1700001E18, + 0x1E1900001E1A, + 0x1E1B00001E1C, + 0x1E1D00001E1E, + 0x1E1F00001E20, + 0x1E2100001E22, + 0x1E2300001E24, + 0x1E2500001E26, + 0x1E2700001E28, + 0x1E2900001E2A, + 0x1E2B00001E2C, + 0x1E2D00001E2E, + 0x1E2F00001E30, + 0x1E3100001E32, + 0x1E3300001E34, + 0x1E3500001E36, + 0x1E3700001E38, + 0x1E3900001E3A, + 0x1E3B00001E3C, + 0x1E3D00001E3E, + 0x1E3F00001E40, + 0x1E4100001E42, + 0x1E4300001E44, + 0x1E4500001E46, + 0x1E4700001E48, + 0x1E4900001E4A, + 0x1E4B00001E4C, + 0x1E4D00001E4E, + 0x1E4F00001E50, + 0x1E5100001E52, + 0x1E5300001E54, + 0x1E5500001E56, + 0x1E5700001E58, + 0x1E5900001E5A, + 0x1E5B00001E5C, + 0x1E5D00001E5E, + 0x1E5F00001E60, + 0x1E6100001E62, + 0x1E6300001E64, + 0x1E6500001E66, + 0x1E6700001E68, + 0x1E6900001E6A, + 0x1E6B00001E6C, + 0x1E6D00001E6E, + 0x1E6F00001E70, + 0x1E7100001E72, + 0x1E7300001E74, + 0x1E7500001E76, + 0x1E7700001E78, + 0x1E7900001E7A, + 0x1E7B00001E7C, + 0x1E7D00001E7E, + 0x1E7F00001E80, + 0x1E8100001E82, + 0x1E8300001E84, + 0x1E8500001E86, + 0x1E8700001E88, + 0x1E8900001E8A, + 0x1E8B00001E8C, + 0x1E8D00001E8E, + 0x1E8F00001E90, + 0x1E9100001E92, + 0x1E9300001E94, + 0x1E9500001E9A, + 0x1E9C00001E9E, + 0x1E9F00001EA0, + 0x1EA100001EA2, + 0x1EA300001EA4, + 0x1EA500001EA6, + 0x1EA700001EA8, + 0x1EA900001EAA, + 0x1EAB00001EAC, + 0x1EAD00001EAE, + 0x1EAF00001EB0, + 0x1EB100001EB2, + 0x1EB300001EB4, + 0x1EB500001EB6, + 0x1EB700001EB8, + 0x1EB900001EBA, + 0x1EBB00001EBC, + 0x1EBD00001EBE, + 0x1EBF00001EC0, + 0x1EC100001EC2, + 0x1EC300001EC4, + 0x1EC500001EC6, + 0x1EC700001EC8, + 0x1EC900001ECA, + 0x1ECB00001ECC, + 0x1ECD00001ECE, + 0x1ECF00001ED0, + 0x1ED100001ED2, + 0x1ED300001ED4, + 0x1ED500001ED6, + 0x1ED700001ED8, + 0x1ED900001EDA, + 0x1EDB00001EDC, + 0x1EDD00001EDE, + 0x1EDF00001EE0, + 0x1EE100001EE2, + 0x1EE300001EE4, + 0x1EE500001EE6, + 0x1EE700001EE8, + 0x1EE900001EEA, + 0x1EEB00001EEC, + 0x1EED00001EEE, + 0x1EEF00001EF0, + 0x1EF100001EF2, + 0x1EF300001EF4, + 0x1EF500001EF6, + 0x1EF700001EF8, + 0x1EF900001EFA, + 0x1EFB00001EFC, + 0x1EFD00001EFE, + 0x1EFF00001F08, + 0x1F1000001F16, + 0x1F2000001F28, + 0x1F3000001F38, + 0x1F4000001F46, + 0x1F5000001F58, + 0x1F6000001F68, + 0x1F7000001F71, + 0x1F7200001F73, + 0x1F7400001F75, + 0x1F7600001F77, + 0x1F7800001F79, + 0x1F7A00001F7B, + 0x1F7C00001F7D, + 0x1FB000001FB2, + 0x1FB600001FB7, + 0x1FC600001FC7, + 0x1FD000001FD3, + 0x1FD600001FD8, + 0x1FE000001FE3, + 0x1FE400001FE8, + 0x1FF600001FF7, + 0x214E0000214F, + 0x218400002185, + 0x2C3000002C60, + 0x2C6100002C62, + 0x2C6500002C67, + 0x2C6800002C69, + 0x2C6A00002C6B, + 0x2C6C00002C6D, + 0x2C7100002C72, + 0x2C7300002C75, + 0x2C7600002C7C, + 0x2C8100002C82, + 0x2C8300002C84, + 0x2C8500002C86, + 0x2C8700002C88, + 0x2C8900002C8A, + 0x2C8B00002C8C, + 0x2C8D00002C8E, + 0x2C8F00002C90, + 0x2C9100002C92, + 0x2C9300002C94, + 0x2C9500002C96, + 0x2C9700002C98, + 0x2C9900002C9A, + 0x2C9B00002C9C, + 0x2C9D00002C9E, + 0x2C9F00002CA0, + 0x2CA100002CA2, + 0x2CA300002CA4, + 0x2CA500002CA6, + 0x2CA700002CA8, + 0x2CA900002CAA, + 0x2CAB00002CAC, + 0x2CAD00002CAE, + 0x2CAF00002CB0, + 0x2CB100002CB2, + 0x2CB300002CB4, + 0x2CB500002CB6, + 0x2CB700002CB8, + 0x2CB900002CBA, + 0x2CBB00002CBC, + 0x2CBD00002CBE, + 0x2CBF00002CC0, + 0x2CC100002CC2, + 0x2CC300002CC4, + 0x2CC500002CC6, + 0x2CC700002CC8, + 0x2CC900002CCA, + 0x2CCB00002CCC, + 0x2CCD00002CCE, + 0x2CCF00002CD0, + 0x2CD100002CD2, + 0x2CD300002CD4, + 0x2CD500002CD6, + 0x2CD700002CD8, + 0x2CD900002CDA, + 0x2CDB00002CDC, + 0x2CDD00002CDE, + 0x2CDF00002CE0, + 0x2CE100002CE2, + 0x2CE300002CE5, + 0x2CEC00002CED, + 0x2CEE00002CF2, + 0x2CF300002CF4, + 0x2D0000002D26, + 0x2D2700002D28, + 0x2D2D00002D2E, + 0x2D3000002D68, + 0x2D7F00002D97, + 0x2DA000002DA7, + 0x2DA800002DAF, + 0x2DB000002DB7, + 0x2DB800002DBF, + 0x2DC000002DC7, + 0x2DC800002DCF, + 0x2DD000002DD7, + 0x2DD800002DDF, + 0x2DE000002E00, + 0x2E2F00002E30, + 0x300500003008, + 0x302A0000302E, + 0x303C0000303D, + 0x304100003097, + 0x30990000309B, + 0x309D0000309F, + 0x30A1000030FB, + 0x30FC000030FF, + 0x310500003130, + 0x31A0000031C0, + 0x31F000003200, + 0x340000004DC0, + 0x4E000000A48D, + 0xA4D00000A4FE, + 0xA5000000A60D, + 0xA6100000A62C, + 0xA6410000A642, + 0xA6430000A644, + 0xA6450000A646, + 0xA6470000A648, + 0xA6490000A64A, + 0xA64B0000A64C, + 0xA64D0000A64E, + 0xA64F0000A650, + 0xA6510000A652, + 0xA6530000A654, + 0xA6550000A656, + 0xA6570000A658, + 0xA6590000A65A, + 0xA65B0000A65C, + 0xA65D0000A65E, + 0xA65F0000A660, + 0xA6610000A662, + 0xA6630000A664, + 0xA6650000A666, + 0xA6670000A668, + 0xA6690000A66A, + 0xA66B0000A66C, + 0xA66D0000A670, + 0xA6740000A67E, + 0xA67F0000A680, + 0xA6810000A682, + 0xA6830000A684, + 0xA6850000A686, + 0xA6870000A688, + 0xA6890000A68A, + 0xA68B0000A68C, + 0xA68D0000A68E, + 0xA68F0000A690, + 0xA6910000A692, + 0xA6930000A694, + 0xA6950000A696, + 0xA6970000A698, + 0xA6990000A69A, + 0xA69B0000A69C, + 0xA69E0000A6E6, + 0xA6F00000A6F2, + 0xA7170000A720, + 0xA7230000A724, + 0xA7250000A726, + 0xA7270000A728, + 0xA7290000A72A, + 0xA72B0000A72C, + 0xA72D0000A72E, + 0xA72F0000A732, + 0xA7330000A734, + 0xA7350000A736, + 0xA7370000A738, + 0xA7390000A73A, + 0xA73B0000A73C, + 0xA73D0000A73E, + 0xA73F0000A740, + 0xA7410000A742, + 0xA7430000A744, + 0xA7450000A746, + 0xA7470000A748, + 0xA7490000A74A, + 0xA74B0000A74C, + 0xA74D0000A74E, + 0xA74F0000A750, + 0xA7510000A752, + 0xA7530000A754, + 0xA7550000A756, + 0xA7570000A758, + 0xA7590000A75A, + 0xA75B0000A75C, + 0xA75D0000A75E, + 0xA75F0000A760, + 0xA7610000A762, + 0xA7630000A764, + 0xA7650000A766, + 0xA7670000A768, + 0xA7690000A76A, + 0xA76B0000A76C, + 0xA76D0000A76E, + 0xA76F0000A770, + 0xA7710000A779, + 0xA77A0000A77B, + 0xA77C0000A77D, + 0xA77F0000A780, + 0xA7810000A782, + 0xA7830000A784, + 0xA7850000A786, + 0xA7870000A789, + 0xA78C0000A78D, + 0xA78E0000A790, + 0xA7910000A792, + 0xA7930000A796, + 0xA7970000A798, + 0xA7990000A79A, + 0xA79B0000A79C, + 0xA79D0000A79E, + 0xA79F0000A7A0, + 0xA7A10000A7A2, + 0xA7A30000A7A4, + 0xA7A50000A7A6, + 0xA7A70000A7A8, + 0xA7A90000A7AA, + 0xA7AF0000A7B0, + 0xA7B50000A7B6, + 0xA7B70000A7B8, + 0xA7B90000A7BA, + 0xA7BB0000A7BC, + 0xA7BD0000A7BE, + 0xA7BF0000A7C0, + 0xA7C10000A7C2, + 0xA7C30000A7C4, + 0xA7C80000A7C9, + 0xA7CA0000A7CB, + 0xA7D10000A7D2, + 0xA7D30000A7D4, + 0xA7D50000A7D6, + 0xA7D70000A7D8, + 0xA7D90000A7DA, + 0xA7F60000A7F8, + 0xA7FA0000A828, + 0xA82C0000A82D, + 0xA8400000A874, + 0xA8800000A8C6, + 0xA8D00000A8DA, + 0xA8E00000A8F8, + 0xA8FB0000A8FC, + 0xA8FD0000A92E, + 0xA9300000A954, + 0xA9800000A9C1, + 0xA9CF0000A9DA, + 0xA9E00000A9FF, + 0xAA000000AA37, + 0xAA400000AA4E, + 0xAA500000AA5A, + 0xAA600000AA77, + 0xAA7A0000AAC3, + 0xAADB0000AADE, + 0xAAE00000AAF0, + 0xAAF20000AAF7, + 0xAB010000AB07, + 0xAB090000AB0F, + 0xAB110000AB17, + 0xAB200000AB27, + 0xAB280000AB2F, + 0xAB300000AB5B, + 0xAB600000AB69, + 0xABC00000ABEB, + 0xABEC0000ABEE, + 0xABF00000ABFA, + 0xAC000000D7A4, + 0xFA0E0000FA10, + 0xFA110000FA12, + 0xFA130000FA15, + 0xFA1F0000FA20, + 0xFA210000FA22, + 0xFA230000FA25, + 0xFA270000FA2A, + 0xFB1E0000FB1F, + 0xFE200000FE30, + 0xFE730000FE74, + 0x100000001000C, + 0x1000D00010027, + 0x100280001003B, + 0x1003C0001003E, + 0x1003F0001004E, + 0x100500001005E, + 0x10080000100FB, + 0x101FD000101FE, + 0x102800001029D, + 0x102A0000102D1, + 0x102E0000102E1, + 0x1030000010320, + 0x1032D00010341, + 0x103420001034A, + 0x103500001037B, + 0x103800001039E, + 0x103A0000103C4, + 0x103C8000103D0, + 0x104280001049E, + 0x104A0000104AA, + 0x104D8000104FC, + 0x1050000010528, + 0x1053000010564, + 0x10597000105A2, + 0x105A3000105B2, + 0x105B3000105BA, + 0x105BB000105BD, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1078000010781, + 0x1080000010806, + 0x1080800010809, + 0x1080A00010836, + 0x1083700010839, + 0x1083C0001083D, + 0x1083F00010856, + 0x1086000010877, + 0x108800001089F, + 0x108E0000108F3, + 0x108F4000108F6, + 0x1090000010916, + 0x109200001093A, + 0x10980000109B8, + 0x109BE000109C0, + 0x10A0000010A04, + 0x10A0500010A07, + 0x10A0C00010A14, + 0x10A1500010A18, + 0x10A1900010A36, + 0x10A3800010A3B, + 0x10A3F00010A40, + 0x10A6000010A7D, + 0x10A8000010A9D, + 0x10AC000010AC8, + 0x10AC900010AE7, + 0x10B0000010B36, + 0x10B4000010B56, + 0x10B6000010B73, + 0x10B8000010B92, + 0x10C0000010C49, + 0x10CC000010CF3, + 0x10D0000010D28, + 0x10D3000010D3A, + 0x10E8000010EAA, + 0x10EAB00010EAD, + 0x10EB000010EB2, + 0x10EFD00010F1D, + 0x10F2700010F28, + 0x10F3000010F51, + 0x10F7000010F86, + 0x10FB000010FC5, + 0x10FE000010FF7, + 0x1100000011047, + 0x1106600011076, + 0x1107F000110BB, + 0x110C2000110C3, + 0x110D0000110E9, + 0x110F0000110FA, + 0x1110000011135, + 0x1113600011140, + 0x1114400011148, + 0x1115000011174, + 0x1117600011177, + 0x11180000111C5, + 0x111C9000111CD, + 0x111CE000111DB, + 0x111DC000111DD, + 0x1120000011212, + 0x1121300011238, + 0x1123E00011242, + 0x1128000011287, + 0x1128800011289, + 0x1128A0001128E, + 0x1128F0001129E, + 0x1129F000112A9, + 0x112B0000112EB, + 0x112F0000112FA, + 0x1130000011304, + 0x113050001130D, + 0x1130F00011311, + 0x1131300011329, + 0x1132A00011331, + 0x1133200011334, + 0x113350001133A, + 0x1133B00011345, + 0x1134700011349, + 0x1134B0001134E, + 0x1135000011351, + 0x1135700011358, + 0x1135D00011364, + 0x113660001136D, + 0x1137000011375, + 0x114000001144B, + 0x114500001145A, + 0x1145E00011462, + 0x11480000114C6, + 0x114C7000114C8, + 0x114D0000114DA, + 0x11580000115B6, + 0x115B8000115C1, + 0x115D8000115DE, + 0x1160000011641, + 0x1164400011645, + 0x116500001165A, + 0x11680000116B9, + 0x116C0000116CA, + 0x117000001171B, + 0x1171D0001172C, + 0x117300001173A, + 0x1174000011747, + 0x118000001183B, + 0x118C0000118EA, + 0x118FF00011907, + 0x119090001190A, + 0x1190C00011914, + 0x1191500011917, + 0x1191800011936, + 0x1193700011939, + 0x1193B00011944, + 0x119500001195A, + 0x119A0000119A8, + 0x119AA000119D8, + 0x119DA000119E2, + 0x119E3000119E5, + 0x11A0000011A3F, + 0x11A4700011A48, + 0x11A5000011A9A, + 0x11A9D00011A9E, + 0x11AB000011AF9, + 0x11C0000011C09, + 0x11C0A00011C37, + 0x11C3800011C41, + 0x11C5000011C5A, + 0x11C7200011C90, + 0x11C9200011CA8, + 0x11CA900011CB7, + 0x11D0000011D07, + 0x11D0800011D0A, + 0x11D0B00011D37, + 0x11D3A00011D3B, + 0x11D3C00011D3E, + 0x11D3F00011D48, + 0x11D5000011D5A, + 0x11D6000011D66, + 0x11D6700011D69, + 0x11D6A00011D8F, + 0x11D9000011D92, + 0x11D9300011D99, + 0x11DA000011DAA, + 0x11EE000011EF7, + 0x11F0000011F11, + 0x11F1200011F3B, + 0x11F3E00011F43, + 0x11F5000011F5A, + 0x11FB000011FB1, + 0x120000001239A, + 0x1248000012544, + 0x12F9000012FF1, + 0x1300000013430, + 0x1344000013456, + 0x1440000014647, + 0x1680000016A39, + 0x16A4000016A5F, + 0x16A6000016A6A, + 0x16A7000016ABF, + 0x16AC000016ACA, + 0x16AD000016AEE, + 0x16AF000016AF5, + 0x16B0000016B37, + 0x16B4000016B44, + 0x16B5000016B5A, + 0x16B6300016B78, + 0x16B7D00016B90, + 0x16E6000016E80, + 0x16F0000016F4B, + 0x16F4F00016F88, + 0x16F8F00016FA0, + 0x16FE000016FE2, + 0x16FE300016FE5, + 0x16FF000016FF2, + 0x17000000187F8, + 0x1880000018CD6, + 0x18D0000018D09, + 0x1AFF00001AFF4, + 0x1AFF50001AFFC, + 0x1AFFD0001AFFF, + 0x1B0000001B123, + 0x1B1320001B133, + 0x1B1500001B153, + 0x1B1550001B156, + 0x1B1640001B168, + 0x1B1700001B2FC, + 0x1BC000001BC6B, + 0x1BC700001BC7D, + 0x1BC800001BC89, + 0x1BC900001BC9A, + 0x1BC9D0001BC9F, + 0x1CF000001CF2E, + 0x1CF300001CF47, + 0x1DA000001DA37, + 0x1DA3B0001DA6D, + 0x1DA750001DA76, + 0x1DA840001DA85, + 0x1DA9B0001DAA0, + 0x1DAA10001DAB0, + 0x1DF000001DF1F, + 0x1DF250001DF2B, + 0x1E0000001E007, + 0x1E0080001E019, + 0x1E01B0001E022, + 0x1E0230001E025, + 0x1E0260001E02B, + 0x1E08F0001E090, + 0x1E1000001E12D, + 0x1E1300001E13E, + 0x1E1400001E14A, + 0x1E14E0001E14F, + 0x1E2900001E2AF, + 0x1E2C00001E2FA, + 0x1E4D00001E4FA, + 0x1E7E00001E7E7, + 0x1E7E80001E7EC, + 0x1E7ED0001E7EF, + 0x1E7F00001E7FF, + 0x1E8000001E8C5, + 0x1E8D00001E8D7, + 0x1E9220001E94C, + 0x1E9500001E95A, + 0x200000002A6E0, + 0x2A7000002B73A, + 0x2B7400002B81E, + 0x2B8200002CEA2, + 0x2CEB00002EBE1, + 0x2EBF00002EE5E, + 0x300000003134B, + 0x31350000323B0, + ), + "CONTEXTJ": (0x200C0000200E,), + "CONTEXTO": ( + 0xB7000000B8, + 0x37500000376, + 0x5F3000005F5, + 0x6600000066A, + 0x6F0000006FA, + 0x30FB000030FC, + ), +} diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/intranges.py b/stripe_config/.venv/lib/python3.12/site-packages/idna/intranges.py new file mode 100644 index 0000000..7bfaa8d --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna/intranges.py @@ -0,0 +1,57 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect +from typing import List, Tuple + + +def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i + 1 < len(sorted_list): + if sorted_list[i] == sorted_list[i + 1] - 1: + continue + current_range = sorted_list[last_write + 1 : i + 1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + + +def _encode_range(start: int, end: int) -> int: + return (start << 32) | end + + +def _decode_range(r: int) -> Tuple[int, int]: + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos - 1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/package_data.py b/stripe_config/.venv/lib/python3.12/site-packages/idna/package_data.py new file mode 100644 index 0000000..514ff7e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna/package_data.py @@ -0,0 +1 @@ +__version__ = "3.10" diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/py.typed b/stripe_config/.venv/lib/python3.12/site-packages/idna/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/idna/uts46data.py b/stripe_config/.venv/lib/python3.12/site-packages/idna/uts46data.py new file mode 100644 index 0000000..eb89432 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/idna/uts46data.py @@ -0,0 +1,8681 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +from typing import List, Tuple, Union + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "15.1.0" + + +def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x0, "3"), + (0x1, "3"), + (0x2, "3"), + (0x3, "3"), + (0x4, "3"), + (0x5, "3"), + (0x6, "3"), + (0x7, "3"), + (0x8, "3"), + (0x9, "3"), + (0xA, "3"), + (0xB, "3"), + (0xC, "3"), + (0xD, "3"), + (0xE, "3"), + (0xF, "3"), + (0x10, "3"), + (0x11, "3"), + (0x12, "3"), + (0x13, "3"), + (0x14, "3"), + (0x15, "3"), + (0x16, "3"), + (0x17, "3"), + (0x18, "3"), + (0x19, "3"), + (0x1A, "3"), + (0x1B, "3"), + (0x1C, "3"), + (0x1D, "3"), + (0x1E, "3"), + (0x1F, "3"), + (0x20, "3"), + (0x21, "3"), + (0x22, "3"), + (0x23, "3"), + (0x24, "3"), + (0x25, "3"), + (0x26, "3"), + (0x27, "3"), + (0x28, "3"), + (0x29, "3"), + (0x2A, "3"), + (0x2B, "3"), + (0x2C, "3"), + (0x2D, "V"), + (0x2E, "V"), + (0x2F, "3"), + (0x30, "V"), + (0x31, "V"), + (0x32, "V"), + (0x33, "V"), + (0x34, "V"), + (0x35, "V"), + (0x36, "V"), + (0x37, "V"), + (0x38, "V"), + (0x39, "V"), + (0x3A, "3"), + (0x3B, "3"), + (0x3C, "3"), + (0x3D, "3"), + (0x3E, "3"), + (0x3F, "3"), + (0x40, "3"), + (0x41, "M", "a"), + (0x42, "M", "b"), + (0x43, "M", "c"), + (0x44, "M", "d"), + (0x45, "M", "e"), + (0x46, "M", "f"), + (0x47, "M", "g"), + (0x48, "M", "h"), + (0x49, "M", "i"), + (0x4A, "M", "j"), + (0x4B, "M", "k"), + (0x4C, "M", "l"), + (0x4D, "M", "m"), + (0x4E, "M", "n"), + (0x4F, "M", "o"), + (0x50, "M", "p"), + (0x51, "M", "q"), + (0x52, "M", "r"), + (0x53, "M", "s"), + (0x54, "M", "t"), + (0x55, "M", "u"), + (0x56, "M", "v"), + (0x57, "M", "w"), + (0x58, "M", "x"), + (0x59, "M", "y"), + (0x5A, "M", "z"), + (0x5B, "3"), + (0x5C, "3"), + (0x5D, "3"), + (0x5E, "3"), + (0x5F, "3"), + (0x60, "3"), + (0x61, "V"), + (0x62, "V"), + (0x63, "V"), + ] + + +def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x64, "V"), + (0x65, "V"), + (0x66, "V"), + (0x67, "V"), + (0x68, "V"), + (0x69, "V"), + (0x6A, "V"), + (0x6B, "V"), + (0x6C, "V"), + (0x6D, "V"), + (0x6E, "V"), + (0x6F, "V"), + (0x70, "V"), + (0x71, "V"), + (0x72, "V"), + (0x73, "V"), + (0x74, "V"), + (0x75, "V"), + (0x76, "V"), + (0x77, "V"), + (0x78, "V"), + (0x79, "V"), + (0x7A, "V"), + (0x7B, "3"), + (0x7C, "3"), + (0x7D, "3"), + (0x7E, "3"), + (0x7F, "3"), + (0x80, "X"), + (0x81, "X"), + (0x82, "X"), + (0x83, "X"), + (0x84, "X"), + (0x85, "X"), + (0x86, "X"), + (0x87, "X"), + (0x88, "X"), + (0x89, "X"), + (0x8A, "X"), + (0x8B, "X"), + (0x8C, "X"), + (0x8D, "X"), + (0x8E, "X"), + (0x8F, "X"), + (0x90, "X"), + (0x91, "X"), + (0x92, "X"), + (0x93, "X"), + (0x94, "X"), + (0x95, "X"), + (0x96, "X"), + (0x97, "X"), + (0x98, "X"), + (0x99, "X"), + (0x9A, "X"), + (0x9B, "X"), + (0x9C, "X"), + (0x9D, "X"), + (0x9E, "X"), + (0x9F, "X"), + (0xA0, "3", " "), + (0xA1, "V"), + (0xA2, "V"), + (0xA3, "V"), + (0xA4, "V"), + (0xA5, "V"), + (0xA6, "V"), + (0xA7, "V"), + (0xA8, "3", " ̈"), + (0xA9, "V"), + (0xAA, "M", "a"), + (0xAB, "V"), + (0xAC, "V"), + (0xAD, "I"), + (0xAE, "V"), + (0xAF, "3", " ̄"), + (0xB0, "V"), + (0xB1, "V"), + (0xB2, "M", "2"), + (0xB3, "M", "3"), + (0xB4, "3", " ́"), + (0xB5, "M", "μ"), + (0xB6, "V"), + (0xB7, "V"), + (0xB8, "3", " ̧"), + (0xB9, "M", "1"), + (0xBA, "M", "o"), + (0xBB, "V"), + (0xBC, "M", "1⁄4"), + (0xBD, "M", "1⁄2"), + (0xBE, "M", "3⁄4"), + (0xBF, "V"), + (0xC0, "M", "à"), + (0xC1, "M", "á"), + (0xC2, "M", "â"), + (0xC3, "M", "ã"), + (0xC4, "M", "ä"), + (0xC5, "M", "å"), + (0xC6, "M", "æ"), + (0xC7, "M", "ç"), + ] + + +def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC8, "M", "è"), + (0xC9, "M", "é"), + (0xCA, "M", "ê"), + (0xCB, "M", "ë"), + (0xCC, "M", "ì"), + (0xCD, "M", "í"), + (0xCE, "M", "î"), + (0xCF, "M", "ï"), + (0xD0, "M", "ð"), + (0xD1, "M", "ñ"), + (0xD2, "M", "ò"), + (0xD3, "M", "ó"), + (0xD4, "M", "ô"), + (0xD5, "M", "õ"), + (0xD6, "M", "ö"), + (0xD7, "V"), + (0xD8, "M", "ø"), + (0xD9, "M", "ù"), + (0xDA, "M", "ú"), + (0xDB, "M", "û"), + (0xDC, "M", "ü"), + (0xDD, "M", "ý"), + (0xDE, "M", "þ"), + (0xDF, "D", "ss"), + (0xE0, "V"), + (0xE1, "V"), + (0xE2, "V"), + (0xE3, "V"), + (0xE4, "V"), + (0xE5, "V"), + (0xE6, "V"), + (0xE7, "V"), + (0xE8, "V"), + (0xE9, "V"), + (0xEA, "V"), + (0xEB, "V"), + (0xEC, "V"), + (0xED, "V"), + (0xEE, "V"), + (0xEF, "V"), + (0xF0, "V"), + (0xF1, "V"), + (0xF2, "V"), + (0xF3, "V"), + (0xF4, "V"), + (0xF5, "V"), + (0xF6, "V"), + (0xF7, "V"), + (0xF8, "V"), + (0xF9, "V"), + (0xFA, "V"), + (0xFB, "V"), + (0xFC, "V"), + (0xFD, "V"), + (0xFE, "V"), + (0xFF, "V"), + (0x100, "M", "ā"), + (0x101, "V"), + (0x102, "M", "ă"), + (0x103, "V"), + (0x104, "M", "ą"), + (0x105, "V"), + (0x106, "M", "ć"), + (0x107, "V"), + (0x108, "M", "ĉ"), + (0x109, "V"), + (0x10A, "M", "ċ"), + (0x10B, "V"), + (0x10C, "M", "č"), + (0x10D, "V"), + (0x10E, "M", "ď"), + (0x10F, "V"), + (0x110, "M", "đ"), + (0x111, "V"), + (0x112, "M", "ē"), + (0x113, "V"), + (0x114, "M", "ĕ"), + (0x115, "V"), + (0x116, "M", "ė"), + (0x117, "V"), + (0x118, "M", "ę"), + (0x119, "V"), + (0x11A, "M", "ě"), + (0x11B, "V"), + (0x11C, "M", "ĝ"), + (0x11D, "V"), + (0x11E, "M", "ğ"), + (0x11F, "V"), + (0x120, "M", "ġ"), + (0x121, "V"), + (0x122, "M", "ģ"), + (0x123, "V"), + (0x124, "M", "ĥ"), + (0x125, "V"), + (0x126, "M", "ħ"), + (0x127, "V"), + (0x128, "M", "ĩ"), + (0x129, "V"), + (0x12A, "M", "ī"), + (0x12B, "V"), + ] + + +def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x12C, "M", "ĭ"), + (0x12D, "V"), + (0x12E, "M", "į"), + (0x12F, "V"), + (0x130, "M", "i̇"), + (0x131, "V"), + (0x132, "M", "ij"), + (0x134, "M", "ĵ"), + (0x135, "V"), + (0x136, "M", "ķ"), + (0x137, "V"), + (0x139, "M", "ĺ"), + (0x13A, "V"), + (0x13B, "M", "ļ"), + (0x13C, "V"), + (0x13D, "M", "ľ"), + (0x13E, "V"), + (0x13F, "M", "l·"), + (0x141, "M", "ł"), + (0x142, "V"), + (0x143, "M", "ń"), + (0x144, "V"), + (0x145, "M", "ņ"), + (0x146, "V"), + (0x147, "M", "ň"), + (0x148, "V"), + (0x149, "M", "ʼn"), + (0x14A, "M", "ŋ"), + (0x14B, "V"), + (0x14C, "M", "ō"), + (0x14D, "V"), + (0x14E, "M", "ŏ"), + (0x14F, "V"), + (0x150, "M", "ő"), + (0x151, "V"), + (0x152, "M", "œ"), + (0x153, "V"), + (0x154, "M", "ŕ"), + (0x155, "V"), + (0x156, "M", "ŗ"), + (0x157, "V"), + (0x158, "M", "ř"), + (0x159, "V"), + (0x15A, "M", "ś"), + (0x15B, "V"), + (0x15C, "M", "ŝ"), + (0x15D, "V"), + (0x15E, "M", "ş"), + (0x15F, "V"), + (0x160, "M", "š"), + (0x161, "V"), + (0x162, "M", "ţ"), + (0x163, "V"), + (0x164, "M", "ť"), + (0x165, "V"), + (0x166, "M", "ŧ"), + (0x167, "V"), + (0x168, "M", "ũ"), + (0x169, "V"), + (0x16A, "M", "ū"), + (0x16B, "V"), + (0x16C, "M", "ŭ"), + (0x16D, "V"), + (0x16E, "M", "ů"), + (0x16F, "V"), + (0x170, "M", "ű"), + (0x171, "V"), + (0x172, "M", "ų"), + (0x173, "V"), + (0x174, "M", "ŵ"), + (0x175, "V"), + (0x176, "M", "ŷ"), + (0x177, "V"), + (0x178, "M", "ÿ"), + (0x179, "M", "ź"), + (0x17A, "V"), + (0x17B, "M", "ż"), + (0x17C, "V"), + (0x17D, "M", "ž"), + (0x17E, "V"), + (0x17F, "M", "s"), + (0x180, "V"), + (0x181, "M", "ɓ"), + (0x182, "M", "ƃ"), + (0x183, "V"), + (0x184, "M", "ƅ"), + (0x185, "V"), + (0x186, "M", "ɔ"), + (0x187, "M", "ƈ"), + (0x188, "V"), + (0x189, "M", "ɖ"), + (0x18A, "M", "ɗ"), + (0x18B, "M", "ƌ"), + (0x18C, "V"), + (0x18E, "M", "ǝ"), + (0x18F, "M", "ə"), + (0x190, "M", "ɛ"), + (0x191, "M", "ƒ"), + (0x192, "V"), + (0x193, "M", "ɠ"), + ] + + +def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x194, "M", "ɣ"), + (0x195, "V"), + (0x196, "M", "ɩ"), + (0x197, "M", "ɨ"), + (0x198, "M", "ƙ"), + (0x199, "V"), + (0x19C, "M", "ɯ"), + (0x19D, "M", "ɲ"), + (0x19E, "V"), + (0x19F, "M", "ɵ"), + (0x1A0, "M", "ơ"), + (0x1A1, "V"), + (0x1A2, "M", "ƣ"), + (0x1A3, "V"), + (0x1A4, "M", "ƥ"), + (0x1A5, "V"), + (0x1A6, "M", "ʀ"), + (0x1A7, "M", "ƨ"), + (0x1A8, "V"), + (0x1A9, "M", "ʃ"), + (0x1AA, "V"), + (0x1AC, "M", "ƭ"), + (0x1AD, "V"), + (0x1AE, "M", "ʈ"), + (0x1AF, "M", "ư"), + (0x1B0, "V"), + (0x1B1, "M", "ʊ"), + (0x1B2, "M", "ʋ"), + (0x1B3, "M", "ƴ"), + (0x1B4, "V"), + (0x1B5, "M", "ƶ"), + (0x1B6, "V"), + (0x1B7, "M", "ʒ"), + (0x1B8, "M", "ƹ"), + (0x1B9, "V"), + (0x1BC, "M", "ƽ"), + (0x1BD, "V"), + (0x1C4, "M", "dž"), + (0x1C7, "M", "lj"), + (0x1CA, "M", "nj"), + (0x1CD, "M", "ǎ"), + (0x1CE, "V"), + (0x1CF, "M", "ǐ"), + (0x1D0, "V"), + (0x1D1, "M", "ǒ"), + (0x1D2, "V"), + (0x1D3, "M", "ǔ"), + (0x1D4, "V"), + (0x1D5, "M", "ǖ"), + (0x1D6, "V"), + (0x1D7, "M", "ǘ"), + (0x1D8, "V"), + (0x1D9, "M", "ǚ"), + (0x1DA, "V"), + (0x1DB, "M", "ǜ"), + (0x1DC, "V"), + (0x1DE, "M", "ǟ"), + (0x1DF, "V"), + (0x1E0, "M", "ǡ"), + (0x1E1, "V"), + (0x1E2, "M", "ǣ"), + (0x1E3, "V"), + (0x1E4, "M", "ǥ"), + (0x1E5, "V"), + (0x1E6, "M", "ǧ"), + (0x1E7, "V"), + (0x1E8, "M", "ǩ"), + (0x1E9, "V"), + (0x1EA, "M", "ǫ"), + (0x1EB, "V"), + (0x1EC, "M", "ǭ"), + (0x1ED, "V"), + (0x1EE, "M", "ǯ"), + (0x1EF, "V"), + (0x1F1, "M", "dz"), + (0x1F4, "M", "ǵ"), + (0x1F5, "V"), + (0x1F6, "M", "ƕ"), + (0x1F7, "M", "ƿ"), + (0x1F8, "M", "ǹ"), + (0x1F9, "V"), + (0x1FA, "M", "ǻ"), + (0x1FB, "V"), + (0x1FC, "M", "ǽ"), + (0x1FD, "V"), + (0x1FE, "M", "ǿ"), + (0x1FF, "V"), + (0x200, "M", "ȁ"), + (0x201, "V"), + (0x202, "M", "ȃ"), + (0x203, "V"), + (0x204, "M", "ȅ"), + (0x205, "V"), + (0x206, "M", "ȇ"), + (0x207, "V"), + (0x208, "M", "ȉ"), + (0x209, "V"), + (0x20A, "M", "ȋ"), + (0x20B, "V"), + (0x20C, "M", "ȍ"), + ] + + +def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x20D, "V"), + (0x20E, "M", "ȏ"), + (0x20F, "V"), + (0x210, "M", "ȑ"), + (0x211, "V"), + (0x212, "M", "ȓ"), + (0x213, "V"), + (0x214, "M", "ȕ"), + (0x215, "V"), + (0x216, "M", "ȗ"), + (0x217, "V"), + (0x218, "M", "ș"), + (0x219, "V"), + (0x21A, "M", "ț"), + (0x21B, "V"), + (0x21C, "M", "ȝ"), + (0x21D, "V"), + (0x21E, "M", "ȟ"), + (0x21F, "V"), + (0x220, "M", "ƞ"), + (0x221, "V"), + (0x222, "M", "ȣ"), + (0x223, "V"), + (0x224, "M", "ȥ"), + (0x225, "V"), + (0x226, "M", "ȧ"), + (0x227, "V"), + (0x228, "M", "ȩ"), + (0x229, "V"), + (0x22A, "M", "ȫ"), + (0x22B, "V"), + (0x22C, "M", "ȭ"), + (0x22D, "V"), + (0x22E, "M", "ȯ"), + (0x22F, "V"), + (0x230, "M", "ȱ"), + (0x231, "V"), + (0x232, "M", "ȳ"), + (0x233, "V"), + (0x23A, "M", "ⱥ"), + (0x23B, "M", "ȼ"), + (0x23C, "V"), + (0x23D, "M", "ƚ"), + (0x23E, "M", "ⱦ"), + (0x23F, "V"), + (0x241, "M", "ɂ"), + (0x242, "V"), + (0x243, "M", "ƀ"), + (0x244, "M", "ʉ"), + (0x245, "M", "ʌ"), + (0x246, "M", "ɇ"), + (0x247, "V"), + (0x248, "M", "ɉ"), + (0x249, "V"), + (0x24A, "M", "ɋ"), + (0x24B, "V"), + (0x24C, "M", "ɍ"), + (0x24D, "V"), + (0x24E, "M", "ɏ"), + (0x24F, "V"), + (0x2B0, "M", "h"), + (0x2B1, "M", "ɦ"), + (0x2B2, "M", "j"), + (0x2B3, "M", "r"), + (0x2B4, "M", "ɹ"), + (0x2B5, "M", "ɻ"), + (0x2B6, "M", "ʁ"), + (0x2B7, "M", "w"), + (0x2B8, "M", "y"), + (0x2B9, "V"), + (0x2D8, "3", " ̆"), + (0x2D9, "3", " ̇"), + (0x2DA, "3", " ̊"), + (0x2DB, "3", " ̨"), + (0x2DC, "3", " ̃"), + (0x2DD, "3", " ̋"), + (0x2DE, "V"), + (0x2E0, "M", "ɣ"), + (0x2E1, "M", "l"), + (0x2E2, "M", "s"), + (0x2E3, "M", "x"), + (0x2E4, "M", "ʕ"), + (0x2E5, "V"), + (0x340, "M", "̀"), + (0x341, "M", "́"), + (0x342, "V"), + (0x343, "M", "̓"), + (0x344, "M", "̈́"), + (0x345, "M", "ι"), + (0x346, "V"), + (0x34F, "I"), + (0x350, "V"), + (0x370, "M", "ͱ"), + (0x371, "V"), + (0x372, "M", "ͳ"), + (0x373, "V"), + (0x374, "M", "ʹ"), + (0x375, "V"), + (0x376, "M", "ͷ"), + (0x377, "V"), + ] + + +def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x378, "X"), + (0x37A, "3", " ι"), + (0x37B, "V"), + (0x37E, "3", ";"), + (0x37F, "M", "ϳ"), + (0x380, "X"), + (0x384, "3", " ́"), + (0x385, "3", " ̈́"), + (0x386, "M", "ά"), + (0x387, "M", "·"), + (0x388, "M", "έ"), + (0x389, "M", "ή"), + (0x38A, "M", "ί"), + (0x38B, "X"), + (0x38C, "M", "ό"), + (0x38D, "X"), + (0x38E, "M", "ύ"), + (0x38F, "M", "ώ"), + (0x390, "V"), + (0x391, "M", "α"), + (0x392, "M", "β"), + (0x393, "M", "γ"), + (0x394, "M", "δ"), + (0x395, "M", "ε"), + (0x396, "M", "ζ"), + (0x397, "M", "η"), + (0x398, "M", "θ"), + (0x399, "M", "ι"), + (0x39A, "M", "κ"), + (0x39B, "M", "λ"), + (0x39C, "M", "μ"), + (0x39D, "M", "ν"), + (0x39E, "M", "ξ"), + (0x39F, "M", "ο"), + (0x3A0, "M", "π"), + (0x3A1, "M", "ρ"), + (0x3A2, "X"), + (0x3A3, "M", "σ"), + (0x3A4, "M", "τ"), + (0x3A5, "M", "υ"), + (0x3A6, "M", "φ"), + (0x3A7, "M", "χ"), + (0x3A8, "M", "ψ"), + (0x3A9, "M", "ω"), + (0x3AA, "M", "ϊ"), + (0x3AB, "M", "ϋ"), + (0x3AC, "V"), + (0x3C2, "D", "σ"), + (0x3C3, "V"), + (0x3CF, "M", "ϗ"), + (0x3D0, "M", "β"), + (0x3D1, "M", "θ"), + (0x3D2, "M", "υ"), + (0x3D3, "M", "ύ"), + (0x3D4, "M", "ϋ"), + (0x3D5, "M", "φ"), + (0x3D6, "M", "π"), + (0x3D7, "V"), + (0x3D8, "M", "ϙ"), + (0x3D9, "V"), + (0x3DA, "M", "ϛ"), + (0x3DB, "V"), + (0x3DC, "M", "ϝ"), + (0x3DD, "V"), + (0x3DE, "M", "ϟ"), + (0x3DF, "V"), + (0x3E0, "M", "ϡ"), + (0x3E1, "V"), + (0x3E2, "M", "ϣ"), + (0x3E3, "V"), + (0x3E4, "M", "ϥ"), + (0x3E5, "V"), + (0x3E6, "M", "ϧ"), + (0x3E7, "V"), + (0x3E8, "M", "ϩ"), + (0x3E9, "V"), + (0x3EA, "M", "ϫ"), + (0x3EB, "V"), + (0x3EC, "M", "ϭ"), + (0x3ED, "V"), + (0x3EE, "M", "ϯ"), + (0x3EF, "V"), + (0x3F0, "M", "κ"), + (0x3F1, "M", "ρ"), + (0x3F2, "M", "σ"), + (0x3F3, "V"), + (0x3F4, "M", "θ"), + (0x3F5, "M", "ε"), + (0x3F6, "V"), + (0x3F7, "M", "ϸ"), + (0x3F8, "V"), + (0x3F9, "M", "σ"), + (0x3FA, "M", "ϻ"), + (0x3FB, "V"), + (0x3FD, "M", "ͻ"), + (0x3FE, "M", "ͼ"), + (0x3FF, "M", "ͽ"), + (0x400, "M", "ѐ"), + (0x401, "M", "ё"), + (0x402, "M", "ђ"), + ] + + +def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x403, "M", "ѓ"), + (0x404, "M", "є"), + (0x405, "M", "ѕ"), + (0x406, "M", "і"), + (0x407, "M", "ї"), + (0x408, "M", "ј"), + (0x409, "M", "љ"), + (0x40A, "M", "њ"), + (0x40B, "M", "ћ"), + (0x40C, "M", "ќ"), + (0x40D, "M", "ѝ"), + (0x40E, "M", "ў"), + (0x40F, "M", "џ"), + (0x410, "M", "а"), + (0x411, "M", "б"), + (0x412, "M", "в"), + (0x413, "M", "г"), + (0x414, "M", "д"), + (0x415, "M", "е"), + (0x416, "M", "ж"), + (0x417, "M", "з"), + (0x418, "M", "и"), + (0x419, "M", "й"), + (0x41A, "M", "к"), + (0x41B, "M", "л"), + (0x41C, "M", "м"), + (0x41D, "M", "н"), + (0x41E, "M", "о"), + (0x41F, "M", "п"), + (0x420, "M", "р"), + (0x421, "M", "с"), + (0x422, "M", "т"), + (0x423, "M", "у"), + (0x424, "M", "ф"), + (0x425, "M", "х"), + (0x426, "M", "ц"), + (0x427, "M", "ч"), + (0x428, "M", "ш"), + (0x429, "M", "щ"), + (0x42A, "M", "ъ"), + (0x42B, "M", "ы"), + (0x42C, "M", "ь"), + (0x42D, "M", "э"), + (0x42E, "M", "ю"), + (0x42F, "M", "я"), + (0x430, "V"), + (0x460, "M", "ѡ"), + (0x461, "V"), + (0x462, "M", "ѣ"), + (0x463, "V"), + (0x464, "M", "ѥ"), + (0x465, "V"), + (0x466, "M", "ѧ"), + (0x467, "V"), + (0x468, "M", "ѩ"), + (0x469, "V"), + (0x46A, "M", "ѫ"), + (0x46B, "V"), + (0x46C, "M", "ѭ"), + (0x46D, "V"), + (0x46E, "M", "ѯ"), + (0x46F, "V"), + (0x470, "M", "ѱ"), + (0x471, "V"), + (0x472, "M", "ѳ"), + (0x473, "V"), + (0x474, "M", "ѵ"), + (0x475, "V"), + (0x476, "M", "ѷ"), + (0x477, "V"), + (0x478, "M", "ѹ"), + (0x479, "V"), + (0x47A, "M", "ѻ"), + (0x47B, "V"), + (0x47C, "M", "ѽ"), + (0x47D, "V"), + (0x47E, "M", "ѿ"), + (0x47F, "V"), + (0x480, "M", "ҁ"), + (0x481, "V"), + (0x48A, "M", "ҋ"), + (0x48B, "V"), + (0x48C, "M", "ҍ"), + (0x48D, "V"), + (0x48E, "M", "ҏ"), + (0x48F, "V"), + (0x490, "M", "ґ"), + (0x491, "V"), + (0x492, "M", "ғ"), + (0x493, "V"), + (0x494, "M", "ҕ"), + (0x495, "V"), + (0x496, "M", "җ"), + (0x497, "V"), + (0x498, "M", "ҙ"), + (0x499, "V"), + (0x49A, "M", "қ"), + (0x49B, "V"), + (0x49C, "M", "ҝ"), + (0x49D, "V"), + ] + + +def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x49E, "M", "ҟ"), + (0x49F, "V"), + (0x4A0, "M", "ҡ"), + (0x4A1, "V"), + (0x4A2, "M", "ң"), + (0x4A3, "V"), + (0x4A4, "M", "ҥ"), + (0x4A5, "V"), + (0x4A6, "M", "ҧ"), + (0x4A7, "V"), + (0x4A8, "M", "ҩ"), + (0x4A9, "V"), + (0x4AA, "M", "ҫ"), + (0x4AB, "V"), + (0x4AC, "M", "ҭ"), + (0x4AD, "V"), + (0x4AE, "M", "ү"), + (0x4AF, "V"), + (0x4B0, "M", "ұ"), + (0x4B1, "V"), + (0x4B2, "M", "ҳ"), + (0x4B3, "V"), + (0x4B4, "M", "ҵ"), + (0x4B5, "V"), + (0x4B6, "M", "ҷ"), + (0x4B7, "V"), + (0x4B8, "M", "ҹ"), + (0x4B9, "V"), + (0x4BA, "M", "һ"), + (0x4BB, "V"), + (0x4BC, "M", "ҽ"), + (0x4BD, "V"), + (0x4BE, "M", "ҿ"), + (0x4BF, "V"), + (0x4C0, "X"), + (0x4C1, "M", "ӂ"), + (0x4C2, "V"), + (0x4C3, "M", "ӄ"), + (0x4C4, "V"), + (0x4C5, "M", "ӆ"), + (0x4C6, "V"), + (0x4C7, "M", "ӈ"), + (0x4C8, "V"), + (0x4C9, "M", "ӊ"), + (0x4CA, "V"), + (0x4CB, "M", "ӌ"), + (0x4CC, "V"), + (0x4CD, "M", "ӎ"), + (0x4CE, "V"), + (0x4D0, "M", "ӑ"), + (0x4D1, "V"), + (0x4D2, "M", "ӓ"), + (0x4D3, "V"), + (0x4D4, "M", "ӕ"), + (0x4D5, "V"), + (0x4D6, "M", "ӗ"), + (0x4D7, "V"), + (0x4D8, "M", "ә"), + (0x4D9, "V"), + (0x4DA, "M", "ӛ"), + (0x4DB, "V"), + (0x4DC, "M", "ӝ"), + (0x4DD, "V"), + (0x4DE, "M", "ӟ"), + (0x4DF, "V"), + (0x4E0, "M", "ӡ"), + (0x4E1, "V"), + (0x4E2, "M", "ӣ"), + (0x4E3, "V"), + (0x4E4, "M", "ӥ"), + (0x4E5, "V"), + (0x4E6, "M", "ӧ"), + (0x4E7, "V"), + (0x4E8, "M", "ө"), + (0x4E9, "V"), + (0x4EA, "M", "ӫ"), + (0x4EB, "V"), + (0x4EC, "M", "ӭ"), + (0x4ED, "V"), + (0x4EE, "M", "ӯ"), + (0x4EF, "V"), + (0x4F0, "M", "ӱ"), + (0x4F1, "V"), + (0x4F2, "M", "ӳ"), + (0x4F3, "V"), + (0x4F4, "M", "ӵ"), + (0x4F5, "V"), + (0x4F6, "M", "ӷ"), + (0x4F7, "V"), + (0x4F8, "M", "ӹ"), + (0x4F9, "V"), + (0x4FA, "M", "ӻ"), + (0x4FB, "V"), + (0x4FC, "M", "ӽ"), + (0x4FD, "V"), + (0x4FE, "M", "ӿ"), + (0x4FF, "V"), + (0x500, "M", "ԁ"), + (0x501, "V"), + (0x502, "M", "ԃ"), + ] + + +def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x503, "V"), + (0x504, "M", "ԅ"), + (0x505, "V"), + (0x506, "M", "ԇ"), + (0x507, "V"), + (0x508, "M", "ԉ"), + (0x509, "V"), + (0x50A, "M", "ԋ"), + (0x50B, "V"), + (0x50C, "M", "ԍ"), + (0x50D, "V"), + (0x50E, "M", "ԏ"), + (0x50F, "V"), + (0x510, "M", "ԑ"), + (0x511, "V"), + (0x512, "M", "ԓ"), + (0x513, "V"), + (0x514, "M", "ԕ"), + (0x515, "V"), + (0x516, "M", "ԗ"), + (0x517, "V"), + (0x518, "M", "ԙ"), + (0x519, "V"), + (0x51A, "M", "ԛ"), + (0x51B, "V"), + (0x51C, "M", "ԝ"), + (0x51D, "V"), + (0x51E, "M", "ԟ"), + (0x51F, "V"), + (0x520, "M", "ԡ"), + (0x521, "V"), + (0x522, "M", "ԣ"), + (0x523, "V"), + (0x524, "M", "ԥ"), + (0x525, "V"), + (0x526, "M", "ԧ"), + (0x527, "V"), + (0x528, "M", "ԩ"), + (0x529, "V"), + (0x52A, "M", "ԫ"), + (0x52B, "V"), + (0x52C, "M", "ԭ"), + (0x52D, "V"), + (0x52E, "M", "ԯ"), + (0x52F, "V"), + (0x530, "X"), + (0x531, "M", "ա"), + (0x532, "M", "բ"), + (0x533, "M", "գ"), + (0x534, "M", "դ"), + (0x535, "M", "ե"), + (0x536, "M", "զ"), + (0x537, "M", "է"), + (0x538, "M", "ը"), + (0x539, "M", "թ"), + (0x53A, "M", "ժ"), + (0x53B, "M", "ի"), + (0x53C, "M", "լ"), + (0x53D, "M", "խ"), + (0x53E, "M", "ծ"), + (0x53F, "M", "կ"), + (0x540, "M", "հ"), + (0x541, "M", "ձ"), + (0x542, "M", "ղ"), + (0x543, "M", "ճ"), + (0x544, "M", "մ"), + (0x545, "M", "յ"), + (0x546, "M", "ն"), + (0x547, "M", "շ"), + (0x548, "M", "ո"), + (0x549, "M", "չ"), + (0x54A, "M", "պ"), + (0x54B, "M", "ջ"), + (0x54C, "M", "ռ"), + (0x54D, "M", "ս"), + (0x54E, "M", "վ"), + (0x54F, "M", "տ"), + (0x550, "M", "ր"), + (0x551, "M", "ց"), + (0x552, "M", "ւ"), + (0x553, "M", "փ"), + (0x554, "M", "ք"), + (0x555, "M", "օ"), + (0x556, "M", "ֆ"), + (0x557, "X"), + (0x559, "V"), + (0x587, "M", "եւ"), + (0x588, "V"), + (0x58B, "X"), + (0x58D, "V"), + (0x590, "X"), + (0x591, "V"), + (0x5C8, "X"), + (0x5D0, "V"), + (0x5EB, "X"), + (0x5EF, "V"), + (0x5F5, "X"), + (0x606, "V"), + (0x61C, "X"), + (0x61D, "V"), + ] + + +def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x675, "M", "اٴ"), + (0x676, "M", "وٴ"), + (0x677, "M", "ۇٴ"), + (0x678, "M", "يٴ"), + (0x679, "V"), + (0x6DD, "X"), + (0x6DE, "V"), + (0x70E, "X"), + (0x710, "V"), + (0x74B, "X"), + (0x74D, "V"), + (0x7B2, "X"), + (0x7C0, "V"), + (0x7FB, "X"), + (0x7FD, "V"), + (0x82E, "X"), + (0x830, "V"), + (0x83F, "X"), + (0x840, "V"), + (0x85C, "X"), + (0x85E, "V"), + (0x85F, "X"), + (0x860, "V"), + (0x86B, "X"), + (0x870, "V"), + (0x88F, "X"), + (0x898, "V"), + (0x8E2, "X"), + (0x8E3, "V"), + (0x958, "M", "क़"), + (0x959, "M", "ख़"), + (0x95A, "M", "ग़"), + (0x95B, "M", "ज़"), + (0x95C, "M", "ड़"), + (0x95D, "M", "ढ़"), + (0x95E, "M", "फ़"), + (0x95F, "M", "य़"), + (0x960, "V"), + (0x984, "X"), + (0x985, "V"), + (0x98D, "X"), + (0x98F, "V"), + (0x991, "X"), + (0x993, "V"), + (0x9A9, "X"), + (0x9AA, "V"), + (0x9B1, "X"), + (0x9B2, "V"), + (0x9B3, "X"), + (0x9B6, "V"), + (0x9BA, "X"), + (0x9BC, "V"), + (0x9C5, "X"), + (0x9C7, "V"), + (0x9C9, "X"), + (0x9CB, "V"), + (0x9CF, "X"), + (0x9D7, "V"), + (0x9D8, "X"), + (0x9DC, "M", "ড়"), + (0x9DD, "M", "ঢ়"), + (0x9DE, "X"), + (0x9DF, "M", "য়"), + (0x9E0, "V"), + (0x9E4, "X"), + (0x9E6, "V"), + (0x9FF, "X"), + (0xA01, "V"), + (0xA04, "X"), + (0xA05, "V"), + (0xA0B, "X"), + (0xA0F, "V"), + (0xA11, "X"), + (0xA13, "V"), + (0xA29, "X"), + (0xA2A, "V"), + (0xA31, "X"), + (0xA32, "V"), + (0xA33, "M", "ਲ਼"), + (0xA34, "X"), + (0xA35, "V"), + (0xA36, "M", "ਸ਼"), + (0xA37, "X"), + (0xA38, "V"), + (0xA3A, "X"), + (0xA3C, "V"), + (0xA3D, "X"), + (0xA3E, "V"), + (0xA43, "X"), + (0xA47, "V"), + (0xA49, "X"), + (0xA4B, "V"), + (0xA4E, "X"), + (0xA51, "V"), + (0xA52, "X"), + (0xA59, "M", "ਖ਼"), + (0xA5A, "M", "ਗ਼"), + (0xA5B, "M", "ਜ਼"), + (0xA5C, "V"), + (0xA5D, "X"), + ] + + +def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA5E, "M", "ਫ਼"), + (0xA5F, "X"), + (0xA66, "V"), + (0xA77, "X"), + (0xA81, "V"), + (0xA84, "X"), + (0xA85, "V"), + (0xA8E, "X"), + (0xA8F, "V"), + (0xA92, "X"), + (0xA93, "V"), + (0xAA9, "X"), + (0xAAA, "V"), + (0xAB1, "X"), + (0xAB2, "V"), + (0xAB4, "X"), + (0xAB5, "V"), + (0xABA, "X"), + (0xABC, "V"), + (0xAC6, "X"), + (0xAC7, "V"), + (0xACA, "X"), + (0xACB, "V"), + (0xACE, "X"), + (0xAD0, "V"), + (0xAD1, "X"), + (0xAE0, "V"), + (0xAE4, "X"), + (0xAE6, "V"), + (0xAF2, "X"), + (0xAF9, "V"), + (0xB00, "X"), + (0xB01, "V"), + (0xB04, "X"), + (0xB05, "V"), + (0xB0D, "X"), + (0xB0F, "V"), + (0xB11, "X"), + (0xB13, "V"), + (0xB29, "X"), + (0xB2A, "V"), + (0xB31, "X"), + (0xB32, "V"), + (0xB34, "X"), + (0xB35, "V"), + (0xB3A, "X"), + (0xB3C, "V"), + (0xB45, "X"), + (0xB47, "V"), + (0xB49, "X"), + (0xB4B, "V"), + (0xB4E, "X"), + (0xB55, "V"), + (0xB58, "X"), + (0xB5C, "M", "ଡ଼"), + (0xB5D, "M", "ଢ଼"), + (0xB5E, "X"), + (0xB5F, "V"), + (0xB64, "X"), + (0xB66, "V"), + (0xB78, "X"), + (0xB82, "V"), + (0xB84, "X"), + (0xB85, "V"), + (0xB8B, "X"), + (0xB8E, "V"), + (0xB91, "X"), + (0xB92, "V"), + (0xB96, "X"), + (0xB99, "V"), + (0xB9B, "X"), + (0xB9C, "V"), + (0xB9D, "X"), + (0xB9E, "V"), + (0xBA0, "X"), + (0xBA3, "V"), + (0xBA5, "X"), + (0xBA8, "V"), + (0xBAB, "X"), + (0xBAE, "V"), + (0xBBA, "X"), + (0xBBE, "V"), + (0xBC3, "X"), + (0xBC6, "V"), + (0xBC9, "X"), + (0xBCA, "V"), + (0xBCE, "X"), + (0xBD0, "V"), + (0xBD1, "X"), + (0xBD7, "V"), + (0xBD8, "X"), + (0xBE6, "V"), + (0xBFB, "X"), + (0xC00, "V"), + (0xC0D, "X"), + (0xC0E, "V"), + (0xC11, "X"), + (0xC12, "V"), + (0xC29, "X"), + (0xC2A, "V"), + ] + + +def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC3A, "X"), + (0xC3C, "V"), + (0xC45, "X"), + (0xC46, "V"), + (0xC49, "X"), + (0xC4A, "V"), + (0xC4E, "X"), + (0xC55, "V"), + (0xC57, "X"), + (0xC58, "V"), + (0xC5B, "X"), + (0xC5D, "V"), + (0xC5E, "X"), + (0xC60, "V"), + (0xC64, "X"), + (0xC66, "V"), + (0xC70, "X"), + (0xC77, "V"), + (0xC8D, "X"), + (0xC8E, "V"), + (0xC91, "X"), + (0xC92, "V"), + (0xCA9, "X"), + (0xCAA, "V"), + (0xCB4, "X"), + (0xCB5, "V"), + (0xCBA, "X"), + (0xCBC, "V"), + (0xCC5, "X"), + (0xCC6, "V"), + (0xCC9, "X"), + (0xCCA, "V"), + (0xCCE, "X"), + (0xCD5, "V"), + (0xCD7, "X"), + (0xCDD, "V"), + (0xCDF, "X"), + (0xCE0, "V"), + (0xCE4, "X"), + (0xCE6, "V"), + (0xCF0, "X"), + (0xCF1, "V"), + (0xCF4, "X"), + (0xD00, "V"), + (0xD0D, "X"), + (0xD0E, "V"), + (0xD11, "X"), + (0xD12, "V"), + (0xD45, "X"), + (0xD46, "V"), + (0xD49, "X"), + (0xD4A, "V"), + (0xD50, "X"), + (0xD54, "V"), + (0xD64, "X"), + (0xD66, "V"), + (0xD80, "X"), + (0xD81, "V"), + (0xD84, "X"), + (0xD85, "V"), + (0xD97, "X"), + (0xD9A, "V"), + (0xDB2, "X"), + (0xDB3, "V"), + (0xDBC, "X"), + (0xDBD, "V"), + (0xDBE, "X"), + (0xDC0, "V"), + (0xDC7, "X"), + (0xDCA, "V"), + (0xDCB, "X"), + (0xDCF, "V"), + (0xDD5, "X"), + (0xDD6, "V"), + (0xDD7, "X"), + (0xDD8, "V"), + (0xDE0, "X"), + (0xDE6, "V"), + (0xDF0, "X"), + (0xDF2, "V"), + (0xDF5, "X"), + (0xE01, "V"), + (0xE33, "M", "ํา"), + (0xE34, "V"), + (0xE3B, "X"), + (0xE3F, "V"), + (0xE5C, "X"), + (0xE81, "V"), + (0xE83, "X"), + (0xE84, "V"), + (0xE85, "X"), + (0xE86, "V"), + (0xE8B, "X"), + (0xE8C, "V"), + (0xEA4, "X"), + (0xEA5, "V"), + (0xEA6, "X"), + (0xEA7, "V"), + (0xEB3, "M", "ໍາ"), + (0xEB4, "V"), + ] + + +def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xEBE, "X"), + (0xEC0, "V"), + (0xEC5, "X"), + (0xEC6, "V"), + (0xEC7, "X"), + (0xEC8, "V"), + (0xECF, "X"), + (0xED0, "V"), + (0xEDA, "X"), + (0xEDC, "M", "ຫນ"), + (0xEDD, "M", "ຫມ"), + (0xEDE, "V"), + (0xEE0, "X"), + (0xF00, "V"), + (0xF0C, "M", "་"), + (0xF0D, "V"), + (0xF43, "M", "གྷ"), + (0xF44, "V"), + (0xF48, "X"), + (0xF49, "V"), + (0xF4D, "M", "ཌྷ"), + (0xF4E, "V"), + (0xF52, "M", "དྷ"), + (0xF53, "V"), + (0xF57, "M", "བྷ"), + (0xF58, "V"), + (0xF5C, "M", "ཛྷ"), + (0xF5D, "V"), + (0xF69, "M", "ཀྵ"), + (0xF6A, "V"), + (0xF6D, "X"), + (0xF71, "V"), + (0xF73, "M", "ཱི"), + (0xF74, "V"), + (0xF75, "M", "ཱུ"), + (0xF76, "M", "ྲྀ"), + (0xF77, "M", "ྲཱྀ"), + (0xF78, "M", "ླྀ"), + (0xF79, "M", "ླཱྀ"), + (0xF7A, "V"), + (0xF81, "M", "ཱྀ"), + (0xF82, "V"), + (0xF93, "M", "ྒྷ"), + (0xF94, "V"), + (0xF98, "X"), + (0xF99, "V"), + (0xF9D, "M", "ྜྷ"), + (0xF9E, "V"), + (0xFA2, "M", "ྡྷ"), + (0xFA3, "V"), + (0xFA7, "M", "ྦྷ"), + (0xFA8, "V"), + (0xFAC, "M", "ྫྷ"), + (0xFAD, "V"), + (0xFB9, "M", "ྐྵ"), + (0xFBA, "V"), + (0xFBD, "X"), + (0xFBE, "V"), + (0xFCD, "X"), + (0xFCE, "V"), + (0xFDB, "X"), + (0x1000, "V"), + (0x10A0, "X"), + (0x10C7, "M", "ⴧ"), + (0x10C8, "X"), + (0x10CD, "M", "ⴭ"), + (0x10CE, "X"), + (0x10D0, "V"), + (0x10FC, "M", "ნ"), + (0x10FD, "V"), + (0x115F, "X"), + (0x1161, "V"), + (0x1249, "X"), + (0x124A, "V"), + (0x124E, "X"), + (0x1250, "V"), + (0x1257, "X"), + (0x1258, "V"), + (0x1259, "X"), + (0x125A, "V"), + (0x125E, "X"), + (0x1260, "V"), + (0x1289, "X"), + (0x128A, "V"), + (0x128E, "X"), + (0x1290, "V"), + (0x12B1, "X"), + (0x12B2, "V"), + (0x12B6, "X"), + (0x12B8, "V"), + (0x12BF, "X"), + (0x12C0, "V"), + (0x12C1, "X"), + (0x12C2, "V"), + (0x12C6, "X"), + (0x12C8, "V"), + (0x12D7, "X"), + (0x12D8, "V"), + (0x1311, "X"), + (0x1312, "V"), + ] + + +def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1316, "X"), + (0x1318, "V"), + (0x135B, "X"), + (0x135D, "V"), + (0x137D, "X"), + (0x1380, "V"), + (0x139A, "X"), + (0x13A0, "V"), + (0x13F6, "X"), + (0x13F8, "M", "Ᏸ"), + (0x13F9, "M", "Ᏹ"), + (0x13FA, "M", "Ᏺ"), + (0x13FB, "M", "Ᏻ"), + (0x13FC, "M", "Ᏼ"), + (0x13FD, "M", "Ᏽ"), + (0x13FE, "X"), + (0x1400, "V"), + (0x1680, "X"), + (0x1681, "V"), + (0x169D, "X"), + (0x16A0, "V"), + (0x16F9, "X"), + (0x1700, "V"), + (0x1716, "X"), + (0x171F, "V"), + (0x1737, "X"), + (0x1740, "V"), + (0x1754, "X"), + (0x1760, "V"), + (0x176D, "X"), + (0x176E, "V"), + (0x1771, "X"), + (0x1772, "V"), + (0x1774, "X"), + (0x1780, "V"), + (0x17B4, "X"), + (0x17B6, "V"), + (0x17DE, "X"), + (0x17E0, "V"), + (0x17EA, "X"), + (0x17F0, "V"), + (0x17FA, "X"), + (0x1800, "V"), + (0x1806, "X"), + (0x1807, "V"), + (0x180B, "I"), + (0x180E, "X"), + (0x180F, "I"), + (0x1810, "V"), + (0x181A, "X"), + (0x1820, "V"), + (0x1879, "X"), + (0x1880, "V"), + (0x18AB, "X"), + (0x18B0, "V"), + (0x18F6, "X"), + (0x1900, "V"), + (0x191F, "X"), + (0x1920, "V"), + (0x192C, "X"), + (0x1930, "V"), + (0x193C, "X"), + (0x1940, "V"), + (0x1941, "X"), + (0x1944, "V"), + (0x196E, "X"), + (0x1970, "V"), + (0x1975, "X"), + (0x1980, "V"), + (0x19AC, "X"), + (0x19B0, "V"), + (0x19CA, "X"), + (0x19D0, "V"), + (0x19DB, "X"), + (0x19DE, "V"), + (0x1A1C, "X"), + (0x1A1E, "V"), + (0x1A5F, "X"), + (0x1A60, "V"), + (0x1A7D, "X"), + (0x1A7F, "V"), + (0x1A8A, "X"), + (0x1A90, "V"), + (0x1A9A, "X"), + (0x1AA0, "V"), + (0x1AAE, "X"), + (0x1AB0, "V"), + (0x1ACF, "X"), + (0x1B00, "V"), + (0x1B4D, "X"), + (0x1B50, "V"), + (0x1B7F, "X"), + (0x1B80, "V"), + (0x1BF4, "X"), + (0x1BFC, "V"), + (0x1C38, "X"), + (0x1C3B, "V"), + (0x1C4A, "X"), + (0x1C4D, "V"), + (0x1C80, "M", "в"), + ] + + +def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1C81, "M", "д"), + (0x1C82, "M", "о"), + (0x1C83, "M", "с"), + (0x1C84, "M", "т"), + (0x1C86, "M", "ъ"), + (0x1C87, "M", "ѣ"), + (0x1C88, "M", "ꙋ"), + (0x1C89, "X"), + (0x1C90, "M", "ა"), + (0x1C91, "M", "ბ"), + (0x1C92, "M", "გ"), + (0x1C93, "M", "დ"), + (0x1C94, "M", "ე"), + (0x1C95, "M", "ვ"), + (0x1C96, "M", "ზ"), + (0x1C97, "M", "თ"), + (0x1C98, "M", "ი"), + (0x1C99, "M", "კ"), + (0x1C9A, "M", "ლ"), + (0x1C9B, "M", "მ"), + (0x1C9C, "M", "ნ"), + (0x1C9D, "M", "ო"), + (0x1C9E, "M", "პ"), + (0x1C9F, "M", "ჟ"), + (0x1CA0, "M", "რ"), + (0x1CA1, "M", "ს"), + (0x1CA2, "M", "ტ"), + (0x1CA3, "M", "უ"), + (0x1CA4, "M", "ფ"), + (0x1CA5, "M", "ქ"), + (0x1CA6, "M", "ღ"), + (0x1CA7, "M", "ყ"), + (0x1CA8, "M", "შ"), + (0x1CA9, "M", "ჩ"), + (0x1CAA, "M", "ც"), + (0x1CAB, "M", "ძ"), + (0x1CAC, "M", "წ"), + (0x1CAD, "M", "ჭ"), + (0x1CAE, "M", "ხ"), + (0x1CAF, "M", "ჯ"), + (0x1CB0, "M", "ჰ"), + (0x1CB1, "M", "ჱ"), + (0x1CB2, "M", "ჲ"), + (0x1CB3, "M", "ჳ"), + (0x1CB4, "M", "ჴ"), + (0x1CB5, "M", "ჵ"), + (0x1CB6, "M", "ჶ"), + (0x1CB7, "M", "ჷ"), + (0x1CB8, "M", "ჸ"), + (0x1CB9, "M", "ჹ"), + (0x1CBA, "M", "ჺ"), + (0x1CBB, "X"), + (0x1CBD, "M", "ჽ"), + (0x1CBE, "M", "ჾ"), + (0x1CBF, "M", "ჿ"), + (0x1CC0, "V"), + (0x1CC8, "X"), + (0x1CD0, "V"), + (0x1CFB, "X"), + (0x1D00, "V"), + (0x1D2C, "M", "a"), + (0x1D2D, "M", "æ"), + (0x1D2E, "M", "b"), + (0x1D2F, "V"), + (0x1D30, "M", "d"), + (0x1D31, "M", "e"), + (0x1D32, "M", "ǝ"), + (0x1D33, "M", "g"), + (0x1D34, "M", "h"), + (0x1D35, "M", "i"), + (0x1D36, "M", "j"), + (0x1D37, "M", "k"), + (0x1D38, "M", "l"), + (0x1D39, "M", "m"), + (0x1D3A, "M", "n"), + (0x1D3B, "V"), + (0x1D3C, "M", "o"), + (0x1D3D, "M", "ȣ"), + (0x1D3E, "M", "p"), + (0x1D3F, "M", "r"), + (0x1D40, "M", "t"), + (0x1D41, "M", "u"), + (0x1D42, "M", "w"), + (0x1D43, "M", "a"), + (0x1D44, "M", "ɐ"), + (0x1D45, "M", "ɑ"), + (0x1D46, "M", "ᴂ"), + (0x1D47, "M", "b"), + (0x1D48, "M", "d"), + (0x1D49, "M", "e"), + (0x1D4A, "M", "ə"), + (0x1D4B, "M", "ɛ"), + (0x1D4C, "M", "ɜ"), + (0x1D4D, "M", "g"), + (0x1D4E, "V"), + (0x1D4F, "M", "k"), + (0x1D50, "M", "m"), + (0x1D51, "M", "ŋ"), + (0x1D52, "M", "o"), + (0x1D53, "M", "ɔ"), + ] + + +def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D54, "M", "ᴖ"), + (0x1D55, "M", "ᴗ"), + (0x1D56, "M", "p"), + (0x1D57, "M", "t"), + (0x1D58, "M", "u"), + (0x1D59, "M", "ᴝ"), + (0x1D5A, "M", "ɯ"), + (0x1D5B, "M", "v"), + (0x1D5C, "M", "ᴥ"), + (0x1D5D, "M", "β"), + (0x1D5E, "M", "γ"), + (0x1D5F, "M", "δ"), + (0x1D60, "M", "φ"), + (0x1D61, "M", "χ"), + (0x1D62, "M", "i"), + (0x1D63, "M", "r"), + (0x1D64, "M", "u"), + (0x1D65, "M", "v"), + (0x1D66, "M", "β"), + (0x1D67, "M", "γ"), + (0x1D68, "M", "ρ"), + (0x1D69, "M", "φ"), + (0x1D6A, "M", "χ"), + (0x1D6B, "V"), + (0x1D78, "M", "н"), + (0x1D79, "V"), + (0x1D9B, "M", "ɒ"), + (0x1D9C, "M", "c"), + (0x1D9D, "M", "ɕ"), + (0x1D9E, "M", "ð"), + (0x1D9F, "M", "ɜ"), + (0x1DA0, "M", "f"), + (0x1DA1, "M", "ɟ"), + (0x1DA2, "M", "ɡ"), + (0x1DA3, "M", "ɥ"), + (0x1DA4, "M", "ɨ"), + (0x1DA5, "M", "ɩ"), + (0x1DA6, "M", "ɪ"), + (0x1DA7, "M", "ᵻ"), + (0x1DA8, "M", "ʝ"), + (0x1DA9, "M", "ɭ"), + (0x1DAA, "M", "ᶅ"), + (0x1DAB, "M", "ʟ"), + (0x1DAC, "M", "ɱ"), + (0x1DAD, "M", "ɰ"), + (0x1DAE, "M", "ɲ"), + (0x1DAF, "M", "ɳ"), + (0x1DB0, "M", "ɴ"), + (0x1DB1, "M", "ɵ"), + (0x1DB2, "M", "ɸ"), + (0x1DB3, "M", "ʂ"), + (0x1DB4, "M", "ʃ"), + (0x1DB5, "M", "ƫ"), + (0x1DB6, "M", "ʉ"), + (0x1DB7, "M", "ʊ"), + (0x1DB8, "M", "ᴜ"), + (0x1DB9, "M", "ʋ"), + (0x1DBA, "M", "ʌ"), + (0x1DBB, "M", "z"), + (0x1DBC, "M", "ʐ"), + (0x1DBD, "M", "ʑ"), + (0x1DBE, "M", "ʒ"), + (0x1DBF, "M", "θ"), + (0x1DC0, "V"), + (0x1E00, "M", "ḁ"), + (0x1E01, "V"), + (0x1E02, "M", "ḃ"), + (0x1E03, "V"), + (0x1E04, "M", "ḅ"), + (0x1E05, "V"), + (0x1E06, "M", "ḇ"), + (0x1E07, "V"), + (0x1E08, "M", "ḉ"), + (0x1E09, "V"), + (0x1E0A, "M", "ḋ"), + (0x1E0B, "V"), + (0x1E0C, "M", "ḍ"), + (0x1E0D, "V"), + (0x1E0E, "M", "ḏ"), + (0x1E0F, "V"), + (0x1E10, "M", "ḑ"), + (0x1E11, "V"), + (0x1E12, "M", "ḓ"), + (0x1E13, "V"), + (0x1E14, "M", "ḕ"), + (0x1E15, "V"), + (0x1E16, "M", "ḗ"), + (0x1E17, "V"), + (0x1E18, "M", "ḙ"), + (0x1E19, "V"), + (0x1E1A, "M", "ḛ"), + (0x1E1B, "V"), + (0x1E1C, "M", "ḝ"), + (0x1E1D, "V"), + (0x1E1E, "M", "ḟ"), + (0x1E1F, "V"), + (0x1E20, "M", "ḡ"), + (0x1E21, "V"), + (0x1E22, "M", "ḣ"), + (0x1E23, "V"), + ] + + +def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E24, "M", "ḥ"), + (0x1E25, "V"), + (0x1E26, "M", "ḧ"), + (0x1E27, "V"), + (0x1E28, "M", "ḩ"), + (0x1E29, "V"), + (0x1E2A, "M", "ḫ"), + (0x1E2B, "V"), + (0x1E2C, "M", "ḭ"), + (0x1E2D, "V"), + (0x1E2E, "M", "ḯ"), + (0x1E2F, "V"), + (0x1E30, "M", "ḱ"), + (0x1E31, "V"), + (0x1E32, "M", "ḳ"), + (0x1E33, "V"), + (0x1E34, "M", "ḵ"), + (0x1E35, "V"), + (0x1E36, "M", "ḷ"), + (0x1E37, "V"), + (0x1E38, "M", "ḹ"), + (0x1E39, "V"), + (0x1E3A, "M", "ḻ"), + (0x1E3B, "V"), + (0x1E3C, "M", "ḽ"), + (0x1E3D, "V"), + (0x1E3E, "M", "ḿ"), + (0x1E3F, "V"), + (0x1E40, "M", "ṁ"), + (0x1E41, "V"), + (0x1E42, "M", "ṃ"), + (0x1E43, "V"), + (0x1E44, "M", "ṅ"), + (0x1E45, "V"), + (0x1E46, "M", "ṇ"), + (0x1E47, "V"), + (0x1E48, "M", "ṉ"), + (0x1E49, "V"), + (0x1E4A, "M", "ṋ"), + (0x1E4B, "V"), + (0x1E4C, "M", "ṍ"), + (0x1E4D, "V"), + (0x1E4E, "M", "ṏ"), + (0x1E4F, "V"), + (0x1E50, "M", "ṑ"), + (0x1E51, "V"), + (0x1E52, "M", "ṓ"), + (0x1E53, "V"), + (0x1E54, "M", "ṕ"), + (0x1E55, "V"), + (0x1E56, "M", "ṗ"), + (0x1E57, "V"), + (0x1E58, "M", "ṙ"), + (0x1E59, "V"), + (0x1E5A, "M", "ṛ"), + (0x1E5B, "V"), + (0x1E5C, "M", "ṝ"), + (0x1E5D, "V"), + (0x1E5E, "M", "ṟ"), + (0x1E5F, "V"), + (0x1E60, "M", "ṡ"), + (0x1E61, "V"), + (0x1E62, "M", "ṣ"), + (0x1E63, "V"), + (0x1E64, "M", "ṥ"), + (0x1E65, "V"), + (0x1E66, "M", "ṧ"), + (0x1E67, "V"), + (0x1E68, "M", "ṩ"), + (0x1E69, "V"), + (0x1E6A, "M", "ṫ"), + (0x1E6B, "V"), + (0x1E6C, "M", "ṭ"), + (0x1E6D, "V"), + (0x1E6E, "M", "ṯ"), + (0x1E6F, "V"), + (0x1E70, "M", "ṱ"), + (0x1E71, "V"), + (0x1E72, "M", "ṳ"), + (0x1E73, "V"), + (0x1E74, "M", "ṵ"), + (0x1E75, "V"), + (0x1E76, "M", "ṷ"), + (0x1E77, "V"), + (0x1E78, "M", "ṹ"), + (0x1E79, "V"), + (0x1E7A, "M", "ṻ"), + (0x1E7B, "V"), + (0x1E7C, "M", "ṽ"), + (0x1E7D, "V"), + (0x1E7E, "M", "ṿ"), + (0x1E7F, "V"), + (0x1E80, "M", "ẁ"), + (0x1E81, "V"), + (0x1E82, "M", "ẃ"), + (0x1E83, "V"), + (0x1E84, "M", "ẅ"), + (0x1E85, "V"), + (0x1E86, "M", "ẇ"), + (0x1E87, "V"), + ] + + +def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E88, "M", "ẉ"), + (0x1E89, "V"), + (0x1E8A, "M", "ẋ"), + (0x1E8B, "V"), + (0x1E8C, "M", "ẍ"), + (0x1E8D, "V"), + (0x1E8E, "M", "ẏ"), + (0x1E8F, "V"), + (0x1E90, "M", "ẑ"), + (0x1E91, "V"), + (0x1E92, "M", "ẓ"), + (0x1E93, "V"), + (0x1E94, "M", "ẕ"), + (0x1E95, "V"), + (0x1E9A, "M", "aʾ"), + (0x1E9B, "M", "ṡ"), + (0x1E9C, "V"), + (0x1E9E, "M", "ß"), + (0x1E9F, "V"), + (0x1EA0, "M", "ạ"), + (0x1EA1, "V"), + (0x1EA2, "M", "ả"), + (0x1EA3, "V"), + (0x1EA4, "M", "ấ"), + (0x1EA5, "V"), + (0x1EA6, "M", "ầ"), + (0x1EA7, "V"), + (0x1EA8, "M", "ẩ"), + (0x1EA9, "V"), + (0x1EAA, "M", "ẫ"), + (0x1EAB, "V"), + (0x1EAC, "M", "ậ"), + (0x1EAD, "V"), + (0x1EAE, "M", "ắ"), + (0x1EAF, "V"), + (0x1EB0, "M", "ằ"), + (0x1EB1, "V"), + (0x1EB2, "M", "ẳ"), + (0x1EB3, "V"), + (0x1EB4, "M", "ẵ"), + (0x1EB5, "V"), + (0x1EB6, "M", "ặ"), + (0x1EB7, "V"), + (0x1EB8, "M", "ẹ"), + (0x1EB9, "V"), + (0x1EBA, "M", "ẻ"), + (0x1EBB, "V"), + (0x1EBC, "M", "ẽ"), + (0x1EBD, "V"), + (0x1EBE, "M", "ế"), + (0x1EBF, "V"), + (0x1EC0, "M", "ề"), + (0x1EC1, "V"), + (0x1EC2, "M", "ể"), + (0x1EC3, "V"), + (0x1EC4, "M", "ễ"), + (0x1EC5, "V"), + (0x1EC6, "M", "ệ"), + (0x1EC7, "V"), + (0x1EC8, "M", "ỉ"), + (0x1EC9, "V"), + (0x1ECA, "M", "ị"), + (0x1ECB, "V"), + (0x1ECC, "M", "ọ"), + (0x1ECD, "V"), + (0x1ECE, "M", "ỏ"), + (0x1ECF, "V"), + (0x1ED0, "M", "ố"), + (0x1ED1, "V"), + (0x1ED2, "M", "ồ"), + (0x1ED3, "V"), + (0x1ED4, "M", "ổ"), + (0x1ED5, "V"), + (0x1ED6, "M", "ỗ"), + (0x1ED7, "V"), + (0x1ED8, "M", "ộ"), + (0x1ED9, "V"), + (0x1EDA, "M", "ớ"), + (0x1EDB, "V"), + (0x1EDC, "M", "ờ"), + (0x1EDD, "V"), + (0x1EDE, "M", "ở"), + (0x1EDF, "V"), + (0x1EE0, "M", "ỡ"), + (0x1EE1, "V"), + (0x1EE2, "M", "ợ"), + (0x1EE3, "V"), + (0x1EE4, "M", "ụ"), + (0x1EE5, "V"), + (0x1EE6, "M", "ủ"), + (0x1EE7, "V"), + (0x1EE8, "M", "ứ"), + (0x1EE9, "V"), + (0x1EEA, "M", "ừ"), + (0x1EEB, "V"), + (0x1EEC, "M", "ử"), + (0x1EED, "V"), + (0x1EEE, "M", "ữ"), + (0x1EEF, "V"), + (0x1EF0, "M", "ự"), + ] + + +def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EF1, "V"), + (0x1EF2, "M", "ỳ"), + (0x1EF3, "V"), + (0x1EF4, "M", "ỵ"), + (0x1EF5, "V"), + (0x1EF6, "M", "ỷ"), + (0x1EF7, "V"), + (0x1EF8, "M", "ỹ"), + (0x1EF9, "V"), + (0x1EFA, "M", "ỻ"), + (0x1EFB, "V"), + (0x1EFC, "M", "ỽ"), + (0x1EFD, "V"), + (0x1EFE, "M", "ỿ"), + (0x1EFF, "V"), + (0x1F08, "M", "ἀ"), + (0x1F09, "M", "ἁ"), + (0x1F0A, "M", "ἂ"), + (0x1F0B, "M", "ἃ"), + (0x1F0C, "M", "ἄ"), + (0x1F0D, "M", "ἅ"), + (0x1F0E, "M", "ἆ"), + (0x1F0F, "M", "ἇ"), + (0x1F10, "V"), + (0x1F16, "X"), + (0x1F18, "M", "ἐ"), + (0x1F19, "M", "ἑ"), + (0x1F1A, "M", "ἒ"), + (0x1F1B, "M", "ἓ"), + (0x1F1C, "M", "ἔ"), + (0x1F1D, "M", "ἕ"), + (0x1F1E, "X"), + (0x1F20, "V"), + (0x1F28, "M", "ἠ"), + (0x1F29, "M", "ἡ"), + (0x1F2A, "M", "ἢ"), + (0x1F2B, "M", "ἣ"), + (0x1F2C, "M", "ἤ"), + (0x1F2D, "M", "ἥ"), + (0x1F2E, "M", "ἦ"), + (0x1F2F, "M", "ἧ"), + (0x1F30, "V"), + (0x1F38, "M", "ἰ"), + (0x1F39, "M", "ἱ"), + (0x1F3A, "M", "ἲ"), + (0x1F3B, "M", "ἳ"), + (0x1F3C, "M", "ἴ"), + (0x1F3D, "M", "ἵ"), + (0x1F3E, "M", "ἶ"), + (0x1F3F, "M", "ἷ"), + (0x1F40, "V"), + (0x1F46, "X"), + (0x1F48, "M", "ὀ"), + (0x1F49, "M", "ὁ"), + (0x1F4A, "M", "ὂ"), + (0x1F4B, "M", "ὃ"), + (0x1F4C, "M", "ὄ"), + (0x1F4D, "M", "ὅ"), + (0x1F4E, "X"), + (0x1F50, "V"), + (0x1F58, "X"), + (0x1F59, "M", "ὑ"), + (0x1F5A, "X"), + (0x1F5B, "M", "ὓ"), + (0x1F5C, "X"), + (0x1F5D, "M", "ὕ"), + (0x1F5E, "X"), + (0x1F5F, "M", "ὗ"), + (0x1F60, "V"), + (0x1F68, "M", "ὠ"), + (0x1F69, "M", "ὡ"), + (0x1F6A, "M", "ὢ"), + (0x1F6B, "M", "ὣ"), + (0x1F6C, "M", "ὤ"), + (0x1F6D, "M", "ὥ"), + (0x1F6E, "M", "ὦ"), + (0x1F6F, "M", "ὧ"), + (0x1F70, "V"), + (0x1F71, "M", "ά"), + (0x1F72, "V"), + (0x1F73, "M", "έ"), + (0x1F74, "V"), + (0x1F75, "M", "ή"), + (0x1F76, "V"), + (0x1F77, "M", "ί"), + (0x1F78, "V"), + (0x1F79, "M", "ό"), + (0x1F7A, "V"), + (0x1F7B, "M", "ύ"), + (0x1F7C, "V"), + (0x1F7D, "M", "ώ"), + (0x1F7E, "X"), + (0x1F80, "M", "ἀι"), + (0x1F81, "M", "ἁι"), + (0x1F82, "M", "ἂι"), + (0x1F83, "M", "ἃι"), + (0x1F84, "M", "ἄι"), + (0x1F85, "M", "ἅι"), + (0x1F86, "M", "ἆι"), + (0x1F87, "M", "ἇι"), + ] + + +def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F88, "M", "ἀι"), + (0x1F89, "M", "ἁι"), + (0x1F8A, "M", "ἂι"), + (0x1F8B, "M", "ἃι"), + (0x1F8C, "M", "ἄι"), + (0x1F8D, "M", "ἅι"), + (0x1F8E, "M", "ἆι"), + (0x1F8F, "M", "ἇι"), + (0x1F90, "M", "ἠι"), + (0x1F91, "M", "ἡι"), + (0x1F92, "M", "ἢι"), + (0x1F93, "M", "ἣι"), + (0x1F94, "M", "ἤι"), + (0x1F95, "M", "ἥι"), + (0x1F96, "M", "ἦι"), + (0x1F97, "M", "ἧι"), + (0x1F98, "M", "ἠι"), + (0x1F99, "M", "ἡι"), + (0x1F9A, "M", "ἢι"), + (0x1F9B, "M", "ἣι"), + (0x1F9C, "M", "ἤι"), + (0x1F9D, "M", "ἥι"), + (0x1F9E, "M", "ἦι"), + (0x1F9F, "M", "ἧι"), + (0x1FA0, "M", "ὠι"), + (0x1FA1, "M", "ὡι"), + (0x1FA2, "M", "ὢι"), + (0x1FA3, "M", "ὣι"), + (0x1FA4, "M", "ὤι"), + (0x1FA5, "M", "ὥι"), + (0x1FA6, "M", "ὦι"), + (0x1FA7, "M", "ὧι"), + (0x1FA8, "M", "ὠι"), + (0x1FA9, "M", "ὡι"), + (0x1FAA, "M", "ὢι"), + (0x1FAB, "M", "ὣι"), + (0x1FAC, "M", "ὤι"), + (0x1FAD, "M", "ὥι"), + (0x1FAE, "M", "ὦι"), + (0x1FAF, "M", "ὧι"), + (0x1FB0, "V"), + (0x1FB2, "M", "ὰι"), + (0x1FB3, "M", "αι"), + (0x1FB4, "M", "άι"), + (0x1FB5, "X"), + (0x1FB6, "V"), + (0x1FB7, "M", "ᾶι"), + (0x1FB8, "M", "ᾰ"), + (0x1FB9, "M", "ᾱ"), + (0x1FBA, "M", "ὰ"), + (0x1FBB, "M", "ά"), + (0x1FBC, "M", "αι"), + (0x1FBD, "3", " ̓"), + (0x1FBE, "M", "ι"), + (0x1FBF, "3", " ̓"), + (0x1FC0, "3", " ͂"), + (0x1FC1, "3", " ̈͂"), + (0x1FC2, "M", "ὴι"), + (0x1FC3, "M", "ηι"), + (0x1FC4, "M", "ήι"), + (0x1FC5, "X"), + (0x1FC6, "V"), + (0x1FC7, "M", "ῆι"), + (0x1FC8, "M", "ὲ"), + (0x1FC9, "M", "έ"), + (0x1FCA, "M", "ὴ"), + (0x1FCB, "M", "ή"), + (0x1FCC, "M", "ηι"), + (0x1FCD, "3", " ̓̀"), + (0x1FCE, "3", " ̓́"), + (0x1FCF, "3", " ̓͂"), + (0x1FD0, "V"), + (0x1FD3, "M", "ΐ"), + (0x1FD4, "X"), + (0x1FD6, "V"), + (0x1FD8, "M", "ῐ"), + (0x1FD9, "M", "ῑ"), + (0x1FDA, "M", "ὶ"), + (0x1FDB, "M", "ί"), + (0x1FDC, "X"), + (0x1FDD, "3", " ̔̀"), + (0x1FDE, "3", " ̔́"), + (0x1FDF, "3", " ̔͂"), + (0x1FE0, "V"), + (0x1FE3, "M", "ΰ"), + (0x1FE4, "V"), + (0x1FE8, "M", "ῠ"), + (0x1FE9, "M", "ῡ"), + (0x1FEA, "M", "ὺ"), + (0x1FEB, "M", "ύ"), + (0x1FEC, "M", "ῥ"), + (0x1FED, "3", " ̈̀"), + (0x1FEE, "3", " ̈́"), + (0x1FEF, "3", "`"), + (0x1FF0, "X"), + (0x1FF2, "M", "ὼι"), + (0x1FF3, "M", "ωι"), + (0x1FF4, "M", "ώι"), + (0x1FF5, "X"), + (0x1FF6, "V"), + ] + + +def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FF7, "M", "ῶι"), + (0x1FF8, "M", "ὸ"), + (0x1FF9, "M", "ό"), + (0x1FFA, "M", "ὼ"), + (0x1FFB, "M", "ώ"), + (0x1FFC, "M", "ωι"), + (0x1FFD, "3", " ́"), + (0x1FFE, "3", " ̔"), + (0x1FFF, "X"), + (0x2000, "3", " "), + (0x200B, "I"), + (0x200C, "D", ""), + (0x200E, "X"), + (0x2010, "V"), + (0x2011, "M", "‐"), + (0x2012, "V"), + (0x2017, "3", " ̳"), + (0x2018, "V"), + (0x2024, "X"), + (0x2027, "V"), + (0x2028, "X"), + (0x202F, "3", " "), + (0x2030, "V"), + (0x2033, "M", "′′"), + (0x2034, "M", "′′′"), + (0x2035, "V"), + (0x2036, "M", "‵‵"), + (0x2037, "M", "‵‵‵"), + (0x2038, "V"), + (0x203C, "3", "!!"), + (0x203D, "V"), + (0x203E, "3", " ̅"), + (0x203F, "V"), + (0x2047, "3", "??"), + (0x2048, "3", "?!"), + (0x2049, "3", "!?"), + (0x204A, "V"), + (0x2057, "M", "′′′′"), + (0x2058, "V"), + (0x205F, "3", " "), + (0x2060, "I"), + (0x2061, "X"), + (0x2064, "I"), + (0x2065, "X"), + (0x2070, "M", "0"), + (0x2071, "M", "i"), + (0x2072, "X"), + (0x2074, "M", "4"), + (0x2075, "M", "5"), + (0x2076, "M", "6"), + (0x2077, "M", "7"), + (0x2078, "M", "8"), + (0x2079, "M", "9"), + (0x207A, "3", "+"), + (0x207B, "M", "−"), + (0x207C, "3", "="), + (0x207D, "3", "("), + (0x207E, "3", ")"), + (0x207F, "M", "n"), + (0x2080, "M", "0"), + (0x2081, "M", "1"), + (0x2082, "M", "2"), + (0x2083, "M", "3"), + (0x2084, "M", "4"), + (0x2085, "M", "5"), + (0x2086, "M", "6"), + (0x2087, "M", "7"), + (0x2088, "M", "8"), + (0x2089, "M", "9"), + (0x208A, "3", "+"), + (0x208B, "M", "−"), + (0x208C, "3", "="), + (0x208D, "3", "("), + (0x208E, "3", ")"), + (0x208F, "X"), + (0x2090, "M", "a"), + (0x2091, "M", "e"), + (0x2092, "M", "o"), + (0x2093, "M", "x"), + (0x2094, "M", "ə"), + (0x2095, "M", "h"), + (0x2096, "M", "k"), + (0x2097, "M", "l"), + (0x2098, "M", "m"), + (0x2099, "M", "n"), + (0x209A, "M", "p"), + (0x209B, "M", "s"), + (0x209C, "M", "t"), + (0x209D, "X"), + (0x20A0, "V"), + (0x20A8, "M", "rs"), + (0x20A9, "V"), + (0x20C1, "X"), + (0x20D0, "V"), + (0x20F1, "X"), + (0x2100, "3", "a/c"), + (0x2101, "3", "a/s"), + (0x2102, "M", "c"), + (0x2103, "M", "°c"), + (0x2104, "V"), + ] + + +def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2105, "3", "c/o"), + (0x2106, "3", "c/u"), + (0x2107, "M", "ɛ"), + (0x2108, "V"), + (0x2109, "M", "°f"), + (0x210A, "M", "g"), + (0x210B, "M", "h"), + (0x210F, "M", "ħ"), + (0x2110, "M", "i"), + (0x2112, "M", "l"), + (0x2114, "V"), + (0x2115, "M", "n"), + (0x2116, "M", "no"), + (0x2117, "V"), + (0x2119, "M", "p"), + (0x211A, "M", "q"), + (0x211B, "M", "r"), + (0x211E, "V"), + (0x2120, "M", "sm"), + (0x2121, "M", "tel"), + (0x2122, "M", "tm"), + (0x2123, "V"), + (0x2124, "M", "z"), + (0x2125, "V"), + (0x2126, "M", "ω"), + (0x2127, "V"), + (0x2128, "M", "z"), + (0x2129, "V"), + (0x212A, "M", "k"), + (0x212B, "M", "å"), + (0x212C, "M", "b"), + (0x212D, "M", "c"), + (0x212E, "V"), + (0x212F, "M", "e"), + (0x2131, "M", "f"), + (0x2132, "X"), + (0x2133, "M", "m"), + (0x2134, "M", "o"), + (0x2135, "M", "א"), + (0x2136, "M", "ב"), + (0x2137, "M", "ג"), + (0x2138, "M", "ד"), + (0x2139, "M", "i"), + (0x213A, "V"), + (0x213B, "M", "fax"), + (0x213C, "M", "π"), + (0x213D, "M", "γ"), + (0x213F, "M", "π"), + (0x2140, "M", "∑"), + (0x2141, "V"), + (0x2145, "M", "d"), + (0x2147, "M", "e"), + (0x2148, "M", "i"), + (0x2149, "M", "j"), + (0x214A, "V"), + (0x2150, "M", "1⁄7"), + (0x2151, "M", "1⁄9"), + (0x2152, "M", "1⁄10"), + (0x2153, "M", "1⁄3"), + (0x2154, "M", "2⁄3"), + (0x2155, "M", "1⁄5"), + (0x2156, "M", "2⁄5"), + (0x2157, "M", "3⁄5"), + (0x2158, "M", "4⁄5"), + (0x2159, "M", "1⁄6"), + (0x215A, "M", "5⁄6"), + (0x215B, "M", "1⁄8"), + (0x215C, "M", "3⁄8"), + (0x215D, "M", "5⁄8"), + (0x215E, "M", "7⁄8"), + (0x215F, "M", "1⁄"), + (0x2160, "M", "i"), + (0x2161, "M", "ii"), + (0x2162, "M", "iii"), + (0x2163, "M", "iv"), + (0x2164, "M", "v"), + (0x2165, "M", "vi"), + (0x2166, "M", "vii"), + (0x2167, "M", "viii"), + (0x2168, "M", "ix"), + (0x2169, "M", "x"), + (0x216A, "M", "xi"), + (0x216B, "M", "xii"), + (0x216C, "M", "l"), + (0x216D, "M", "c"), + (0x216E, "M", "d"), + (0x216F, "M", "m"), + (0x2170, "M", "i"), + (0x2171, "M", "ii"), + (0x2172, "M", "iii"), + (0x2173, "M", "iv"), + (0x2174, "M", "v"), + (0x2175, "M", "vi"), + (0x2176, "M", "vii"), + (0x2177, "M", "viii"), + (0x2178, "M", "ix"), + (0x2179, "M", "x"), + (0x217A, "M", "xi"), + (0x217B, "M", "xii"), + (0x217C, "M", "l"), + ] + + +def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x217D, "M", "c"), + (0x217E, "M", "d"), + (0x217F, "M", "m"), + (0x2180, "V"), + (0x2183, "X"), + (0x2184, "V"), + (0x2189, "M", "0⁄3"), + (0x218A, "V"), + (0x218C, "X"), + (0x2190, "V"), + (0x222C, "M", "∫∫"), + (0x222D, "M", "∫∫∫"), + (0x222E, "V"), + (0x222F, "M", "∮∮"), + (0x2230, "M", "∮∮∮"), + (0x2231, "V"), + (0x2329, "M", "〈"), + (0x232A, "M", "〉"), + (0x232B, "V"), + (0x2427, "X"), + (0x2440, "V"), + (0x244B, "X"), + (0x2460, "M", "1"), + (0x2461, "M", "2"), + (0x2462, "M", "3"), + (0x2463, "M", "4"), + (0x2464, "M", "5"), + (0x2465, "M", "6"), + (0x2466, "M", "7"), + (0x2467, "M", "8"), + (0x2468, "M", "9"), + (0x2469, "M", "10"), + (0x246A, "M", "11"), + (0x246B, "M", "12"), + (0x246C, "M", "13"), + (0x246D, "M", "14"), + (0x246E, "M", "15"), + (0x246F, "M", "16"), + (0x2470, "M", "17"), + (0x2471, "M", "18"), + (0x2472, "M", "19"), + (0x2473, "M", "20"), + (0x2474, "3", "(1)"), + (0x2475, "3", "(2)"), + (0x2476, "3", "(3)"), + (0x2477, "3", "(4)"), + (0x2478, "3", "(5)"), + (0x2479, "3", "(6)"), + (0x247A, "3", "(7)"), + (0x247B, "3", "(8)"), + (0x247C, "3", "(9)"), + (0x247D, "3", "(10)"), + (0x247E, "3", "(11)"), + (0x247F, "3", "(12)"), + (0x2480, "3", "(13)"), + (0x2481, "3", "(14)"), + (0x2482, "3", "(15)"), + (0x2483, "3", "(16)"), + (0x2484, "3", "(17)"), + (0x2485, "3", "(18)"), + (0x2486, "3", "(19)"), + (0x2487, "3", "(20)"), + (0x2488, "X"), + (0x249C, "3", "(a)"), + (0x249D, "3", "(b)"), + (0x249E, "3", "(c)"), + (0x249F, "3", "(d)"), + (0x24A0, "3", "(e)"), + (0x24A1, "3", "(f)"), + (0x24A2, "3", "(g)"), + (0x24A3, "3", "(h)"), + (0x24A4, "3", "(i)"), + (0x24A5, "3", "(j)"), + (0x24A6, "3", "(k)"), + (0x24A7, "3", "(l)"), + (0x24A8, "3", "(m)"), + (0x24A9, "3", "(n)"), + (0x24AA, "3", "(o)"), + (0x24AB, "3", "(p)"), + (0x24AC, "3", "(q)"), + (0x24AD, "3", "(r)"), + (0x24AE, "3", "(s)"), + (0x24AF, "3", "(t)"), + (0x24B0, "3", "(u)"), + (0x24B1, "3", "(v)"), + (0x24B2, "3", "(w)"), + (0x24B3, "3", "(x)"), + (0x24B4, "3", "(y)"), + (0x24B5, "3", "(z)"), + (0x24B6, "M", "a"), + (0x24B7, "M", "b"), + (0x24B8, "M", "c"), + (0x24B9, "M", "d"), + (0x24BA, "M", "e"), + (0x24BB, "M", "f"), + (0x24BC, "M", "g"), + (0x24BD, "M", "h"), + (0x24BE, "M", "i"), + (0x24BF, "M", "j"), + (0x24C0, "M", "k"), + ] + + +def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x24C1, "M", "l"), + (0x24C2, "M", "m"), + (0x24C3, "M", "n"), + (0x24C4, "M", "o"), + (0x24C5, "M", "p"), + (0x24C6, "M", "q"), + (0x24C7, "M", "r"), + (0x24C8, "M", "s"), + (0x24C9, "M", "t"), + (0x24CA, "M", "u"), + (0x24CB, "M", "v"), + (0x24CC, "M", "w"), + (0x24CD, "M", "x"), + (0x24CE, "M", "y"), + (0x24CF, "M", "z"), + (0x24D0, "M", "a"), + (0x24D1, "M", "b"), + (0x24D2, "M", "c"), + (0x24D3, "M", "d"), + (0x24D4, "M", "e"), + (0x24D5, "M", "f"), + (0x24D6, "M", "g"), + (0x24D7, "M", "h"), + (0x24D8, "M", "i"), + (0x24D9, "M", "j"), + (0x24DA, "M", "k"), + (0x24DB, "M", "l"), + (0x24DC, "M", "m"), + (0x24DD, "M", "n"), + (0x24DE, "M", "o"), + (0x24DF, "M", "p"), + (0x24E0, "M", "q"), + (0x24E1, "M", "r"), + (0x24E2, "M", "s"), + (0x24E3, "M", "t"), + (0x24E4, "M", "u"), + (0x24E5, "M", "v"), + (0x24E6, "M", "w"), + (0x24E7, "M", "x"), + (0x24E8, "M", "y"), + (0x24E9, "M", "z"), + (0x24EA, "M", "0"), + (0x24EB, "V"), + (0x2A0C, "M", "∫∫∫∫"), + (0x2A0D, "V"), + (0x2A74, "3", "::="), + (0x2A75, "3", "=="), + (0x2A76, "3", "==="), + (0x2A77, "V"), + (0x2ADC, "M", "⫝̸"), + (0x2ADD, "V"), + (0x2B74, "X"), + (0x2B76, "V"), + (0x2B96, "X"), + (0x2B97, "V"), + (0x2C00, "M", "ⰰ"), + (0x2C01, "M", "ⰱ"), + (0x2C02, "M", "ⰲ"), + (0x2C03, "M", "ⰳ"), + (0x2C04, "M", "ⰴ"), + (0x2C05, "M", "ⰵ"), + (0x2C06, "M", "ⰶ"), + (0x2C07, "M", "ⰷ"), + (0x2C08, "M", "ⰸ"), + (0x2C09, "M", "ⰹ"), + (0x2C0A, "M", "ⰺ"), + (0x2C0B, "M", "ⰻ"), + (0x2C0C, "M", "ⰼ"), + (0x2C0D, "M", "ⰽ"), + (0x2C0E, "M", "ⰾ"), + (0x2C0F, "M", "ⰿ"), + (0x2C10, "M", "ⱀ"), + (0x2C11, "M", "ⱁ"), + (0x2C12, "M", "ⱂ"), + (0x2C13, "M", "ⱃ"), + (0x2C14, "M", "ⱄ"), + (0x2C15, "M", "ⱅ"), + (0x2C16, "M", "ⱆ"), + (0x2C17, "M", "ⱇ"), + (0x2C18, "M", "ⱈ"), + (0x2C19, "M", "ⱉ"), + (0x2C1A, "M", "ⱊ"), + (0x2C1B, "M", "ⱋ"), + (0x2C1C, "M", "ⱌ"), + (0x2C1D, "M", "ⱍ"), + (0x2C1E, "M", "ⱎ"), + (0x2C1F, "M", "ⱏ"), + (0x2C20, "M", "ⱐ"), + (0x2C21, "M", "ⱑ"), + (0x2C22, "M", "ⱒ"), + (0x2C23, "M", "ⱓ"), + (0x2C24, "M", "ⱔ"), + (0x2C25, "M", "ⱕ"), + (0x2C26, "M", "ⱖ"), + (0x2C27, "M", "ⱗ"), + (0x2C28, "M", "ⱘ"), + (0x2C29, "M", "ⱙ"), + (0x2C2A, "M", "ⱚ"), + (0x2C2B, "M", "ⱛ"), + (0x2C2C, "M", "ⱜ"), + ] + + +def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2C2D, "M", "ⱝ"), + (0x2C2E, "M", "ⱞ"), + (0x2C2F, "M", "ⱟ"), + (0x2C30, "V"), + (0x2C60, "M", "ⱡ"), + (0x2C61, "V"), + (0x2C62, "M", "ɫ"), + (0x2C63, "M", "ᵽ"), + (0x2C64, "M", "ɽ"), + (0x2C65, "V"), + (0x2C67, "M", "ⱨ"), + (0x2C68, "V"), + (0x2C69, "M", "ⱪ"), + (0x2C6A, "V"), + (0x2C6B, "M", "ⱬ"), + (0x2C6C, "V"), + (0x2C6D, "M", "ɑ"), + (0x2C6E, "M", "ɱ"), + (0x2C6F, "M", "ɐ"), + (0x2C70, "M", "ɒ"), + (0x2C71, "V"), + (0x2C72, "M", "ⱳ"), + (0x2C73, "V"), + (0x2C75, "M", "ⱶ"), + (0x2C76, "V"), + (0x2C7C, "M", "j"), + (0x2C7D, "M", "v"), + (0x2C7E, "M", "ȿ"), + (0x2C7F, "M", "ɀ"), + (0x2C80, "M", "ⲁ"), + (0x2C81, "V"), + (0x2C82, "M", "ⲃ"), + (0x2C83, "V"), + (0x2C84, "M", "ⲅ"), + (0x2C85, "V"), + (0x2C86, "M", "ⲇ"), + (0x2C87, "V"), + (0x2C88, "M", "ⲉ"), + (0x2C89, "V"), + (0x2C8A, "M", "ⲋ"), + (0x2C8B, "V"), + (0x2C8C, "M", "ⲍ"), + (0x2C8D, "V"), + (0x2C8E, "M", "ⲏ"), + (0x2C8F, "V"), + (0x2C90, "M", "ⲑ"), + (0x2C91, "V"), + (0x2C92, "M", "ⲓ"), + (0x2C93, "V"), + (0x2C94, "M", "ⲕ"), + (0x2C95, "V"), + (0x2C96, "M", "ⲗ"), + (0x2C97, "V"), + (0x2C98, "M", "ⲙ"), + (0x2C99, "V"), + (0x2C9A, "M", "ⲛ"), + (0x2C9B, "V"), + (0x2C9C, "M", "ⲝ"), + (0x2C9D, "V"), + (0x2C9E, "M", "ⲟ"), + (0x2C9F, "V"), + (0x2CA0, "M", "ⲡ"), + (0x2CA1, "V"), + (0x2CA2, "M", "ⲣ"), + (0x2CA3, "V"), + (0x2CA4, "M", "ⲥ"), + (0x2CA5, "V"), + (0x2CA6, "M", "ⲧ"), + (0x2CA7, "V"), + (0x2CA8, "M", "ⲩ"), + (0x2CA9, "V"), + (0x2CAA, "M", "ⲫ"), + (0x2CAB, "V"), + (0x2CAC, "M", "ⲭ"), + (0x2CAD, "V"), + (0x2CAE, "M", "ⲯ"), + (0x2CAF, "V"), + (0x2CB0, "M", "ⲱ"), + (0x2CB1, "V"), + (0x2CB2, "M", "ⲳ"), + (0x2CB3, "V"), + (0x2CB4, "M", "ⲵ"), + (0x2CB5, "V"), + (0x2CB6, "M", "ⲷ"), + (0x2CB7, "V"), + (0x2CB8, "M", "ⲹ"), + (0x2CB9, "V"), + (0x2CBA, "M", "ⲻ"), + (0x2CBB, "V"), + (0x2CBC, "M", "ⲽ"), + (0x2CBD, "V"), + (0x2CBE, "M", "ⲿ"), + (0x2CBF, "V"), + (0x2CC0, "M", "ⳁ"), + (0x2CC1, "V"), + (0x2CC2, "M", "ⳃ"), + (0x2CC3, "V"), + (0x2CC4, "M", "ⳅ"), + (0x2CC5, "V"), + (0x2CC6, "M", "ⳇ"), + ] + + +def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2CC7, "V"), + (0x2CC8, "M", "ⳉ"), + (0x2CC9, "V"), + (0x2CCA, "M", "ⳋ"), + (0x2CCB, "V"), + (0x2CCC, "M", "ⳍ"), + (0x2CCD, "V"), + (0x2CCE, "M", "ⳏ"), + (0x2CCF, "V"), + (0x2CD0, "M", "ⳑ"), + (0x2CD1, "V"), + (0x2CD2, "M", "ⳓ"), + (0x2CD3, "V"), + (0x2CD4, "M", "ⳕ"), + (0x2CD5, "V"), + (0x2CD6, "M", "ⳗ"), + (0x2CD7, "V"), + (0x2CD8, "M", "ⳙ"), + (0x2CD9, "V"), + (0x2CDA, "M", "ⳛ"), + (0x2CDB, "V"), + (0x2CDC, "M", "ⳝ"), + (0x2CDD, "V"), + (0x2CDE, "M", "ⳟ"), + (0x2CDF, "V"), + (0x2CE0, "M", "ⳡ"), + (0x2CE1, "V"), + (0x2CE2, "M", "ⳣ"), + (0x2CE3, "V"), + (0x2CEB, "M", "ⳬ"), + (0x2CEC, "V"), + (0x2CED, "M", "ⳮ"), + (0x2CEE, "V"), + (0x2CF2, "M", "ⳳ"), + (0x2CF3, "V"), + (0x2CF4, "X"), + (0x2CF9, "V"), + (0x2D26, "X"), + (0x2D27, "V"), + (0x2D28, "X"), + (0x2D2D, "V"), + (0x2D2E, "X"), + (0x2D30, "V"), + (0x2D68, "X"), + (0x2D6F, "M", "ⵡ"), + (0x2D70, "V"), + (0x2D71, "X"), + (0x2D7F, "V"), + (0x2D97, "X"), + (0x2DA0, "V"), + (0x2DA7, "X"), + (0x2DA8, "V"), + (0x2DAF, "X"), + (0x2DB0, "V"), + (0x2DB7, "X"), + (0x2DB8, "V"), + (0x2DBF, "X"), + (0x2DC0, "V"), + (0x2DC7, "X"), + (0x2DC8, "V"), + (0x2DCF, "X"), + (0x2DD0, "V"), + (0x2DD7, "X"), + (0x2DD8, "V"), + (0x2DDF, "X"), + (0x2DE0, "V"), + (0x2E5E, "X"), + (0x2E80, "V"), + (0x2E9A, "X"), + (0x2E9B, "V"), + (0x2E9F, "M", "母"), + (0x2EA0, "V"), + (0x2EF3, "M", "龟"), + (0x2EF4, "X"), + (0x2F00, "M", "一"), + (0x2F01, "M", "丨"), + (0x2F02, "M", "丶"), + (0x2F03, "M", "丿"), + (0x2F04, "M", "乙"), + (0x2F05, "M", "亅"), + (0x2F06, "M", "二"), + (0x2F07, "M", "亠"), + (0x2F08, "M", "人"), + (0x2F09, "M", "儿"), + (0x2F0A, "M", "入"), + (0x2F0B, "M", "八"), + (0x2F0C, "M", "冂"), + (0x2F0D, "M", "冖"), + (0x2F0E, "M", "冫"), + (0x2F0F, "M", "几"), + (0x2F10, "M", "凵"), + (0x2F11, "M", "刀"), + (0x2F12, "M", "力"), + (0x2F13, "M", "勹"), + (0x2F14, "M", "匕"), + (0x2F15, "M", "匚"), + (0x2F16, "M", "匸"), + (0x2F17, "M", "十"), + (0x2F18, "M", "卜"), + (0x2F19, "M", "卩"), + ] + + +def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F1A, "M", "厂"), + (0x2F1B, "M", "厶"), + (0x2F1C, "M", "又"), + (0x2F1D, "M", "口"), + (0x2F1E, "M", "囗"), + (0x2F1F, "M", "土"), + (0x2F20, "M", "士"), + (0x2F21, "M", "夂"), + (0x2F22, "M", "夊"), + (0x2F23, "M", "夕"), + (0x2F24, "M", "大"), + (0x2F25, "M", "女"), + (0x2F26, "M", "子"), + (0x2F27, "M", "宀"), + (0x2F28, "M", "寸"), + (0x2F29, "M", "小"), + (0x2F2A, "M", "尢"), + (0x2F2B, "M", "尸"), + (0x2F2C, "M", "屮"), + (0x2F2D, "M", "山"), + (0x2F2E, "M", "巛"), + (0x2F2F, "M", "工"), + (0x2F30, "M", "己"), + (0x2F31, "M", "巾"), + (0x2F32, "M", "干"), + (0x2F33, "M", "幺"), + (0x2F34, "M", "广"), + (0x2F35, "M", "廴"), + (0x2F36, "M", "廾"), + (0x2F37, "M", "弋"), + (0x2F38, "M", "弓"), + (0x2F39, "M", "彐"), + (0x2F3A, "M", "彡"), + (0x2F3B, "M", "彳"), + (0x2F3C, "M", "心"), + (0x2F3D, "M", "戈"), + (0x2F3E, "M", "戶"), + (0x2F3F, "M", "手"), + (0x2F40, "M", "支"), + (0x2F41, "M", "攴"), + (0x2F42, "M", "文"), + (0x2F43, "M", "斗"), + (0x2F44, "M", "斤"), + (0x2F45, "M", "方"), + (0x2F46, "M", "无"), + (0x2F47, "M", "日"), + (0x2F48, "M", "曰"), + (0x2F49, "M", "月"), + (0x2F4A, "M", "木"), + (0x2F4B, "M", "欠"), + (0x2F4C, "M", "止"), + (0x2F4D, "M", "歹"), + (0x2F4E, "M", "殳"), + (0x2F4F, "M", "毋"), + (0x2F50, "M", "比"), + (0x2F51, "M", "毛"), + (0x2F52, "M", "氏"), + (0x2F53, "M", "气"), + (0x2F54, "M", "水"), + (0x2F55, "M", "火"), + (0x2F56, "M", "爪"), + (0x2F57, "M", "父"), + (0x2F58, "M", "爻"), + (0x2F59, "M", "爿"), + (0x2F5A, "M", "片"), + (0x2F5B, "M", "牙"), + (0x2F5C, "M", "牛"), + (0x2F5D, "M", "犬"), + (0x2F5E, "M", "玄"), + (0x2F5F, "M", "玉"), + (0x2F60, "M", "瓜"), + (0x2F61, "M", "瓦"), + (0x2F62, "M", "甘"), + (0x2F63, "M", "生"), + (0x2F64, "M", "用"), + (0x2F65, "M", "田"), + (0x2F66, "M", "疋"), + (0x2F67, "M", "疒"), + (0x2F68, "M", "癶"), + (0x2F69, "M", "白"), + (0x2F6A, "M", "皮"), + (0x2F6B, "M", "皿"), + (0x2F6C, "M", "目"), + (0x2F6D, "M", "矛"), + (0x2F6E, "M", "矢"), + (0x2F6F, "M", "石"), + (0x2F70, "M", "示"), + (0x2F71, "M", "禸"), + (0x2F72, "M", "禾"), + (0x2F73, "M", "穴"), + (0x2F74, "M", "立"), + (0x2F75, "M", "竹"), + (0x2F76, "M", "米"), + (0x2F77, "M", "糸"), + (0x2F78, "M", "缶"), + (0x2F79, "M", "网"), + (0x2F7A, "M", "羊"), + (0x2F7B, "M", "羽"), + (0x2F7C, "M", "老"), + (0x2F7D, "M", "而"), + ] + + +def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F7E, "M", "耒"), + (0x2F7F, "M", "耳"), + (0x2F80, "M", "聿"), + (0x2F81, "M", "肉"), + (0x2F82, "M", "臣"), + (0x2F83, "M", "自"), + (0x2F84, "M", "至"), + (0x2F85, "M", "臼"), + (0x2F86, "M", "舌"), + (0x2F87, "M", "舛"), + (0x2F88, "M", "舟"), + (0x2F89, "M", "艮"), + (0x2F8A, "M", "色"), + (0x2F8B, "M", "艸"), + (0x2F8C, "M", "虍"), + (0x2F8D, "M", "虫"), + (0x2F8E, "M", "血"), + (0x2F8F, "M", "行"), + (0x2F90, "M", "衣"), + (0x2F91, "M", "襾"), + (0x2F92, "M", "見"), + (0x2F93, "M", "角"), + (0x2F94, "M", "言"), + (0x2F95, "M", "谷"), + (0x2F96, "M", "豆"), + (0x2F97, "M", "豕"), + (0x2F98, "M", "豸"), + (0x2F99, "M", "貝"), + (0x2F9A, "M", "赤"), + (0x2F9B, "M", "走"), + (0x2F9C, "M", "足"), + (0x2F9D, "M", "身"), + (0x2F9E, "M", "車"), + (0x2F9F, "M", "辛"), + (0x2FA0, "M", "辰"), + (0x2FA1, "M", "辵"), + (0x2FA2, "M", "邑"), + (0x2FA3, "M", "酉"), + (0x2FA4, "M", "釆"), + (0x2FA5, "M", "里"), + (0x2FA6, "M", "金"), + (0x2FA7, "M", "長"), + (0x2FA8, "M", "門"), + (0x2FA9, "M", "阜"), + (0x2FAA, "M", "隶"), + (0x2FAB, "M", "隹"), + (0x2FAC, "M", "雨"), + (0x2FAD, "M", "靑"), + (0x2FAE, "M", "非"), + (0x2FAF, "M", "面"), + (0x2FB0, "M", "革"), + (0x2FB1, "M", "韋"), + (0x2FB2, "M", "韭"), + (0x2FB3, "M", "音"), + (0x2FB4, "M", "頁"), + (0x2FB5, "M", "風"), + (0x2FB6, "M", "飛"), + (0x2FB7, "M", "食"), + (0x2FB8, "M", "首"), + (0x2FB9, "M", "香"), + (0x2FBA, "M", "馬"), + (0x2FBB, "M", "骨"), + (0x2FBC, "M", "高"), + (0x2FBD, "M", "髟"), + (0x2FBE, "M", "鬥"), + (0x2FBF, "M", "鬯"), + (0x2FC0, "M", "鬲"), + (0x2FC1, "M", "鬼"), + (0x2FC2, "M", "魚"), + (0x2FC3, "M", "鳥"), + (0x2FC4, "M", "鹵"), + (0x2FC5, "M", "鹿"), + (0x2FC6, "M", "麥"), + (0x2FC7, "M", "麻"), + (0x2FC8, "M", "黃"), + (0x2FC9, "M", "黍"), + (0x2FCA, "M", "黑"), + (0x2FCB, "M", "黹"), + (0x2FCC, "M", "黽"), + (0x2FCD, "M", "鼎"), + (0x2FCE, "M", "鼓"), + (0x2FCF, "M", "鼠"), + (0x2FD0, "M", "鼻"), + (0x2FD1, "M", "齊"), + (0x2FD2, "M", "齒"), + (0x2FD3, "M", "龍"), + (0x2FD4, "M", "龜"), + (0x2FD5, "M", "龠"), + (0x2FD6, "X"), + (0x3000, "3", " "), + (0x3001, "V"), + (0x3002, "M", "."), + (0x3003, "V"), + (0x3036, "M", "〒"), + (0x3037, "V"), + (0x3038, "M", "十"), + (0x3039, "M", "卄"), + (0x303A, "M", "卅"), + (0x303B, "V"), + (0x3040, "X"), + ] + + +def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3041, "V"), + (0x3097, "X"), + (0x3099, "V"), + (0x309B, "3", " ゙"), + (0x309C, "3", " ゚"), + (0x309D, "V"), + (0x309F, "M", "より"), + (0x30A0, "V"), + (0x30FF, "M", "コト"), + (0x3100, "X"), + (0x3105, "V"), + (0x3130, "X"), + (0x3131, "M", "ᄀ"), + (0x3132, "M", "ᄁ"), + (0x3133, "M", "ᆪ"), + (0x3134, "M", "ᄂ"), + (0x3135, "M", "ᆬ"), + (0x3136, "M", "ᆭ"), + (0x3137, "M", "ᄃ"), + (0x3138, "M", "ᄄ"), + (0x3139, "M", "ᄅ"), + (0x313A, "M", "ᆰ"), + (0x313B, "M", "ᆱ"), + (0x313C, "M", "ᆲ"), + (0x313D, "M", "ᆳ"), + (0x313E, "M", "ᆴ"), + (0x313F, "M", "ᆵ"), + (0x3140, "M", "ᄚ"), + (0x3141, "M", "ᄆ"), + (0x3142, "M", "ᄇ"), + (0x3143, "M", "ᄈ"), + (0x3144, "M", "ᄡ"), + (0x3145, "M", "ᄉ"), + (0x3146, "M", "ᄊ"), + (0x3147, "M", "ᄋ"), + (0x3148, "M", "ᄌ"), + (0x3149, "M", "ᄍ"), + (0x314A, "M", "ᄎ"), + (0x314B, "M", "ᄏ"), + (0x314C, "M", "ᄐ"), + (0x314D, "M", "ᄑ"), + (0x314E, "M", "ᄒ"), + (0x314F, "M", "ᅡ"), + (0x3150, "M", "ᅢ"), + (0x3151, "M", "ᅣ"), + (0x3152, "M", "ᅤ"), + (0x3153, "M", "ᅥ"), + (0x3154, "M", "ᅦ"), + (0x3155, "M", "ᅧ"), + (0x3156, "M", "ᅨ"), + (0x3157, "M", "ᅩ"), + (0x3158, "M", "ᅪ"), + (0x3159, "M", "ᅫ"), + (0x315A, "M", "ᅬ"), + (0x315B, "M", "ᅭ"), + (0x315C, "M", "ᅮ"), + (0x315D, "M", "ᅯ"), + (0x315E, "M", "ᅰ"), + (0x315F, "M", "ᅱ"), + (0x3160, "M", "ᅲ"), + (0x3161, "M", "ᅳ"), + (0x3162, "M", "ᅴ"), + (0x3163, "M", "ᅵ"), + (0x3164, "X"), + (0x3165, "M", "ᄔ"), + (0x3166, "M", "ᄕ"), + (0x3167, "M", "ᇇ"), + (0x3168, "M", "ᇈ"), + (0x3169, "M", "ᇌ"), + (0x316A, "M", "ᇎ"), + (0x316B, "M", "ᇓ"), + (0x316C, "M", "ᇗ"), + (0x316D, "M", "ᇙ"), + (0x316E, "M", "ᄜ"), + (0x316F, "M", "ᇝ"), + (0x3170, "M", "ᇟ"), + (0x3171, "M", "ᄝ"), + (0x3172, "M", "ᄞ"), + (0x3173, "M", "ᄠ"), + (0x3174, "M", "ᄢ"), + (0x3175, "M", "ᄣ"), + (0x3176, "M", "ᄧ"), + (0x3177, "M", "ᄩ"), + (0x3178, "M", "ᄫ"), + (0x3179, "M", "ᄬ"), + (0x317A, "M", "ᄭ"), + (0x317B, "M", "ᄮ"), + (0x317C, "M", "ᄯ"), + (0x317D, "M", "ᄲ"), + (0x317E, "M", "ᄶ"), + (0x317F, "M", "ᅀ"), + (0x3180, "M", "ᅇ"), + (0x3181, "M", "ᅌ"), + (0x3182, "M", "ᇱ"), + (0x3183, "M", "ᇲ"), + (0x3184, "M", "ᅗ"), + (0x3185, "M", "ᅘ"), + (0x3186, "M", "ᅙ"), + (0x3187, "M", "ᆄ"), + (0x3188, "M", "ᆅ"), + ] + + +def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3189, "M", "ᆈ"), + (0x318A, "M", "ᆑ"), + (0x318B, "M", "ᆒ"), + (0x318C, "M", "ᆔ"), + (0x318D, "M", "ᆞ"), + (0x318E, "M", "ᆡ"), + (0x318F, "X"), + (0x3190, "V"), + (0x3192, "M", "一"), + (0x3193, "M", "二"), + (0x3194, "M", "三"), + (0x3195, "M", "四"), + (0x3196, "M", "上"), + (0x3197, "M", "中"), + (0x3198, "M", "下"), + (0x3199, "M", "甲"), + (0x319A, "M", "乙"), + (0x319B, "M", "丙"), + (0x319C, "M", "丁"), + (0x319D, "M", "天"), + (0x319E, "M", "地"), + (0x319F, "M", "人"), + (0x31A0, "V"), + (0x31E4, "X"), + (0x31F0, "V"), + (0x3200, "3", "(ᄀ)"), + (0x3201, "3", "(ᄂ)"), + (0x3202, "3", "(ᄃ)"), + (0x3203, "3", "(ᄅ)"), + (0x3204, "3", "(ᄆ)"), + (0x3205, "3", "(ᄇ)"), + (0x3206, "3", "(ᄉ)"), + (0x3207, "3", "(ᄋ)"), + (0x3208, "3", "(ᄌ)"), + (0x3209, "3", "(ᄎ)"), + (0x320A, "3", "(ᄏ)"), + (0x320B, "3", "(ᄐ)"), + (0x320C, "3", "(ᄑ)"), + (0x320D, "3", "(ᄒ)"), + (0x320E, "3", "(가)"), + (0x320F, "3", "(나)"), + (0x3210, "3", "(다)"), + (0x3211, "3", "(라)"), + (0x3212, "3", "(마)"), + (0x3213, "3", "(바)"), + (0x3214, "3", "(사)"), + (0x3215, "3", "(아)"), + (0x3216, "3", "(자)"), + (0x3217, "3", "(차)"), + (0x3218, "3", "(카)"), + (0x3219, "3", "(타)"), + (0x321A, "3", "(파)"), + (0x321B, "3", "(하)"), + (0x321C, "3", "(주)"), + (0x321D, "3", "(오전)"), + (0x321E, "3", "(오후)"), + (0x321F, "X"), + (0x3220, "3", "(一)"), + (0x3221, "3", "(二)"), + (0x3222, "3", "(三)"), + (0x3223, "3", "(四)"), + (0x3224, "3", "(五)"), + (0x3225, "3", "(六)"), + (0x3226, "3", "(七)"), + (0x3227, "3", "(八)"), + (0x3228, "3", "(九)"), + (0x3229, "3", "(十)"), + (0x322A, "3", "(月)"), + (0x322B, "3", "(火)"), + (0x322C, "3", "(水)"), + (0x322D, "3", "(木)"), + (0x322E, "3", "(金)"), + (0x322F, "3", "(土)"), + (0x3230, "3", "(日)"), + (0x3231, "3", "(株)"), + (0x3232, "3", "(有)"), + (0x3233, "3", "(社)"), + (0x3234, "3", "(名)"), + (0x3235, "3", "(特)"), + (0x3236, "3", "(財)"), + (0x3237, "3", "(祝)"), + (0x3238, "3", "(労)"), + (0x3239, "3", "(代)"), + (0x323A, "3", "(呼)"), + (0x323B, "3", "(学)"), + (0x323C, "3", "(監)"), + (0x323D, "3", "(企)"), + (0x323E, "3", "(資)"), + (0x323F, "3", "(協)"), + (0x3240, "3", "(祭)"), + (0x3241, "3", "(休)"), + (0x3242, "3", "(自)"), + (0x3243, "3", "(至)"), + (0x3244, "M", "問"), + (0x3245, "M", "幼"), + (0x3246, "M", "文"), + (0x3247, "M", "箏"), + (0x3248, "V"), + (0x3250, "M", "pte"), + (0x3251, "M", "21"), + ] + + +def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3252, "M", "22"), + (0x3253, "M", "23"), + (0x3254, "M", "24"), + (0x3255, "M", "25"), + (0x3256, "M", "26"), + (0x3257, "M", "27"), + (0x3258, "M", "28"), + (0x3259, "M", "29"), + (0x325A, "M", "30"), + (0x325B, "M", "31"), + (0x325C, "M", "32"), + (0x325D, "M", "33"), + (0x325E, "M", "34"), + (0x325F, "M", "35"), + (0x3260, "M", "ᄀ"), + (0x3261, "M", "ᄂ"), + (0x3262, "M", "ᄃ"), + (0x3263, "M", "ᄅ"), + (0x3264, "M", "ᄆ"), + (0x3265, "M", "ᄇ"), + (0x3266, "M", "ᄉ"), + (0x3267, "M", "ᄋ"), + (0x3268, "M", "ᄌ"), + (0x3269, "M", "ᄎ"), + (0x326A, "M", "ᄏ"), + (0x326B, "M", "ᄐ"), + (0x326C, "M", "ᄑ"), + (0x326D, "M", "ᄒ"), + (0x326E, "M", "가"), + (0x326F, "M", "나"), + (0x3270, "M", "다"), + (0x3271, "M", "라"), + (0x3272, "M", "마"), + (0x3273, "M", "바"), + (0x3274, "M", "사"), + (0x3275, "M", "아"), + (0x3276, "M", "자"), + (0x3277, "M", "차"), + (0x3278, "M", "카"), + (0x3279, "M", "타"), + (0x327A, "M", "파"), + (0x327B, "M", "하"), + (0x327C, "M", "참고"), + (0x327D, "M", "주의"), + (0x327E, "M", "우"), + (0x327F, "V"), + (0x3280, "M", "一"), + (0x3281, "M", "二"), + (0x3282, "M", "三"), + (0x3283, "M", "四"), + (0x3284, "M", "五"), + (0x3285, "M", "六"), + (0x3286, "M", "七"), + (0x3287, "M", "八"), + (0x3288, "M", "九"), + (0x3289, "M", "十"), + (0x328A, "M", "月"), + (0x328B, "M", "火"), + (0x328C, "M", "水"), + (0x328D, "M", "木"), + (0x328E, "M", "金"), + (0x328F, "M", "土"), + (0x3290, "M", "日"), + (0x3291, "M", "株"), + (0x3292, "M", "有"), + (0x3293, "M", "社"), + (0x3294, "M", "名"), + (0x3295, "M", "特"), + (0x3296, "M", "財"), + (0x3297, "M", "祝"), + (0x3298, "M", "労"), + (0x3299, "M", "秘"), + (0x329A, "M", "男"), + (0x329B, "M", "女"), + (0x329C, "M", "適"), + (0x329D, "M", "優"), + (0x329E, "M", "印"), + (0x329F, "M", "注"), + (0x32A0, "M", "項"), + (0x32A1, "M", "休"), + (0x32A2, "M", "写"), + (0x32A3, "M", "正"), + (0x32A4, "M", "上"), + (0x32A5, "M", "中"), + (0x32A6, "M", "下"), + (0x32A7, "M", "左"), + (0x32A8, "M", "右"), + (0x32A9, "M", "医"), + (0x32AA, "M", "宗"), + (0x32AB, "M", "学"), + (0x32AC, "M", "監"), + (0x32AD, "M", "企"), + (0x32AE, "M", "資"), + (0x32AF, "M", "協"), + (0x32B0, "M", "夜"), + (0x32B1, "M", "36"), + (0x32B2, "M", "37"), + (0x32B3, "M", "38"), + (0x32B4, "M", "39"), + (0x32B5, "M", "40"), + ] + + +def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x32B6, "M", "41"), + (0x32B7, "M", "42"), + (0x32B8, "M", "43"), + (0x32B9, "M", "44"), + (0x32BA, "M", "45"), + (0x32BB, "M", "46"), + (0x32BC, "M", "47"), + (0x32BD, "M", "48"), + (0x32BE, "M", "49"), + (0x32BF, "M", "50"), + (0x32C0, "M", "1月"), + (0x32C1, "M", "2月"), + (0x32C2, "M", "3月"), + (0x32C3, "M", "4月"), + (0x32C4, "M", "5月"), + (0x32C5, "M", "6月"), + (0x32C6, "M", "7月"), + (0x32C7, "M", "8月"), + (0x32C8, "M", "9月"), + (0x32C9, "M", "10月"), + (0x32CA, "M", "11月"), + (0x32CB, "M", "12月"), + (0x32CC, "M", "hg"), + (0x32CD, "M", "erg"), + (0x32CE, "M", "ev"), + (0x32CF, "M", "ltd"), + (0x32D0, "M", "ア"), + (0x32D1, "M", "イ"), + (0x32D2, "M", "ウ"), + (0x32D3, "M", "エ"), + (0x32D4, "M", "オ"), + (0x32D5, "M", "カ"), + (0x32D6, "M", "キ"), + (0x32D7, "M", "ク"), + (0x32D8, "M", "ケ"), + (0x32D9, "M", "コ"), + (0x32DA, "M", "サ"), + (0x32DB, "M", "シ"), + (0x32DC, "M", "ス"), + (0x32DD, "M", "セ"), + (0x32DE, "M", "ソ"), + (0x32DF, "M", "タ"), + (0x32E0, "M", "チ"), + (0x32E1, "M", "ツ"), + (0x32E2, "M", "テ"), + (0x32E3, "M", "ト"), + (0x32E4, "M", "ナ"), + (0x32E5, "M", "ニ"), + (0x32E6, "M", "ヌ"), + (0x32E7, "M", "ネ"), + (0x32E8, "M", "ノ"), + (0x32E9, "M", "ハ"), + (0x32EA, "M", "ヒ"), + (0x32EB, "M", "フ"), + (0x32EC, "M", "ヘ"), + (0x32ED, "M", "ホ"), + (0x32EE, "M", "マ"), + (0x32EF, "M", "ミ"), + (0x32F0, "M", "ム"), + (0x32F1, "M", "メ"), + (0x32F2, "M", "モ"), + (0x32F3, "M", "ヤ"), + (0x32F4, "M", "ユ"), + (0x32F5, "M", "ヨ"), + (0x32F6, "M", "ラ"), + (0x32F7, "M", "リ"), + (0x32F8, "M", "ル"), + (0x32F9, "M", "レ"), + (0x32FA, "M", "ロ"), + (0x32FB, "M", "ワ"), + (0x32FC, "M", "ヰ"), + (0x32FD, "M", "ヱ"), + (0x32FE, "M", "ヲ"), + (0x32FF, "M", "令和"), + (0x3300, "M", "アパート"), + (0x3301, "M", "アルファ"), + (0x3302, "M", "アンペア"), + (0x3303, "M", "アール"), + (0x3304, "M", "イニング"), + (0x3305, "M", "インチ"), + (0x3306, "M", "ウォン"), + (0x3307, "M", "エスクード"), + (0x3308, "M", "エーカー"), + (0x3309, "M", "オンス"), + (0x330A, "M", "オーム"), + (0x330B, "M", "カイリ"), + (0x330C, "M", "カラット"), + (0x330D, "M", "カロリー"), + (0x330E, "M", "ガロン"), + (0x330F, "M", "ガンマ"), + (0x3310, "M", "ギガ"), + (0x3311, "M", "ギニー"), + (0x3312, "M", "キュリー"), + (0x3313, "M", "ギルダー"), + (0x3314, "M", "キロ"), + (0x3315, "M", "キログラム"), + (0x3316, "M", "キロメートル"), + (0x3317, "M", "キロワット"), + (0x3318, "M", "グラム"), + (0x3319, "M", "グラムトン"), + ] + + +def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x331A, "M", "クルゼイロ"), + (0x331B, "M", "クローネ"), + (0x331C, "M", "ケース"), + (0x331D, "M", "コルナ"), + (0x331E, "M", "コーポ"), + (0x331F, "M", "サイクル"), + (0x3320, "M", "サンチーム"), + (0x3321, "M", "シリング"), + (0x3322, "M", "センチ"), + (0x3323, "M", "セント"), + (0x3324, "M", "ダース"), + (0x3325, "M", "デシ"), + (0x3326, "M", "ドル"), + (0x3327, "M", "トン"), + (0x3328, "M", "ナノ"), + (0x3329, "M", "ノット"), + (0x332A, "M", "ハイツ"), + (0x332B, "M", "パーセント"), + (0x332C, "M", "パーツ"), + (0x332D, "M", "バーレル"), + (0x332E, "M", "ピアストル"), + (0x332F, "M", "ピクル"), + (0x3330, "M", "ピコ"), + (0x3331, "M", "ビル"), + (0x3332, "M", "ファラッド"), + (0x3333, "M", "フィート"), + (0x3334, "M", "ブッシェル"), + (0x3335, "M", "フラン"), + (0x3336, "M", "ヘクタール"), + (0x3337, "M", "ペソ"), + (0x3338, "M", "ペニヒ"), + (0x3339, "M", "ヘルツ"), + (0x333A, "M", "ペンス"), + (0x333B, "M", "ページ"), + (0x333C, "M", "ベータ"), + (0x333D, "M", "ポイント"), + (0x333E, "M", "ボルト"), + (0x333F, "M", "ホン"), + (0x3340, "M", "ポンド"), + (0x3341, "M", "ホール"), + (0x3342, "M", "ホーン"), + (0x3343, "M", "マイクロ"), + (0x3344, "M", "マイル"), + (0x3345, "M", "マッハ"), + (0x3346, "M", "マルク"), + (0x3347, "M", "マンション"), + (0x3348, "M", "ミクロン"), + (0x3349, "M", "ミリ"), + (0x334A, "M", "ミリバール"), + (0x334B, "M", "メガ"), + (0x334C, "M", "メガトン"), + (0x334D, "M", "メートル"), + (0x334E, "M", "ヤード"), + (0x334F, "M", "ヤール"), + (0x3350, "M", "ユアン"), + (0x3351, "M", "リットル"), + (0x3352, "M", "リラ"), + (0x3353, "M", "ルピー"), + (0x3354, "M", "ルーブル"), + (0x3355, "M", "レム"), + (0x3356, "M", "レントゲン"), + (0x3357, "M", "ワット"), + (0x3358, "M", "0点"), + (0x3359, "M", "1点"), + (0x335A, "M", "2点"), + (0x335B, "M", "3点"), + (0x335C, "M", "4点"), + (0x335D, "M", "5点"), + (0x335E, "M", "6点"), + (0x335F, "M", "7点"), + (0x3360, "M", "8点"), + (0x3361, "M", "9点"), + (0x3362, "M", "10点"), + (0x3363, "M", "11点"), + (0x3364, "M", "12点"), + (0x3365, "M", "13点"), + (0x3366, "M", "14点"), + (0x3367, "M", "15点"), + (0x3368, "M", "16点"), + (0x3369, "M", "17点"), + (0x336A, "M", "18点"), + (0x336B, "M", "19点"), + (0x336C, "M", "20点"), + (0x336D, "M", "21点"), + (0x336E, "M", "22点"), + (0x336F, "M", "23点"), + (0x3370, "M", "24点"), + (0x3371, "M", "hpa"), + (0x3372, "M", "da"), + (0x3373, "M", "au"), + (0x3374, "M", "bar"), + (0x3375, "M", "ov"), + (0x3376, "M", "pc"), + (0x3377, "M", "dm"), + (0x3378, "M", "dm2"), + (0x3379, "M", "dm3"), + (0x337A, "M", "iu"), + (0x337B, "M", "平成"), + (0x337C, "M", "昭和"), + (0x337D, "M", "大正"), + ] + + +def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x337E, "M", "明治"), + (0x337F, "M", "株式会社"), + (0x3380, "M", "pa"), + (0x3381, "M", "na"), + (0x3382, "M", "μa"), + (0x3383, "M", "ma"), + (0x3384, "M", "ka"), + (0x3385, "M", "kb"), + (0x3386, "M", "mb"), + (0x3387, "M", "gb"), + (0x3388, "M", "cal"), + (0x3389, "M", "kcal"), + (0x338A, "M", "pf"), + (0x338B, "M", "nf"), + (0x338C, "M", "μf"), + (0x338D, "M", "μg"), + (0x338E, "M", "mg"), + (0x338F, "M", "kg"), + (0x3390, "M", "hz"), + (0x3391, "M", "khz"), + (0x3392, "M", "mhz"), + (0x3393, "M", "ghz"), + (0x3394, "M", "thz"), + (0x3395, "M", "μl"), + (0x3396, "M", "ml"), + (0x3397, "M", "dl"), + (0x3398, "M", "kl"), + (0x3399, "M", "fm"), + (0x339A, "M", "nm"), + (0x339B, "M", "μm"), + (0x339C, "M", "mm"), + (0x339D, "M", "cm"), + (0x339E, "M", "km"), + (0x339F, "M", "mm2"), + (0x33A0, "M", "cm2"), + (0x33A1, "M", "m2"), + (0x33A2, "M", "km2"), + (0x33A3, "M", "mm3"), + (0x33A4, "M", "cm3"), + (0x33A5, "M", "m3"), + (0x33A6, "M", "km3"), + (0x33A7, "M", "m∕s"), + (0x33A8, "M", "m∕s2"), + (0x33A9, "M", "pa"), + (0x33AA, "M", "kpa"), + (0x33AB, "M", "mpa"), + (0x33AC, "M", "gpa"), + (0x33AD, "M", "rad"), + (0x33AE, "M", "rad∕s"), + (0x33AF, "M", "rad∕s2"), + (0x33B0, "M", "ps"), + (0x33B1, "M", "ns"), + (0x33B2, "M", "μs"), + (0x33B3, "M", "ms"), + (0x33B4, "M", "pv"), + (0x33B5, "M", "nv"), + (0x33B6, "M", "μv"), + (0x33B7, "M", "mv"), + (0x33B8, "M", "kv"), + (0x33B9, "M", "mv"), + (0x33BA, "M", "pw"), + (0x33BB, "M", "nw"), + (0x33BC, "M", "μw"), + (0x33BD, "M", "mw"), + (0x33BE, "M", "kw"), + (0x33BF, "M", "mw"), + (0x33C0, "M", "kω"), + (0x33C1, "M", "mω"), + (0x33C2, "X"), + (0x33C3, "M", "bq"), + (0x33C4, "M", "cc"), + (0x33C5, "M", "cd"), + (0x33C6, "M", "c∕kg"), + (0x33C7, "X"), + (0x33C8, "M", "db"), + (0x33C9, "M", "gy"), + (0x33CA, "M", "ha"), + (0x33CB, "M", "hp"), + (0x33CC, "M", "in"), + (0x33CD, "M", "kk"), + (0x33CE, "M", "km"), + (0x33CF, "M", "kt"), + (0x33D0, "M", "lm"), + (0x33D1, "M", "ln"), + (0x33D2, "M", "log"), + (0x33D3, "M", "lx"), + (0x33D4, "M", "mb"), + (0x33D5, "M", "mil"), + (0x33D6, "M", "mol"), + (0x33D7, "M", "ph"), + (0x33D8, "X"), + (0x33D9, "M", "ppm"), + (0x33DA, "M", "pr"), + (0x33DB, "M", "sr"), + (0x33DC, "M", "sv"), + (0x33DD, "M", "wb"), + (0x33DE, "M", "v∕m"), + (0x33DF, "M", "a∕m"), + (0x33E0, "M", "1日"), + (0x33E1, "M", "2日"), + ] + + +def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x33E2, "M", "3日"), + (0x33E3, "M", "4日"), + (0x33E4, "M", "5日"), + (0x33E5, "M", "6日"), + (0x33E6, "M", "7日"), + (0x33E7, "M", "8日"), + (0x33E8, "M", "9日"), + (0x33E9, "M", "10日"), + (0x33EA, "M", "11日"), + (0x33EB, "M", "12日"), + (0x33EC, "M", "13日"), + (0x33ED, "M", "14日"), + (0x33EE, "M", "15日"), + (0x33EF, "M", "16日"), + (0x33F0, "M", "17日"), + (0x33F1, "M", "18日"), + (0x33F2, "M", "19日"), + (0x33F3, "M", "20日"), + (0x33F4, "M", "21日"), + (0x33F5, "M", "22日"), + (0x33F6, "M", "23日"), + (0x33F7, "M", "24日"), + (0x33F8, "M", "25日"), + (0x33F9, "M", "26日"), + (0x33FA, "M", "27日"), + (0x33FB, "M", "28日"), + (0x33FC, "M", "29日"), + (0x33FD, "M", "30日"), + (0x33FE, "M", "31日"), + (0x33FF, "M", "gal"), + (0x3400, "V"), + (0xA48D, "X"), + (0xA490, "V"), + (0xA4C7, "X"), + (0xA4D0, "V"), + (0xA62C, "X"), + (0xA640, "M", "ꙁ"), + (0xA641, "V"), + (0xA642, "M", "ꙃ"), + (0xA643, "V"), + (0xA644, "M", "ꙅ"), + (0xA645, "V"), + (0xA646, "M", "ꙇ"), + (0xA647, "V"), + (0xA648, "M", "ꙉ"), + (0xA649, "V"), + (0xA64A, "M", "ꙋ"), + (0xA64B, "V"), + (0xA64C, "M", "ꙍ"), + (0xA64D, "V"), + (0xA64E, "M", "ꙏ"), + (0xA64F, "V"), + (0xA650, "M", "ꙑ"), + (0xA651, "V"), + (0xA652, "M", "ꙓ"), + (0xA653, "V"), + (0xA654, "M", "ꙕ"), + (0xA655, "V"), + (0xA656, "M", "ꙗ"), + (0xA657, "V"), + (0xA658, "M", "ꙙ"), + (0xA659, "V"), + (0xA65A, "M", "ꙛ"), + (0xA65B, "V"), + (0xA65C, "M", "ꙝ"), + (0xA65D, "V"), + (0xA65E, "M", "ꙟ"), + (0xA65F, "V"), + (0xA660, "M", "ꙡ"), + (0xA661, "V"), + (0xA662, "M", "ꙣ"), + (0xA663, "V"), + (0xA664, "M", "ꙥ"), + (0xA665, "V"), + (0xA666, "M", "ꙧ"), + (0xA667, "V"), + (0xA668, "M", "ꙩ"), + (0xA669, "V"), + (0xA66A, "M", "ꙫ"), + (0xA66B, "V"), + (0xA66C, "M", "ꙭ"), + (0xA66D, "V"), + (0xA680, "M", "ꚁ"), + (0xA681, "V"), + (0xA682, "M", "ꚃ"), + (0xA683, "V"), + (0xA684, "M", "ꚅ"), + (0xA685, "V"), + (0xA686, "M", "ꚇ"), + (0xA687, "V"), + (0xA688, "M", "ꚉ"), + (0xA689, "V"), + (0xA68A, "M", "ꚋ"), + (0xA68B, "V"), + (0xA68C, "M", "ꚍ"), + (0xA68D, "V"), + (0xA68E, "M", "ꚏ"), + (0xA68F, "V"), + (0xA690, "M", "ꚑ"), + (0xA691, "V"), + ] + + +def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA692, "M", "ꚓ"), + (0xA693, "V"), + (0xA694, "M", "ꚕ"), + (0xA695, "V"), + (0xA696, "M", "ꚗ"), + (0xA697, "V"), + (0xA698, "M", "ꚙ"), + (0xA699, "V"), + (0xA69A, "M", "ꚛ"), + (0xA69B, "V"), + (0xA69C, "M", "ъ"), + (0xA69D, "M", "ь"), + (0xA69E, "V"), + (0xA6F8, "X"), + (0xA700, "V"), + (0xA722, "M", "ꜣ"), + (0xA723, "V"), + (0xA724, "M", "ꜥ"), + (0xA725, "V"), + (0xA726, "M", "ꜧ"), + (0xA727, "V"), + (0xA728, "M", "ꜩ"), + (0xA729, "V"), + (0xA72A, "M", "ꜫ"), + (0xA72B, "V"), + (0xA72C, "M", "ꜭ"), + (0xA72D, "V"), + (0xA72E, "M", "ꜯ"), + (0xA72F, "V"), + (0xA732, "M", "ꜳ"), + (0xA733, "V"), + (0xA734, "M", "ꜵ"), + (0xA735, "V"), + (0xA736, "M", "ꜷ"), + (0xA737, "V"), + (0xA738, "M", "ꜹ"), + (0xA739, "V"), + (0xA73A, "M", "ꜻ"), + (0xA73B, "V"), + (0xA73C, "M", "ꜽ"), + (0xA73D, "V"), + (0xA73E, "M", "ꜿ"), + (0xA73F, "V"), + (0xA740, "M", "ꝁ"), + (0xA741, "V"), + (0xA742, "M", "ꝃ"), + (0xA743, "V"), + (0xA744, "M", "ꝅ"), + (0xA745, "V"), + (0xA746, "M", "ꝇ"), + (0xA747, "V"), + (0xA748, "M", "ꝉ"), + (0xA749, "V"), + (0xA74A, "M", "ꝋ"), + (0xA74B, "V"), + (0xA74C, "M", "ꝍ"), + (0xA74D, "V"), + (0xA74E, "M", "ꝏ"), + (0xA74F, "V"), + (0xA750, "M", "ꝑ"), + (0xA751, "V"), + (0xA752, "M", "ꝓ"), + (0xA753, "V"), + (0xA754, "M", "ꝕ"), + (0xA755, "V"), + (0xA756, "M", "ꝗ"), + (0xA757, "V"), + (0xA758, "M", "ꝙ"), + (0xA759, "V"), + (0xA75A, "M", "ꝛ"), + (0xA75B, "V"), + (0xA75C, "M", "ꝝ"), + (0xA75D, "V"), + (0xA75E, "M", "ꝟ"), + (0xA75F, "V"), + (0xA760, "M", "ꝡ"), + (0xA761, "V"), + (0xA762, "M", "ꝣ"), + (0xA763, "V"), + (0xA764, "M", "ꝥ"), + (0xA765, "V"), + (0xA766, "M", "ꝧ"), + (0xA767, "V"), + (0xA768, "M", "ꝩ"), + (0xA769, "V"), + (0xA76A, "M", "ꝫ"), + (0xA76B, "V"), + (0xA76C, "M", "ꝭ"), + (0xA76D, "V"), + (0xA76E, "M", "ꝯ"), + (0xA76F, "V"), + (0xA770, "M", "ꝯ"), + (0xA771, "V"), + (0xA779, "M", "ꝺ"), + (0xA77A, "V"), + (0xA77B, "M", "ꝼ"), + (0xA77C, "V"), + (0xA77D, "M", "ᵹ"), + (0xA77E, "M", "ꝿ"), + (0xA77F, "V"), + ] + + +def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA780, "M", "ꞁ"), + (0xA781, "V"), + (0xA782, "M", "ꞃ"), + (0xA783, "V"), + (0xA784, "M", "ꞅ"), + (0xA785, "V"), + (0xA786, "M", "ꞇ"), + (0xA787, "V"), + (0xA78B, "M", "ꞌ"), + (0xA78C, "V"), + (0xA78D, "M", "ɥ"), + (0xA78E, "V"), + (0xA790, "M", "ꞑ"), + (0xA791, "V"), + (0xA792, "M", "ꞓ"), + (0xA793, "V"), + (0xA796, "M", "ꞗ"), + (0xA797, "V"), + (0xA798, "M", "ꞙ"), + (0xA799, "V"), + (0xA79A, "M", "ꞛ"), + (0xA79B, "V"), + (0xA79C, "M", "ꞝ"), + (0xA79D, "V"), + (0xA79E, "M", "ꞟ"), + (0xA79F, "V"), + (0xA7A0, "M", "ꞡ"), + (0xA7A1, "V"), + (0xA7A2, "M", "ꞣ"), + (0xA7A3, "V"), + (0xA7A4, "M", "ꞥ"), + (0xA7A5, "V"), + (0xA7A6, "M", "ꞧ"), + (0xA7A7, "V"), + (0xA7A8, "M", "ꞩ"), + (0xA7A9, "V"), + (0xA7AA, "M", "ɦ"), + (0xA7AB, "M", "ɜ"), + (0xA7AC, "M", "ɡ"), + (0xA7AD, "M", "ɬ"), + (0xA7AE, "M", "ɪ"), + (0xA7AF, "V"), + (0xA7B0, "M", "ʞ"), + (0xA7B1, "M", "ʇ"), + (0xA7B2, "M", "ʝ"), + (0xA7B3, "M", "ꭓ"), + (0xA7B4, "M", "ꞵ"), + (0xA7B5, "V"), + (0xA7B6, "M", "ꞷ"), + (0xA7B7, "V"), + (0xA7B8, "M", "ꞹ"), + (0xA7B9, "V"), + (0xA7BA, "M", "ꞻ"), + (0xA7BB, "V"), + (0xA7BC, "M", "ꞽ"), + (0xA7BD, "V"), + (0xA7BE, "M", "ꞿ"), + (0xA7BF, "V"), + (0xA7C0, "M", "ꟁ"), + (0xA7C1, "V"), + (0xA7C2, "M", "ꟃ"), + (0xA7C3, "V"), + (0xA7C4, "M", "ꞔ"), + (0xA7C5, "M", "ʂ"), + (0xA7C6, "M", "ᶎ"), + (0xA7C7, "M", "ꟈ"), + (0xA7C8, "V"), + (0xA7C9, "M", "ꟊ"), + (0xA7CA, "V"), + (0xA7CB, "X"), + (0xA7D0, "M", "ꟑ"), + (0xA7D1, "V"), + (0xA7D2, "X"), + (0xA7D3, "V"), + (0xA7D4, "X"), + (0xA7D5, "V"), + (0xA7D6, "M", "ꟗ"), + (0xA7D7, "V"), + (0xA7D8, "M", "ꟙ"), + (0xA7D9, "V"), + (0xA7DA, "X"), + (0xA7F2, "M", "c"), + (0xA7F3, "M", "f"), + (0xA7F4, "M", "q"), + (0xA7F5, "M", "ꟶ"), + (0xA7F6, "V"), + (0xA7F8, "M", "ħ"), + (0xA7F9, "M", "œ"), + (0xA7FA, "V"), + (0xA82D, "X"), + (0xA830, "V"), + (0xA83A, "X"), + (0xA840, "V"), + (0xA878, "X"), + (0xA880, "V"), + (0xA8C6, "X"), + (0xA8CE, "V"), + (0xA8DA, "X"), + (0xA8E0, "V"), + (0xA954, "X"), + ] + + +def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA95F, "V"), + (0xA97D, "X"), + (0xA980, "V"), + (0xA9CE, "X"), + (0xA9CF, "V"), + (0xA9DA, "X"), + (0xA9DE, "V"), + (0xA9FF, "X"), + (0xAA00, "V"), + (0xAA37, "X"), + (0xAA40, "V"), + (0xAA4E, "X"), + (0xAA50, "V"), + (0xAA5A, "X"), + (0xAA5C, "V"), + (0xAAC3, "X"), + (0xAADB, "V"), + (0xAAF7, "X"), + (0xAB01, "V"), + (0xAB07, "X"), + (0xAB09, "V"), + (0xAB0F, "X"), + (0xAB11, "V"), + (0xAB17, "X"), + (0xAB20, "V"), + (0xAB27, "X"), + (0xAB28, "V"), + (0xAB2F, "X"), + (0xAB30, "V"), + (0xAB5C, "M", "ꜧ"), + (0xAB5D, "M", "ꬷ"), + (0xAB5E, "M", "ɫ"), + (0xAB5F, "M", "ꭒ"), + (0xAB60, "V"), + (0xAB69, "M", "ʍ"), + (0xAB6A, "V"), + (0xAB6C, "X"), + (0xAB70, "M", "Ꭰ"), + (0xAB71, "M", "Ꭱ"), + (0xAB72, "M", "Ꭲ"), + (0xAB73, "M", "Ꭳ"), + (0xAB74, "M", "Ꭴ"), + (0xAB75, "M", "Ꭵ"), + (0xAB76, "M", "Ꭶ"), + (0xAB77, "M", "Ꭷ"), + (0xAB78, "M", "Ꭸ"), + (0xAB79, "M", "Ꭹ"), + (0xAB7A, "M", "Ꭺ"), + (0xAB7B, "M", "Ꭻ"), + (0xAB7C, "M", "Ꭼ"), + (0xAB7D, "M", "Ꭽ"), + (0xAB7E, "M", "Ꭾ"), + (0xAB7F, "M", "Ꭿ"), + (0xAB80, "M", "Ꮀ"), + (0xAB81, "M", "Ꮁ"), + (0xAB82, "M", "Ꮂ"), + (0xAB83, "M", "Ꮃ"), + (0xAB84, "M", "Ꮄ"), + (0xAB85, "M", "Ꮅ"), + (0xAB86, "M", "Ꮆ"), + (0xAB87, "M", "Ꮇ"), + (0xAB88, "M", "Ꮈ"), + (0xAB89, "M", "Ꮉ"), + (0xAB8A, "M", "Ꮊ"), + (0xAB8B, "M", "Ꮋ"), + (0xAB8C, "M", "Ꮌ"), + (0xAB8D, "M", "Ꮍ"), + (0xAB8E, "M", "Ꮎ"), + (0xAB8F, "M", "Ꮏ"), + (0xAB90, "M", "Ꮐ"), + (0xAB91, "M", "Ꮑ"), + (0xAB92, "M", "Ꮒ"), + (0xAB93, "M", "Ꮓ"), + (0xAB94, "M", "Ꮔ"), + (0xAB95, "M", "Ꮕ"), + (0xAB96, "M", "Ꮖ"), + (0xAB97, "M", "Ꮗ"), + (0xAB98, "M", "Ꮘ"), + (0xAB99, "M", "Ꮙ"), + (0xAB9A, "M", "Ꮚ"), + (0xAB9B, "M", "Ꮛ"), + (0xAB9C, "M", "Ꮜ"), + (0xAB9D, "M", "Ꮝ"), + (0xAB9E, "M", "Ꮞ"), + (0xAB9F, "M", "Ꮟ"), + (0xABA0, "M", "Ꮠ"), + (0xABA1, "M", "Ꮡ"), + (0xABA2, "M", "Ꮢ"), + (0xABA3, "M", "Ꮣ"), + (0xABA4, "M", "Ꮤ"), + (0xABA5, "M", "Ꮥ"), + (0xABA6, "M", "Ꮦ"), + (0xABA7, "M", "Ꮧ"), + (0xABA8, "M", "Ꮨ"), + (0xABA9, "M", "Ꮩ"), + (0xABAA, "M", "Ꮪ"), + (0xABAB, "M", "Ꮫ"), + (0xABAC, "M", "Ꮬ"), + (0xABAD, "M", "Ꮭ"), + (0xABAE, "M", "Ꮮ"), + ] + + +def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xABAF, "M", "Ꮯ"), + (0xABB0, "M", "Ꮰ"), + (0xABB1, "M", "Ꮱ"), + (0xABB2, "M", "Ꮲ"), + (0xABB3, "M", "Ꮳ"), + (0xABB4, "M", "Ꮴ"), + (0xABB5, "M", "Ꮵ"), + (0xABB6, "M", "Ꮶ"), + (0xABB7, "M", "Ꮷ"), + (0xABB8, "M", "Ꮸ"), + (0xABB9, "M", "Ꮹ"), + (0xABBA, "M", "Ꮺ"), + (0xABBB, "M", "Ꮻ"), + (0xABBC, "M", "Ꮼ"), + (0xABBD, "M", "Ꮽ"), + (0xABBE, "M", "Ꮾ"), + (0xABBF, "M", "Ꮿ"), + (0xABC0, "V"), + (0xABEE, "X"), + (0xABF0, "V"), + (0xABFA, "X"), + (0xAC00, "V"), + (0xD7A4, "X"), + (0xD7B0, "V"), + (0xD7C7, "X"), + (0xD7CB, "V"), + (0xD7FC, "X"), + (0xF900, "M", "豈"), + (0xF901, "M", "更"), + (0xF902, "M", "車"), + (0xF903, "M", "賈"), + (0xF904, "M", "滑"), + (0xF905, "M", "串"), + (0xF906, "M", "句"), + (0xF907, "M", "龜"), + (0xF909, "M", "契"), + (0xF90A, "M", "金"), + (0xF90B, "M", "喇"), + (0xF90C, "M", "奈"), + (0xF90D, "M", "懶"), + (0xF90E, "M", "癩"), + (0xF90F, "M", "羅"), + (0xF910, "M", "蘿"), + (0xF911, "M", "螺"), + (0xF912, "M", "裸"), + (0xF913, "M", "邏"), + (0xF914, "M", "樂"), + (0xF915, "M", "洛"), + (0xF916, "M", "烙"), + (0xF917, "M", "珞"), + (0xF918, "M", "落"), + (0xF919, "M", "酪"), + (0xF91A, "M", "駱"), + (0xF91B, "M", "亂"), + (0xF91C, "M", "卵"), + (0xF91D, "M", "欄"), + (0xF91E, "M", "爛"), + (0xF91F, "M", "蘭"), + (0xF920, "M", "鸞"), + (0xF921, "M", "嵐"), + (0xF922, "M", "濫"), + (0xF923, "M", "藍"), + (0xF924, "M", "襤"), + (0xF925, "M", "拉"), + (0xF926, "M", "臘"), + (0xF927, "M", "蠟"), + (0xF928, "M", "廊"), + (0xF929, "M", "朗"), + (0xF92A, "M", "浪"), + (0xF92B, "M", "狼"), + (0xF92C, "M", "郎"), + (0xF92D, "M", "來"), + (0xF92E, "M", "冷"), + (0xF92F, "M", "勞"), + (0xF930, "M", "擄"), + (0xF931, "M", "櫓"), + (0xF932, "M", "爐"), + (0xF933, "M", "盧"), + (0xF934, "M", "老"), + (0xF935, "M", "蘆"), + (0xF936, "M", "虜"), + (0xF937, "M", "路"), + (0xF938, "M", "露"), + (0xF939, "M", "魯"), + (0xF93A, "M", "鷺"), + (0xF93B, "M", "碌"), + (0xF93C, "M", "祿"), + (0xF93D, "M", "綠"), + (0xF93E, "M", "菉"), + (0xF93F, "M", "錄"), + (0xF940, "M", "鹿"), + (0xF941, "M", "論"), + (0xF942, "M", "壟"), + (0xF943, "M", "弄"), + (0xF944, "M", "籠"), + (0xF945, "M", "聾"), + (0xF946, "M", "牢"), + (0xF947, "M", "磊"), + (0xF948, "M", "賂"), + (0xF949, "M", "雷"), + ] + + +def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF94A, "M", "壘"), + (0xF94B, "M", "屢"), + (0xF94C, "M", "樓"), + (0xF94D, "M", "淚"), + (0xF94E, "M", "漏"), + (0xF94F, "M", "累"), + (0xF950, "M", "縷"), + (0xF951, "M", "陋"), + (0xF952, "M", "勒"), + (0xF953, "M", "肋"), + (0xF954, "M", "凜"), + (0xF955, "M", "凌"), + (0xF956, "M", "稜"), + (0xF957, "M", "綾"), + (0xF958, "M", "菱"), + (0xF959, "M", "陵"), + (0xF95A, "M", "讀"), + (0xF95B, "M", "拏"), + (0xF95C, "M", "樂"), + (0xF95D, "M", "諾"), + (0xF95E, "M", "丹"), + (0xF95F, "M", "寧"), + (0xF960, "M", "怒"), + (0xF961, "M", "率"), + (0xF962, "M", "異"), + (0xF963, "M", "北"), + (0xF964, "M", "磻"), + (0xF965, "M", "便"), + (0xF966, "M", "復"), + (0xF967, "M", "不"), + (0xF968, "M", "泌"), + (0xF969, "M", "數"), + (0xF96A, "M", "索"), + (0xF96B, "M", "參"), + (0xF96C, "M", "塞"), + (0xF96D, "M", "省"), + (0xF96E, "M", "葉"), + (0xF96F, "M", "說"), + (0xF970, "M", "殺"), + (0xF971, "M", "辰"), + (0xF972, "M", "沈"), + (0xF973, "M", "拾"), + (0xF974, "M", "若"), + (0xF975, "M", "掠"), + (0xF976, "M", "略"), + (0xF977, "M", "亮"), + (0xF978, "M", "兩"), + (0xF979, "M", "凉"), + (0xF97A, "M", "梁"), + (0xF97B, "M", "糧"), + (0xF97C, "M", "良"), + (0xF97D, "M", "諒"), + (0xF97E, "M", "量"), + (0xF97F, "M", "勵"), + (0xF980, "M", "呂"), + (0xF981, "M", "女"), + (0xF982, "M", "廬"), + (0xF983, "M", "旅"), + (0xF984, "M", "濾"), + (0xF985, "M", "礪"), + (0xF986, "M", "閭"), + (0xF987, "M", "驪"), + (0xF988, "M", "麗"), + (0xF989, "M", "黎"), + (0xF98A, "M", "力"), + (0xF98B, "M", "曆"), + (0xF98C, "M", "歷"), + (0xF98D, "M", "轢"), + (0xF98E, "M", "年"), + (0xF98F, "M", "憐"), + (0xF990, "M", "戀"), + (0xF991, "M", "撚"), + (0xF992, "M", "漣"), + (0xF993, "M", "煉"), + (0xF994, "M", "璉"), + (0xF995, "M", "秊"), + (0xF996, "M", "練"), + (0xF997, "M", "聯"), + (0xF998, "M", "輦"), + (0xF999, "M", "蓮"), + (0xF99A, "M", "連"), + (0xF99B, "M", "鍊"), + (0xF99C, "M", "列"), + (0xF99D, "M", "劣"), + (0xF99E, "M", "咽"), + (0xF99F, "M", "烈"), + (0xF9A0, "M", "裂"), + (0xF9A1, "M", "說"), + (0xF9A2, "M", "廉"), + (0xF9A3, "M", "念"), + (0xF9A4, "M", "捻"), + (0xF9A5, "M", "殮"), + (0xF9A6, "M", "簾"), + (0xF9A7, "M", "獵"), + (0xF9A8, "M", "令"), + (0xF9A9, "M", "囹"), + (0xF9AA, "M", "寧"), + (0xF9AB, "M", "嶺"), + (0xF9AC, "M", "怜"), + (0xF9AD, "M", "玲"), + ] + + +def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF9AE, "M", "瑩"), + (0xF9AF, "M", "羚"), + (0xF9B0, "M", "聆"), + (0xF9B1, "M", "鈴"), + (0xF9B2, "M", "零"), + (0xF9B3, "M", "靈"), + (0xF9B4, "M", "領"), + (0xF9B5, "M", "例"), + (0xF9B6, "M", "禮"), + (0xF9B7, "M", "醴"), + (0xF9B8, "M", "隸"), + (0xF9B9, "M", "惡"), + (0xF9BA, "M", "了"), + (0xF9BB, "M", "僚"), + (0xF9BC, "M", "寮"), + (0xF9BD, "M", "尿"), + (0xF9BE, "M", "料"), + (0xF9BF, "M", "樂"), + (0xF9C0, "M", "燎"), + (0xF9C1, "M", "療"), + (0xF9C2, "M", "蓼"), + (0xF9C3, "M", "遼"), + (0xF9C4, "M", "龍"), + (0xF9C5, "M", "暈"), + (0xF9C6, "M", "阮"), + (0xF9C7, "M", "劉"), + (0xF9C8, "M", "杻"), + (0xF9C9, "M", "柳"), + (0xF9CA, "M", "流"), + (0xF9CB, "M", "溜"), + (0xF9CC, "M", "琉"), + (0xF9CD, "M", "留"), + (0xF9CE, "M", "硫"), + (0xF9CF, "M", "紐"), + (0xF9D0, "M", "類"), + (0xF9D1, "M", "六"), + (0xF9D2, "M", "戮"), + (0xF9D3, "M", "陸"), + (0xF9D4, "M", "倫"), + (0xF9D5, "M", "崙"), + (0xF9D6, "M", "淪"), + (0xF9D7, "M", "輪"), + (0xF9D8, "M", "律"), + (0xF9D9, "M", "慄"), + (0xF9DA, "M", "栗"), + (0xF9DB, "M", "率"), + (0xF9DC, "M", "隆"), + (0xF9DD, "M", "利"), + (0xF9DE, "M", "吏"), + (0xF9DF, "M", "履"), + (0xF9E0, "M", "易"), + (0xF9E1, "M", "李"), + (0xF9E2, "M", "梨"), + (0xF9E3, "M", "泥"), + (0xF9E4, "M", "理"), + (0xF9E5, "M", "痢"), + (0xF9E6, "M", "罹"), + (0xF9E7, "M", "裏"), + (0xF9E8, "M", "裡"), + (0xF9E9, "M", "里"), + (0xF9EA, "M", "離"), + (0xF9EB, "M", "匿"), + (0xF9EC, "M", "溺"), + (0xF9ED, "M", "吝"), + (0xF9EE, "M", "燐"), + (0xF9EF, "M", "璘"), + (0xF9F0, "M", "藺"), + (0xF9F1, "M", "隣"), + (0xF9F2, "M", "鱗"), + (0xF9F3, "M", "麟"), + (0xF9F4, "M", "林"), + (0xF9F5, "M", "淋"), + (0xF9F6, "M", "臨"), + (0xF9F7, "M", "立"), + (0xF9F8, "M", "笠"), + (0xF9F9, "M", "粒"), + (0xF9FA, "M", "狀"), + (0xF9FB, "M", "炙"), + (0xF9FC, "M", "識"), + (0xF9FD, "M", "什"), + (0xF9FE, "M", "茶"), + (0xF9FF, "M", "刺"), + (0xFA00, "M", "切"), + (0xFA01, "M", "度"), + (0xFA02, "M", "拓"), + (0xFA03, "M", "糖"), + (0xFA04, "M", "宅"), + (0xFA05, "M", "洞"), + (0xFA06, "M", "暴"), + (0xFA07, "M", "輻"), + (0xFA08, "M", "行"), + (0xFA09, "M", "降"), + (0xFA0A, "M", "見"), + (0xFA0B, "M", "廓"), + (0xFA0C, "M", "兀"), + (0xFA0D, "M", "嗀"), + (0xFA0E, "V"), + (0xFA10, "M", "塚"), + (0xFA11, "V"), + (0xFA12, "M", "晴"), + ] + + +def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFA13, "V"), + (0xFA15, "M", "凞"), + (0xFA16, "M", "猪"), + (0xFA17, "M", "益"), + (0xFA18, "M", "礼"), + (0xFA19, "M", "神"), + (0xFA1A, "M", "祥"), + (0xFA1B, "M", "福"), + (0xFA1C, "M", "靖"), + (0xFA1D, "M", "精"), + (0xFA1E, "M", "羽"), + (0xFA1F, "V"), + (0xFA20, "M", "蘒"), + (0xFA21, "V"), + (0xFA22, "M", "諸"), + (0xFA23, "V"), + (0xFA25, "M", "逸"), + (0xFA26, "M", "都"), + (0xFA27, "V"), + (0xFA2A, "M", "飯"), + (0xFA2B, "M", "飼"), + (0xFA2C, "M", "館"), + (0xFA2D, "M", "鶴"), + (0xFA2E, "M", "郞"), + (0xFA2F, "M", "隷"), + (0xFA30, "M", "侮"), + (0xFA31, "M", "僧"), + (0xFA32, "M", "免"), + (0xFA33, "M", "勉"), + (0xFA34, "M", "勤"), + (0xFA35, "M", "卑"), + (0xFA36, "M", "喝"), + (0xFA37, "M", "嘆"), + (0xFA38, "M", "器"), + (0xFA39, "M", "塀"), + (0xFA3A, "M", "墨"), + (0xFA3B, "M", "層"), + (0xFA3C, "M", "屮"), + (0xFA3D, "M", "悔"), + (0xFA3E, "M", "慨"), + (0xFA3F, "M", "憎"), + (0xFA40, "M", "懲"), + (0xFA41, "M", "敏"), + (0xFA42, "M", "既"), + (0xFA43, "M", "暑"), + (0xFA44, "M", "梅"), + (0xFA45, "M", "海"), + (0xFA46, "M", "渚"), + (0xFA47, "M", "漢"), + (0xFA48, "M", "煮"), + (0xFA49, "M", "爫"), + (0xFA4A, "M", "琢"), + (0xFA4B, "M", "碑"), + (0xFA4C, "M", "社"), + (0xFA4D, "M", "祉"), + (0xFA4E, "M", "祈"), + (0xFA4F, "M", "祐"), + (0xFA50, "M", "祖"), + (0xFA51, "M", "祝"), + (0xFA52, "M", "禍"), + (0xFA53, "M", "禎"), + (0xFA54, "M", "穀"), + (0xFA55, "M", "突"), + (0xFA56, "M", "節"), + (0xFA57, "M", "練"), + (0xFA58, "M", "縉"), + (0xFA59, "M", "繁"), + (0xFA5A, "M", "署"), + (0xFA5B, "M", "者"), + (0xFA5C, "M", "臭"), + (0xFA5D, "M", "艹"), + (0xFA5F, "M", "著"), + (0xFA60, "M", "褐"), + (0xFA61, "M", "視"), + (0xFA62, "M", "謁"), + (0xFA63, "M", "謹"), + (0xFA64, "M", "賓"), + (0xFA65, "M", "贈"), + (0xFA66, "M", "辶"), + (0xFA67, "M", "逸"), + (0xFA68, "M", "難"), + (0xFA69, "M", "響"), + (0xFA6A, "M", "頻"), + (0xFA6B, "M", "恵"), + (0xFA6C, "M", "𤋮"), + (0xFA6D, "M", "舘"), + (0xFA6E, "X"), + (0xFA70, "M", "並"), + (0xFA71, "M", "况"), + (0xFA72, "M", "全"), + (0xFA73, "M", "侀"), + (0xFA74, "M", "充"), + (0xFA75, "M", "冀"), + (0xFA76, "M", "勇"), + (0xFA77, "M", "勺"), + (0xFA78, "M", "喝"), + (0xFA79, "M", "啕"), + (0xFA7A, "M", "喙"), + (0xFA7B, "M", "嗢"), + (0xFA7C, "M", "塚"), + ] + + +def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFA7D, "M", "墳"), + (0xFA7E, "M", "奄"), + (0xFA7F, "M", "奔"), + (0xFA80, "M", "婢"), + (0xFA81, "M", "嬨"), + (0xFA82, "M", "廒"), + (0xFA83, "M", "廙"), + (0xFA84, "M", "彩"), + (0xFA85, "M", "徭"), + (0xFA86, "M", "惘"), + (0xFA87, "M", "慎"), + (0xFA88, "M", "愈"), + (0xFA89, "M", "憎"), + (0xFA8A, "M", "慠"), + (0xFA8B, "M", "懲"), + (0xFA8C, "M", "戴"), + (0xFA8D, "M", "揄"), + (0xFA8E, "M", "搜"), + (0xFA8F, "M", "摒"), + (0xFA90, "M", "敖"), + (0xFA91, "M", "晴"), + (0xFA92, "M", "朗"), + (0xFA93, "M", "望"), + (0xFA94, "M", "杖"), + (0xFA95, "M", "歹"), + (0xFA96, "M", "殺"), + (0xFA97, "M", "流"), + (0xFA98, "M", "滛"), + (0xFA99, "M", "滋"), + (0xFA9A, "M", "漢"), + (0xFA9B, "M", "瀞"), + (0xFA9C, "M", "煮"), + (0xFA9D, "M", "瞧"), + (0xFA9E, "M", "爵"), + (0xFA9F, "M", "犯"), + (0xFAA0, "M", "猪"), + (0xFAA1, "M", "瑱"), + (0xFAA2, "M", "甆"), + (0xFAA3, "M", "画"), + (0xFAA4, "M", "瘝"), + (0xFAA5, "M", "瘟"), + (0xFAA6, "M", "益"), + (0xFAA7, "M", "盛"), + (0xFAA8, "M", "直"), + (0xFAA9, "M", "睊"), + (0xFAAA, "M", "着"), + (0xFAAB, "M", "磌"), + (0xFAAC, "M", "窱"), + (0xFAAD, "M", "節"), + (0xFAAE, "M", "类"), + (0xFAAF, "M", "絛"), + (0xFAB0, "M", "練"), + (0xFAB1, "M", "缾"), + (0xFAB2, "M", "者"), + (0xFAB3, "M", "荒"), + (0xFAB4, "M", "華"), + (0xFAB5, "M", "蝹"), + (0xFAB6, "M", "襁"), + (0xFAB7, "M", "覆"), + (0xFAB8, "M", "視"), + (0xFAB9, "M", "調"), + (0xFABA, "M", "諸"), + (0xFABB, "M", "請"), + (0xFABC, "M", "謁"), + (0xFABD, "M", "諾"), + (0xFABE, "M", "諭"), + (0xFABF, "M", "謹"), + (0xFAC0, "M", "變"), + (0xFAC1, "M", "贈"), + (0xFAC2, "M", "輸"), + (0xFAC3, "M", "遲"), + (0xFAC4, "M", "醙"), + (0xFAC5, "M", "鉶"), + (0xFAC6, "M", "陼"), + (0xFAC7, "M", "難"), + (0xFAC8, "M", "靖"), + (0xFAC9, "M", "韛"), + (0xFACA, "M", "響"), + (0xFACB, "M", "頋"), + (0xFACC, "M", "頻"), + (0xFACD, "M", "鬒"), + (0xFACE, "M", "龜"), + (0xFACF, "M", "𢡊"), + (0xFAD0, "M", "𢡄"), + (0xFAD1, "M", "𣏕"), + (0xFAD2, "M", "㮝"), + (0xFAD3, "M", "䀘"), + (0xFAD4, "M", "䀹"), + (0xFAD5, "M", "𥉉"), + (0xFAD6, "M", "𥳐"), + (0xFAD7, "M", "𧻓"), + (0xFAD8, "M", "齃"), + (0xFAD9, "M", "龎"), + (0xFADA, "X"), + (0xFB00, "M", "ff"), + (0xFB01, "M", "fi"), + (0xFB02, "M", "fl"), + (0xFB03, "M", "ffi"), + (0xFB04, "M", "ffl"), + (0xFB05, "M", "st"), + ] + + +def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFB07, "X"), + (0xFB13, "M", "մն"), + (0xFB14, "M", "մե"), + (0xFB15, "M", "մի"), + (0xFB16, "M", "վն"), + (0xFB17, "M", "մխ"), + (0xFB18, "X"), + (0xFB1D, "M", "יִ"), + (0xFB1E, "V"), + (0xFB1F, "M", "ײַ"), + (0xFB20, "M", "ע"), + (0xFB21, "M", "א"), + (0xFB22, "M", "ד"), + (0xFB23, "M", "ה"), + (0xFB24, "M", "כ"), + (0xFB25, "M", "ל"), + (0xFB26, "M", "ם"), + (0xFB27, "M", "ר"), + (0xFB28, "M", "ת"), + (0xFB29, "3", "+"), + (0xFB2A, "M", "שׁ"), + (0xFB2B, "M", "שׂ"), + (0xFB2C, "M", "שּׁ"), + (0xFB2D, "M", "שּׂ"), + (0xFB2E, "M", "אַ"), + (0xFB2F, "M", "אָ"), + (0xFB30, "M", "אּ"), + (0xFB31, "M", "בּ"), + (0xFB32, "M", "גּ"), + (0xFB33, "M", "דּ"), + (0xFB34, "M", "הּ"), + (0xFB35, "M", "וּ"), + (0xFB36, "M", "זּ"), + (0xFB37, "X"), + (0xFB38, "M", "טּ"), + (0xFB39, "M", "יּ"), + (0xFB3A, "M", "ךּ"), + (0xFB3B, "M", "כּ"), + (0xFB3C, "M", "לּ"), + (0xFB3D, "X"), + (0xFB3E, "M", "מּ"), + (0xFB3F, "X"), + (0xFB40, "M", "נּ"), + (0xFB41, "M", "סּ"), + (0xFB42, "X"), + (0xFB43, "M", "ףּ"), + (0xFB44, "M", "פּ"), + (0xFB45, "X"), + (0xFB46, "M", "צּ"), + (0xFB47, "M", "קּ"), + (0xFB48, "M", "רּ"), + (0xFB49, "M", "שּ"), + (0xFB4A, "M", "תּ"), + (0xFB4B, "M", "וֹ"), + (0xFB4C, "M", "בֿ"), + (0xFB4D, "M", "כֿ"), + (0xFB4E, "M", "פֿ"), + (0xFB4F, "M", "אל"), + (0xFB50, "M", "ٱ"), + (0xFB52, "M", "ٻ"), + (0xFB56, "M", "پ"), + (0xFB5A, "M", "ڀ"), + (0xFB5E, "M", "ٺ"), + (0xFB62, "M", "ٿ"), + (0xFB66, "M", "ٹ"), + (0xFB6A, "M", "ڤ"), + (0xFB6E, "M", "ڦ"), + (0xFB72, "M", "ڄ"), + (0xFB76, "M", "ڃ"), + (0xFB7A, "M", "چ"), + (0xFB7E, "M", "ڇ"), + (0xFB82, "M", "ڍ"), + (0xFB84, "M", "ڌ"), + (0xFB86, "M", "ڎ"), + (0xFB88, "M", "ڈ"), + (0xFB8A, "M", "ژ"), + (0xFB8C, "M", "ڑ"), + (0xFB8E, "M", "ک"), + (0xFB92, "M", "گ"), + (0xFB96, "M", "ڳ"), + (0xFB9A, "M", "ڱ"), + (0xFB9E, "M", "ں"), + (0xFBA0, "M", "ڻ"), + (0xFBA4, "M", "ۀ"), + (0xFBA6, "M", "ہ"), + (0xFBAA, "M", "ھ"), + (0xFBAE, "M", "ے"), + (0xFBB0, "M", "ۓ"), + (0xFBB2, "V"), + (0xFBC3, "X"), + (0xFBD3, "M", "ڭ"), + (0xFBD7, "M", "ۇ"), + (0xFBD9, "M", "ۆ"), + (0xFBDB, "M", "ۈ"), + (0xFBDD, "M", "ۇٴ"), + (0xFBDE, "M", "ۋ"), + (0xFBE0, "M", "ۅ"), + (0xFBE2, "M", "ۉ"), + (0xFBE4, "M", "ې"), + (0xFBE8, "M", "ى"), + ] + + +def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFBEA, "M", "ئا"), + (0xFBEC, "M", "ئە"), + (0xFBEE, "M", "ئو"), + (0xFBF0, "M", "ئۇ"), + (0xFBF2, "M", "ئۆ"), + (0xFBF4, "M", "ئۈ"), + (0xFBF6, "M", "ئې"), + (0xFBF9, "M", "ئى"), + (0xFBFC, "M", "ی"), + (0xFC00, "M", "ئج"), + (0xFC01, "M", "ئح"), + (0xFC02, "M", "ئم"), + (0xFC03, "M", "ئى"), + (0xFC04, "M", "ئي"), + (0xFC05, "M", "بج"), + (0xFC06, "M", "بح"), + (0xFC07, "M", "بخ"), + (0xFC08, "M", "بم"), + (0xFC09, "M", "بى"), + (0xFC0A, "M", "بي"), + (0xFC0B, "M", "تج"), + (0xFC0C, "M", "تح"), + (0xFC0D, "M", "تخ"), + (0xFC0E, "M", "تم"), + (0xFC0F, "M", "تى"), + (0xFC10, "M", "تي"), + (0xFC11, "M", "ثج"), + (0xFC12, "M", "ثم"), + (0xFC13, "M", "ثى"), + (0xFC14, "M", "ثي"), + (0xFC15, "M", "جح"), + (0xFC16, "M", "جم"), + (0xFC17, "M", "حج"), + (0xFC18, "M", "حم"), + (0xFC19, "M", "خج"), + (0xFC1A, "M", "خح"), + (0xFC1B, "M", "خم"), + (0xFC1C, "M", "سج"), + (0xFC1D, "M", "سح"), + (0xFC1E, "M", "سخ"), + (0xFC1F, "M", "سم"), + (0xFC20, "M", "صح"), + (0xFC21, "M", "صم"), + (0xFC22, "M", "ضج"), + (0xFC23, "M", "ضح"), + (0xFC24, "M", "ضخ"), + (0xFC25, "M", "ضم"), + (0xFC26, "M", "طح"), + (0xFC27, "M", "طم"), + (0xFC28, "M", "ظم"), + (0xFC29, "M", "عج"), + (0xFC2A, "M", "عم"), + (0xFC2B, "M", "غج"), + (0xFC2C, "M", "غم"), + (0xFC2D, "M", "فج"), + (0xFC2E, "M", "فح"), + (0xFC2F, "M", "فخ"), + (0xFC30, "M", "فم"), + (0xFC31, "M", "فى"), + (0xFC32, "M", "في"), + (0xFC33, "M", "قح"), + (0xFC34, "M", "قم"), + (0xFC35, "M", "قى"), + (0xFC36, "M", "قي"), + (0xFC37, "M", "كا"), + (0xFC38, "M", "كج"), + (0xFC39, "M", "كح"), + (0xFC3A, "M", "كخ"), + (0xFC3B, "M", "كل"), + (0xFC3C, "M", "كم"), + (0xFC3D, "M", "كى"), + (0xFC3E, "M", "كي"), + (0xFC3F, "M", "لج"), + (0xFC40, "M", "لح"), + (0xFC41, "M", "لخ"), + (0xFC42, "M", "لم"), + (0xFC43, "M", "لى"), + (0xFC44, "M", "لي"), + (0xFC45, "M", "مج"), + (0xFC46, "M", "مح"), + (0xFC47, "M", "مخ"), + (0xFC48, "M", "مم"), + (0xFC49, "M", "مى"), + (0xFC4A, "M", "مي"), + (0xFC4B, "M", "نج"), + (0xFC4C, "M", "نح"), + (0xFC4D, "M", "نخ"), + (0xFC4E, "M", "نم"), + (0xFC4F, "M", "نى"), + (0xFC50, "M", "ني"), + (0xFC51, "M", "هج"), + (0xFC52, "M", "هم"), + (0xFC53, "M", "هى"), + (0xFC54, "M", "هي"), + (0xFC55, "M", "يج"), + (0xFC56, "M", "يح"), + (0xFC57, "M", "يخ"), + (0xFC58, "M", "يم"), + (0xFC59, "M", "يى"), + (0xFC5A, "M", "يي"), + ] + + +def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFC5B, "M", "ذٰ"), + (0xFC5C, "M", "رٰ"), + (0xFC5D, "M", "ىٰ"), + (0xFC5E, "3", " ٌّ"), + (0xFC5F, "3", " ٍّ"), + (0xFC60, "3", " َّ"), + (0xFC61, "3", " ُّ"), + (0xFC62, "3", " ِّ"), + (0xFC63, "3", " ّٰ"), + (0xFC64, "M", "ئر"), + (0xFC65, "M", "ئز"), + (0xFC66, "M", "ئم"), + (0xFC67, "M", "ئن"), + (0xFC68, "M", "ئى"), + (0xFC69, "M", "ئي"), + (0xFC6A, "M", "بر"), + (0xFC6B, "M", "بز"), + (0xFC6C, "M", "بم"), + (0xFC6D, "M", "بن"), + (0xFC6E, "M", "بى"), + (0xFC6F, "M", "بي"), + (0xFC70, "M", "تر"), + (0xFC71, "M", "تز"), + (0xFC72, "M", "تم"), + (0xFC73, "M", "تن"), + (0xFC74, "M", "تى"), + (0xFC75, "M", "تي"), + (0xFC76, "M", "ثر"), + (0xFC77, "M", "ثز"), + (0xFC78, "M", "ثم"), + (0xFC79, "M", "ثن"), + (0xFC7A, "M", "ثى"), + (0xFC7B, "M", "ثي"), + (0xFC7C, "M", "فى"), + (0xFC7D, "M", "في"), + (0xFC7E, "M", "قى"), + (0xFC7F, "M", "قي"), + (0xFC80, "M", "كا"), + (0xFC81, "M", "كل"), + (0xFC82, "M", "كم"), + (0xFC83, "M", "كى"), + (0xFC84, "M", "كي"), + (0xFC85, "M", "لم"), + (0xFC86, "M", "لى"), + (0xFC87, "M", "لي"), + (0xFC88, "M", "ما"), + (0xFC89, "M", "مم"), + (0xFC8A, "M", "نر"), + (0xFC8B, "M", "نز"), + (0xFC8C, "M", "نم"), + (0xFC8D, "M", "نن"), + (0xFC8E, "M", "نى"), + (0xFC8F, "M", "ني"), + (0xFC90, "M", "ىٰ"), + (0xFC91, "M", "ير"), + (0xFC92, "M", "يز"), + (0xFC93, "M", "يم"), + (0xFC94, "M", "ين"), + (0xFC95, "M", "يى"), + (0xFC96, "M", "يي"), + (0xFC97, "M", "ئج"), + (0xFC98, "M", "ئح"), + (0xFC99, "M", "ئخ"), + (0xFC9A, "M", "ئم"), + (0xFC9B, "M", "ئه"), + (0xFC9C, "M", "بج"), + (0xFC9D, "M", "بح"), + (0xFC9E, "M", "بخ"), + (0xFC9F, "M", "بم"), + (0xFCA0, "M", "به"), + (0xFCA1, "M", "تج"), + (0xFCA2, "M", "تح"), + (0xFCA3, "M", "تخ"), + (0xFCA4, "M", "تم"), + (0xFCA5, "M", "ته"), + (0xFCA6, "M", "ثم"), + (0xFCA7, "M", "جح"), + (0xFCA8, "M", "جم"), + (0xFCA9, "M", "حج"), + (0xFCAA, "M", "حم"), + (0xFCAB, "M", "خج"), + (0xFCAC, "M", "خم"), + (0xFCAD, "M", "سج"), + (0xFCAE, "M", "سح"), + (0xFCAF, "M", "سخ"), + (0xFCB0, "M", "سم"), + (0xFCB1, "M", "صح"), + (0xFCB2, "M", "صخ"), + (0xFCB3, "M", "صم"), + (0xFCB4, "M", "ضج"), + (0xFCB5, "M", "ضح"), + (0xFCB6, "M", "ضخ"), + (0xFCB7, "M", "ضم"), + (0xFCB8, "M", "طح"), + (0xFCB9, "M", "ظم"), + (0xFCBA, "M", "عج"), + (0xFCBB, "M", "عم"), + (0xFCBC, "M", "غج"), + (0xFCBD, "M", "غم"), + (0xFCBE, "M", "فج"), + ] + + +def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFCBF, "M", "فح"), + (0xFCC0, "M", "فخ"), + (0xFCC1, "M", "فم"), + (0xFCC2, "M", "قح"), + (0xFCC3, "M", "قم"), + (0xFCC4, "M", "كج"), + (0xFCC5, "M", "كح"), + (0xFCC6, "M", "كخ"), + (0xFCC7, "M", "كل"), + (0xFCC8, "M", "كم"), + (0xFCC9, "M", "لج"), + (0xFCCA, "M", "لح"), + (0xFCCB, "M", "لخ"), + (0xFCCC, "M", "لم"), + (0xFCCD, "M", "له"), + (0xFCCE, "M", "مج"), + (0xFCCF, "M", "مح"), + (0xFCD0, "M", "مخ"), + (0xFCD1, "M", "مم"), + (0xFCD2, "M", "نج"), + (0xFCD3, "M", "نح"), + (0xFCD4, "M", "نخ"), + (0xFCD5, "M", "نم"), + (0xFCD6, "M", "نه"), + (0xFCD7, "M", "هج"), + (0xFCD8, "M", "هم"), + (0xFCD9, "M", "هٰ"), + (0xFCDA, "M", "يج"), + (0xFCDB, "M", "يح"), + (0xFCDC, "M", "يخ"), + (0xFCDD, "M", "يم"), + (0xFCDE, "M", "يه"), + (0xFCDF, "M", "ئم"), + (0xFCE0, "M", "ئه"), + (0xFCE1, "M", "بم"), + (0xFCE2, "M", "به"), + (0xFCE3, "M", "تم"), + (0xFCE4, "M", "ته"), + (0xFCE5, "M", "ثم"), + (0xFCE6, "M", "ثه"), + (0xFCE7, "M", "سم"), + (0xFCE8, "M", "سه"), + (0xFCE9, "M", "شم"), + (0xFCEA, "M", "شه"), + (0xFCEB, "M", "كل"), + (0xFCEC, "M", "كم"), + (0xFCED, "M", "لم"), + (0xFCEE, "M", "نم"), + (0xFCEF, "M", "نه"), + (0xFCF0, "M", "يم"), + (0xFCF1, "M", "يه"), + (0xFCF2, "M", "ـَّ"), + (0xFCF3, "M", "ـُّ"), + (0xFCF4, "M", "ـِّ"), + (0xFCF5, "M", "طى"), + (0xFCF6, "M", "طي"), + (0xFCF7, "M", "عى"), + (0xFCF8, "M", "عي"), + (0xFCF9, "M", "غى"), + (0xFCFA, "M", "غي"), + (0xFCFB, "M", "سى"), + (0xFCFC, "M", "سي"), + (0xFCFD, "M", "شى"), + (0xFCFE, "M", "شي"), + (0xFCFF, "M", "حى"), + (0xFD00, "M", "حي"), + (0xFD01, "M", "جى"), + (0xFD02, "M", "جي"), + (0xFD03, "M", "خى"), + (0xFD04, "M", "خي"), + (0xFD05, "M", "صى"), + (0xFD06, "M", "صي"), + (0xFD07, "M", "ضى"), + (0xFD08, "M", "ضي"), + (0xFD09, "M", "شج"), + (0xFD0A, "M", "شح"), + (0xFD0B, "M", "شخ"), + (0xFD0C, "M", "شم"), + (0xFD0D, "M", "شر"), + (0xFD0E, "M", "سر"), + (0xFD0F, "M", "صر"), + (0xFD10, "M", "ضر"), + (0xFD11, "M", "طى"), + (0xFD12, "M", "طي"), + (0xFD13, "M", "عى"), + (0xFD14, "M", "عي"), + (0xFD15, "M", "غى"), + (0xFD16, "M", "غي"), + (0xFD17, "M", "سى"), + (0xFD18, "M", "سي"), + (0xFD19, "M", "شى"), + (0xFD1A, "M", "شي"), + (0xFD1B, "M", "حى"), + (0xFD1C, "M", "حي"), + (0xFD1D, "M", "جى"), + (0xFD1E, "M", "جي"), + (0xFD1F, "M", "خى"), + (0xFD20, "M", "خي"), + (0xFD21, "M", "صى"), + (0xFD22, "M", "صي"), + ] + + +def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFD23, "M", "ضى"), + (0xFD24, "M", "ضي"), + (0xFD25, "M", "شج"), + (0xFD26, "M", "شح"), + (0xFD27, "M", "شخ"), + (0xFD28, "M", "شم"), + (0xFD29, "M", "شر"), + (0xFD2A, "M", "سر"), + (0xFD2B, "M", "صر"), + (0xFD2C, "M", "ضر"), + (0xFD2D, "M", "شج"), + (0xFD2E, "M", "شح"), + (0xFD2F, "M", "شخ"), + (0xFD30, "M", "شم"), + (0xFD31, "M", "سه"), + (0xFD32, "M", "شه"), + (0xFD33, "M", "طم"), + (0xFD34, "M", "سج"), + (0xFD35, "M", "سح"), + (0xFD36, "M", "سخ"), + (0xFD37, "M", "شج"), + (0xFD38, "M", "شح"), + (0xFD39, "M", "شخ"), + (0xFD3A, "M", "طم"), + (0xFD3B, "M", "ظم"), + (0xFD3C, "M", "اً"), + (0xFD3E, "V"), + (0xFD50, "M", "تجم"), + (0xFD51, "M", "تحج"), + (0xFD53, "M", "تحم"), + (0xFD54, "M", "تخم"), + (0xFD55, "M", "تمج"), + (0xFD56, "M", "تمح"), + (0xFD57, "M", "تمخ"), + (0xFD58, "M", "جمح"), + (0xFD5A, "M", "حمي"), + (0xFD5B, "M", "حمى"), + (0xFD5C, "M", "سحج"), + (0xFD5D, "M", "سجح"), + (0xFD5E, "M", "سجى"), + (0xFD5F, "M", "سمح"), + (0xFD61, "M", "سمج"), + (0xFD62, "M", "سمم"), + (0xFD64, "M", "صحح"), + (0xFD66, "M", "صمم"), + (0xFD67, "M", "شحم"), + (0xFD69, "M", "شجي"), + (0xFD6A, "M", "شمخ"), + (0xFD6C, "M", "شمم"), + (0xFD6E, "M", "ضحى"), + (0xFD6F, "M", "ضخم"), + (0xFD71, "M", "طمح"), + (0xFD73, "M", "طمم"), + (0xFD74, "M", "طمي"), + (0xFD75, "M", "عجم"), + (0xFD76, "M", "عمم"), + (0xFD78, "M", "عمى"), + (0xFD79, "M", "غمم"), + (0xFD7A, "M", "غمي"), + (0xFD7B, "M", "غمى"), + (0xFD7C, "M", "فخم"), + (0xFD7E, "M", "قمح"), + (0xFD7F, "M", "قمم"), + (0xFD80, "M", "لحم"), + (0xFD81, "M", "لحي"), + (0xFD82, "M", "لحى"), + (0xFD83, "M", "لجج"), + (0xFD85, "M", "لخم"), + (0xFD87, "M", "لمح"), + (0xFD89, "M", "محج"), + (0xFD8A, "M", "محم"), + (0xFD8B, "M", "محي"), + (0xFD8C, "M", "مجح"), + (0xFD8D, "M", "مجم"), + (0xFD8E, "M", "مخج"), + (0xFD8F, "M", "مخم"), + (0xFD90, "X"), + (0xFD92, "M", "مجخ"), + (0xFD93, "M", "همج"), + (0xFD94, "M", "همم"), + (0xFD95, "M", "نحم"), + (0xFD96, "M", "نحى"), + (0xFD97, "M", "نجم"), + (0xFD99, "M", "نجى"), + (0xFD9A, "M", "نمي"), + (0xFD9B, "M", "نمى"), + (0xFD9C, "M", "يمم"), + (0xFD9E, "M", "بخي"), + (0xFD9F, "M", "تجي"), + (0xFDA0, "M", "تجى"), + (0xFDA1, "M", "تخي"), + (0xFDA2, "M", "تخى"), + (0xFDA3, "M", "تمي"), + (0xFDA4, "M", "تمى"), + (0xFDA5, "M", "جمي"), + (0xFDA6, "M", "جحى"), + (0xFDA7, "M", "جمى"), + (0xFDA8, "M", "سخى"), + (0xFDA9, "M", "صحي"), + (0xFDAA, "M", "شحي"), + ] + + +def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFDAB, "M", "ضحي"), + (0xFDAC, "M", "لجي"), + (0xFDAD, "M", "لمي"), + (0xFDAE, "M", "يحي"), + (0xFDAF, "M", "يجي"), + (0xFDB0, "M", "يمي"), + (0xFDB1, "M", "ممي"), + (0xFDB2, "M", "قمي"), + (0xFDB3, "M", "نحي"), + (0xFDB4, "M", "قمح"), + (0xFDB5, "M", "لحم"), + (0xFDB6, "M", "عمي"), + (0xFDB7, "M", "كمي"), + (0xFDB8, "M", "نجح"), + (0xFDB9, "M", "مخي"), + (0xFDBA, "M", "لجم"), + (0xFDBB, "M", "كمم"), + (0xFDBC, "M", "لجم"), + (0xFDBD, "M", "نجح"), + (0xFDBE, "M", "جحي"), + (0xFDBF, "M", "حجي"), + (0xFDC0, "M", "مجي"), + (0xFDC1, "M", "فمي"), + (0xFDC2, "M", "بحي"), + (0xFDC3, "M", "كمم"), + (0xFDC4, "M", "عجم"), + (0xFDC5, "M", "صمم"), + (0xFDC6, "M", "سخي"), + (0xFDC7, "M", "نجي"), + (0xFDC8, "X"), + (0xFDCF, "V"), + (0xFDD0, "X"), + (0xFDF0, "M", "صلے"), + (0xFDF1, "M", "قلے"), + (0xFDF2, "M", "الله"), + (0xFDF3, "M", "اكبر"), + (0xFDF4, "M", "محمد"), + (0xFDF5, "M", "صلعم"), + (0xFDF6, "M", "رسول"), + (0xFDF7, "M", "عليه"), + (0xFDF8, "M", "وسلم"), + (0xFDF9, "M", "صلى"), + (0xFDFA, "3", "صلى الله عليه وسلم"), + (0xFDFB, "3", "جل جلاله"), + (0xFDFC, "M", "ریال"), + (0xFDFD, "V"), + (0xFE00, "I"), + (0xFE10, "3", ","), + (0xFE11, "M", "、"), + (0xFE12, "X"), + (0xFE13, "3", ":"), + (0xFE14, "3", ";"), + (0xFE15, "3", "!"), + (0xFE16, "3", "?"), + (0xFE17, "M", "〖"), + (0xFE18, "M", "〗"), + (0xFE19, "X"), + (0xFE20, "V"), + (0xFE30, "X"), + (0xFE31, "M", "—"), + (0xFE32, "M", "–"), + (0xFE33, "3", "_"), + (0xFE35, "3", "("), + (0xFE36, "3", ")"), + (0xFE37, "3", "{"), + (0xFE38, "3", "}"), + (0xFE39, "M", "〔"), + (0xFE3A, "M", "〕"), + (0xFE3B, "M", "【"), + (0xFE3C, "M", "】"), + (0xFE3D, "M", "《"), + (0xFE3E, "M", "》"), + (0xFE3F, "M", "〈"), + (0xFE40, "M", "〉"), + (0xFE41, "M", "「"), + (0xFE42, "M", "」"), + (0xFE43, "M", "『"), + (0xFE44, "M", "』"), + (0xFE45, "V"), + (0xFE47, "3", "["), + (0xFE48, "3", "]"), + (0xFE49, "3", " ̅"), + (0xFE4D, "3", "_"), + (0xFE50, "3", ","), + (0xFE51, "M", "、"), + (0xFE52, "X"), + (0xFE54, "3", ";"), + (0xFE55, "3", ":"), + (0xFE56, "3", "?"), + (0xFE57, "3", "!"), + (0xFE58, "M", "—"), + (0xFE59, "3", "("), + (0xFE5A, "3", ")"), + (0xFE5B, "3", "{"), + (0xFE5C, "3", "}"), + (0xFE5D, "M", "〔"), + (0xFE5E, "M", "〕"), + (0xFE5F, "3", "#"), + (0xFE60, "3", "&"), + (0xFE61, "3", "*"), + ] + + +def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFE62, "3", "+"), + (0xFE63, "M", "-"), + (0xFE64, "3", "<"), + (0xFE65, "3", ">"), + (0xFE66, "3", "="), + (0xFE67, "X"), + (0xFE68, "3", "\\"), + (0xFE69, "3", "$"), + (0xFE6A, "3", "%"), + (0xFE6B, "3", "@"), + (0xFE6C, "X"), + (0xFE70, "3", " ً"), + (0xFE71, "M", "ـً"), + (0xFE72, "3", " ٌ"), + (0xFE73, "V"), + (0xFE74, "3", " ٍ"), + (0xFE75, "X"), + (0xFE76, "3", " َ"), + (0xFE77, "M", "ـَ"), + (0xFE78, "3", " ُ"), + (0xFE79, "M", "ـُ"), + (0xFE7A, "3", " ِ"), + (0xFE7B, "M", "ـِ"), + (0xFE7C, "3", " ّ"), + (0xFE7D, "M", "ـّ"), + (0xFE7E, "3", " ْ"), + (0xFE7F, "M", "ـْ"), + (0xFE80, "M", "ء"), + (0xFE81, "M", "آ"), + (0xFE83, "M", "أ"), + (0xFE85, "M", "ؤ"), + (0xFE87, "M", "إ"), + (0xFE89, "M", "ئ"), + (0xFE8D, "M", "ا"), + (0xFE8F, "M", "ب"), + (0xFE93, "M", "ة"), + (0xFE95, "M", "ت"), + (0xFE99, "M", "ث"), + (0xFE9D, "M", "ج"), + (0xFEA1, "M", "ح"), + (0xFEA5, "M", "خ"), + (0xFEA9, "M", "د"), + (0xFEAB, "M", "ذ"), + (0xFEAD, "M", "ر"), + (0xFEAF, "M", "ز"), + (0xFEB1, "M", "س"), + (0xFEB5, "M", "ش"), + (0xFEB9, "M", "ص"), + (0xFEBD, "M", "ض"), + (0xFEC1, "M", "ط"), + (0xFEC5, "M", "ظ"), + (0xFEC9, "M", "ع"), + (0xFECD, "M", "غ"), + (0xFED1, "M", "ف"), + (0xFED5, "M", "ق"), + (0xFED9, "M", "ك"), + (0xFEDD, "M", "ل"), + (0xFEE1, "M", "م"), + (0xFEE5, "M", "ن"), + (0xFEE9, "M", "ه"), + (0xFEED, "M", "و"), + (0xFEEF, "M", "ى"), + (0xFEF1, "M", "ي"), + (0xFEF5, "M", "لآ"), + (0xFEF7, "M", "لأ"), + (0xFEF9, "M", "لإ"), + (0xFEFB, "M", "لا"), + (0xFEFD, "X"), + (0xFEFF, "I"), + (0xFF00, "X"), + (0xFF01, "3", "!"), + (0xFF02, "3", '"'), + (0xFF03, "3", "#"), + (0xFF04, "3", "$"), + (0xFF05, "3", "%"), + (0xFF06, "3", "&"), + (0xFF07, "3", "'"), + (0xFF08, "3", "("), + (0xFF09, "3", ")"), + (0xFF0A, "3", "*"), + (0xFF0B, "3", "+"), + (0xFF0C, "3", ","), + (0xFF0D, "M", "-"), + (0xFF0E, "M", "."), + (0xFF0F, "3", "/"), + (0xFF10, "M", "0"), + (0xFF11, "M", "1"), + (0xFF12, "M", "2"), + (0xFF13, "M", "3"), + (0xFF14, "M", "4"), + (0xFF15, "M", "5"), + (0xFF16, "M", "6"), + (0xFF17, "M", "7"), + (0xFF18, "M", "8"), + (0xFF19, "M", "9"), + (0xFF1A, "3", ":"), + (0xFF1B, "3", ";"), + (0xFF1C, "3", "<"), + (0xFF1D, "3", "="), + (0xFF1E, "3", ">"), + ] + + +def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF1F, "3", "?"), + (0xFF20, "3", "@"), + (0xFF21, "M", "a"), + (0xFF22, "M", "b"), + (0xFF23, "M", "c"), + (0xFF24, "M", "d"), + (0xFF25, "M", "e"), + (0xFF26, "M", "f"), + (0xFF27, "M", "g"), + (0xFF28, "M", "h"), + (0xFF29, "M", "i"), + (0xFF2A, "M", "j"), + (0xFF2B, "M", "k"), + (0xFF2C, "M", "l"), + (0xFF2D, "M", "m"), + (0xFF2E, "M", "n"), + (0xFF2F, "M", "o"), + (0xFF30, "M", "p"), + (0xFF31, "M", "q"), + (0xFF32, "M", "r"), + (0xFF33, "M", "s"), + (0xFF34, "M", "t"), + (0xFF35, "M", "u"), + (0xFF36, "M", "v"), + (0xFF37, "M", "w"), + (0xFF38, "M", "x"), + (0xFF39, "M", "y"), + (0xFF3A, "M", "z"), + (0xFF3B, "3", "["), + (0xFF3C, "3", "\\"), + (0xFF3D, "3", "]"), + (0xFF3E, "3", "^"), + (0xFF3F, "3", "_"), + (0xFF40, "3", "`"), + (0xFF41, "M", "a"), + (0xFF42, "M", "b"), + (0xFF43, "M", "c"), + (0xFF44, "M", "d"), + (0xFF45, "M", "e"), + (0xFF46, "M", "f"), + (0xFF47, "M", "g"), + (0xFF48, "M", "h"), + (0xFF49, "M", "i"), + (0xFF4A, "M", "j"), + (0xFF4B, "M", "k"), + (0xFF4C, "M", "l"), + (0xFF4D, "M", "m"), + (0xFF4E, "M", "n"), + (0xFF4F, "M", "o"), + (0xFF50, "M", "p"), + (0xFF51, "M", "q"), + (0xFF52, "M", "r"), + (0xFF53, "M", "s"), + (0xFF54, "M", "t"), + (0xFF55, "M", "u"), + (0xFF56, "M", "v"), + (0xFF57, "M", "w"), + (0xFF58, "M", "x"), + (0xFF59, "M", "y"), + (0xFF5A, "M", "z"), + (0xFF5B, "3", "{"), + (0xFF5C, "3", "|"), + (0xFF5D, "3", "}"), + (0xFF5E, "3", "~"), + (0xFF5F, "M", "⦅"), + (0xFF60, "M", "⦆"), + (0xFF61, "M", "."), + (0xFF62, "M", "「"), + (0xFF63, "M", "」"), + (0xFF64, "M", "、"), + (0xFF65, "M", "・"), + (0xFF66, "M", "ヲ"), + (0xFF67, "M", "ァ"), + (0xFF68, "M", "ィ"), + (0xFF69, "M", "ゥ"), + (0xFF6A, "M", "ェ"), + (0xFF6B, "M", "ォ"), + (0xFF6C, "M", "ャ"), + (0xFF6D, "M", "ュ"), + (0xFF6E, "M", "ョ"), + (0xFF6F, "M", "ッ"), + (0xFF70, "M", "ー"), + (0xFF71, "M", "ア"), + (0xFF72, "M", "イ"), + (0xFF73, "M", "ウ"), + (0xFF74, "M", "エ"), + (0xFF75, "M", "オ"), + (0xFF76, "M", "カ"), + (0xFF77, "M", "キ"), + (0xFF78, "M", "ク"), + (0xFF79, "M", "ケ"), + (0xFF7A, "M", "コ"), + (0xFF7B, "M", "サ"), + (0xFF7C, "M", "シ"), + (0xFF7D, "M", "ス"), + (0xFF7E, "M", "セ"), + (0xFF7F, "M", "ソ"), + (0xFF80, "M", "タ"), + (0xFF81, "M", "チ"), + (0xFF82, "M", "ツ"), + ] + + +def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF83, "M", "テ"), + (0xFF84, "M", "ト"), + (0xFF85, "M", "ナ"), + (0xFF86, "M", "ニ"), + (0xFF87, "M", "ヌ"), + (0xFF88, "M", "ネ"), + (0xFF89, "M", "ノ"), + (0xFF8A, "M", "ハ"), + (0xFF8B, "M", "ヒ"), + (0xFF8C, "M", "フ"), + (0xFF8D, "M", "ヘ"), + (0xFF8E, "M", "ホ"), + (0xFF8F, "M", "マ"), + (0xFF90, "M", "ミ"), + (0xFF91, "M", "ム"), + (0xFF92, "M", "メ"), + (0xFF93, "M", "モ"), + (0xFF94, "M", "ヤ"), + (0xFF95, "M", "ユ"), + (0xFF96, "M", "ヨ"), + (0xFF97, "M", "ラ"), + (0xFF98, "M", "リ"), + (0xFF99, "M", "ル"), + (0xFF9A, "M", "レ"), + (0xFF9B, "M", "ロ"), + (0xFF9C, "M", "ワ"), + (0xFF9D, "M", "ン"), + (0xFF9E, "M", "゙"), + (0xFF9F, "M", "゚"), + (0xFFA0, "X"), + (0xFFA1, "M", "ᄀ"), + (0xFFA2, "M", "ᄁ"), + (0xFFA3, "M", "ᆪ"), + (0xFFA4, "M", "ᄂ"), + (0xFFA5, "M", "ᆬ"), + (0xFFA6, "M", "ᆭ"), + (0xFFA7, "M", "ᄃ"), + (0xFFA8, "M", "ᄄ"), + (0xFFA9, "M", "ᄅ"), + (0xFFAA, "M", "ᆰ"), + (0xFFAB, "M", "ᆱ"), + (0xFFAC, "M", "ᆲ"), + (0xFFAD, "M", "ᆳ"), + (0xFFAE, "M", "ᆴ"), + (0xFFAF, "M", "ᆵ"), + (0xFFB0, "M", "ᄚ"), + (0xFFB1, "M", "ᄆ"), + (0xFFB2, "M", "ᄇ"), + (0xFFB3, "M", "ᄈ"), + (0xFFB4, "M", "ᄡ"), + (0xFFB5, "M", "ᄉ"), + (0xFFB6, "M", "ᄊ"), + (0xFFB7, "M", "ᄋ"), + (0xFFB8, "M", "ᄌ"), + (0xFFB9, "M", "ᄍ"), + (0xFFBA, "M", "ᄎ"), + (0xFFBB, "M", "ᄏ"), + (0xFFBC, "M", "ᄐ"), + (0xFFBD, "M", "ᄑ"), + (0xFFBE, "M", "ᄒ"), + (0xFFBF, "X"), + (0xFFC2, "M", "ᅡ"), + (0xFFC3, "M", "ᅢ"), + (0xFFC4, "M", "ᅣ"), + (0xFFC5, "M", "ᅤ"), + (0xFFC6, "M", "ᅥ"), + (0xFFC7, "M", "ᅦ"), + (0xFFC8, "X"), + (0xFFCA, "M", "ᅧ"), + (0xFFCB, "M", "ᅨ"), + (0xFFCC, "M", "ᅩ"), + (0xFFCD, "M", "ᅪ"), + (0xFFCE, "M", "ᅫ"), + (0xFFCF, "M", "ᅬ"), + (0xFFD0, "X"), + (0xFFD2, "M", "ᅭ"), + (0xFFD3, "M", "ᅮ"), + (0xFFD4, "M", "ᅯ"), + (0xFFD5, "M", "ᅰ"), + (0xFFD6, "M", "ᅱ"), + (0xFFD7, "M", "ᅲ"), + (0xFFD8, "X"), + (0xFFDA, "M", "ᅳ"), + (0xFFDB, "M", "ᅴ"), + (0xFFDC, "M", "ᅵ"), + (0xFFDD, "X"), + (0xFFE0, "M", "¢"), + (0xFFE1, "M", "£"), + (0xFFE2, "M", "¬"), + (0xFFE3, "3", " ̄"), + (0xFFE4, "M", "¦"), + (0xFFE5, "M", "¥"), + (0xFFE6, "M", "₩"), + (0xFFE7, "X"), + (0xFFE8, "M", "│"), + (0xFFE9, "M", "←"), + (0xFFEA, "M", "↑"), + (0xFFEB, "M", "→"), + (0xFFEC, "M", "↓"), + (0xFFED, "M", "■"), + ] + + +def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFFEE, "M", "○"), + (0xFFEF, "X"), + (0x10000, "V"), + (0x1000C, "X"), + (0x1000D, "V"), + (0x10027, "X"), + (0x10028, "V"), + (0x1003B, "X"), + (0x1003C, "V"), + (0x1003E, "X"), + (0x1003F, "V"), + (0x1004E, "X"), + (0x10050, "V"), + (0x1005E, "X"), + (0x10080, "V"), + (0x100FB, "X"), + (0x10100, "V"), + (0x10103, "X"), + (0x10107, "V"), + (0x10134, "X"), + (0x10137, "V"), + (0x1018F, "X"), + (0x10190, "V"), + (0x1019D, "X"), + (0x101A0, "V"), + (0x101A1, "X"), + (0x101D0, "V"), + (0x101FE, "X"), + (0x10280, "V"), + (0x1029D, "X"), + (0x102A0, "V"), + (0x102D1, "X"), + (0x102E0, "V"), + (0x102FC, "X"), + (0x10300, "V"), + (0x10324, "X"), + (0x1032D, "V"), + (0x1034B, "X"), + (0x10350, "V"), + (0x1037B, "X"), + (0x10380, "V"), + (0x1039E, "X"), + (0x1039F, "V"), + (0x103C4, "X"), + (0x103C8, "V"), + (0x103D6, "X"), + (0x10400, "M", "𐐨"), + (0x10401, "M", "𐐩"), + (0x10402, "M", "𐐪"), + (0x10403, "M", "𐐫"), + (0x10404, "M", "𐐬"), + (0x10405, "M", "𐐭"), + (0x10406, "M", "𐐮"), + (0x10407, "M", "𐐯"), + (0x10408, "M", "𐐰"), + (0x10409, "M", "𐐱"), + (0x1040A, "M", "𐐲"), + (0x1040B, "M", "𐐳"), + (0x1040C, "M", "𐐴"), + (0x1040D, "M", "𐐵"), + (0x1040E, "M", "𐐶"), + (0x1040F, "M", "𐐷"), + (0x10410, "M", "𐐸"), + (0x10411, "M", "𐐹"), + (0x10412, "M", "𐐺"), + (0x10413, "M", "𐐻"), + (0x10414, "M", "𐐼"), + (0x10415, "M", "𐐽"), + (0x10416, "M", "𐐾"), + (0x10417, "M", "𐐿"), + (0x10418, "M", "𐑀"), + (0x10419, "M", "𐑁"), + (0x1041A, "M", "𐑂"), + (0x1041B, "M", "𐑃"), + (0x1041C, "M", "𐑄"), + (0x1041D, "M", "𐑅"), + (0x1041E, "M", "𐑆"), + (0x1041F, "M", "𐑇"), + (0x10420, "M", "𐑈"), + (0x10421, "M", "𐑉"), + (0x10422, "M", "𐑊"), + (0x10423, "M", "𐑋"), + (0x10424, "M", "𐑌"), + (0x10425, "M", "𐑍"), + (0x10426, "M", "𐑎"), + (0x10427, "M", "𐑏"), + (0x10428, "V"), + (0x1049E, "X"), + (0x104A0, "V"), + (0x104AA, "X"), + (0x104B0, "M", "𐓘"), + (0x104B1, "M", "𐓙"), + (0x104B2, "M", "𐓚"), + (0x104B3, "M", "𐓛"), + (0x104B4, "M", "𐓜"), + (0x104B5, "M", "𐓝"), + (0x104B6, "M", "𐓞"), + (0x104B7, "M", "𐓟"), + (0x104B8, "M", "𐓠"), + (0x104B9, "M", "𐓡"), + ] + + +def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x104BA, "M", "𐓢"), + (0x104BB, "M", "𐓣"), + (0x104BC, "M", "𐓤"), + (0x104BD, "M", "𐓥"), + (0x104BE, "M", "𐓦"), + (0x104BF, "M", "𐓧"), + (0x104C0, "M", "𐓨"), + (0x104C1, "M", "𐓩"), + (0x104C2, "M", "𐓪"), + (0x104C3, "M", "𐓫"), + (0x104C4, "M", "𐓬"), + (0x104C5, "M", "𐓭"), + (0x104C6, "M", "𐓮"), + (0x104C7, "M", "𐓯"), + (0x104C8, "M", "𐓰"), + (0x104C9, "M", "𐓱"), + (0x104CA, "M", "𐓲"), + (0x104CB, "M", "𐓳"), + (0x104CC, "M", "𐓴"), + (0x104CD, "M", "𐓵"), + (0x104CE, "M", "𐓶"), + (0x104CF, "M", "𐓷"), + (0x104D0, "M", "𐓸"), + (0x104D1, "M", "𐓹"), + (0x104D2, "M", "𐓺"), + (0x104D3, "M", "𐓻"), + (0x104D4, "X"), + (0x104D8, "V"), + (0x104FC, "X"), + (0x10500, "V"), + (0x10528, "X"), + (0x10530, "V"), + (0x10564, "X"), + (0x1056F, "V"), + (0x10570, "M", "𐖗"), + (0x10571, "M", "𐖘"), + (0x10572, "M", "𐖙"), + (0x10573, "M", "𐖚"), + (0x10574, "M", "𐖛"), + (0x10575, "M", "𐖜"), + (0x10576, "M", "𐖝"), + (0x10577, "M", "𐖞"), + (0x10578, "M", "𐖟"), + (0x10579, "M", "𐖠"), + (0x1057A, "M", "𐖡"), + (0x1057B, "X"), + (0x1057C, "M", "𐖣"), + (0x1057D, "M", "𐖤"), + (0x1057E, "M", "𐖥"), + (0x1057F, "M", "𐖦"), + (0x10580, "M", "𐖧"), + (0x10581, "M", "𐖨"), + (0x10582, "M", "𐖩"), + (0x10583, "M", "𐖪"), + (0x10584, "M", "𐖫"), + (0x10585, "M", "𐖬"), + (0x10586, "M", "𐖭"), + (0x10587, "M", "𐖮"), + (0x10588, "M", "𐖯"), + (0x10589, "M", "𐖰"), + (0x1058A, "M", "𐖱"), + (0x1058B, "X"), + (0x1058C, "M", "𐖳"), + (0x1058D, "M", "𐖴"), + (0x1058E, "M", "𐖵"), + (0x1058F, "M", "𐖶"), + (0x10590, "M", "𐖷"), + (0x10591, "M", "𐖸"), + (0x10592, "M", "𐖹"), + (0x10593, "X"), + (0x10594, "M", "𐖻"), + (0x10595, "M", "𐖼"), + (0x10596, "X"), + (0x10597, "V"), + (0x105A2, "X"), + (0x105A3, "V"), + (0x105B2, "X"), + (0x105B3, "V"), + (0x105BA, "X"), + (0x105BB, "V"), + (0x105BD, "X"), + (0x10600, "V"), + (0x10737, "X"), + (0x10740, "V"), + (0x10756, "X"), + (0x10760, "V"), + (0x10768, "X"), + (0x10780, "V"), + (0x10781, "M", "ː"), + (0x10782, "M", "ˑ"), + (0x10783, "M", "æ"), + (0x10784, "M", "ʙ"), + (0x10785, "M", "ɓ"), + (0x10786, "X"), + (0x10787, "M", "ʣ"), + (0x10788, "M", "ꭦ"), + (0x10789, "M", "ʥ"), + (0x1078A, "M", "ʤ"), + (0x1078B, "M", "ɖ"), + (0x1078C, "M", "ɗ"), + ] + + +def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1078D, "M", "ᶑ"), + (0x1078E, "M", "ɘ"), + (0x1078F, "M", "ɞ"), + (0x10790, "M", "ʩ"), + (0x10791, "M", "ɤ"), + (0x10792, "M", "ɢ"), + (0x10793, "M", "ɠ"), + (0x10794, "M", "ʛ"), + (0x10795, "M", "ħ"), + (0x10796, "M", "ʜ"), + (0x10797, "M", "ɧ"), + (0x10798, "M", "ʄ"), + (0x10799, "M", "ʪ"), + (0x1079A, "M", "ʫ"), + (0x1079B, "M", "ɬ"), + (0x1079C, "M", "𝼄"), + (0x1079D, "M", "ꞎ"), + (0x1079E, "M", "ɮ"), + (0x1079F, "M", "𝼅"), + (0x107A0, "M", "ʎ"), + (0x107A1, "M", "𝼆"), + (0x107A2, "M", "ø"), + (0x107A3, "M", "ɶ"), + (0x107A4, "M", "ɷ"), + (0x107A5, "M", "q"), + (0x107A6, "M", "ɺ"), + (0x107A7, "M", "𝼈"), + (0x107A8, "M", "ɽ"), + (0x107A9, "M", "ɾ"), + (0x107AA, "M", "ʀ"), + (0x107AB, "M", "ʨ"), + (0x107AC, "M", "ʦ"), + (0x107AD, "M", "ꭧ"), + (0x107AE, "M", "ʧ"), + (0x107AF, "M", "ʈ"), + (0x107B0, "M", "ⱱ"), + (0x107B1, "X"), + (0x107B2, "M", "ʏ"), + (0x107B3, "M", "ʡ"), + (0x107B4, "M", "ʢ"), + (0x107B5, "M", "ʘ"), + (0x107B6, "M", "ǀ"), + (0x107B7, "M", "ǁ"), + (0x107B8, "M", "ǂ"), + (0x107B9, "M", "𝼊"), + (0x107BA, "M", "𝼞"), + (0x107BB, "X"), + (0x10800, "V"), + (0x10806, "X"), + (0x10808, "V"), + (0x10809, "X"), + (0x1080A, "V"), + (0x10836, "X"), + (0x10837, "V"), + (0x10839, "X"), + (0x1083C, "V"), + (0x1083D, "X"), + (0x1083F, "V"), + (0x10856, "X"), + (0x10857, "V"), + (0x1089F, "X"), + (0x108A7, "V"), + (0x108B0, "X"), + (0x108E0, "V"), + (0x108F3, "X"), + (0x108F4, "V"), + (0x108F6, "X"), + (0x108FB, "V"), + (0x1091C, "X"), + (0x1091F, "V"), + (0x1093A, "X"), + (0x1093F, "V"), + (0x10940, "X"), + (0x10980, "V"), + (0x109B8, "X"), + (0x109BC, "V"), + (0x109D0, "X"), + (0x109D2, "V"), + (0x10A04, "X"), + (0x10A05, "V"), + (0x10A07, "X"), + (0x10A0C, "V"), + (0x10A14, "X"), + (0x10A15, "V"), + (0x10A18, "X"), + (0x10A19, "V"), + (0x10A36, "X"), + (0x10A38, "V"), + (0x10A3B, "X"), + (0x10A3F, "V"), + (0x10A49, "X"), + (0x10A50, "V"), + (0x10A59, "X"), + (0x10A60, "V"), + (0x10AA0, "X"), + (0x10AC0, "V"), + (0x10AE7, "X"), + (0x10AEB, "V"), + (0x10AF7, "X"), + (0x10B00, "V"), + ] + + +def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10B36, "X"), + (0x10B39, "V"), + (0x10B56, "X"), + (0x10B58, "V"), + (0x10B73, "X"), + (0x10B78, "V"), + (0x10B92, "X"), + (0x10B99, "V"), + (0x10B9D, "X"), + (0x10BA9, "V"), + (0x10BB0, "X"), + (0x10C00, "V"), + (0x10C49, "X"), + (0x10C80, "M", "𐳀"), + (0x10C81, "M", "𐳁"), + (0x10C82, "M", "𐳂"), + (0x10C83, "M", "𐳃"), + (0x10C84, "M", "𐳄"), + (0x10C85, "M", "𐳅"), + (0x10C86, "M", "𐳆"), + (0x10C87, "M", "𐳇"), + (0x10C88, "M", "𐳈"), + (0x10C89, "M", "𐳉"), + (0x10C8A, "M", "𐳊"), + (0x10C8B, "M", "𐳋"), + (0x10C8C, "M", "𐳌"), + (0x10C8D, "M", "𐳍"), + (0x10C8E, "M", "𐳎"), + (0x10C8F, "M", "𐳏"), + (0x10C90, "M", "𐳐"), + (0x10C91, "M", "𐳑"), + (0x10C92, "M", "𐳒"), + (0x10C93, "M", "𐳓"), + (0x10C94, "M", "𐳔"), + (0x10C95, "M", "𐳕"), + (0x10C96, "M", "𐳖"), + (0x10C97, "M", "𐳗"), + (0x10C98, "M", "𐳘"), + (0x10C99, "M", "𐳙"), + (0x10C9A, "M", "𐳚"), + (0x10C9B, "M", "𐳛"), + (0x10C9C, "M", "𐳜"), + (0x10C9D, "M", "𐳝"), + (0x10C9E, "M", "𐳞"), + (0x10C9F, "M", "𐳟"), + (0x10CA0, "M", "𐳠"), + (0x10CA1, "M", "𐳡"), + (0x10CA2, "M", "𐳢"), + (0x10CA3, "M", "𐳣"), + (0x10CA4, "M", "𐳤"), + (0x10CA5, "M", "𐳥"), + (0x10CA6, "M", "𐳦"), + (0x10CA7, "M", "𐳧"), + (0x10CA8, "M", "𐳨"), + (0x10CA9, "M", "𐳩"), + (0x10CAA, "M", "𐳪"), + (0x10CAB, "M", "𐳫"), + (0x10CAC, "M", "𐳬"), + (0x10CAD, "M", "𐳭"), + (0x10CAE, "M", "𐳮"), + (0x10CAF, "M", "𐳯"), + (0x10CB0, "M", "𐳰"), + (0x10CB1, "M", "𐳱"), + (0x10CB2, "M", "𐳲"), + (0x10CB3, "X"), + (0x10CC0, "V"), + (0x10CF3, "X"), + (0x10CFA, "V"), + (0x10D28, "X"), + (0x10D30, "V"), + (0x10D3A, "X"), + (0x10E60, "V"), + (0x10E7F, "X"), + (0x10E80, "V"), + (0x10EAA, "X"), + (0x10EAB, "V"), + (0x10EAE, "X"), + (0x10EB0, "V"), + (0x10EB2, "X"), + (0x10EFD, "V"), + (0x10F28, "X"), + (0x10F30, "V"), + (0x10F5A, "X"), + (0x10F70, "V"), + (0x10F8A, "X"), + (0x10FB0, "V"), + (0x10FCC, "X"), + (0x10FE0, "V"), + (0x10FF7, "X"), + (0x11000, "V"), + (0x1104E, "X"), + (0x11052, "V"), + (0x11076, "X"), + (0x1107F, "V"), + (0x110BD, "X"), + (0x110BE, "V"), + (0x110C3, "X"), + (0x110D0, "V"), + (0x110E9, "X"), + (0x110F0, "V"), + ] + + +def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x110FA, "X"), + (0x11100, "V"), + (0x11135, "X"), + (0x11136, "V"), + (0x11148, "X"), + (0x11150, "V"), + (0x11177, "X"), + (0x11180, "V"), + (0x111E0, "X"), + (0x111E1, "V"), + (0x111F5, "X"), + (0x11200, "V"), + (0x11212, "X"), + (0x11213, "V"), + (0x11242, "X"), + (0x11280, "V"), + (0x11287, "X"), + (0x11288, "V"), + (0x11289, "X"), + (0x1128A, "V"), + (0x1128E, "X"), + (0x1128F, "V"), + (0x1129E, "X"), + (0x1129F, "V"), + (0x112AA, "X"), + (0x112B0, "V"), + (0x112EB, "X"), + (0x112F0, "V"), + (0x112FA, "X"), + (0x11300, "V"), + (0x11304, "X"), + (0x11305, "V"), + (0x1130D, "X"), + (0x1130F, "V"), + (0x11311, "X"), + (0x11313, "V"), + (0x11329, "X"), + (0x1132A, "V"), + (0x11331, "X"), + (0x11332, "V"), + (0x11334, "X"), + (0x11335, "V"), + (0x1133A, "X"), + (0x1133B, "V"), + (0x11345, "X"), + (0x11347, "V"), + (0x11349, "X"), + (0x1134B, "V"), + (0x1134E, "X"), + (0x11350, "V"), + (0x11351, "X"), + (0x11357, "V"), + (0x11358, "X"), + (0x1135D, "V"), + (0x11364, "X"), + (0x11366, "V"), + (0x1136D, "X"), + (0x11370, "V"), + (0x11375, "X"), + (0x11400, "V"), + (0x1145C, "X"), + (0x1145D, "V"), + (0x11462, "X"), + (0x11480, "V"), + (0x114C8, "X"), + (0x114D0, "V"), + (0x114DA, "X"), + (0x11580, "V"), + (0x115B6, "X"), + (0x115B8, "V"), + (0x115DE, "X"), + (0x11600, "V"), + (0x11645, "X"), + (0x11650, "V"), + (0x1165A, "X"), + (0x11660, "V"), + (0x1166D, "X"), + (0x11680, "V"), + (0x116BA, "X"), + (0x116C0, "V"), + (0x116CA, "X"), + (0x11700, "V"), + (0x1171B, "X"), + (0x1171D, "V"), + (0x1172C, "X"), + (0x11730, "V"), + (0x11747, "X"), + (0x11800, "V"), + (0x1183C, "X"), + (0x118A0, "M", "𑣀"), + (0x118A1, "M", "𑣁"), + (0x118A2, "M", "𑣂"), + (0x118A3, "M", "𑣃"), + (0x118A4, "M", "𑣄"), + (0x118A5, "M", "𑣅"), + (0x118A6, "M", "𑣆"), + (0x118A7, "M", "𑣇"), + (0x118A8, "M", "𑣈"), + (0x118A9, "M", "𑣉"), + (0x118AA, "M", "𑣊"), + ] + + +def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x118AB, "M", "𑣋"), + (0x118AC, "M", "𑣌"), + (0x118AD, "M", "𑣍"), + (0x118AE, "M", "𑣎"), + (0x118AF, "M", "𑣏"), + (0x118B0, "M", "𑣐"), + (0x118B1, "M", "𑣑"), + (0x118B2, "M", "𑣒"), + (0x118B3, "M", "𑣓"), + (0x118B4, "M", "𑣔"), + (0x118B5, "M", "𑣕"), + (0x118B6, "M", "𑣖"), + (0x118B7, "M", "𑣗"), + (0x118B8, "M", "𑣘"), + (0x118B9, "M", "𑣙"), + (0x118BA, "M", "𑣚"), + (0x118BB, "M", "𑣛"), + (0x118BC, "M", "𑣜"), + (0x118BD, "M", "𑣝"), + (0x118BE, "M", "𑣞"), + (0x118BF, "M", "𑣟"), + (0x118C0, "V"), + (0x118F3, "X"), + (0x118FF, "V"), + (0x11907, "X"), + (0x11909, "V"), + (0x1190A, "X"), + (0x1190C, "V"), + (0x11914, "X"), + (0x11915, "V"), + (0x11917, "X"), + (0x11918, "V"), + (0x11936, "X"), + (0x11937, "V"), + (0x11939, "X"), + (0x1193B, "V"), + (0x11947, "X"), + (0x11950, "V"), + (0x1195A, "X"), + (0x119A0, "V"), + (0x119A8, "X"), + (0x119AA, "V"), + (0x119D8, "X"), + (0x119DA, "V"), + (0x119E5, "X"), + (0x11A00, "V"), + (0x11A48, "X"), + (0x11A50, "V"), + (0x11AA3, "X"), + (0x11AB0, "V"), + (0x11AF9, "X"), + (0x11B00, "V"), + (0x11B0A, "X"), + (0x11C00, "V"), + (0x11C09, "X"), + (0x11C0A, "V"), + (0x11C37, "X"), + (0x11C38, "V"), + (0x11C46, "X"), + (0x11C50, "V"), + (0x11C6D, "X"), + (0x11C70, "V"), + (0x11C90, "X"), + (0x11C92, "V"), + (0x11CA8, "X"), + (0x11CA9, "V"), + (0x11CB7, "X"), + (0x11D00, "V"), + (0x11D07, "X"), + (0x11D08, "V"), + (0x11D0A, "X"), + (0x11D0B, "V"), + (0x11D37, "X"), + (0x11D3A, "V"), + (0x11D3B, "X"), + (0x11D3C, "V"), + (0x11D3E, "X"), + (0x11D3F, "V"), + (0x11D48, "X"), + (0x11D50, "V"), + (0x11D5A, "X"), + (0x11D60, "V"), + (0x11D66, "X"), + (0x11D67, "V"), + (0x11D69, "X"), + (0x11D6A, "V"), + (0x11D8F, "X"), + (0x11D90, "V"), + (0x11D92, "X"), + (0x11D93, "V"), + (0x11D99, "X"), + (0x11DA0, "V"), + (0x11DAA, "X"), + (0x11EE0, "V"), + (0x11EF9, "X"), + (0x11F00, "V"), + (0x11F11, "X"), + (0x11F12, "V"), + (0x11F3B, "X"), + (0x11F3E, "V"), + ] + + +def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x11F5A, "X"), + (0x11FB0, "V"), + (0x11FB1, "X"), + (0x11FC0, "V"), + (0x11FF2, "X"), + (0x11FFF, "V"), + (0x1239A, "X"), + (0x12400, "V"), + (0x1246F, "X"), + (0x12470, "V"), + (0x12475, "X"), + (0x12480, "V"), + (0x12544, "X"), + (0x12F90, "V"), + (0x12FF3, "X"), + (0x13000, "V"), + (0x13430, "X"), + (0x13440, "V"), + (0x13456, "X"), + (0x14400, "V"), + (0x14647, "X"), + (0x16800, "V"), + (0x16A39, "X"), + (0x16A40, "V"), + (0x16A5F, "X"), + (0x16A60, "V"), + (0x16A6A, "X"), + (0x16A6E, "V"), + (0x16ABF, "X"), + (0x16AC0, "V"), + (0x16ACA, "X"), + (0x16AD0, "V"), + (0x16AEE, "X"), + (0x16AF0, "V"), + (0x16AF6, "X"), + (0x16B00, "V"), + (0x16B46, "X"), + (0x16B50, "V"), + (0x16B5A, "X"), + (0x16B5B, "V"), + (0x16B62, "X"), + (0x16B63, "V"), + (0x16B78, "X"), + (0x16B7D, "V"), + (0x16B90, "X"), + (0x16E40, "M", "𖹠"), + (0x16E41, "M", "𖹡"), + (0x16E42, "M", "𖹢"), + (0x16E43, "M", "𖹣"), + (0x16E44, "M", "𖹤"), + (0x16E45, "M", "𖹥"), + (0x16E46, "M", "𖹦"), + (0x16E47, "M", "𖹧"), + (0x16E48, "M", "𖹨"), + (0x16E49, "M", "𖹩"), + (0x16E4A, "M", "𖹪"), + (0x16E4B, "M", "𖹫"), + (0x16E4C, "M", "𖹬"), + (0x16E4D, "M", "𖹭"), + (0x16E4E, "M", "𖹮"), + (0x16E4F, "M", "𖹯"), + (0x16E50, "M", "𖹰"), + (0x16E51, "M", "𖹱"), + (0x16E52, "M", "𖹲"), + (0x16E53, "M", "𖹳"), + (0x16E54, "M", "𖹴"), + (0x16E55, "M", "𖹵"), + (0x16E56, "M", "𖹶"), + (0x16E57, "M", "𖹷"), + (0x16E58, "M", "𖹸"), + (0x16E59, "M", "𖹹"), + (0x16E5A, "M", "𖹺"), + (0x16E5B, "M", "𖹻"), + (0x16E5C, "M", "𖹼"), + (0x16E5D, "M", "𖹽"), + (0x16E5E, "M", "𖹾"), + (0x16E5F, "M", "𖹿"), + (0x16E60, "V"), + (0x16E9B, "X"), + (0x16F00, "V"), + (0x16F4B, "X"), + (0x16F4F, "V"), + (0x16F88, "X"), + (0x16F8F, "V"), + (0x16FA0, "X"), + (0x16FE0, "V"), + (0x16FE5, "X"), + (0x16FF0, "V"), + (0x16FF2, "X"), + (0x17000, "V"), + (0x187F8, "X"), + (0x18800, "V"), + (0x18CD6, "X"), + (0x18D00, "V"), + (0x18D09, "X"), + (0x1AFF0, "V"), + (0x1AFF4, "X"), + (0x1AFF5, "V"), + (0x1AFFC, "X"), + (0x1AFFD, "V"), + ] + + +def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1AFFF, "X"), + (0x1B000, "V"), + (0x1B123, "X"), + (0x1B132, "V"), + (0x1B133, "X"), + (0x1B150, "V"), + (0x1B153, "X"), + (0x1B155, "V"), + (0x1B156, "X"), + (0x1B164, "V"), + (0x1B168, "X"), + (0x1B170, "V"), + (0x1B2FC, "X"), + (0x1BC00, "V"), + (0x1BC6B, "X"), + (0x1BC70, "V"), + (0x1BC7D, "X"), + (0x1BC80, "V"), + (0x1BC89, "X"), + (0x1BC90, "V"), + (0x1BC9A, "X"), + (0x1BC9C, "V"), + (0x1BCA0, "I"), + (0x1BCA4, "X"), + (0x1CF00, "V"), + (0x1CF2E, "X"), + (0x1CF30, "V"), + (0x1CF47, "X"), + (0x1CF50, "V"), + (0x1CFC4, "X"), + (0x1D000, "V"), + (0x1D0F6, "X"), + (0x1D100, "V"), + (0x1D127, "X"), + (0x1D129, "V"), + (0x1D15E, "M", "𝅗𝅥"), + (0x1D15F, "M", "𝅘𝅥"), + (0x1D160, "M", "𝅘𝅥𝅮"), + (0x1D161, "M", "𝅘𝅥𝅯"), + (0x1D162, "M", "𝅘𝅥𝅰"), + (0x1D163, "M", "𝅘𝅥𝅱"), + (0x1D164, "M", "𝅘𝅥𝅲"), + (0x1D165, "V"), + (0x1D173, "X"), + (0x1D17B, "V"), + (0x1D1BB, "M", "𝆹𝅥"), + (0x1D1BC, "M", "𝆺𝅥"), + (0x1D1BD, "M", "𝆹𝅥𝅮"), + (0x1D1BE, "M", "𝆺𝅥𝅮"), + (0x1D1BF, "M", "𝆹𝅥𝅯"), + (0x1D1C0, "M", "𝆺𝅥𝅯"), + (0x1D1C1, "V"), + (0x1D1EB, "X"), + (0x1D200, "V"), + (0x1D246, "X"), + (0x1D2C0, "V"), + (0x1D2D4, "X"), + (0x1D2E0, "V"), + (0x1D2F4, "X"), + (0x1D300, "V"), + (0x1D357, "X"), + (0x1D360, "V"), + (0x1D379, "X"), + (0x1D400, "M", "a"), + (0x1D401, "M", "b"), + (0x1D402, "M", "c"), + (0x1D403, "M", "d"), + (0x1D404, "M", "e"), + (0x1D405, "M", "f"), + (0x1D406, "M", "g"), + (0x1D407, "M", "h"), + (0x1D408, "M", "i"), + (0x1D409, "M", "j"), + (0x1D40A, "M", "k"), + (0x1D40B, "M", "l"), + (0x1D40C, "M", "m"), + (0x1D40D, "M", "n"), + (0x1D40E, "M", "o"), + (0x1D40F, "M", "p"), + (0x1D410, "M", "q"), + (0x1D411, "M", "r"), + (0x1D412, "M", "s"), + (0x1D413, "M", "t"), + (0x1D414, "M", "u"), + (0x1D415, "M", "v"), + (0x1D416, "M", "w"), + (0x1D417, "M", "x"), + (0x1D418, "M", "y"), + (0x1D419, "M", "z"), + (0x1D41A, "M", "a"), + (0x1D41B, "M", "b"), + (0x1D41C, "M", "c"), + (0x1D41D, "M", "d"), + (0x1D41E, "M", "e"), + (0x1D41F, "M", "f"), + (0x1D420, "M", "g"), + (0x1D421, "M", "h"), + (0x1D422, "M", "i"), + (0x1D423, "M", "j"), + (0x1D424, "M", "k"), + ] + + +def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D425, "M", "l"), + (0x1D426, "M", "m"), + (0x1D427, "M", "n"), + (0x1D428, "M", "o"), + (0x1D429, "M", "p"), + (0x1D42A, "M", "q"), + (0x1D42B, "M", "r"), + (0x1D42C, "M", "s"), + (0x1D42D, "M", "t"), + (0x1D42E, "M", "u"), + (0x1D42F, "M", "v"), + (0x1D430, "M", "w"), + (0x1D431, "M", "x"), + (0x1D432, "M", "y"), + (0x1D433, "M", "z"), + (0x1D434, "M", "a"), + (0x1D435, "M", "b"), + (0x1D436, "M", "c"), + (0x1D437, "M", "d"), + (0x1D438, "M", "e"), + (0x1D439, "M", "f"), + (0x1D43A, "M", "g"), + (0x1D43B, "M", "h"), + (0x1D43C, "M", "i"), + (0x1D43D, "M", "j"), + (0x1D43E, "M", "k"), + (0x1D43F, "M", "l"), + (0x1D440, "M", "m"), + (0x1D441, "M", "n"), + (0x1D442, "M", "o"), + (0x1D443, "M", "p"), + (0x1D444, "M", "q"), + (0x1D445, "M", "r"), + (0x1D446, "M", "s"), + (0x1D447, "M", "t"), + (0x1D448, "M", "u"), + (0x1D449, "M", "v"), + (0x1D44A, "M", "w"), + (0x1D44B, "M", "x"), + (0x1D44C, "M", "y"), + (0x1D44D, "M", "z"), + (0x1D44E, "M", "a"), + (0x1D44F, "M", "b"), + (0x1D450, "M", "c"), + (0x1D451, "M", "d"), + (0x1D452, "M", "e"), + (0x1D453, "M", "f"), + (0x1D454, "M", "g"), + (0x1D455, "X"), + (0x1D456, "M", "i"), + (0x1D457, "M", "j"), + (0x1D458, "M", "k"), + (0x1D459, "M", "l"), + (0x1D45A, "M", "m"), + (0x1D45B, "M", "n"), + (0x1D45C, "M", "o"), + (0x1D45D, "M", "p"), + (0x1D45E, "M", "q"), + (0x1D45F, "M", "r"), + (0x1D460, "M", "s"), + (0x1D461, "M", "t"), + (0x1D462, "M", "u"), + (0x1D463, "M", "v"), + (0x1D464, "M", "w"), + (0x1D465, "M", "x"), + (0x1D466, "M", "y"), + (0x1D467, "M", "z"), + (0x1D468, "M", "a"), + (0x1D469, "M", "b"), + (0x1D46A, "M", "c"), + (0x1D46B, "M", "d"), + (0x1D46C, "M", "e"), + (0x1D46D, "M", "f"), + (0x1D46E, "M", "g"), + (0x1D46F, "M", "h"), + (0x1D470, "M", "i"), + (0x1D471, "M", "j"), + (0x1D472, "M", "k"), + (0x1D473, "M", "l"), + (0x1D474, "M", "m"), + (0x1D475, "M", "n"), + (0x1D476, "M", "o"), + (0x1D477, "M", "p"), + (0x1D478, "M", "q"), + (0x1D479, "M", "r"), + (0x1D47A, "M", "s"), + (0x1D47B, "M", "t"), + (0x1D47C, "M", "u"), + (0x1D47D, "M", "v"), + (0x1D47E, "M", "w"), + (0x1D47F, "M", "x"), + (0x1D480, "M", "y"), + (0x1D481, "M", "z"), + (0x1D482, "M", "a"), + (0x1D483, "M", "b"), + (0x1D484, "M", "c"), + (0x1D485, "M", "d"), + (0x1D486, "M", "e"), + (0x1D487, "M", "f"), + (0x1D488, "M", "g"), + ] + + +def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D489, "M", "h"), + (0x1D48A, "M", "i"), + (0x1D48B, "M", "j"), + (0x1D48C, "M", "k"), + (0x1D48D, "M", "l"), + (0x1D48E, "M", "m"), + (0x1D48F, "M", "n"), + (0x1D490, "M", "o"), + (0x1D491, "M", "p"), + (0x1D492, "M", "q"), + (0x1D493, "M", "r"), + (0x1D494, "M", "s"), + (0x1D495, "M", "t"), + (0x1D496, "M", "u"), + (0x1D497, "M", "v"), + (0x1D498, "M", "w"), + (0x1D499, "M", "x"), + (0x1D49A, "M", "y"), + (0x1D49B, "M", "z"), + (0x1D49C, "M", "a"), + (0x1D49D, "X"), + (0x1D49E, "M", "c"), + (0x1D49F, "M", "d"), + (0x1D4A0, "X"), + (0x1D4A2, "M", "g"), + (0x1D4A3, "X"), + (0x1D4A5, "M", "j"), + (0x1D4A6, "M", "k"), + (0x1D4A7, "X"), + (0x1D4A9, "M", "n"), + (0x1D4AA, "M", "o"), + (0x1D4AB, "M", "p"), + (0x1D4AC, "M", "q"), + (0x1D4AD, "X"), + (0x1D4AE, "M", "s"), + (0x1D4AF, "M", "t"), + (0x1D4B0, "M", "u"), + (0x1D4B1, "M", "v"), + (0x1D4B2, "M", "w"), + (0x1D4B3, "M", "x"), + (0x1D4B4, "M", "y"), + (0x1D4B5, "M", "z"), + (0x1D4B6, "M", "a"), + (0x1D4B7, "M", "b"), + (0x1D4B8, "M", "c"), + (0x1D4B9, "M", "d"), + (0x1D4BA, "X"), + (0x1D4BB, "M", "f"), + (0x1D4BC, "X"), + (0x1D4BD, "M", "h"), + (0x1D4BE, "M", "i"), + (0x1D4BF, "M", "j"), + (0x1D4C0, "M", "k"), + (0x1D4C1, "M", "l"), + (0x1D4C2, "M", "m"), + (0x1D4C3, "M", "n"), + (0x1D4C4, "X"), + (0x1D4C5, "M", "p"), + (0x1D4C6, "M", "q"), + (0x1D4C7, "M", "r"), + (0x1D4C8, "M", "s"), + (0x1D4C9, "M", "t"), + (0x1D4CA, "M", "u"), + (0x1D4CB, "M", "v"), + (0x1D4CC, "M", "w"), + (0x1D4CD, "M", "x"), + (0x1D4CE, "M", "y"), + (0x1D4CF, "M", "z"), + (0x1D4D0, "M", "a"), + (0x1D4D1, "M", "b"), + (0x1D4D2, "M", "c"), + (0x1D4D3, "M", "d"), + (0x1D4D4, "M", "e"), + (0x1D4D5, "M", "f"), + (0x1D4D6, "M", "g"), + (0x1D4D7, "M", "h"), + (0x1D4D8, "M", "i"), + (0x1D4D9, "M", "j"), + (0x1D4DA, "M", "k"), + (0x1D4DB, "M", "l"), + (0x1D4DC, "M", "m"), + (0x1D4DD, "M", "n"), + (0x1D4DE, "M", "o"), + (0x1D4DF, "M", "p"), + (0x1D4E0, "M", "q"), + (0x1D4E1, "M", "r"), + (0x1D4E2, "M", "s"), + (0x1D4E3, "M", "t"), + (0x1D4E4, "M", "u"), + (0x1D4E5, "M", "v"), + (0x1D4E6, "M", "w"), + (0x1D4E7, "M", "x"), + (0x1D4E8, "M", "y"), + (0x1D4E9, "M", "z"), + (0x1D4EA, "M", "a"), + (0x1D4EB, "M", "b"), + (0x1D4EC, "M", "c"), + (0x1D4ED, "M", "d"), + (0x1D4EE, "M", "e"), + (0x1D4EF, "M", "f"), + ] + + +def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D4F0, "M", "g"), + (0x1D4F1, "M", "h"), + (0x1D4F2, "M", "i"), + (0x1D4F3, "M", "j"), + (0x1D4F4, "M", "k"), + (0x1D4F5, "M", "l"), + (0x1D4F6, "M", "m"), + (0x1D4F7, "M", "n"), + (0x1D4F8, "M", "o"), + (0x1D4F9, "M", "p"), + (0x1D4FA, "M", "q"), + (0x1D4FB, "M", "r"), + (0x1D4FC, "M", "s"), + (0x1D4FD, "M", "t"), + (0x1D4FE, "M", "u"), + (0x1D4FF, "M", "v"), + (0x1D500, "M", "w"), + (0x1D501, "M", "x"), + (0x1D502, "M", "y"), + (0x1D503, "M", "z"), + (0x1D504, "M", "a"), + (0x1D505, "M", "b"), + (0x1D506, "X"), + (0x1D507, "M", "d"), + (0x1D508, "M", "e"), + (0x1D509, "M", "f"), + (0x1D50A, "M", "g"), + (0x1D50B, "X"), + (0x1D50D, "M", "j"), + (0x1D50E, "M", "k"), + (0x1D50F, "M", "l"), + (0x1D510, "M", "m"), + (0x1D511, "M", "n"), + (0x1D512, "M", "o"), + (0x1D513, "M", "p"), + (0x1D514, "M", "q"), + (0x1D515, "X"), + (0x1D516, "M", "s"), + (0x1D517, "M", "t"), + (0x1D518, "M", "u"), + (0x1D519, "M", "v"), + (0x1D51A, "M", "w"), + (0x1D51B, "M", "x"), + (0x1D51C, "M", "y"), + (0x1D51D, "X"), + (0x1D51E, "M", "a"), + (0x1D51F, "M", "b"), + (0x1D520, "M", "c"), + (0x1D521, "M", "d"), + (0x1D522, "M", "e"), + (0x1D523, "M", "f"), + (0x1D524, "M", "g"), + (0x1D525, "M", "h"), + (0x1D526, "M", "i"), + (0x1D527, "M", "j"), + (0x1D528, "M", "k"), + (0x1D529, "M", "l"), + (0x1D52A, "M", "m"), + (0x1D52B, "M", "n"), + (0x1D52C, "M", "o"), + (0x1D52D, "M", "p"), + (0x1D52E, "M", "q"), + (0x1D52F, "M", "r"), + (0x1D530, "M", "s"), + (0x1D531, "M", "t"), + (0x1D532, "M", "u"), + (0x1D533, "M", "v"), + (0x1D534, "M", "w"), + (0x1D535, "M", "x"), + (0x1D536, "M", "y"), + (0x1D537, "M", "z"), + (0x1D538, "M", "a"), + (0x1D539, "M", "b"), + (0x1D53A, "X"), + (0x1D53B, "M", "d"), + (0x1D53C, "M", "e"), + (0x1D53D, "M", "f"), + (0x1D53E, "M", "g"), + (0x1D53F, "X"), + (0x1D540, "M", "i"), + (0x1D541, "M", "j"), + (0x1D542, "M", "k"), + (0x1D543, "M", "l"), + (0x1D544, "M", "m"), + (0x1D545, "X"), + (0x1D546, "M", "o"), + (0x1D547, "X"), + (0x1D54A, "M", "s"), + (0x1D54B, "M", "t"), + (0x1D54C, "M", "u"), + (0x1D54D, "M", "v"), + (0x1D54E, "M", "w"), + (0x1D54F, "M", "x"), + (0x1D550, "M", "y"), + (0x1D551, "X"), + (0x1D552, "M", "a"), + (0x1D553, "M", "b"), + (0x1D554, "M", "c"), + (0x1D555, "M", "d"), + (0x1D556, "M", "e"), + ] + + +def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D557, "M", "f"), + (0x1D558, "M", "g"), + (0x1D559, "M", "h"), + (0x1D55A, "M", "i"), + (0x1D55B, "M", "j"), + (0x1D55C, "M", "k"), + (0x1D55D, "M", "l"), + (0x1D55E, "M", "m"), + (0x1D55F, "M", "n"), + (0x1D560, "M", "o"), + (0x1D561, "M", "p"), + (0x1D562, "M", "q"), + (0x1D563, "M", "r"), + (0x1D564, "M", "s"), + (0x1D565, "M", "t"), + (0x1D566, "M", "u"), + (0x1D567, "M", "v"), + (0x1D568, "M", "w"), + (0x1D569, "M", "x"), + (0x1D56A, "M", "y"), + (0x1D56B, "M", "z"), + (0x1D56C, "M", "a"), + (0x1D56D, "M", "b"), + (0x1D56E, "M", "c"), + (0x1D56F, "M", "d"), + (0x1D570, "M", "e"), + (0x1D571, "M", "f"), + (0x1D572, "M", "g"), + (0x1D573, "M", "h"), + (0x1D574, "M", "i"), + (0x1D575, "M", "j"), + (0x1D576, "M", "k"), + (0x1D577, "M", "l"), + (0x1D578, "M", "m"), + (0x1D579, "M", "n"), + (0x1D57A, "M", "o"), + (0x1D57B, "M", "p"), + (0x1D57C, "M", "q"), + (0x1D57D, "M", "r"), + (0x1D57E, "M", "s"), + (0x1D57F, "M", "t"), + (0x1D580, "M", "u"), + (0x1D581, "M", "v"), + (0x1D582, "M", "w"), + (0x1D583, "M", "x"), + (0x1D584, "M", "y"), + (0x1D585, "M", "z"), + (0x1D586, "M", "a"), + (0x1D587, "M", "b"), + (0x1D588, "M", "c"), + (0x1D589, "M", "d"), + (0x1D58A, "M", "e"), + (0x1D58B, "M", "f"), + (0x1D58C, "M", "g"), + (0x1D58D, "M", "h"), + (0x1D58E, "M", "i"), + (0x1D58F, "M", "j"), + (0x1D590, "M", "k"), + (0x1D591, "M", "l"), + (0x1D592, "M", "m"), + (0x1D593, "M", "n"), + (0x1D594, "M", "o"), + (0x1D595, "M", "p"), + (0x1D596, "M", "q"), + (0x1D597, "M", "r"), + (0x1D598, "M", "s"), + (0x1D599, "M", "t"), + (0x1D59A, "M", "u"), + (0x1D59B, "M", "v"), + (0x1D59C, "M", "w"), + (0x1D59D, "M", "x"), + (0x1D59E, "M", "y"), + (0x1D59F, "M", "z"), + (0x1D5A0, "M", "a"), + (0x1D5A1, "M", "b"), + (0x1D5A2, "M", "c"), + (0x1D5A3, "M", "d"), + (0x1D5A4, "M", "e"), + (0x1D5A5, "M", "f"), + (0x1D5A6, "M", "g"), + (0x1D5A7, "M", "h"), + (0x1D5A8, "M", "i"), + (0x1D5A9, "M", "j"), + (0x1D5AA, "M", "k"), + (0x1D5AB, "M", "l"), + (0x1D5AC, "M", "m"), + (0x1D5AD, "M", "n"), + (0x1D5AE, "M", "o"), + (0x1D5AF, "M", "p"), + (0x1D5B0, "M", "q"), + (0x1D5B1, "M", "r"), + (0x1D5B2, "M", "s"), + (0x1D5B3, "M", "t"), + (0x1D5B4, "M", "u"), + (0x1D5B5, "M", "v"), + (0x1D5B6, "M", "w"), + (0x1D5B7, "M", "x"), + (0x1D5B8, "M", "y"), + (0x1D5B9, "M", "z"), + (0x1D5BA, "M", "a"), + ] + + +def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D5BB, "M", "b"), + (0x1D5BC, "M", "c"), + (0x1D5BD, "M", "d"), + (0x1D5BE, "M", "e"), + (0x1D5BF, "M", "f"), + (0x1D5C0, "M", "g"), + (0x1D5C1, "M", "h"), + (0x1D5C2, "M", "i"), + (0x1D5C3, "M", "j"), + (0x1D5C4, "M", "k"), + (0x1D5C5, "M", "l"), + (0x1D5C6, "M", "m"), + (0x1D5C7, "M", "n"), + (0x1D5C8, "M", "o"), + (0x1D5C9, "M", "p"), + (0x1D5CA, "M", "q"), + (0x1D5CB, "M", "r"), + (0x1D5CC, "M", "s"), + (0x1D5CD, "M", "t"), + (0x1D5CE, "M", "u"), + (0x1D5CF, "M", "v"), + (0x1D5D0, "M", "w"), + (0x1D5D1, "M", "x"), + (0x1D5D2, "M", "y"), + (0x1D5D3, "M", "z"), + (0x1D5D4, "M", "a"), + (0x1D5D5, "M", "b"), + (0x1D5D6, "M", "c"), + (0x1D5D7, "M", "d"), + (0x1D5D8, "M", "e"), + (0x1D5D9, "M", "f"), + (0x1D5DA, "M", "g"), + (0x1D5DB, "M", "h"), + (0x1D5DC, "M", "i"), + (0x1D5DD, "M", "j"), + (0x1D5DE, "M", "k"), + (0x1D5DF, "M", "l"), + (0x1D5E0, "M", "m"), + (0x1D5E1, "M", "n"), + (0x1D5E2, "M", "o"), + (0x1D5E3, "M", "p"), + (0x1D5E4, "M", "q"), + (0x1D5E5, "M", "r"), + (0x1D5E6, "M", "s"), + (0x1D5E7, "M", "t"), + (0x1D5E8, "M", "u"), + (0x1D5E9, "M", "v"), + (0x1D5EA, "M", "w"), + (0x1D5EB, "M", "x"), + (0x1D5EC, "M", "y"), + (0x1D5ED, "M", "z"), + (0x1D5EE, "M", "a"), + (0x1D5EF, "M", "b"), + (0x1D5F0, "M", "c"), + (0x1D5F1, "M", "d"), + (0x1D5F2, "M", "e"), + (0x1D5F3, "M", "f"), + (0x1D5F4, "M", "g"), + (0x1D5F5, "M", "h"), + (0x1D5F6, "M", "i"), + (0x1D5F7, "M", "j"), + (0x1D5F8, "M", "k"), + (0x1D5F9, "M", "l"), + (0x1D5FA, "M", "m"), + (0x1D5FB, "M", "n"), + (0x1D5FC, "M", "o"), + (0x1D5FD, "M", "p"), + (0x1D5FE, "M", "q"), + (0x1D5FF, "M", "r"), + (0x1D600, "M", "s"), + (0x1D601, "M", "t"), + (0x1D602, "M", "u"), + (0x1D603, "M", "v"), + (0x1D604, "M", "w"), + (0x1D605, "M", "x"), + (0x1D606, "M", "y"), + (0x1D607, "M", "z"), + (0x1D608, "M", "a"), + (0x1D609, "M", "b"), + (0x1D60A, "M", "c"), + (0x1D60B, "M", "d"), + (0x1D60C, "M", "e"), + (0x1D60D, "M", "f"), + (0x1D60E, "M", "g"), + (0x1D60F, "M", "h"), + (0x1D610, "M", "i"), + (0x1D611, "M", "j"), + (0x1D612, "M", "k"), + (0x1D613, "M", "l"), + (0x1D614, "M", "m"), + (0x1D615, "M", "n"), + (0x1D616, "M", "o"), + (0x1D617, "M", "p"), + (0x1D618, "M", "q"), + (0x1D619, "M", "r"), + (0x1D61A, "M", "s"), + (0x1D61B, "M", "t"), + (0x1D61C, "M", "u"), + (0x1D61D, "M", "v"), + (0x1D61E, "M", "w"), + ] + + +def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D61F, "M", "x"), + (0x1D620, "M", "y"), + (0x1D621, "M", "z"), + (0x1D622, "M", "a"), + (0x1D623, "M", "b"), + (0x1D624, "M", "c"), + (0x1D625, "M", "d"), + (0x1D626, "M", "e"), + (0x1D627, "M", "f"), + (0x1D628, "M", "g"), + (0x1D629, "M", "h"), + (0x1D62A, "M", "i"), + (0x1D62B, "M", "j"), + (0x1D62C, "M", "k"), + (0x1D62D, "M", "l"), + (0x1D62E, "M", "m"), + (0x1D62F, "M", "n"), + (0x1D630, "M", "o"), + (0x1D631, "M", "p"), + (0x1D632, "M", "q"), + (0x1D633, "M", "r"), + (0x1D634, "M", "s"), + (0x1D635, "M", "t"), + (0x1D636, "M", "u"), + (0x1D637, "M", "v"), + (0x1D638, "M", "w"), + (0x1D639, "M", "x"), + (0x1D63A, "M", "y"), + (0x1D63B, "M", "z"), + (0x1D63C, "M", "a"), + (0x1D63D, "M", "b"), + (0x1D63E, "M", "c"), + (0x1D63F, "M", "d"), + (0x1D640, "M", "e"), + (0x1D641, "M", "f"), + (0x1D642, "M", "g"), + (0x1D643, "M", "h"), + (0x1D644, "M", "i"), + (0x1D645, "M", "j"), + (0x1D646, "M", "k"), + (0x1D647, "M", "l"), + (0x1D648, "M", "m"), + (0x1D649, "M", "n"), + (0x1D64A, "M", "o"), + (0x1D64B, "M", "p"), + (0x1D64C, "M", "q"), + (0x1D64D, "M", "r"), + (0x1D64E, "M", "s"), + (0x1D64F, "M", "t"), + (0x1D650, "M", "u"), + (0x1D651, "M", "v"), + (0x1D652, "M", "w"), + (0x1D653, "M", "x"), + (0x1D654, "M", "y"), + (0x1D655, "M", "z"), + (0x1D656, "M", "a"), + (0x1D657, "M", "b"), + (0x1D658, "M", "c"), + (0x1D659, "M", "d"), + (0x1D65A, "M", "e"), + (0x1D65B, "M", "f"), + (0x1D65C, "M", "g"), + (0x1D65D, "M", "h"), + (0x1D65E, "M", "i"), + (0x1D65F, "M", "j"), + (0x1D660, "M", "k"), + (0x1D661, "M", "l"), + (0x1D662, "M", "m"), + (0x1D663, "M", "n"), + (0x1D664, "M", "o"), + (0x1D665, "M", "p"), + (0x1D666, "M", "q"), + (0x1D667, "M", "r"), + (0x1D668, "M", "s"), + (0x1D669, "M", "t"), + (0x1D66A, "M", "u"), + (0x1D66B, "M", "v"), + (0x1D66C, "M", "w"), + (0x1D66D, "M", "x"), + (0x1D66E, "M", "y"), + (0x1D66F, "M", "z"), + (0x1D670, "M", "a"), + (0x1D671, "M", "b"), + (0x1D672, "M", "c"), + (0x1D673, "M", "d"), + (0x1D674, "M", "e"), + (0x1D675, "M", "f"), + (0x1D676, "M", "g"), + (0x1D677, "M", "h"), + (0x1D678, "M", "i"), + (0x1D679, "M", "j"), + (0x1D67A, "M", "k"), + (0x1D67B, "M", "l"), + (0x1D67C, "M", "m"), + (0x1D67D, "M", "n"), + (0x1D67E, "M", "o"), + (0x1D67F, "M", "p"), + (0x1D680, "M", "q"), + (0x1D681, "M", "r"), + (0x1D682, "M", "s"), + ] + + +def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D683, "M", "t"), + (0x1D684, "M", "u"), + (0x1D685, "M", "v"), + (0x1D686, "M", "w"), + (0x1D687, "M", "x"), + (0x1D688, "M", "y"), + (0x1D689, "M", "z"), + (0x1D68A, "M", "a"), + (0x1D68B, "M", "b"), + (0x1D68C, "M", "c"), + (0x1D68D, "M", "d"), + (0x1D68E, "M", "e"), + (0x1D68F, "M", "f"), + (0x1D690, "M", "g"), + (0x1D691, "M", "h"), + (0x1D692, "M", "i"), + (0x1D693, "M", "j"), + (0x1D694, "M", "k"), + (0x1D695, "M", "l"), + (0x1D696, "M", "m"), + (0x1D697, "M", "n"), + (0x1D698, "M", "o"), + (0x1D699, "M", "p"), + (0x1D69A, "M", "q"), + (0x1D69B, "M", "r"), + (0x1D69C, "M", "s"), + (0x1D69D, "M", "t"), + (0x1D69E, "M", "u"), + (0x1D69F, "M", "v"), + (0x1D6A0, "M", "w"), + (0x1D6A1, "M", "x"), + (0x1D6A2, "M", "y"), + (0x1D6A3, "M", "z"), + (0x1D6A4, "M", "ı"), + (0x1D6A5, "M", "ȷ"), + (0x1D6A6, "X"), + (0x1D6A8, "M", "α"), + (0x1D6A9, "M", "β"), + (0x1D6AA, "M", "γ"), + (0x1D6AB, "M", "δ"), + (0x1D6AC, "M", "ε"), + (0x1D6AD, "M", "ζ"), + (0x1D6AE, "M", "η"), + (0x1D6AF, "M", "θ"), + (0x1D6B0, "M", "ι"), + (0x1D6B1, "M", "κ"), + (0x1D6B2, "M", "λ"), + (0x1D6B3, "M", "μ"), + (0x1D6B4, "M", "ν"), + (0x1D6B5, "M", "ξ"), + (0x1D6B6, "M", "ο"), + (0x1D6B7, "M", "π"), + (0x1D6B8, "M", "ρ"), + (0x1D6B9, "M", "θ"), + (0x1D6BA, "M", "σ"), + (0x1D6BB, "M", "τ"), + (0x1D6BC, "M", "υ"), + (0x1D6BD, "M", "φ"), + (0x1D6BE, "M", "χ"), + (0x1D6BF, "M", "ψ"), + (0x1D6C0, "M", "ω"), + (0x1D6C1, "M", "∇"), + (0x1D6C2, "M", "α"), + (0x1D6C3, "M", "β"), + (0x1D6C4, "M", "γ"), + (0x1D6C5, "M", "δ"), + (0x1D6C6, "M", "ε"), + (0x1D6C7, "M", "ζ"), + (0x1D6C8, "M", "η"), + (0x1D6C9, "M", "θ"), + (0x1D6CA, "M", "ι"), + (0x1D6CB, "M", "κ"), + (0x1D6CC, "M", "λ"), + (0x1D6CD, "M", "μ"), + (0x1D6CE, "M", "ν"), + (0x1D6CF, "M", "ξ"), + (0x1D6D0, "M", "ο"), + (0x1D6D1, "M", "π"), + (0x1D6D2, "M", "ρ"), + (0x1D6D3, "M", "σ"), + (0x1D6D5, "M", "τ"), + (0x1D6D6, "M", "υ"), + (0x1D6D7, "M", "φ"), + (0x1D6D8, "M", "χ"), + (0x1D6D9, "M", "ψ"), + (0x1D6DA, "M", "ω"), + (0x1D6DB, "M", "∂"), + (0x1D6DC, "M", "ε"), + (0x1D6DD, "M", "θ"), + (0x1D6DE, "M", "κ"), + (0x1D6DF, "M", "φ"), + (0x1D6E0, "M", "ρ"), + (0x1D6E1, "M", "π"), + (0x1D6E2, "M", "α"), + (0x1D6E3, "M", "β"), + (0x1D6E4, "M", "γ"), + (0x1D6E5, "M", "δ"), + (0x1D6E6, "M", "ε"), + (0x1D6E7, "M", "ζ"), + (0x1D6E8, "M", "η"), + ] + + +def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D6E9, "M", "θ"), + (0x1D6EA, "M", "ι"), + (0x1D6EB, "M", "κ"), + (0x1D6EC, "M", "λ"), + (0x1D6ED, "M", "μ"), + (0x1D6EE, "M", "ν"), + (0x1D6EF, "M", "ξ"), + (0x1D6F0, "M", "ο"), + (0x1D6F1, "M", "π"), + (0x1D6F2, "M", "ρ"), + (0x1D6F3, "M", "θ"), + (0x1D6F4, "M", "σ"), + (0x1D6F5, "M", "τ"), + (0x1D6F6, "M", "υ"), + (0x1D6F7, "M", "φ"), + (0x1D6F8, "M", "χ"), + (0x1D6F9, "M", "ψ"), + (0x1D6FA, "M", "ω"), + (0x1D6FB, "M", "∇"), + (0x1D6FC, "M", "α"), + (0x1D6FD, "M", "β"), + (0x1D6FE, "M", "γ"), + (0x1D6FF, "M", "δ"), + (0x1D700, "M", "ε"), + (0x1D701, "M", "ζ"), + (0x1D702, "M", "η"), + (0x1D703, "M", "θ"), + (0x1D704, "M", "ι"), + (0x1D705, "M", "κ"), + (0x1D706, "M", "λ"), + (0x1D707, "M", "μ"), + (0x1D708, "M", "ν"), + (0x1D709, "M", "ξ"), + (0x1D70A, "M", "ο"), + (0x1D70B, "M", "π"), + (0x1D70C, "M", "ρ"), + (0x1D70D, "M", "σ"), + (0x1D70F, "M", "τ"), + (0x1D710, "M", "υ"), + (0x1D711, "M", "φ"), + (0x1D712, "M", "χ"), + (0x1D713, "M", "ψ"), + (0x1D714, "M", "ω"), + (0x1D715, "M", "∂"), + (0x1D716, "M", "ε"), + (0x1D717, "M", "θ"), + (0x1D718, "M", "κ"), + (0x1D719, "M", "φ"), + (0x1D71A, "M", "ρ"), + (0x1D71B, "M", "π"), + (0x1D71C, "M", "α"), + (0x1D71D, "M", "β"), + (0x1D71E, "M", "γ"), + (0x1D71F, "M", "δ"), + (0x1D720, "M", "ε"), + (0x1D721, "M", "ζ"), + (0x1D722, "M", "η"), + (0x1D723, "M", "θ"), + (0x1D724, "M", "ι"), + (0x1D725, "M", "κ"), + (0x1D726, "M", "λ"), + (0x1D727, "M", "μ"), + (0x1D728, "M", "ν"), + (0x1D729, "M", "ξ"), + (0x1D72A, "M", "ο"), + (0x1D72B, "M", "π"), + (0x1D72C, "M", "ρ"), + (0x1D72D, "M", "θ"), + (0x1D72E, "M", "σ"), + (0x1D72F, "M", "τ"), + (0x1D730, "M", "υ"), + (0x1D731, "M", "φ"), + (0x1D732, "M", "χ"), + (0x1D733, "M", "ψ"), + (0x1D734, "M", "ω"), + (0x1D735, "M", "∇"), + (0x1D736, "M", "α"), + (0x1D737, "M", "β"), + (0x1D738, "M", "γ"), + (0x1D739, "M", "δ"), + (0x1D73A, "M", "ε"), + (0x1D73B, "M", "ζ"), + (0x1D73C, "M", "η"), + (0x1D73D, "M", "θ"), + (0x1D73E, "M", "ι"), + (0x1D73F, "M", "κ"), + (0x1D740, "M", "λ"), + (0x1D741, "M", "μ"), + (0x1D742, "M", "ν"), + (0x1D743, "M", "ξ"), + (0x1D744, "M", "ο"), + (0x1D745, "M", "π"), + (0x1D746, "M", "ρ"), + (0x1D747, "M", "σ"), + (0x1D749, "M", "τ"), + (0x1D74A, "M", "υ"), + (0x1D74B, "M", "φ"), + (0x1D74C, "M", "χ"), + (0x1D74D, "M", "ψ"), + (0x1D74E, "M", "ω"), + ] + + +def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D74F, "M", "∂"), + (0x1D750, "M", "ε"), + (0x1D751, "M", "θ"), + (0x1D752, "M", "κ"), + (0x1D753, "M", "φ"), + (0x1D754, "M", "ρ"), + (0x1D755, "M", "π"), + (0x1D756, "M", "α"), + (0x1D757, "M", "β"), + (0x1D758, "M", "γ"), + (0x1D759, "M", "δ"), + (0x1D75A, "M", "ε"), + (0x1D75B, "M", "ζ"), + (0x1D75C, "M", "η"), + (0x1D75D, "M", "θ"), + (0x1D75E, "M", "ι"), + (0x1D75F, "M", "κ"), + (0x1D760, "M", "λ"), + (0x1D761, "M", "μ"), + (0x1D762, "M", "ν"), + (0x1D763, "M", "ξ"), + (0x1D764, "M", "ο"), + (0x1D765, "M", "π"), + (0x1D766, "M", "ρ"), + (0x1D767, "M", "θ"), + (0x1D768, "M", "σ"), + (0x1D769, "M", "τ"), + (0x1D76A, "M", "υ"), + (0x1D76B, "M", "φ"), + (0x1D76C, "M", "χ"), + (0x1D76D, "M", "ψ"), + (0x1D76E, "M", "ω"), + (0x1D76F, "M", "∇"), + (0x1D770, "M", "α"), + (0x1D771, "M", "β"), + (0x1D772, "M", "γ"), + (0x1D773, "M", "δ"), + (0x1D774, "M", "ε"), + (0x1D775, "M", "ζ"), + (0x1D776, "M", "η"), + (0x1D777, "M", "θ"), + (0x1D778, "M", "ι"), + (0x1D779, "M", "κ"), + (0x1D77A, "M", "λ"), + (0x1D77B, "M", "μ"), + (0x1D77C, "M", "ν"), + (0x1D77D, "M", "ξ"), + (0x1D77E, "M", "ο"), + (0x1D77F, "M", "π"), + (0x1D780, "M", "ρ"), + (0x1D781, "M", "σ"), + (0x1D783, "M", "τ"), + (0x1D784, "M", "υ"), + (0x1D785, "M", "φ"), + (0x1D786, "M", "χ"), + (0x1D787, "M", "ψ"), + (0x1D788, "M", "ω"), + (0x1D789, "M", "∂"), + (0x1D78A, "M", "ε"), + (0x1D78B, "M", "θ"), + (0x1D78C, "M", "κ"), + (0x1D78D, "M", "φ"), + (0x1D78E, "M", "ρ"), + (0x1D78F, "M", "π"), + (0x1D790, "M", "α"), + (0x1D791, "M", "β"), + (0x1D792, "M", "γ"), + (0x1D793, "M", "δ"), + (0x1D794, "M", "ε"), + (0x1D795, "M", "ζ"), + (0x1D796, "M", "η"), + (0x1D797, "M", "θ"), + (0x1D798, "M", "ι"), + (0x1D799, "M", "κ"), + (0x1D79A, "M", "λ"), + (0x1D79B, "M", "μ"), + (0x1D79C, "M", "ν"), + (0x1D79D, "M", "ξ"), + (0x1D79E, "M", "ο"), + (0x1D79F, "M", "π"), + (0x1D7A0, "M", "ρ"), + (0x1D7A1, "M", "θ"), + (0x1D7A2, "M", "σ"), + (0x1D7A3, "M", "τ"), + (0x1D7A4, "M", "υ"), + (0x1D7A5, "M", "φ"), + (0x1D7A6, "M", "χ"), + (0x1D7A7, "M", "ψ"), + (0x1D7A8, "M", "ω"), + (0x1D7A9, "M", "∇"), + (0x1D7AA, "M", "α"), + (0x1D7AB, "M", "β"), + (0x1D7AC, "M", "γ"), + (0x1D7AD, "M", "δ"), + (0x1D7AE, "M", "ε"), + (0x1D7AF, "M", "ζ"), + (0x1D7B0, "M", "η"), + (0x1D7B1, "M", "θ"), + (0x1D7B2, "M", "ι"), + (0x1D7B3, "M", "κ"), + ] + + +def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D7B4, "M", "λ"), + (0x1D7B5, "M", "μ"), + (0x1D7B6, "M", "ν"), + (0x1D7B7, "M", "ξ"), + (0x1D7B8, "M", "ο"), + (0x1D7B9, "M", "π"), + (0x1D7BA, "M", "ρ"), + (0x1D7BB, "M", "σ"), + (0x1D7BD, "M", "τ"), + (0x1D7BE, "M", "υ"), + (0x1D7BF, "M", "φ"), + (0x1D7C0, "M", "χ"), + (0x1D7C1, "M", "ψ"), + (0x1D7C2, "M", "ω"), + (0x1D7C3, "M", "∂"), + (0x1D7C4, "M", "ε"), + (0x1D7C5, "M", "θ"), + (0x1D7C6, "M", "κ"), + (0x1D7C7, "M", "φ"), + (0x1D7C8, "M", "ρ"), + (0x1D7C9, "M", "π"), + (0x1D7CA, "M", "ϝ"), + (0x1D7CC, "X"), + (0x1D7CE, "M", "0"), + (0x1D7CF, "M", "1"), + (0x1D7D0, "M", "2"), + (0x1D7D1, "M", "3"), + (0x1D7D2, "M", "4"), + (0x1D7D3, "M", "5"), + (0x1D7D4, "M", "6"), + (0x1D7D5, "M", "7"), + (0x1D7D6, "M", "8"), + (0x1D7D7, "M", "9"), + (0x1D7D8, "M", "0"), + (0x1D7D9, "M", "1"), + (0x1D7DA, "M", "2"), + (0x1D7DB, "M", "3"), + (0x1D7DC, "M", "4"), + (0x1D7DD, "M", "5"), + (0x1D7DE, "M", "6"), + (0x1D7DF, "M", "7"), + (0x1D7E0, "M", "8"), + (0x1D7E1, "M", "9"), + (0x1D7E2, "M", "0"), + (0x1D7E3, "M", "1"), + (0x1D7E4, "M", "2"), + (0x1D7E5, "M", "3"), + (0x1D7E6, "M", "4"), + (0x1D7E7, "M", "5"), + (0x1D7E8, "M", "6"), + (0x1D7E9, "M", "7"), + (0x1D7EA, "M", "8"), + (0x1D7EB, "M", "9"), + (0x1D7EC, "M", "0"), + (0x1D7ED, "M", "1"), + (0x1D7EE, "M", "2"), + (0x1D7EF, "M", "3"), + (0x1D7F0, "M", "4"), + (0x1D7F1, "M", "5"), + (0x1D7F2, "M", "6"), + (0x1D7F3, "M", "7"), + (0x1D7F4, "M", "8"), + (0x1D7F5, "M", "9"), + (0x1D7F6, "M", "0"), + (0x1D7F7, "M", "1"), + (0x1D7F8, "M", "2"), + (0x1D7F9, "M", "3"), + (0x1D7FA, "M", "4"), + (0x1D7FB, "M", "5"), + (0x1D7FC, "M", "6"), + (0x1D7FD, "M", "7"), + (0x1D7FE, "M", "8"), + (0x1D7FF, "M", "9"), + (0x1D800, "V"), + (0x1DA8C, "X"), + (0x1DA9B, "V"), + (0x1DAA0, "X"), + (0x1DAA1, "V"), + (0x1DAB0, "X"), + (0x1DF00, "V"), + (0x1DF1F, "X"), + (0x1DF25, "V"), + (0x1DF2B, "X"), + (0x1E000, "V"), + (0x1E007, "X"), + (0x1E008, "V"), + (0x1E019, "X"), + (0x1E01B, "V"), + (0x1E022, "X"), + (0x1E023, "V"), + (0x1E025, "X"), + (0x1E026, "V"), + (0x1E02B, "X"), + (0x1E030, "M", "а"), + (0x1E031, "M", "б"), + (0x1E032, "M", "в"), + (0x1E033, "M", "г"), + (0x1E034, "M", "д"), + (0x1E035, "M", "е"), + (0x1E036, "M", "ж"), + ] + + +def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E037, "M", "з"), + (0x1E038, "M", "и"), + (0x1E039, "M", "к"), + (0x1E03A, "M", "л"), + (0x1E03B, "M", "м"), + (0x1E03C, "M", "о"), + (0x1E03D, "M", "п"), + (0x1E03E, "M", "р"), + (0x1E03F, "M", "с"), + (0x1E040, "M", "т"), + (0x1E041, "M", "у"), + (0x1E042, "M", "ф"), + (0x1E043, "M", "х"), + (0x1E044, "M", "ц"), + (0x1E045, "M", "ч"), + (0x1E046, "M", "ш"), + (0x1E047, "M", "ы"), + (0x1E048, "M", "э"), + (0x1E049, "M", "ю"), + (0x1E04A, "M", "ꚉ"), + (0x1E04B, "M", "ә"), + (0x1E04C, "M", "і"), + (0x1E04D, "M", "ј"), + (0x1E04E, "M", "ө"), + (0x1E04F, "M", "ү"), + (0x1E050, "M", "ӏ"), + (0x1E051, "M", "а"), + (0x1E052, "M", "б"), + (0x1E053, "M", "в"), + (0x1E054, "M", "г"), + (0x1E055, "M", "д"), + (0x1E056, "M", "е"), + (0x1E057, "M", "ж"), + (0x1E058, "M", "з"), + (0x1E059, "M", "и"), + (0x1E05A, "M", "к"), + (0x1E05B, "M", "л"), + (0x1E05C, "M", "о"), + (0x1E05D, "M", "п"), + (0x1E05E, "M", "с"), + (0x1E05F, "M", "у"), + (0x1E060, "M", "ф"), + (0x1E061, "M", "х"), + (0x1E062, "M", "ц"), + (0x1E063, "M", "ч"), + (0x1E064, "M", "ш"), + (0x1E065, "M", "ъ"), + (0x1E066, "M", "ы"), + (0x1E067, "M", "ґ"), + (0x1E068, "M", "і"), + (0x1E069, "M", "ѕ"), + (0x1E06A, "M", "џ"), + (0x1E06B, "M", "ҫ"), + (0x1E06C, "M", "ꙑ"), + (0x1E06D, "M", "ұ"), + (0x1E06E, "X"), + (0x1E08F, "V"), + (0x1E090, "X"), + (0x1E100, "V"), + (0x1E12D, "X"), + (0x1E130, "V"), + (0x1E13E, "X"), + (0x1E140, "V"), + (0x1E14A, "X"), + (0x1E14E, "V"), + (0x1E150, "X"), + (0x1E290, "V"), + (0x1E2AF, "X"), + (0x1E2C0, "V"), + (0x1E2FA, "X"), + (0x1E2FF, "V"), + (0x1E300, "X"), + (0x1E4D0, "V"), + (0x1E4FA, "X"), + (0x1E7E0, "V"), + (0x1E7E7, "X"), + (0x1E7E8, "V"), + (0x1E7EC, "X"), + (0x1E7ED, "V"), + (0x1E7EF, "X"), + (0x1E7F0, "V"), + (0x1E7FF, "X"), + (0x1E800, "V"), + (0x1E8C5, "X"), + (0x1E8C7, "V"), + (0x1E8D7, "X"), + (0x1E900, "M", "𞤢"), + (0x1E901, "M", "𞤣"), + (0x1E902, "M", "𞤤"), + (0x1E903, "M", "𞤥"), + (0x1E904, "M", "𞤦"), + (0x1E905, "M", "𞤧"), + (0x1E906, "M", "𞤨"), + (0x1E907, "M", "𞤩"), + (0x1E908, "M", "𞤪"), + (0x1E909, "M", "𞤫"), + (0x1E90A, "M", "𞤬"), + (0x1E90B, "M", "𞤭"), + (0x1E90C, "M", "𞤮"), + (0x1E90D, "M", "𞤯"), + ] + + +def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E90E, "M", "𞤰"), + (0x1E90F, "M", "𞤱"), + (0x1E910, "M", "𞤲"), + (0x1E911, "M", "𞤳"), + (0x1E912, "M", "𞤴"), + (0x1E913, "M", "𞤵"), + (0x1E914, "M", "𞤶"), + (0x1E915, "M", "𞤷"), + (0x1E916, "M", "𞤸"), + (0x1E917, "M", "𞤹"), + (0x1E918, "M", "𞤺"), + (0x1E919, "M", "𞤻"), + (0x1E91A, "M", "𞤼"), + (0x1E91B, "M", "𞤽"), + (0x1E91C, "M", "𞤾"), + (0x1E91D, "M", "𞤿"), + (0x1E91E, "M", "𞥀"), + (0x1E91F, "M", "𞥁"), + (0x1E920, "M", "𞥂"), + (0x1E921, "M", "𞥃"), + (0x1E922, "V"), + (0x1E94C, "X"), + (0x1E950, "V"), + (0x1E95A, "X"), + (0x1E95E, "V"), + (0x1E960, "X"), + (0x1EC71, "V"), + (0x1ECB5, "X"), + (0x1ED01, "V"), + (0x1ED3E, "X"), + (0x1EE00, "M", "ا"), + (0x1EE01, "M", "ب"), + (0x1EE02, "M", "ج"), + (0x1EE03, "M", "د"), + (0x1EE04, "X"), + (0x1EE05, "M", "و"), + (0x1EE06, "M", "ز"), + (0x1EE07, "M", "ح"), + (0x1EE08, "M", "ط"), + (0x1EE09, "M", "ي"), + (0x1EE0A, "M", "ك"), + (0x1EE0B, "M", "ل"), + (0x1EE0C, "M", "م"), + (0x1EE0D, "M", "ن"), + (0x1EE0E, "M", "س"), + (0x1EE0F, "M", "ع"), + (0x1EE10, "M", "ف"), + (0x1EE11, "M", "ص"), + (0x1EE12, "M", "ق"), + (0x1EE13, "M", "ر"), + (0x1EE14, "M", "ش"), + (0x1EE15, "M", "ت"), + (0x1EE16, "M", "ث"), + (0x1EE17, "M", "خ"), + (0x1EE18, "M", "ذ"), + (0x1EE19, "M", "ض"), + (0x1EE1A, "M", "ظ"), + (0x1EE1B, "M", "غ"), + (0x1EE1C, "M", "ٮ"), + (0x1EE1D, "M", "ں"), + (0x1EE1E, "M", "ڡ"), + (0x1EE1F, "M", "ٯ"), + (0x1EE20, "X"), + (0x1EE21, "M", "ب"), + (0x1EE22, "M", "ج"), + (0x1EE23, "X"), + (0x1EE24, "M", "ه"), + (0x1EE25, "X"), + (0x1EE27, "M", "ح"), + (0x1EE28, "X"), + (0x1EE29, "M", "ي"), + (0x1EE2A, "M", "ك"), + (0x1EE2B, "M", "ل"), + (0x1EE2C, "M", "م"), + (0x1EE2D, "M", "ن"), + (0x1EE2E, "M", "س"), + (0x1EE2F, "M", "ع"), + (0x1EE30, "M", "ف"), + (0x1EE31, "M", "ص"), + (0x1EE32, "M", "ق"), + (0x1EE33, "X"), + (0x1EE34, "M", "ش"), + (0x1EE35, "M", "ت"), + (0x1EE36, "M", "ث"), + (0x1EE37, "M", "خ"), + (0x1EE38, "X"), + (0x1EE39, "M", "ض"), + (0x1EE3A, "X"), + (0x1EE3B, "M", "غ"), + (0x1EE3C, "X"), + (0x1EE42, "M", "ج"), + (0x1EE43, "X"), + (0x1EE47, "M", "ح"), + (0x1EE48, "X"), + (0x1EE49, "M", "ي"), + (0x1EE4A, "X"), + (0x1EE4B, "M", "ل"), + (0x1EE4C, "X"), + (0x1EE4D, "M", "ن"), + (0x1EE4E, "M", "س"), + ] + + +def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EE4F, "M", "ع"), + (0x1EE50, "X"), + (0x1EE51, "M", "ص"), + (0x1EE52, "M", "ق"), + (0x1EE53, "X"), + (0x1EE54, "M", "ش"), + (0x1EE55, "X"), + (0x1EE57, "M", "خ"), + (0x1EE58, "X"), + (0x1EE59, "M", "ض"), + (0x1EE5A, "X"), + (0x1EE5B, "M", "غ"), + (0x1EE5C, "X"), + (0x1EE5D, "M", "ں"), + (0x1EE5E, "X"), + (0x1EE5F, "M", "ٯ"), + (0x1EE60, "X"), + (0x1EE61, "M", "ب"), + (0x1EE62, "M", "ج"), + (0x1EE63, "X"), + (0x1EE64, "M", "ه"), + (0x1EE65, "X"), + (0x1EE67, "M", "ح"), + (0x1EE68, "M", "ط"), + (0x1EE69, "M", "ي"), + (0x1EE6A, "M", "ك"), + (0x1EE6B, "X"), + (0x1EE6C, "M", "م"), + (0x1EE6D, "M", "ن"), + (0x1EE6E, "M", "س"), + (0x1EE6F, "M", "ع"), + (0x1EE70, "M", "ف"), + (0x1EE71, "M", "ص"), + (0x1EE72, "M", "ق"), + (0x1EE73, "X"), + (0x1EE74, "M", "ش"), + (0x1EE75, "M", "ت"), + (0x1EE76, "M", "ث"), + (0x1EE77, "M", "خ"), + (0x1EE78, "X"), + (0x1EE79, "M", "ض"), + (0x1EE7A, "M", "ظ"), + (0x1EE7B, "M", "غ"), + (0x1EE7C, "M", "ٮ"), + (0x1EE7D, "X"), + (0x1EE7E, "M", "ڡ"), + (0x1EE7F, "X"), + (0x1EE80, "M", "ا"), + (0x1EE81, "M", "ب"), + (0x1EE82, "M", "ج"), + (0x1EE83, "M", "د"), + (0x1EE84, "M", "ه"), + (0x1EE85, "M", "و"), + (0x1EE86, "M", "ز"), + (0x1EE87, "M", "ح"), + (0x1EE88, "M", "ط"), + (0x1EE89, "M", "ي"), + (0x1EE8A, "X"), + (0x1EE8B, "M", "ل"), + (0x1EE8C, "M", "م"), + (0x1EE8D, "M", "ن"), + (0x1EE8E, "M", "س"), + (0x1EE8F, "M", "ع"), + (0x1EE90, "M", "ف"), + (0x1EE91, "M", "ص"), + (0x1EE92, "M", "ق"), + (0x1EE93, "M", "ر"), + (0x1EE94, "M", "ش"), + (0x1EE95, "M", "ت"), + (0x1EE96, "M", "ث"), + (0x1EE97, "M", "خ"), + (0x1EE98, "M", "ذ"), + (0x1EE99, "M", "ض"), + (0x1EE9A, "M", "ظ"), + (0x1EE9B, "M", "غ"), + (0x1EE9C, "X"), + (0x1EEA1, "M", "ب"), + (0x1EEA2, "M", "ج"), + (0x1EEA3, "M", "د"), + (0x1EEA4, "X"), + (0x1EEA5, "M", "و"), + (0x1EEA6, "M", "ز"), + (0x1EEA7, "M", "ح"), + (0x1EEA8, "M", "ط"), + (0x1EEA9, "M", "ي"), + (0x1EEAA, "X"), + (0x1EEAB, "M", "ل"), + (0x1EEAC, "M", "م"), + (0x1EEAD, "M", "ن"), + (0x1EEAE, "M", "س"), + (0x1EEAF, "M", "ع"), + (0x1EEB0, "M", "ف"), + (0x1EEB1, "M", "ص"), + (0x1EEB2, "M", "ق"), + (0x1EEB3, "M", "ر"), + (0x1EEB4, "M", "ش"), + (0x1EEB5, "M", "ت"), + (0x1EEB6, "M", "ث"), + (0x1EEB7, "M", "خ"), + (0x1EEB8, "M", "ذ"), + ] + + +def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EEB9, "M", "ض"), + (0x1EEBA, "M", "ظ"), + (0x1EEBB, "M", "غ"), + (0x1EEBC, "X"), + (0x1EEF0, "V"), + (0x1EEF2, "X"), + (0x1F000, "V"), + (0x1F02C, "X"), + (0x1F030, "V"), + (0x1F094, "X"), + (0x1F0A0, "V"), + (0x1F0AF, "X"), + (0x1F0B1, "V"), + (0x1F0C0, "X"), + (0x1F0C1, "V"), + (0x1F0D0, "X"), + (0x1F0D1, "V"), + (0x1F0F6, "X"), + (0x1F101, "3", "0,"), + (0x1F102, "3", "1,"), + (0x1F103, "3", "2,"), + (0x1F104, "3", "3,"), + (0x1F105, "3", "4,"), + (0x1F106, "3", "5,"), + (0x1F107, "3", "6,"), + (0x1F108, "3", "7,"), + (0x1F109, "3", "8,"), + (0x1F10A, "3", "9,"), + (0x1F10B, "V"), + (0x1F110, "3", "(a)"), + (0x1F111, "3", "(b)"), + (0x1F112, "3", "(c)"), + (0x1F113, "3", "(d)"), + (0x1F114, "3", "(e)"), + (0x1F115, "3", "(f)"), + (0x1F116, "3", "(g)"), + (0x1F117, "3", "(h)"), + (0x1F118, "3", "(i)"), + (0x1F119, "3", "(j)"), + (0x1F11A, "3", "(k)"), + (0x1F11B, "3", "(l)"), + (0x1F11C, "3", "(m)"), + (0x1F11D, "3", "(n)"), + (0x1F11E, "3", "(o)"), + (0x1F11F, "3", "(p)"), + (0x1F120, "3", "(q)"), + (0x1F121, "3", "(r)"), + (0x1F122, "3", "(s)"), + (0x1F123, "3", "(t)"), + (0x1F124, "3", "(u)"), + (0x1F125, "3", "(v)"), + (0x1F126, "3", "(w)"), + (0x1F127, "3", "(x)"), + (0x1F128, "3", "(y)"), + (0x1F129, "3", "(z)"), + (0x1F12A, "M", "〔s〕"), + (0x1F12B, "M", "c"), + (0x1F12C, "M", "r"), + (0x1F12D, "M", "cd"), + (0x1F12E, "M", "wz"), + (0x1F12F, "V"), + (0x1F130, "M", "a"), + (0x1F131, "M", "b"), + (0x1F132, "M", "c"), + (0x1F133, "M", "d"), + (0x1F134, "M", "e"), + (0x1F135, "M", "f"), + (0x1F136, "M", "g"), + (0x1F137, "M", "h"), + (0x1F138, "M", "i"), + (0x1F139, "M", "j"), + (0x1F13A, "M", "k"), + (0x1F13B, "M", "l"), + (0x1F13C, "M", "m"), + (0x1F13D, "M", "n"), + (0x1F13E, "M", "o"), + (0x1F13F, "M", "p"), + (0x1F140, "M", "q"), + (0x1F141, "M", "r"), + (0x1F142, "M", "s"), + (0x1F143, "M", "t"), + (0x1F144, "M", "u"), + (0x1F145, "M", "v"), + (0x1F146, "M", "w"), + (0x1F147, "M", "x"), + (0x1F148, "M", "y"), + (0x1F149, "M", "z"), + (0x1F14A, "M", "hv"), + (0x1F14B, "M", "mv"), + (0x1F14C, "M", "sd"), + (0x1F14D, "M", "ss"), + (0x1F14E, "M", "ppv"), + (0x1F14F, "M", "wc"), + (0x1F150, "V"), + (0x1F16A, "M", "mc"), + (0x1F16B, "M", "md"), + (0x1F16C, "M", "mr"), + (0x1F16D, "V"), + (0x1F190, "M", "dj"), + (0x1F191, "V"), + ] + + +def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F1AE, "X"), + (0x1F1E6, "V"), + (0x1F200, "M", "ほか"), + (0x1F201, "M", "ココ"), + (0x1F202, "M", "サ"), + (0x1F203, "X"), + (0x1F210, "M", "手"), + (0x1F211, "M", "字"), + (0x1F212, "M", "双"), + (0x1F213, "M", "デ"), + (0x1F214, "M", "二"), + (0x1F215, "M", "多"), + (0x1F216, "M", "解"), + (0x1F217, "M", "天"), + (0x1F218, "M", "交"), + (0x1F219, "M", "映"), + (0x1F21A, "M", "無"), + (0x1F21B, "M", "料"), + (0x1F21C, "M", "前"), + (0x1F21D, "M", "後"), + (0x1F21E, "M", "再"), + (0x1F21F, "M", "新"), + (0x1F220, "M", "初"), + (0x1F221, "M", "終"), + (0x1F222, "M", "生"), + (0x1F223, "M", "販"), + (0x1F224, "M", "声"), + (0x1F225, "M", "吹"), + (0x1F226, "M", "演"), + (0x1F227, "M", "投"), + (0x1F228, "M", "捕"), + (0x1F229, "M", "一"), + (0x1F22A, "M", "三"), + (0x1F22B, "M", "遊"), + (0x1F22C, "M", "左"), + (0x1F22D, "M", "中"), + (0x1F22E, "M", "右"), + (0x1F22F, "M", "指"), + (0x1F230, "M", "走"), + (0x1F231, "M", "打"), + (0x1F232, "M", "禁"), + (0x1F233, "M", "空"), + (0x1F234, "M", "合"), + (0x1F235, "M", "満"), + (0x1F236, "M", "有"), + (0x1F237, "M", "月"), + (0x1F238, "M", "申"), + (0x1F239, "M", "割"), + (0x1F23A, "M", "営"), + (0x1F23B, "M", "配"), + (0x1F23C, "X"), + (0x1F240, "M", "〔本〕"), + (0x1F241, "M", "〔三〕"), + (0x1F242, "M", "〔二〕"), + (0x1F243, "M", "〔安〕"), + (0x1F244, "M", "〔点〕"), + (0x1F245, "M", "〔打〕"), + (0x1F246, "M", "〔盗〕"), + (0x1F247, "M", "〔勝〕"), + (0x1F248, "M", "〔敗〕"), + (0x1F249, "X"), + (0x1F250, "M", "得"), + (0x1F251, "M", "可"), + (0x1F252, "X"), + (0x1F260, "V"), + (0x1F266, "X"), + (0x1F300, "V"), + (0x1F6D8, "X"), + (0x1F6DC, "V"), + (0x1F6ED, "X"), + (0x1F6F0, "V"), + (0x1F6FD, "X"), + (0x1F700, "V"), + (0x1F777, "X"), + (0x1F77B, "V"), + (0x1F7DA, "X"), + (0x1F7E0, "V"), + (0x1F7EC, "X"), + (0x1F7F0, "V"), + (0x1F7F1, "X"), + (0x1F800, "V"), + (0x1F80C, "X"), + (0x1F810, "V"), + (0x1F848, "X"), + (0x1F850, "V"), + (0x1F85A, "X"), + (0x1F860, "V"), + (0x1F888, "X"), + (0x1F890, "V"), + (0x1F8AE, "X"), + (0x1F8B0, "V"), + (0x1F8B2, "X"), + (0x1F900, "V"), + (0x1FA54, "X"), + (0x1FA60, "V"), + (0x1FA6E, "X"), + (0x1FA70, "V"), + (0x1FA7D, "X"), + (0x1FA80, "V"), + (0x1FA89, "X"), + ] + + +def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FA90, "V"), + (0x1FABE, "X"), + (0x1FABF, "V"), + (0x1FAC6, "X"), + (0x1FACE, "V"), + (0x1FADC, "X"), + (0x1FAE0, "V"), + (0x1FAE9, "X"), + (0x1FAF0, "V"), + (0x1FAF9, "X"), + (0x1FB00, "V"), + (0x1FB93, "X"), + (0x1FB94, "V"), + (0x1FBCB, "X"), + (0x1FBF0, "M", "0"), + (0x1FBF1, "M", "1"), + (0x1FBF2, "M", "2"), + (0x1FBF3, "M", "3"), + (0x1FBF4, "M", "4"), + (0x1FBF5, "M", "5"), + (0x1FBF6, "M", "6"), + (0x1FBF7, "M", "7"), + (0x1FBF8, "M", "8"), + (0x1FBF9, "M", "9"), + (0x1FBFA, "X"), + (0x20000, "V"), + (0x2A6E0, "X"), + (0x2A700, "V"), + (0x2B73A, "X"), + (0x2B740, "V"), + (0x2B81E, "X"), + (0x2B820, "V"), + (0x2CEA2, "X"), + (0x2CEB0, "V"), + (0x2EBE1, "X"), + (0x2EBF0, "V"), + (0x2EE5E, "X"), + (0x2F800, "M", "丽"), + (0x2F801, "M", "丸"), + (0x2F802, "M", "乁"), + (0x2F803, "M", "𠄢"), + (0x2F804, "M", "你"), + (0x2F805, "M", "侮"), + (0x2F806, "M", "侻"), + (0x2F807, "M", "倂"), + (0x2F808, "M", "偺"), + (0x2F809, "M", "備"), + (0x2F80A, "M", "僧"), + (0x2F80B, "M", "像"), + (0x2F80C, "M", "㒞"), + (0x2F80D, "M", "𠘺"), + (0x2F80E, "M", "免"), + (0x2F80F, "M", "兔"), + (0x2F810, "M", "兤"), + (0x2F811, "M", "具"), + (0x2F812, "M", "𠔜"), + (0x2F813, "M", "㒹"), + (0x2F814, "M", "內"), + (0x2F815, "M", "再"), + (0x2F816, "M", "𠕋"), + (0x2F817, "M", "冗"), + (0x2F818, "M", "冤"), + (0x2F819, "M", "仌"), + (0x2F81A, "M", "冬"), + (0x2F81B, "M", "况"), + (0x2F81C, "M", "𩇟"), + (0x2F81D, "M", "凵"), + (0x2F81E, "M", "刃"), + (0x2F81F, "M", "㓟"), + (0x2F820, "M", "刻"), + (0x2F821, "M", "剆"), + (0x2F822, "M", "割"), + (0x2F823, "M", "剷"), + (0x2F824, "M", "㔕"), + (0x2F825, "M", "勇"), + (0x2F826, "M", "勉"), + (0x2F827, "M", "勤"), + (0x2F828, "M", "勺"), + (0x2F829, "M", "包"), + (0x2F82A, "M", "匆"), + (0x2F82B, "M", "北"), + (0x2F82C, "M", "卉"), + (0x2F82D, "M", "卑"), + (0x2F82E, "M", "博"), + (0x2F82F, "M", "即"), + (0x2F830, "M", "卽"), + (0x2F831, "M", "卿"), + (0x2F834, "M", "𠨬"), + (0x2F835, "M", "灰"), + (0x2F836, "M", "及"), + (0x2F837, "M", "叟"), + (0x2F838, "M", "𠭣"), + (0x2F839, "M", "叫"), + (0x2F83A, "M", "叱"), + (0x2F83B, "M", "吆"), + (0x2F83C, "M", "咞"), + (0x2F83D, "M", "吸"), + (0x2F83E, "M", "呈"), + (0x2F83F, "M", "周"), + (0x2F840, "M", "咢"), + ] + + +def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F841, "M", "哶"), + (0x2F842, "M", "唐"), + (0x2F843, "M", "啓"), + (0x2F844, "M", "啣"), + (0x2F845, "M", "善"), + (0x2F847, "M", "喙"), + (0x2F848, "M", "喫"), + (0x2F849, "M", "喳"), + (0x2F84A, "M", "嗂"), + (0x2F84B, "M", "圖"), + (0x2F84C, "M", "嘆"), + (0x2F84D, "M", "圗"), + (0x2F84E, "M", "噑"), + (0x2F84F, "M", "噴"), + (0x2F850, "M", "切"), + (0x2F851, "M", "壮"), + (0x2F852, "M", "城"), + (0x2F853, "M", "埴"), + (0x2F854, "M", "堍"), + (0x2F855, "M", "型"), + (0x2F856, "M", "堲"), + (0x2F857, "M", "報"), + (0x2F858, "M", "墬"), + (0x2F859, "M", "𡓤"), + (0x2F85A, "M", "売"), + (0x2F85B, "M", "壷"), + (0x2F85C, "M", "夆"), + (0x2F85D, "M", "多"), + (0x2F85E, "M", "夢"), + (0x2F85F, "M", "奢"), + (0x2F860, "M", "𡚨"), + (0x2F861, "M", "𡛪"), + (0x2F862, "M", "姬"), + (0x2F863, "M", "娛"), + (0x2F864, "M", "娧"), + (0x2F865, "M", "姘"), + (0x2F866, "M", "婦"), + (0x2F867, "M", "㛮"), + (0x2F868, "X"), + (0x2F869, "M", "嬈"), + (0x2F86A, "M", "嬾"), + (0x2F86C, "M", "𡧈"), + (0x2F86D, "M", "寃"), + (0x2F86E, "M", "寘"), + (0x2F86F, "M", "寧"), + (0x2F870, "M", "寳"), + (0x2F871, "M", "𡬘"), + (0x2F872, "M", "寿"), + (0x2F873, "M", "将"), + (0x2F874, "X"), + (0x2F875, "M", "尢"), + (0x2F876, "M", "㞁"), + (0x2F877, "M", "屠"), + (0x2F878, "M", "屮"), + (0x2F879, "M", "峀"), + (0x2F87A, "M", "岍"), + (0x2F87B, "M", "𡷤"), + (0x2F87C, "M", "嵃"), + (0x2F87D, "M", "𡷦"), + (0x2F87E, "M", "嵮"), + (0x2F87F, "M", "嵫"), + (0x2F880, "M", "嵼"), + (0x2F881, "M", "巡"), + (0x2F882, "M", "巢"), + (0x2F883, "M", "㠯"), + (0x2F884, "M", "巽"), + (0x2F885, "M", "帨"), + (0x2F886, "M", "帽"), + (0x2F887, "M", "幩"), + (0x2F888, "M", "㡢"), + (0x2F889, "M", "𢆃"), + (0x2F88A, "M", "㡼"), + (0x2F88B, "M", "庰"), + (0x2F88C, "M", "庳"), + (0x2F88D, "M", "庶"), + (0x2F88E, "M", "廊"), + (0x2F88F, "M", "𪎒"), + (0x2F890, "M", "廾"), + (0x2F891, "M", "𢌱"), + (0x2F893, "M", "舁"), + (0x2F894, "M", "弢"), + (0x2F896, "M", "㣇"), + (0x2F897, "M", "𣊸"), + (0x2F898, "M", "𦇚"), + (0x2F899, "M", "形"), + (0x2F89A, "M", "彫"), + (0x2F89B, "M", "㣣"), + (0x2F89C, "M", "徚"), + (0x2F89D, "M", "忍"), + (0x2F89E, "M", "志"), + (0x2F89F, "M", "忹"), + (0x2F8A0, "M", "悁"), + (0x2F8A1, "M", "㤺"), + (0x2F8A2, "M", "㤜"), + (0x2F8A3, "M", "悔"), + (0x2F8A4, "M", "𢛔"), + (0x2F8A5, "M", "惇"), + (0x2F8A6, "M", "慈"), + (0x2F8A7, "M", "慌"), + (0x2F8A8, "M", "慎"), + ] + + +def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F8A9, "M", "慌"), + (0x2F8AA, "M", "慺"), + (0x2F8AB, "M", "憎"), + (0x2F8AC, "M", "憲"), + (0x2F8AD, "M", "憤"), + (0x2F8AE, "M", "憯"), + (0x2F8AF, "M", "懞"), + (0x2F8B0, "M", "懲"), + (0x2F8B1, "M", "懶"), + (0x2F8B2, "M", "成"), + (0x2F8B3, "M", "戛"), + (0x2F8B4, "M", "扝"), + (0x2F8B5, "M", "抱"), + (0x2F8B6, "M", "拔"), + (0x2F8B7, "M", "捐"), + (0x2F8B8, "M", "𢬌"), + (0x2F8B9, "M", "挽"), + (0x2F8BA, "M", "拼"), + (0x2F8BB, "M", "捨"), + (0x2F8BC, "M", "掃"), + (0x2F8BD, "M", "揤"), + (0x2F8BE, "M", "𢯱"), + (0x2F8BF, "M", "搢"), + (0x2F8C0, "M", "揅"), + (0x2F8C1, "M", "掩"), + (0x2F8C2, "M", "㨮"), + (0x2F8C3, "M", "摩"), + (0x2F8C4, "M", "摾"), + (0x2F8C5, "M", "撝"), + (0x2F8C6, "M", "摷"), + (0x2F8C7, "M", "㩬"), + (0x2F8C8, "M", "敏"), + (0x2F8C9, "M", "敬"), + (0x2F8CA, "M", "𣀊"), + (0x2F8CB, "M", "旣"), + (0x2F8CC, "M", "書"), + (0x2F8CD, "M", "晉"), + (0x2F8CE, "M", "㬙"), + (0x2F8CF, "M", "暑"), + (0x2F8D0, "M", "㬈"), + (0x2F8D1, "M", "㫤"), + (0x2F8D2, "M", "冒"), + (0x2F8D3, "M", "冕"), + (0x2F8D4, "M", "最"), + (0x2F8D5, "M", "暜"), + (0x2F8D6, "M", "肭"), + (0x2F8D7, "M", "䏙"), + (0x2F8D8, "M", "朗"), + (0x2F8D9, "M", "望"), + (0x2F8DA, "M", "朡"), + (0x2F8DB, "M", "杞"), + (0x2F8DC, "M", "杓"), + (0x2F8DD, "M", "𣏃"), + (0x2F8DE, "M", "㭉"), + (0x2F8DF, "M", "柺"), + (0x2F8E0, "M", "枅"), + (0x2F8E1, "M", "桒"), + (0x2F8E2, "M", "梅"), + (0x2F8E3, "M", "𣑭"), + (0x2F8E4, "M", "梎"), + (0x2F8E5, "M", "栟"), + (0x2F8E6, "M", "椔"), + (0x2F8E7, "M", "㮝"), + (0x2F8E8, "M", "楂"), + (0x2F8E9, "M", "榣"), + (0x2F8EA, "M", "槪"), + (0x2F8EB, "M", "檨"), + (0x2F8EC, "M", "𣚣"), + (0x2F8ED, "M", "櫛"), + (0x2F8EE, "M", "㰘"), + (0x2F8EF, "M", "次"), + (0x2F8F0, "M", "𣢧"), + (0x2F8F1, "M", "歔"), + (0x2F8F2, "M", "㱎"), + (0x2F8F3, "M", "歲"), + (0x2F8F4, "M", "殟"), + (0x2F8F5, "M", "殺"), + (0x2F8F6, "M", "殻"), + (0x2F8F7, "M", "𣪍"), + (0x2F8F8, "M", "𡴋"), + (0x2F8F9, "M", "𣫺"), + (0x2F8FA, "M", "汎"), + (0x2F8FB, "M", "𣲼"), + (0x2F8FC, "M", "沿"), + (0x2F8FD, "M", "泍"), + (0x2F8FE, "M", "汧"), + (0x2F8FF, "M", "洖"), + (0x2F900, "M", "派"), + (0x2F901, "M", "海"), + (0x2F902, "M", "流"), + (0x2F903, "M", "浩"), + (0x2F904, "M", "浸"), + (0x2F905, "M", "涅"), + (0x2F906, "M", "𣴞"), + (0x2F907, "M", "洴"), + (0x2F908, "M", "港"), + (0x2F909, "M", "湮"), + (0x2F90A, "M", "㴳"), + (0x2F90B, "M", "滋"), + (0x2F90C, "M", "滇"), + ] + + +def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F90D, "M", "𣻑"), + (0x2F90E, "M", "淹"), + (0x2F90F, "M", "潮"), + (0x2F910, "M", "𣽞"), + (0x2F911, "M", "𣾎"), + (0x2F912, "M", "濆"), + (0x2F913, "M", "瀹"), + (0x2F914, "M", "瀞"), + (0x2F915, "M", "瀛"), + (0x2F916, "M", "㶖"), + (0x2F917, "M", "灊"), + (0x2F918, "M", "災"), + (0x2F919, "M", "灷"), + (0x2F91A, "M", "炭"), + (0x2F91B, "M", "𠔥"), + (0x2F91C, "M", "煅"), + (0x2F91D, "M", "𤉣"), + (0x2F91E, "M", "熜"), + (0x2F91F, "X"), + (0x2F920, "M", "爨"), + (0x2F921, "M", "爵"), + (0x2F922, "M", "牐"), + (0x2F923, "M", "𤘈"), + (0x2F924, "M", "犀"), + (0x2F925, "M", "犕"), + (0x2F926, "M", "𤜵"), + (0x2F927, "M", "𤠔"), + (0x2F928, "M", "獺"), + (0x2F929, "M", "王"), + (0x2F92A, "M", "㺬"), + (0x2F92B, "M", "玥"), + (0x2F92C, "M", "㺸"), + (0x2F92E, "M", "瑇"), + (0x2F92F, "M", "瑜"), + (0x2F930, "M", "瑱"), + (0x2F931, "M", "璅"), + (0x2F932, "M", "瓊"), + (0x2F933, "M", "㼛"), + (0x2F934, "M", "甤"), + (0x2F935, "M", "𤰶"), + (0x2F936, "M", "甾"), + (0x2F937, "M", "𤲒"), + (0x2F938, "M", "異"), + (0x2F939, "M", "𢆟"), + (0x2F93A, "M", "瘐"), + (0x2F93B, "M", "𤾡"), + (0x2F93C, "M", "𤾸"), + (0x2F93D, "M", "𥁄"), + (0x2F93E, "M", "㿼"), + (0x2F93F, "M", "䀈"), + (0x2F940, "M", "直"), + (0x2F941, "M", "𥃳"), + (0x2F942, "M", "𥃲"), + (0x2F943, "M", "𥄙"), + (0x2F944, "M", "𥄳"), + (0x2F945, "M", "眞"), + (0x2F946, "M", "真"), + (0x2F948, "M", "睊"), + (0x2F949, "M", "䀹"), + (0x2F94A, "M", "瞋"), + (0x2F94B, "M", "䁆"), + (0x2F94C, "M", "䂖"), + (0x2F94D, "M", "𥐝"), + (0x2F94E, "M", "硎"), + (0x2F94F, "M", "碌"), + (0x2F950, "M", "磌"), + (0x2F951, "M", "䃣"), + (0x2F952, "M", "𥘦"), + (0x2F953, "M", "祖"), + (0x2F954, "M", "𥚚"), + (0x2F955, "M", "𥛅"), + (0x2F956, "M", "福"), + (0x2F957, "M", "秫"), + (0x2F958, "M", "䄯"), + (0x2F959, "M", "穀"), + (0x2F95A, "M", "穊"), + (0x2F95B, "M", "穏"), + (0x2F95C, "M", "𥥼"), + (0x2F95D, "M", "𥪧"), + (0x2F95F, "X"), + (0x2F960, "M", "䈂"), + (0x2F961, "M", "𥮫"), + (0x2F962, "M", "篆"), + (0x2F963, "M", "築"), + (0x2F964, "M", "䈧"), + (0x2F965, "M", "𥲀"), + (0x2F966, "M", "糒"), + (0x2F967, "M", "䊠"), + (0x2F968, "M", "糨"), + (0x2F969, "M", "糣"), + (0x2F96A, "M", "紀"), + (0x2F96B, "M", "𥾆"), + (0x2F96C, "M", "絣"), + (0x2F96D, "M", "䌁"), + (0x2F96E, "M", "緇"), + (0x2F96F, "M", "縂"), + (0x2F970, "M", "繅"), + (0x2F971, "M", "䌴"), + (0x2F972, "M", "𦈨"), + (0x2F973, "M", "𦉇"), + ] + + +def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F974, "M", "䍙"), + (0x2F975, "M", "𦋙"), + (0x2F976, "M", "罺"), + (0x2F977, "M", "𦌾"), + (0x2F978, "M", "羕"), + (0x2F979, "M", "翺"), + (0x2F97A, "M", "者"), + (0x2F97B, "M", "𦓚"), + (0x2F97C, "M", "𦔣"), + (0x2F97D, "M", "聠"), + (0x2F97E, "M", "𦖨"), + (0x2F97F, "M", "聰"), + (0x2F980, "M", "𣍟"), + (0x2F981, "M", "䏕"), + (0x2F982, "M", "育"), + (0x2F983, "M", "脃"), + (0x2F984, "M", "䐋"), + (0x2F985, "M", "脾"), + (0x2F986, "M", "媵"), + (0x2F987, "M", "𦞧"), + (0x2F988, "M", "𦞵"), + (0x2F989, "M", "𣎓"), + (0x2F98A, "M", "𣎜"), + (0x2F98B, "M", "舁"), + (0x2F98C, "M", "舄"), + (0x2F98D, "M", "辞"), + (0x2F98E, "M", "䑫"), + (0x2F98F, "M", "芑"), + (0x2F990, "M", "芋"), + (0x2F991, "M", "芝"), + (0x2F992, "M", "劳"), + (0x2F993, "M", "花"), + (0x2F994, "M", "芳"), + (0x2F995, "M", "芽"), + (0x2F996, "M", "苦"), + (0x2F997, "M", "𦬼"), + (0x2F998, "M", "若"), + (0x2F999, "M", "茝"), + (0x2F99A, "M", "荣"), + (0x2F99B, "M", "莭"), + (0x2F99C, "M", "茣"), + (0x2F99D, "M", "莽"), + (0x2F99E, "M", "菧"), + (0x2F99F, "M", "著"), + (0x2F9A0, "M", "荓"), + (0x2F9A1, "M", "菊"), + (0x2F9A2, "M", "菌"), + (0x2F9A3, "M", "菜"), + (0x2F9A4, "M", "𦰶"), + (0x2F9A5, "M", "𦵫"), + (0x2F9A6, "M", "𦳕"), + (0x2F9A7, "M", "䔫"), + (0x2F9A8, "M", "蓱"), + (0x2F9A9, "M", "蓳"), + (0x2F9AA, "M", "蔖"), + (0x2F9AB, "M", "𧏊"), + (0x2F9AC, "M", "蕤"), + (0x2F9AD, "M", "𦼬"), + (0x2F9AE, "M", "䕝"), + (0x2F9AF, "M", "䕡"), + (0x2F9B0, "M", "𦾱"), + (0x2F9B1, "M", "𧃒"), + (0x2F9B2, "M", "䕫"), + (0x2F9B3, "M", "虐"), + (0x2F9B4, "M", "虜"), + (0x2F9B5, "M", "虧"), + (0x2F9B6, "M", "虩"), + (0x2F9B7, "M", "蚩"), + (0x2F9B8, "M", "蚈"), + (0x2F9B9, "M", "蜎"), + (0x2F9BA, "M", "蛢"), + (0x2F9BB, "M", "蝹"), + (0x2F9BC, "M", "蜨"), + (0x2F9BD, "M", "蝫"), + (0x2F9BE, "M", "螆"), + (0x2F9BF, "X"), + (0x2F9C0, "M", "蟡"), + (0x2F9C1, "M", "蠁"), + (0x2F9C2, "M", "䗹"), + (0x2F9C3, "M", "衠"), + (0x2F9C4, "M", "衣"), + (0x2F9C5, "M", "𧙧"), + (0x2F9C6, "M", "裗"), + (0x2F9C7, "M", "裞"), + (0x2F9C8, "M", "䘵"), + (0x2F9C9, "M", "裺"), + (0x2F9CA, "M", "㒻"), + (0x2F9CB, "M", "𧢮"), + (0x2F9CC, "M", "𧥦"), + (0x2F9CD, "M", "䚾"), + (0x2F9CE, "M", "䛇"), + (0x2F9CF, "M", "誠"), + (0x2F9D0, "M", "諭"), + (0x2F9D1, "M", "變"), + (0x2F9D2, "M", "豕"), + (0x2F9D3, "M", "𧲨"), + (0x2F9D4, "M", "貫"), + (0x2F9D5, "M", "賁"), + (0x2F9D6, "M", "贛"), + (0x2F9D7, "M", "起"), + ] + + +def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F9D8, "M", "𧼯"), + (0x2F9D9, "M", "𠠄"), + (0x2F9DA, "M", "跋"), + (0x2F9DB, "M", "趼"), + (0x2F9DC, "M", "跰"), + (0x2F9DD, "M", "𠣞"), + (0x2F9DE, "M", "軔"), + (0x2F9DF, "M", "輸"), + (0x2F9E0, "M", "𨗒"), + (0x2F9E1, "M", "𨗭"), + (0x2F9E2, "M", "邔"), + (0x2F9E3, "M", "郱"), + (0x2F9E4, "M", "鄑"), + (0x2F9E5, "M", "𨜮"), + (0x2F9E6, "M", "鄛"), + (0x2F9E7, "M", "鈸"), + (0x2F9E8, "M", "鋗"), + (0x2F9E9, "M", "鋘"), + (0x2F9EA, "M", "鉼"), + (0x2F9EB, "M", "鏹"), + (0x2F9EC, "M", "鐕"), + (0x2F9ED, "M", "𨯺"), + (0x2F9EE, "M", "開"), + (0x2F9EF, "M", "䦕"), + (0x2F9F0, "M", "閷"), + (0x2F9F1, "M", "𨵷"), + (0x2F9F2, "M", "䧦"), + (0x2F9F3, "M", "雃"), + (0x2F9F4, "M", "嶲"), + (0x2F9F5, "M", "霣"), + (0x2F9F6, "M", "𩅅"), + (0x2F9F7, "M", "𩈚"), + (0x2F9F8, "M", "䩮"), + (0x2F9F9, "M", "䩶"), + (0x2F9FA, "M", "韠"), + (0x2F9FB, "M", "𩐊"), + (0x2F9FC, "M", "䪲"), + (0x2F9FD, "M", "𩒖"), + (0x2F9FE, "M", "頋"), + (0x2FA00, "M", "頩"), + (0x2FA01, "M", "𩖶"), + (0x2FA02, "M", "飢"), + (0x2FA03, "M", "䬳"), + (0x2FA04, "M", "餩"), + (0x2FA05, "M", "馧"), + (0x2FA06, "M", "駂"), + (0x2FA07, "M", "駾"), + (0x2FA08, "M", "䯎"), + (0x2FA09, "M", "𩬰"), + (0x2FA0A, "M", "鬒"), + (0x2FA0B, "M", "鱀"), + (0x2FA0C, "M", "鳽"), + (0x2FA0D, "M", "䳎"), + (0x2FA0E, "M", "䳭"), + (0x2FA0F, "M", "鵧"), + (0x2FA10, "M", "𪃎"), + (0x2FA11, "M", "䳸"), + (0x2FA12, "M", "𪄅"), + (0x2FA13, "M", "𪈎"), + (0x2FA14, "M", "𪊑"), + (0x2FA15, "M", "麻"), + (0x2FA16, "M", "䵖"), + (0x2FA17, "M", "黹"), + (0x2FA18, "M", "黾"), + (0x2FA19, "M", "鼅"), + (0x2FA1A, "M", "鼏"), + (0x2FA1B, "M", "鼖"), + (0x2FA1C, "M", "鼻"), + (0x2FA1D, "M", "𪘀"), + (0x2FA1E, "X"), + (0x30000, "V"), + (0x3134B, "X"), + (0x31350, "V"), + (0x323B0, "X"), + (0xE0100, "I"), + (0xE01F0, "X"), + ] + + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() + + _seg_79() + + _seg_80() + + _seg_81() +) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..7b190ca --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2011 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA new file mode 100644 index 0000000..ddf5464 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.1 +Name: itsdangerous +Version: 2.2.0 +Summary: Safely pass data to untrusted environments and back. +Maintainer-email: Pallets +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Typing :: Typed +Project-URL: Changes, https://itsdangerous.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://itsdangerous.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/itsdangerous/ + +# ItsDangerous + +... so better sign this + +Various helpers to pass data to untrusted environments and to get it +back safe and sound. Data is cryptographically signed to ensure that a +token has not been tampered with. + +It's possible to customize how data is serialized. Data is compressed as +needed. A timestamp can be added and verified automatically while +loading a token. + + +## A Simple Example + +Here's how you could generate a token for transmitting a user's id and +name between web requests. + +```python +from itsdangerous import URLSafeSerializer +auth_s = URLSafeSerializer("secret key", "auth") +token = auth_s.dumps({"id": 5, "name": "itsdangerous"}) + +print(token) +# eyJpZCI6NSwibmFtZSI6Iml0c2Rhbmdlcm91cyJ9.6YP6T0BaO67XP--9UzTrmurXSmg + +data = auth_s.loads(token) +print(data["name"]) +# itsdangerous +``` + + +## Donate + +The Pallets organization develops and supports ItsDangerous and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +[please donate today][]. + +[please donate today]: https://palletsprojects.com/donate + diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD new file mode 100644 index 0000000..245f43e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD @@ -0,0 +1,22 @@ +itsdangerous-2.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +itsdangerous-2.2.0.dist-info/LICENSE.txt,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475 +itsdangerous-2.2.0.dist-info/METADATA,sha256=0rk0-1ZwihuU5DnwJVwPWoEI4yWOyCexih3JyZHblhE,1924 +itsdangerous-2.2.0.dist-info/RECORD,, +itsdangerous-2.2.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +itsdangerous/__init__.py,sha256=4SK75sCe29xbRgQE1ZQtMHnKUuZYAf3bSpZOrff1IAY,1427 +itsdangerous/__pycache__/__init__.cpython-312.pyc,, +itsdangerous/__pycache__/_json.cpython-312.pyc,, +itsdangerous/__pycache__/encoding.cpython-312.pyc,, +itsdangerous/__pycache__/exc.cpython-312.pyc,, +itsdangerous/__pycache__/serializer.cpython-312.pyc,, +itsdangerous/__pycache__/signer.cpython-312.pyc,, +itsdangerous/__pycache__/timed.cpython-312.pyc,, +itsdangerous/__pycache__/url_safe.cpython-312.pyc,, +itsdangerous/_json.py,sha256=wPQGmge2yZ9328EHKF6gadGeyGYCJQKxtU-iLKE6UnA,473 +itsdangerous/encoding.py,sha256=wwTz5q_3zLcaAdunk6_vSoStwGqYWe307Zl_U87aRFM,1409 +itsdangerous/exc.py,sha256=Rr3exo0MRFEcPZltwecyK16VV1bE2K9_F1-d-ljcUn4,3201 +itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +itsdangerous/serializer.py,sha256=PmdwADLqkSyQLZ0jOKAgDsAW4k_H0TlA71Ei3z0C5aI,15601 +itsdangerous/signer.py,sha256=YO0CV7NBvHA6j549REHJFUjUojw2pHqwcUpQnU7yNYQ,9647 +itsdangerous/timed.py,sha256=6RvDMqNumGMxf0-HlpaZdN9PUQQmRvrQGplKhxuivUs,8083 +itsdangerous/url_safe.py,sha256=az4e5fXi_vs-YbWj8YZwn4wiVKfeD--GEKRT5Ueu4P4,2505 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL new file mode 100644 index 0000000..3b5e64b --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__init__.py b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__init__.py new file mode 100644 index 0000000..ea55256 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__init__.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +import typing as t + +from .encoding import base64_decode as base64_decode +from .encoding import base64_encode as base64_encode +from .encoding import want_bytes as want_bytes +from .exc import BadData as BadData +from .exc import BadHeader as BadHeader +from .exc import BadPayload as BadPayload +from .exc import BadSignature as BadSignature +from .exc import BadTimeSignature as BadTimeSignature +from .exc import SignatureExpired as SignatureExpired +from .serializer import Serializer as Serializer +from .signer import HMACAlgorithm as HMACAlgorithm +from .signer import NoneAlgorithm as NoneAlgorithm +from .signer import Signer as Signer +from .timed import TimedSerializer as TimedSerializer +from .timed import TimestampSigner as TimestampSigner +from .url_safe import URLSafeSerializer as URLSafeSerializer +from .url_safe import URLSafeTimedSerializer as URLSafeTimedSerializer + + +def __getattr__(name: str) -> t.Any: + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " ItsDangerous 2.3. Use feature detection or" + " 'importlib.metadata.version(\"itsdangerous\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("itsdangerous") + + raise AttributeError(name) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b63a297976209d79f0830f1c7d72d57fcb1b406 GIT binary patch literal 1613 zcmZXU&u<$=6vt=%W4&H`ZO3tbm8ji>Lb`{pAt^`|6;fylMS`fpt&sMz8ha-8ru)O1 z9Vc~^NC8Gr@Be8W$ zNeVa&BaXQjh4JQ*G8By_j_JqOTtZtBp)hMK&~PN^yEx=-v(IS^!@18e*}xnF<^gY0 zOeh0G2jdRz`w=E!6~StF?GW=G6HY5&-}M4|PCGMhJ?MIjitqFWWghmuJ?Yc9{q_3I zb-x`kk9PtXHa4S>P712auU6+ZX-~07$hng!B@`{N$XI`_% zsp-Wgpm{VfnkeIuk@0(3(G8#lXpn0MBC6707*rqJ%#pbHLW}Ek7YHm@PUHG2U zmMAJSV&;k$bR))nuW1LAV*-_8kK(zq?D3e4{VZE6;5z0|KlYJ`Q)C~K)w=J~9qK2= z$;nnOss7(_qU~Z9dSN?GGJ=xo#%L=L%(ug#L>q^Z#fLd_Ukd6T$k2iQ{he>wps7?c_#|j>pvLmHva*;`5#5xKvs_$V zRu#gu5VRii-59PZs|jsJbmE+TN9=vUm!W&D-3TJm^XaE-4NP$};+xPNrxisRpyijS r`VYD`5RW}T?+(z)09gZcb$~vS&j$mvDxb?^<;DPgeyWy~OLCDn){DMs literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a83a6038b06becb7f9a6ae9b1e73c7c2d103a2c2 GIT binary patch literal 1167 zcmZ`&y-yTD6rb5I*5fN68YxURpeBoWt6(%S#Kf3rqRClMm|U|NZU%0TyWMqW4zh3s z1&xiCP+C}E_)}~kk|3)lB-q#?6ed^sX7@PM#7XYWZ{NJH-+S*q_V*VMoYKjD^#CJu zq(07$kpp~s7r+Lhh~heG;4;PvYjv%xXSY!{HS`oweH~F_Tg$!5R-(D)5B1^Vw3mco zB#8{7P?RdUMK1OHI!nS(8B&#H1ph z&AuqDOughJjv03dkD4KMY9b1qMns!+=Ey3Mj*vWvg|l1@BopAqiWQ*VJ*p!3;nPU~ z8%TEFY8`4_O8_mj-Fcq{o+VdHO2A}T@fBrOOQ6Ha8rg{!skWE($l zb)}V*&68$b@*W72nzY%7!6Mb8xms#1E)%{WgqoA%aMcAq4C0>_Wj+I-7xzG{p+kFM z-yYqyM>mUG*Z1t(pS$0aTZKJ)`fI0!)4PN2yBi>OY?njJP{}p;1r@&+2I;h%xdav} zwK$Va9=1(cd=w_G#V>*hzpTVa7hM9B>fi?JYx{mk8qD|8g74>x3b@brUo}a+^U~w{ zG^!}IP=BLJgTbQEYymQgA5d0N&RLC=E1`NMZh}}x2gb~yIdr07^V+G7tl?vYjx9hZ znr=>Hx}OT=ag;Zd1_jMGfejSL)j(52EqC5~OD1s;E~Hpyx%gFhKQE$f&*W4d@-cW& eJ0-4wIMy-7-_Y0*8u@~Te_6eF;sk-nJbwdc=MVS* literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0d3cfc96db747646a68d58a818fcf1440009078 GIT binary patch literal 2667 zcma(SOKcNIbjG{hINmsM67qqPvLq>~fy4zuno^)ZA)-|=qR^iabvK?#Vt2DnXU9O? zq)MwE=&3rF89(6RTunfKnz zy#M?jiG&f1#G}f@mqCOch=o5?Z-Q43VT2YCK?GZ95+^Yh^MDmd1|(LJio|MCl{lEx zh(c7WZZeb%VN{PuV?Dt2A88`NuY<{Y5+&N#YBCJC4zNy@Y^Q(uI=+g4zG;2!&#od8 z`a#Kd`RjE|>TiI?VkDaah^kpbE@}V?ugNsi=4@{bQ!bLNuvg2z{5*%~uw(o4^cw+> zmTV`@qya4IAT1;UxN|xXYkeq~G3@H5ZRfbjGdbHyJQRuovF?aTj+)#|E8Y?8{8i_`rE;pO0Ia(fHIf zpUByJ26pX^I~h*jJ!jQjBUL4?mNzaWULC?4#ZUH8CM&X zm$}V(W{EAS(V;=_Vpn4_6p%@pr-37O8Y}|Pjd=S~o-Atz+6MR>k;35R5NhmP)XI@9 zb0hck=8E1^(tECrl=U4IeRoOUeRHs^4;R&8)&$};&KB7woqY=?wazA(1b$X-R2?ny zj;QNyUw5&NNU)$GRDiPzpzJKP3BH!aS>QZ7*7u%9J&1>VK9`M5ti}Sph&9h*E{vCh zXnxRU@K*s+H;cc(7w`piQTYg6z_C!_WHpS0iV}b@LJ0b0RQ^Xijf^9MC1dKv%?+AP zI+Jm=%($InG!|eYtyzNr%>W*Xyequ$mVMr|GQ{xW)9=NH7z7$YB39=GU9qUmT0p!e z?4F`-{h8@0dQ23k8-Cxk^4^>Y2g03gVi%^4=oQ8@x!@hZ3}9`B&!GU;a$%`sx${os z$lS08Qv2pcR#YXp|6WsDrKzvf)VHLSo8rY#{O@}W zZC46Kz55Zuz;0|Sw(lu74lZvkhF*&65MA-;?p(Uw_hoU4{w*VsW(i-VL zVGpS523a=maPjC!GG{dgJuS+1!U22XbHpp_8PxG(*Y{o5K3nQ5Z`@th_uM>O(ua!b zkhBUKVldCg`iH$Pl;*Jz6J_~C2mcu}Uf1(VK`JThLCm0kQJ!bE8LiEUdn!6gGo)T{y=B`37 zre)p8s*^oZ7Ka;=m7KCD=af0FMl$2@ma%%FNi`~LE19Ev=l43$Jkv7uR*O7Fi?AlL4`zLcGZ_$J75b#AicYXx`RfO@MsQUqm z{89b4{DnGKLTLX{yrO70a<{IvKe)BRob_g z+P4?mb}Wtja^m`lr8ky)imeALt;b5O$9@|xwRm63)*F^*fG4^U)h%^?MsxSC+8xo8pZ>ULm0m*jrtcO?^qH5 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28e3795c5f34c1aaf6131ae8b756040504b5d313 GIT binary patch literal 3927 zcmbVP-H#hr6~AN8*yCOAN7AI5(0oiN+r>@SZbATQRS_typggP)sf1)9&EECgT@Q?B z%)R4Hyz)bkR$?Pj5ecF2$RklC{t;e^R79|-gw!YAoUE&@^2G1l8IM0|1;K25?wND% z+>djAzjIFhvb40o@N7T-d-GRi#y+E$(PJfwaq=f9kC?|iBVa9~ZWyHJf?Pe1HXoQR zvu+wJ$9}*(^N4wtu%6_TZ|enZEx=k7h0I#iRvXrmC}vh$TNhwm6n17UX=@qQrHQc% z+PVzu%EY{j-CSk$-?Vha=r8gxjA9=9QK+`@ZhJfyvELGnWN(Q~H)@=`h4)|Mn1a;} zkJWRYf#aFSY|rp=N9DTdSzi9gtXs$Io>4E{VUOCIr3mJ8kyR~*VZbsoZ zsyA-dlpl-DHgEg_v#OdOD{pl08oW|%cO}8~a5Z&&b+nabSk)TD7x&pe?WG6BzuFi6 zu=a_4?djT;WAmf(3A$J#Js;_ebnTI^KzYP^?B`^idG0W2!&EW!$$W1V6OdkZ-CuTikoI6vFKW21_Jury5Bp20&l@5LT=%gdmtfT!{jT1qEZ|*> zB6ZMWUmUS#In%N~FXybQr?z2T(%aL68tBg+GtrEbH=ulpA!Cj#)xj2U!vZ&~ei;tA zguE-o)im_|FQ zUu^Sk5OJ?!>TA@uATLw5b`~8IB)p&aOT+B^* zLk`z#y(q`k?;$Moob4zSj|=h~^_(a1Dha}Ha<3Oi(`yml(rbK;j3j8VT7|$h{==-D znzpt1oIxaO(~$X>cndwVmsnyY#Bq|zUl#VJuasE#A>!xwT6ZU}l|t(#1v78rhAGU2 z2R!g6f*ugi+0`LJ2Py>0E&aB&GwJW0Y7)j$_+i_Ok*+a8rzn zFGs~9Wd)ZYDZGj`i;UN?P67`~hJeQuJ}%BWB*RDrqtz7%U}RWkrR6jt{c+lJux=A7jR7p_ICXG@x-Z z1;i99+o1LwK0Rj1p(tX@^^tf7ilS(E#GdEireq9tPaQmkpK-EG>5b#?%qpl(LDbn8c<0h3HdWP&uUQ$Zjyp?c}z(0C24!#S^3gGq2 zb<+fEPQ>X#vhV(KB>jCqieVm?WKhMI>t&8= z2u)ZEggr-uz54po>$Sn+igjCa7H!H|(rk9-@}NZ80=rl_rBTlqL;_-(bv}syrxd;b z-~Bkrnfw+4z$9qXTsi^Q6rm_`1Atk>lj>oraMQsfMpF_7;60(*DECk$XNb=*`IduP zIQd!%T7)|-U+F4A&$27xyF!F|_A&f1m7X@^1MNv*ssu;l!dlOvc@Z@l9f@$|cpd47 z`ws1mS}dvJh&rOsLG`}H<5+I(jHXH;iLj$*dRY~oK^=EOI(~Dj@c*Zz(cqsdXU1$G zn$B?HmGOOMWDppps098}F*A+-q@0?pX7p0@pQicws7gH~eum$;;4E17>8fSje$F5g zw9=qTnd;rW4i$?iY{^mmLfmcRD*8q&=`j6L#;c^7)wK{MswAdsKIv5nI zqrW4mYM?}>ehM+j8;0>I`|4-x?5FJVuuwKG9s5IuW_V@M*nIfyAwx5~bl%u_*c&o5 i!?*K>{qfqykf9xx*Noc_%R`1{cxxH@+UE?7Uid%w6LsbQ literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4677e8ae364a02a3840eef259cadd43f12a12118 GIT binary patch literal 15408 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 KVVfyu1pPM!zo66r literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e912c9f66c865885adfa2f20c6a1ac05a2f067ef GIT binary patch literal 8721 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 gH>1Bh@|)Bqfz@UbS;I$eYVS t.Any: + return _json.loads(payload) + + @staticmethod + def dumps(obj: t.Any, **kwargs: t.Any) -> str: + kwargs.setdefault("ensure_ascii", False) + kwargs.setdefault("separators", (",", ":")) + return _json.dumps(obj, **kwargs) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/encoding.py b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/encoding.py new file mode 100644 index 0000000..f5ca80f --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/encoding.py @@ -0,0 +1,54 @@ +from __future__ import annotations + +import base64 +import string +import struct +import typing as t + +from .exc import BadData + + +def want_bytes( + s: str | bytes, encoding: str = "utf-8", errors: str = "strict" +) -> bytes: + if isinstance(s, str): + s = s.encode(encoding, errors) + + return s + + +def base64_encode(string: str | bytes) -> bytes: + """Base64 encode a string of bytes or text. The resulting bytes are + safe to use in URLs. + """ + string = want_bytes(string) + return base64.urlsafe_b64encode(string).rstrip(b"=") + + +def base64_decode(string: str | bytes) -> bytes: + """Base64 decode a URL-safe string of bytes or text. The result is + bytes. + """ + string = want_bytes(string, encoding="ascii", errors="ignore") + string += b"=" * (-len(string) % 4) + + try: + return base64.urlsafe_b64decode(string) + except (TypeError, ValueError) as e: + raise BadData("Invalid base64-encoded data") from e + + +# The alphabet used by base64.urlsafe_* +_base64_alphabet = f"{string.ascii_letters}{string.digits}-_=".encode("ascii") + +_int64_struct = struct.Struct(">Q") +_int_to_bytes = _int64_struct.pack +_bytes_to_int = t.cast("t.Callable[[bytes], tuple[int]]", _int64_struct.unpack) + + +def int_to_bytes(num: int) -> bytes: + return _int_to_bytes(num).lstrip(b"\x00") + + +def bytes_to_int(bytestr: bytes) -> int: + return _bytes_to_int(bytestr.rjust(8, b"\x00"))[0] diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/exc.py b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/exc.py new file mode 100644 index 0000000..a75adcd --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/exc.py @@ -0,0 +1,106 @@ +from __future__ import annotations + +import typing as t +from datetime import datetime + + +class BadData(Exception): + """Raised if bad data of any sort was encountered. This is the base + for all exceptions that ItsDangerous defines. + + .. versionadded:: 0.15 + """ + + def __init__(self, message: str): + super().__init__(message) + self.message = message + + def __str__(self) -> str: + return self.message + + +class BadSignature(BadData): + """Raised if a signature does not match.""" + + def __init__(self, message: str, payload: t.Any | None = None): + super().__init__(message) + + #: The payload that failed the signature test. In some + #: situations you might still want to inspect this, even if + #: you know it was tampered with. + #: + #: .. versionadded:: 0.14 + self.payload: t.Any | None = payload + + +class BadTimeSignature(BadSignature): + """Raised if a time-based signature is invalid. This is a subclass + of :class:`BadSignature`. + """ + + def __init__( + self, + message: str, + payload: t.Any | None = None, + date_signed: datetime | None = None, + ): + super().__init__(message, payload) + + #: If the signature expired this exposes the date of when the + #: signature was created. This can be helpful in order to + #: tell the user how long a link has been gone stale. + #: + #: .. versionchanged:: 2.0 + #: The datetime value is timezone-aware rather than naive. + #: + #: .. versionadded:: 0.14 + self.date_signed = date_signed + + +class SignatureExpired(BadTimeSignature): + """Raised if a signature timestamp is older than ``max_age``. This + is a subclass of :exc:`BadTimeSignature`. + """ + + +class BadHeader(BadSignature): + """Raised if a signed header is invalid in some form. This only + happens for serializers that have a header that goes with the + signature. + + .. versionadded:: 0.24 + """ + + def __init__( + self, + message: str, + payload: t.Any | None = None, + header: t.Any | None = None, + original_error: Exception | None = None, + ): + super().__init__(message, payload) + + #: If the header is actually available but just malformed it + #: might be stored here. + self.header: t.Any | None = header + + #: If available, the error that indicates why the payload was + #: not valid. This might be ``None``. + self.original_error: Exception | None = original_error + + +class BadPayload(BadData): + """Raised if a payload is invalid. This could happen if the payload + is loaded despite an invalid signature, or if there is a mismatch + between the serializer and deserializer. The original exception + that occurred during loading is stored on as :attr:`original_error`. + + .. versionadded:: 0.15 + """ + + def __init__(self, message: str, original_error: Exception | None = None): + super().__init__(message) + + #: If available, the error that indicates why the payload was + #: not valid. This might be ``None``. + self.original_error: Exception | None = original_error diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/py.typed b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/serializer.py b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/serializer.py new file mode 100644 index 0000000..5ddf387 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/serializer.py @@ -0,0 +1,406 @@ +from __future__ import annotations + +import collections.abc as cabc +import json +import typing as t + +from .encoding import want_bytes +from .exc import BadPayload +from .exc import BadSignature +from .signer import _make_keys_list +from .signer import Signer + +if t.TYPE_CHECKING: + import typing_extensions as te + + # This should be either be str or bytes. To avoid having to specify the + # bound type, it falls back to a union if structural matching fails. + _TSerialized = te.TypeVar( + "_TSerialized", bound=t.Union[str, bytes], default=t.Union[str, bytes] + ) +else: + # Still available at runtime on Python < 3.13, but without the default. + _TSerialized = t.TypeVar("_TSerialized", bound=t.Union[str, bytes]) + + +class _PDataSerializer(t.Protocol[_TSerialized]): + def loads(self, payload: _TSerialized, /) -> t.Any: ... + # A signature with additional arguments is not handled correctly by type + # checkers right now, so an overload is used below for serializers that + # don't match this strict protocol. + def dumps(self, obj: t.Any, /) -> _TSerialized: ... + + +# Use TypeIs once it's available in typing_extensions or 3.13. +def is_text_serializer( + serializer: _PDataSerializer[t.Any], +) -> te.TypeGuard[_PDataSerializer[str]]: + """Checks whether a serializer generates text or binary.""" + return isinstance(serializer.dumps({}), str) + + +class Serializer(t.Generic[_TSerialized]): + """A serializer wraps a :class:`~itsdangerous.signer.Signer` to + enable serializing and securely signing data other than bytes. It + can unsign to verify that the data hasn't been changed. + + The serializer provides :meth:`dumps` and :meth:`loads`, similar to + :mod:`json`, and by default uses :mod:`json` internally to serialize + the data to bytes. + + The secret key should be a random string of ``bytes`` and should not + be saved to code or version control. Different salts should be used + to distinguish signing in different contexts. See :doc:`/concepts` + for information about the security of the secret key and salt. + + :param secret_key: The secret key to sign and verify with. Can be a + list of keys, oldest to newest, to support key rotation. + :param salt: Extra key to combine with ``secret_key`` to distinguish + signatures in different contexts. + :param serializer: An object that provides ``dumps`` and ``loads`` + methods for serializing data to a string. Defaults to + :attr:`default_serializer`, which defaults to :mod:`json`. + :param serializer_kwargs: Keyword arguments to pass when calling + ``serializer.dumps``. + :param signer: A ``Signer`` class to instantiate when signing data. + Defaults to :attr:`default_signer`, which defaults to + :class:`~itsdangerous.signer.Signer`. + :param signer_kwargs: Keyword arguments to pass when instantiating + the ``Signer`` class. + :param fallback_signers: List of signer parameters to try when + unsigning with the default signer fails. Each item can be a dict + of ``signer_kwargs``, a ``Signer`` class, or a tuple of + ``(signer, signer_kwargs)``. Defaults to + :attr:`default_fallback_signers`. + + .. versionchanged:: 2.0 + Added support for key rotation by passing a list to + ``secret_key``. + + .. versionchanged:: 2.0 + Removed the default SHA-512 fallback signer from + ``default_fallback_signers``. + + .. versionchanged:: 1.1 + Added support for ``fallback_signers`` and configured a default + SHA-512 fallback. This fallback is for users who used the yanked + 1.0.0 release which defaulted to SHA-512. + + .. versionchanged:: 0.14 + The ``signer`` and ``signer_kwargs`` parameters were added to + the constructor. + """ + + #: The default serialization module to use to serialize data to a + #: string internally. The default is :mod:`json`, but can be changed + #: to any object that provides ``dumps`` and ``loads`` methods. + default_serializer: _PDataSerializer[t.Any] = json + + #: The default ``Signer`` class to instantiate when signing data. + #: The default is :class:`itsdangerous.signer.Signer`. + default_signer: type[Signer] = Signer + + #: The default fallback signers to try when unsigning fails. + default_fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] = [] + + # Serializer[str] if no data serializer is provided, or if it returns str. + @t.overload + def __init__( + self: Serializer[str], + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + serializer: None | _PDataSerializer[str] = None, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Serializer[bytes] with a bytes data serializer positional argument. + @t.overload + def __init__( + self: Serializer[bytes], + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None, + serializer: _PDataSerializer[bytes], + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Serializer[bytes] with a bytes data serializer keyword argument. + @t.overload + def __init__( + self: Serializer[bytes], + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + *, + serializer: _PDataSerializer[bytes], + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Fall back with a positional argument. If the strict signature of + # _PDataSerializer doesn't match, fall back to a union, requiring the user + # to specify the type. + @t.overload + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None, + serializer: t.Any, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Fall back with a keyword argument. + @t.overload + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + *, + serializer: t.Any, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + serializer: t.Any | None = None, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): + #: The list of secret keys to try for verifying signatures, from + #: oldest to newest. The newest (last) key is used for signing. + #: + #: This allows a key rotation system to keep a list of allowed + #: keys and remove expired ones. + self.secret_keys: list[bytes] = _make_keys_list(secret_key) + + if salt is not None: + salt = want_bytes(salt) + # if salt is None then the signer's default is used + + self.salt = salt + + if serializer is None: + serializer = self.default_serializer + + self.serializer: _PDataSerializer[_TSerialized] = serializer + self.is_text_serializer: bool = is_text_serializer(serializer) + + if signer is None: + signer = self.default_signer + + self.signer: type[Signer] = signer + self.signer_kwargs: dict[str, t.Any] = signer_kwargs or {} + + if fallback_signers is None: + fallback_signers = list(self.default_fallback_signers) + + self.fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] = fallback_signers + self.serializer_kwargs: dict[str, t.Any] = serializer_kwargs or {} + + @property + def secret_key(self) -> bytes: + """The newest (last) entry in the :attr:`secret_keys` list. This + is for compatibility from before key rotation support was added. + """ + return self.secret_keys[-1] + + def load_payload( + self, payload: bytes, serializer: _PDataSerializer[t.Any] | None = None + ) -> t.Any: + """Loads the encoded object. This function raises + :class:`.BadPayload` if the payload is not valid. The + ``serializer`` parameter can be used to override the serializer + stored on the class. The encoded ``payload`` should always be + bytes. + """ + if serializer is None: + use_serializer = self.serializer + is_text = self.is_text_serializer + else: + use_serializer = serializer + is_text = is_text_serializer(serializer) + + try: + if is_text: + return use_serializer.loads(payload.decode("utf-8")) # type: ignore[arg-type] + + return use_serializer.loads(payload) # type: ignore[arg-type] + except Exception as e: + raise BadPayload( + "Could not load the payload because an exception" + " occurred on unserializing the data.", + original_error=e, + ) from e + + def dump_payload(self, obj: t.Any) -> bytes: + """Dumps the encoded object. The return value is always bytes. + If the internal serializer returns text, the value will be + encoded as UTF-8. + """ + return want_bytes(self.serializer.dumps(obj, **self.serializer_kwargs)) + + def make_signer(self, salt: str | bytes | None = None) -> Signer: + """Creates a new instance of the signer to be used. The default + implementation uses the :class:`.Signer` base class. + """ + if salt is None: + salt = self.salt + + return self.signer(self.secret_keys, salt=salt, **self.signer_kwargs) + + def iter_unsigners(self, salt: str | bytes | None = None) -> cabc.Iterator[Signer]: + """Iterates over all signers to be tried for unsigning. Starts + with the configured signer, then constructs each signer + specified in ``fallback_signers``. + """ + if salt is None: + salt = self.salt + + yield self.make_signer(salt) + + for fallback in self.fallback_signers: + if isinstance(fallback, dict): + kwargs = fallback + fallback = self.signer + elif isinstance(fallback, tuple): + fallback, kwargs = fallback + else: + kwargs = self.signer_kwargs + + for secret_key in self.secret_keys: + yield fallback(secret_key, salt=salt, **kwargs) + + def dumps(self, obj: t.Any, salt: str | bytes | None = None) -> _TSerialized: + """Returns a signed string serialized with the internal + serializer. The return value can be either a byte or unicode + string depending on the format of the internal serializer. + """ + payload = want_bytes(self.dump_payload(obj)) + rv = self.make_signer(salt).sign(payload) + + if self.is_text_serializer: + return rv.decode("utf-8") # type: ignore[return-value] + + return rv # type: ignore[return-value] + + def dump(self, obj: t.Any, f: t.IO[t.Any], salt: str | bytes | None = None) -> None: + """Like :meth:`dumps` but dumps into a file. The file handle has + to be compatible with what the internal serializer expects. + """ + f.write(self.dumps(obj, salt)) + + def loads( + self, s: str | bytes, salt: str | bytes | None = None, **kwargs: t.Any + ) -> t.Any: + """Reverse of :meth:`dumps`. Raises :exc:`.BadSignature` if the + signature validation fails. + """ + s = want_bytes(s) + last_exception = None + + for signer in self.iter_unsigners(salt): + try: + return self.load_payload(signer.unsign(s)) + except BadSignature as err: + last_exception = err + + raise t.cast(BadSignature, last_exception) + + def load(self, f: t.IO[t.Any], salt: str | bytes | None = None) -> t.Any: + """Like :meth:`loads` but loads from a file.""" + return self.loads(f.read(), salt) + + def loads_unsafe( + self, s: str | bytes, salt: str | bytes | None = None + ) -> tuple[bool, t.Any]: + """Like :meth:`loads` but without verifying the signature. This + is potentially very dangerous to use depending on how your + serializer works. The return value is ``(signature_valid, + payload)`` instead of just the payload. The first item will be a + boolean that indicates if the signature is valid. This function + never fails. + + Use it for debugging only and if you know that your serializer + module is not exploitable (for example, do not use it with a + pickle serializer). + + .. versionadded:: 0.15 + """ + return self._loads_unsafe_impl(s, salt) + + def _loads_unsafe_impl( + self, + s: str | bytes, + salt: str | bytes | None, + load_kwargs: dict[str, t.Any] | None = None, + load_payload_kwargs: dict[str, t.Any] | None = None, + ) -> tuple[bool, t.Any]: + """Low level helper function to implement :meth:`loads_unsafe` + in serializer subclasses. + """ + if load_kwargs is None: + load_kwargs = {} + + try: + return True, self.loads(s, salt=salt, **load_kwargs) + except BadSignature as e: + if e.payload is None: + return False, None + + if load_payload_kwargs is None: + load_payload_kwargs = {} + + try: + return ( + False, + self.load_payload(e.payload, **load_payload_kwargs), + ) + except BadPayload: + return False, None + + def load_unsafe( + self, f: t.IO[t.Any], salt: str | bytes | None = None + ) -> tuple[bool, t.Any]: + """Like :meth:`loads_unsafe` but loads from a file. + + .. versionadded:: 0.15 + """ + return self.loads_unsafe(f.read(), salt=salt) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/signer.py b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/signer.py new file mode 100644 index 0000000..e324dc0 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/signer.py @@ -0,0 +1,266 @@ +from __future__ import annotations + +import collections.abc as cabc +import hashlib +import hmac +import typing as t + +from .encoding import _base64_alphabet +from .encoding import base64_decode +from .encoding import base64_encode +from .encoding import want_bytes +from .exc import BadSignature + + +class SigningAlgorithm: + """Subclasses must implement :meth:`get_signature` to provide + signature generation functionality. + """ + + def get_signature(self, key: bytes, value: bytes) -> bytes: + """Returns the signature for the given key and value.""" + raise NotImplementedError() + + def verify_signature(self, key: bytes, value: bytes, sig: bytes) -> bool: + """Verifies the given signature matches the expected + signature. + """ + return hmac.compare_digest(sig, self.get_signature(key, value)) + + +class NoneAlgorithm(SigningAlgorithm): + """Provides an algorithm that does not perform any signing and + returns an empty signature. + """ + + def get_signature(self, key: bytes, value: bytes) -> bytes: + return b"" + + +def _lazy_sha1(string: bytes = b"") -> t.Any: + """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include + SHA-1, in which case the import and use as a default would fail before the + developer can configure something else. + """ + return hashlib.sha1(string) + + +class HMACAlgorithm(SigningAlgorithm): + """Provides signature generation using HMACs.""" + + #: The digest method to use with the MAC algorithm. This defaults to + #: SHA1, but can be changed to any other function in the hashlib + #: module. + default_digest_method: t.Any = staticmethod(_lazy_sha1) + + def __init__(self, digest_method: t.Any = None): + if digest_method is None: + digest_method = self.default_digest_method + + self.digest_method: t.Any = digest_method + + def get_signature(self, key: bytes, value: bytes) -> bytes: + mac = hmac.new(key, msg=value, digestmod=self.digest_method) + return mac.digest() + + +def _make_keys_list( + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], +) -> list[bytes]: + if isinstance(secret_key, (str, bytes)): + return [want_bytes(secret_key)] + + return [want_bytes(s) for s in secret_key] # pyright: ignore + + +class Signer: + """A signer securely signs bytes, then unsigns them to verify that + the value hasn't been changed. + + The secret key should be a random string of ``bytes`` and should not + be saved to code or version control. Different salts should be used + to distinguish signing in different contexts. See :doc:`/concepts` + for information about the security of the secret key and salt. + + :param secret_key: The secret key to sign and verify with. Can be a + list of keys, oldest to newest, to support key rotation. + :param salt: Extra key to combine with ``secret_key`` to distinguish + signatures in different contexts. + :param sep: Separator between the signature and value. + :param key_derivation: How to derive the signing key from the secret + key and salt. Possible values are ``concat``, ``django-concat``, + or ``hmac``. Defaults to :attr:`default_key_derivation`, which + defaults to ``django-concat``. + :param digest_method: Hash function to use when generating the HMAC + signature. Defaults to :attr:`default_digest_method`, which + defaults to :func:`hashlib.sha1`. Note that the security of the + hash alone doesn't apply when used intermediately in HMAC. + :param algorithm: A :class:`SigningAlgorithm` instance to use + instead of building a default :class:`HMACAlgorithm` with the + ``digest_method``. + + .. versionchanged:: 2.0 + Added support for key rotation by passing a list to + ``secret_key``. + + .. versionchanged:: 0.18 + ``algorithm`` was added as an argument to the class constructor. + + .. versionchanged:: 0.14 + ``key_derivation`` and ``digest_method`` were added as arguments + to the class constructor. + """ + + #: The default digest method to use for the signer. The default is + #: :func:`hashlib.sha1`, but can be changed to any :mod:`hashlib` or + #: compatible object. Note that the security of the hash alone + #: doesn't apply when used intermediately in HMAC. + #: + #: .. versionadded:: 0.14 + default_digest_method: t.Any = staticmethod(_lazy_sha1) + + #: The default scheme to use to derive the signing key from the + #: secret key and salt. The default is ``django-concat``. Possible + #: values are ``concat``, ``django-concat``, and ``hmac``. + #: + #: .. versionadded:: 0.14 + default_key_derivation: str = "django-concat" + + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous.Signer", + sep: str | bytes = b".", + key_derivation: str | None = None, + digest_method: t.Any | None = None, + algorithm: SigningAlgorithm | None = None, + ): + #: The list of secret keys to try for verifying signatures, from + #: oldest to newest. The newest (last) key is used for signing. + #: + #: This allows a key rotation system to keep a list of allowed + #: keys and remove expired ones. + self.secret_keys: list[bytes] = _make_keys_list(secret_key) + self.sep: bytes = want_bytes(sep) + + if self.sep in _base64_alphabet: + raise ValueError( + "The given separator cannot be used because it may be" + " contained in the signature itself. ASCII letters," + " digits, and '-_=' must not be used." + ) + + if salt is not None: + salt = want_bytes(salt) + else: + salt = b"itsdangerous.Signer" + + self.salt = salt + + if key_derivation is None: + key_derivation = self.default_key_derivation + + self.key_derivation: str = key_derivation + + if digest_method is None: + digest_method = self.default_digest_method + + self.digest_method: t.Any = digest_method + + if algorithm is None: + algorithm = HMACAlgorithm(self.digest_method) + + self.algorithm: SigningAlgorithm = algorithm + + @property + def secret_key(self) -> bytes: + """The newest (last) entry in the :attr:`secret_keys` list. This + is for compatibility from before key rotation support was added. + """ + return self.secret_keys[-1] + + def derive_key(self, secret_key: str | bytes | None = None) -> bytes: + """This method is called to derive the key. The default key + derivation choices can be overridden here. Key derivation is not + intended to be used as a security method to make a complex key + out of a short password. Instead you should use large random + secret keys. + + :param secret_key: A specific secret key to derive from. + Defaults to the last item in :attr:`secret_keys`. + + .. versionchanged:: 2.0 + Added the ``secret_key`` parameter. + """ + if secret_key is None: + secret_key = self.secret_keys[-1] + else: + secret_key = want_bytes(secret_key) + + if self.key_derivation == "concat": + return t.cast(bytes, self.digest_method(self.salt + secret_key).digest()) + elif self.key_derivation == "django-concat": + return t.cast( + bytes, self.digest_method(self.salt + b"signer" + secret_key).digest() + ) + elif self.key_derivation == "hmac": + mac = hmac.new(secret_key, digestmod=self.digest_method) + mac.update(self.salt) + return mac.digest() + elif self.key_derivation == "none": + return secret_key + else: + raise TypeError("Unknown key derivation method") + + def get_signature(self, value: str | bytes) -> bytes: + """Returns the signature for the given value.""" + value = want_bytes(value) + key = self.derive_key() + sig = self.algorithm.get_signature(key, value) + return base64_encode(sig) + + def sign(self, value: str | bytes) -> bytes: + """Signs the given string.""" + value = want_bytes(value) + return value + self.sep + self.get_signature(value) + + def verify_signature(self, value: str | bytes, sig: str | bytes) -> bool: + """Verifies the signature for the given value.""" + try: + sig = base64_decode(sig) + except Exception: + return False + + value = want_bytes(value) + + for secret_key in reversed(self.secret_keys): + key = self.derive_key(secret_key) + + if self.algorithm.verify_signature(key, value, sig): + return True + + return False + + def unsign(self, signed_value: str | bytes) -> bytes: + """Unsigns the given string.""" + signed_value = want_bytes(signed_value) + + if self.sep not in signed_value: + raise BadSignature(f"No {self.sep!r} found in value") + + value, sig = signed_value.rsplit(self.sep, 1) + + if self.verify_signature(value, sig): + return value + + raise BadSignature(f"Signature {sig!r} does not match", payload=value) + + def validate(self, signed_value: str | bytes) -> bool: + """Only validates the given signed value. Returns ``True`` if + the signature exists and is valid. + """ + try: + self.unsign(signed_value) + return True + except BadSignature: + return False diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/timed.py b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/timed.py new file mode 100644 index 0000000..7384375 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/timed.py @@ -0,0 +1,228 @@ +from __future__ import annotations + +import collections.abc as cabc +import time +import typing as t +from datetime import datetime +from datetime import timezone + +from .encoding import base64_decode +from .encoding import base64_encode +from .encoding import bytes_to_int +from .encoding import int_to_bytes +from .encoding import want_bytes +from .exc import BadSignature +from .exc import BadTimeSignature +from .exc import SignatureExpired +from .serializer import _TSerialized +from .serializer import Serializer +from .signer import Signer + + +class TimestampSigner(Signer): + """Works like the regular :class:`.Signer` but also records the time + of the signing and can be used to expire signatures. The + :meth:`unsign` method can raise :exc:`.SignatureExpired` if the + unsigning failed because the signature is expired. + """ + + def get_timestamp(self) -> int: + """Returns the current timestamp. The function must return an + integer. + """ + return int(time.time()) + + def timestamp_to_datetime(self, ts: int) -> datetime: + """Convert the timestamp from :meth:`get_timestamp` into an + aware :class`datetime.datetime` in UTC. + + .. versionchanged:: 2.0 + The timestamp is returned as a timezone-aware ``datetime`` + in UTC rather than a naive ``datetime`` assumed to be UTC. + """ + return datetime.fromtimestamp(ts, tz=timezone.utc) + + def sign(self, value: str | bytes) -> bytes: + """Signs the given string and also attaches time information.""" + value = want_bytes(value) + timestamp = base64_encode(int_to_bytes(self.get_timestamp())) + sep = want_bytes(self.sep) + value = value + sep + timestamp + return value + sep + self.get_signature(value) + + # Ignore overlapping signatures check, return_timestamp is the only + # parameter that affects the return type. + + @t.overload + def unsign( # type: ignore[overload-overlap] + self, + signed_value: str | bytes, + max_age: int | None = None, + return_timestamp: t.Literal[False] = False, + ) -> bytes: ... + + @t.overload + def unsign( + self, + signed_value: str | bytes, + max_age: int | None = None, + return_timestamp: t.Literal[True] = True, + ) -> tuple[bytes, datetime]: ... + + def unsign( + self, + signed_value: str | bytes, + max_age: int | None = None, + return_timestamp: bool = False, + ) -> tuple[bytes, datetime] | bytes: + """Works like the regular :meth:`.Signer.unsign` but can also + validate the time. See the base docstring of the class for + the general behavior. If ``return_timestamp`` is ``True`` the + timestamp of the signature will be returned as an aware + :class:`datetime.datetime` object in UTC. + + .. versionchanged:: 2.0 + The timestamp is returned as a timezone-aware ``datetime`` + in UTC rather than a naive ``datetime`` assumed to be UTC. + """ + try: + result = super().unsign(signed_value) + sig_error = None + except BadSignature as e: + sig_error = e + result = e.payload or b"" + + sep = want_bytes(self.sep) + + # If there is no timestamp in the result there is something + # seriously wrong. In case there was a signature error, we raise + # that one directly, otherwise we have a weird situation in + # which we shouldn't have come except someone uses a time-based + # serializer on non-timestamp data, so catch that. + if sep not in result: + if sig_error: + raise sig_error + + raise BadTimeSignature("timestamp missing", payload=result) + + value, ts_bytes = result.rsplit(sep, 1) + ts_int: int | None = None + ts_dt: datetime | None = None + + try: + ts_int = bytes_to_int(base64_decode(ts_bytes)) + except Exception: + pass + + # Signature is *not* okay. Raise a proper error now that we have + # split the value and the timestamp. + if sig_error is not None: + if ts_int is not None: + try: + ts_dt = self.timestamp_to_datetime(ts_int) + except (ValueError, OSError, OverflowError) as exc: + # Windows raises OSError + # 32-bit raises OverflowError + raise BadTimeSignature( + "Malformed timestamp", payload=value + ) from exc + + raise BadTimeSignature(str(sig_error), payload=value, date_signed=ts_dt) + + # Signature was okay but the timestamp is actually not there or + # malformed. Should not happen, but we handle it anyway. + if ts_int is None: + raise BadTimeSignature("Malformed timestamp", payload=value) + + # Check timestamp is not older than max_age + if max_age is not None: + age = self.get_timestamp() - ts_int + + if age > max_age: + raise SignatureExpired( + f"Signature age {age} > {max_age} seconds", + payload=value, + date_signed=self.timestamp_to_datetime(ts_int), + ) + + if age < 0: + raise SignatureExpired( + f"Signature age {age} < 0 seconds", + payload=value, + date_signed=self.timestamp_to_datetime(ts_int), + ) + + if return_timestamp: + return value, self.timestamp_to_datetime(ts_int) + + return value + + def validate(self, signed_value: str | bytes, max_age: int | None = None) -> bool: + """Only validates the given signed value. Returns ``True`` if + the signature exists and is valid.""" + try: + self.unsign(signed_value, max_age=max_age) + return True + except BadSignature: + return False + + +class TimedSerializer(Serializer[_TSerialized]): + """Uses :class:`TimestampSigner` instead of the default + :class:`.Signer`. + """ + + default_signer: type[TimestampSigner] = TimestampSigner + + def iter_unsigners( + self, salt: str | bytes | None = None + ) -> cabc.Iterator[TimestampSigner]: + return t.cast("cabc.Iterator[TimestampSigner]", super().iter_unsigners(salt)) + + # TODO: Signature is incompatible because parameters were added + # before salt. + + def loads( # type: ignore[override] + self, + s: str | bytes, + max_age: int | None = None, + return_timestamp: bool = False, + salt: str | bytes | None = None, + ) -> t.Any: + """Reverse of :meth:`dumps`, raises :exc:`.BadSignature` if the + signature validation fails. If a ``max_age`` is provided it will + ensure the signature is not older than that time in seconds. In + case the signature is outdated, :exc:`.SignatureExpired` is + raised. All arguments are forwarded to the signer's + :meth:`~TimestampSigner.unsign` method. + """ + s = want_bytes(s) + last_exception = None + + for signer in self.iter_unsigners(salt): + try: + base64d, timestamp = signer.unsign( + s, max_age=max_age, return_timestamp=True + ) + payload = self.load_payload(base64d) + + if return_timestamp: + return payload, timestamp + + return payload + except SignatureExpired: + # The signature was unsigned successfully but was + # expired. Do not try the next signer. + raise + except BadSignature as err: + last_exception = err + + raise t.cast(BadSignature, last_exception) + + def loads_unsafe( # type: ignore[override] + self, + s: str | bytes, + max_age: int | None = None, + salt: str | bytes | None = None, + ) -> tuple[bool, t.Any]: + return self._loads_unsafe_impl(s, salt, load_kwargs={"max_age": max_age}) diff --git a/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/url_safe.py b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/url_safe.py new file mode 100644 index 0000000..56a0793 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/itsdangerous/url_safe.py @@ -0,0 +1,83 @@ +from __future__ import annotations + +import typing as t +import zlib + +from ._json import _CompactJSON +from .encoding import base64_decode +from .encoding import base64_encode +from .exc import BadPayload +from .serializer import _PDataSerializer +from .serializer import Serializer +from .timed import TimedSerializer + + +class URLSafeSerializerMixin(Serializer[str]): + """Mixed in with a regular serializer it will attempt to zlib + compress the string to make it shorter if necessary. It will also + base64 encode the string so that it can safely be placed in a URL. + """ + + default_serializer: _PDataSerializer[str] = _CompactJSON + + def load_payload( + self, + payload: bytes, + *args: t.Any, + serializer: t.Any | None = None, + **kwargs: t.Any, + ) -> t.Any: + decompress = False + + if payload.startswith(b"."): + payload = payload[1:] + decompress = True + + try: + json = base64_decode(payload) + except Exception as e: + raise BadPayload( + "Could not base64 decode the payload because of an exception", + original_error=e, + ) from e + + if decompress: + try: + json = zlib.decompress(json) + except Exception as e: + raise BadPayload( + "Could not zlib decompress the payload before decoding the payload", + original_error=e, + ) from e + + return super().load_payload(json, *args, **kwargs) + + def dump_payload(self, obj: t.Any) -> bytes: + json = super().dump_payload(obj) + is_compressed = False + compressed = zlib.compress(json) + + if len(compressed) < (len(json) - 1): + json = compressed + is_compressed = True + + base64d = base64_encode(json) + + if is_compressed: + base64d = b"." + base64d + + return base64d + + +class URLSafeSerializer(URLSafeSerializerMixin, Serializer[str]): + """Works like :class:`.Serializer` but dumps and loads into a URL + safe string consisting of the upper and lowercase character of the + alphabet as well as ``'_'``, ``'-'`` and ``'.'``. + """ + + +class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer[str]): + """Works like :class:`.TimedSerializer` but dumps and loads into a + URL safe string consisting of the upper and lowercase character of + the alphabet as well as ``'_'``, ``'-'`` and ``'.'``. + """ diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER b/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA b/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA new file mode 100644 index 0000000..ffef2ff --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA @@ -0,0 +1,84 @@ +Metadata-Version: 2.4 +Name: Jinja2 +Version: 3.1.6 +Summary: A very fast and expressive template engine. +Maintainer-email: Pallets +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Typing :: Typed +License-File: LICENSE.txt +Requires-Dist: MarkupSafe>=2.0 +Requires-Dist: Babel>=2.7 ; extra == "i18n" +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/jinja/ +Provides-Extra: i18n + +# Jinja + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +## In A Nutshell + +```jinja +{% extends "base.html" %} +{% block title %}Members{% endblock %} +{% block content %} +

+{% endblock %} +``` + +## Donate + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, [please +donate today][]. + +[please donate today]: https://palletsprojects.com/donate + +## Contributing + +See our [detailed contributing documentation][contrib] for many ways to +contribute, including reporting issues, requesting features, asking or answering +questions, and making PRs. + +[contrib]: https://palletsprojects.com/contributing/ + diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD b/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD new file mode 100644 index 0000000..ffa3866 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD @@ -0,0 +1,57 @@ +jinja2-3.1.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +jinja2-3.1.6.dist-info/METADATA,sha256=aMVUj7Z8QTKhOJjZsx7FDGvqKr3ZFdkh8hQ1XDpkmcg,2871 +jinja2-3.1.6.dist-info/RECORD,, +jinja2-3.1.6.dist-info/WHEEL,sha256=_2ozNFCLWc93bK4WKHCO-eDUENDlo-dgc9cU3qokYO4,82 +jinja2-3.1.6.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 +jinja2-3.1.6.dist-info/licenses/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +jinja2/__init__.py,sha256=xxepO9i7DHsqkQrgBEduLtfoz2QCuT6_gbL4XSN1hbU,1928 +jinja2/__pycache__/__init__.cpython-312.pyc,, +jinja2/__pycache__/_identifier.cpython-312.pyc,, +jinja2/__pycache__/async_utils.cpython-312.pyc,, +jinja2/__pycache__/bccache.cpython-312.pyc,, +jinja2/__pycache__/compiler.cpython-312.pyc,, +jinja2/__pycache__/constants.cpython-312.pyc,, +jinja2/__pycache__/debug.cpython-312.pyc,, +jinja2/__pycache__/defaults.cpython-312.pyc,, +jinja2/__pycache__/environment.cpython-312.pyc,, +jinja2/__pycache__/exceptions.cpython-312.pyc,, +jinja2/__pycache__/ext.cpython-312.pyc,, +jinja2/__pycache__/filters.cpython-312.pyc,, +jinja2/__pycache__/idtracking.cpython-312.pyc,, +jinja2/__pycache__/lexer.cpython-312.pyc,, +jinja2/__pycache__/loaders.cpython-312.pyc,, +jinja2/__pycache__/meta.cpython-312.pyc,, +jinja2/__pycache__/nativetypes.cpython-312.pyc,, +jinja2/__pycache__/nodes.cpython-312.pyc,, +jinja2/__pycache__/optimizer.cpython-312.pyc,, +jinja2/__pycache__/parser.cpython-312.pyc,, +jinja2/__pycache__/runtime.cpython-312.pyc,, +jinja2/__pycache__/sandbox.cpython-312.pyc,, +jinja2/__pycache__/tests.cpython-312.pyc,, +jinja2/__pycache__/utils.cpython-312.pyc,, +jinja2/__pycache__/visitor.cpython-312.pyc,, +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=vK-PdsuorOMnWSnEkT3iUJRIkTnYgO2T6MnGxDgHI5o,2834 +jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 +jinja2/compiler.py,sha256=9RpCQl5X88BHllJiPsHPh295Hh0uApvwFJNQuutULeM,74131 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=CnHqCDHd-BVGvti_8ZsTolnXNhA3ECsY-6n_2pwU8Hw,6297 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=9nhrP7Ch-NbGX00wvyr4yy-uhNHq2OCc60ggGrni_fk,61513 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=5PF5eHfh8mXAIxXHHRB2xXbXohi8pE3nHSOxa66uS7E,31875 +jinja2/filters.py,sha256=PQ_Egd9n9jSgtnGQYyF4K5j2nYwhUIulhPnyimkdr-k,55212 +jinja2/idtracking.py,sha256=-ll5lIp73pML3ErUYiIJj7tdmWxcH_IlDv3yA_hiZYo,10555 +jinja2/lexer.py,sha256=LYiYio6br-Tep9nPcupWXsPEtjluw3p1mU-lNBVRUfk,29786 +jinja2/loaders.py,sha256=wIrnxjvcbqh5VwW28NSkfotiDq8qNCxIOSFbGUiSLB4,24055 +jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 +jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 +jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 +jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 +jinja2/parser.py,sha256=lLOFy3sEmHc5IaEHRiH1sQVnId2moUQzhyeJZTtdY30,40383 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=gDk-GvdriJXqgsGbHgrcKTP0Yp6zPXzhzrIpCFH3jAU,34249 +jinja2/sandbox.py,sha256=Mw2aitlY2I8la7FYhcX2YG9BtUYcLnD0Gh3d29cDWrY,15009 +jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 +jinja2/utils.py,sha256=rRp3o9e7ZKS4fyrWRbELyLcpuGVTFcnooaOa1qx_FIk,24129 +jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL b/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL new file mode 100644 index 0000000..23d2d7e --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.11.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt b/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt new file mode 100644 index 0000000..abc3eae --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[babel.extractors] +jinja2=jinja2.ext:babel_extract[i18n] + diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt b/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__init__.py b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__init__.py new file mode 100644 index 0000000..1a423a3 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__init__.py @@ -0,0 +1,38 @@ +"""Jinja is a template engine written in pure Python. It provides a +non-XML syntax that supports inline expressions and an optional +sandboxed environment. +""" + +from .bccache import BytecodeCache as BytecodeCache +from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache +from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache +from .environment import Environment as Environment +from .environment import Template as Template +from .exceptions import TemplateAssertionError as TemplateAssertionError +from .exceptions import TemplateError as TemplateError +from .exceptions import TemplateNotFound as TemplateNotFound +from .exceptions import TemplateRuntimeError as TemplateRuntimeError +from .exceptions import TemplatesNotFound as TemplatesNotFound +from .exceptions import TemplateSyntaxError as TemplateSyntaxError +from .exceptions import UndefinedError as UndefinedError +from .loaders import BaseLoader as BaseLoader +from .loaders import ChoiceLoader as ChoiceLoader +from .loaders import DictLoader as DictLoader +from .loaders import FileSystemLoader as FileSystemLoader +from .loaders import FunctionLoader as FunctionLoader +from .loaders import ModuleLoader as ModuleLoader +from .loaders import PackageLoader as PackageLoader +from .loaders import PrefixLoader as PrefixLoader +from .runtime import ChainableUndefined as ChainableUndefined +from .runtime import DebugUndefined as DebugUndefined +from .runtime import make_logging_undefined as make_logging_undefined +from .runtime import StrictUndefined as StrictUndefined +from .runtime import Undefined as Undefined +from .utils import clear_caches as clear_caches +from .utils import is_undefined as is_undefined +from .utils import pass_context as pass_context +from .utils import pass_environment as pass_environment +from .utils import pass_eval_context as pass_eval_context +from .utils import select_autoescape as select_autoescape + +__version__ = "3.1.6" diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..501111ea31bc21e1e12401f2d7e3379d36f657d7 GIT binary patch literal 1638 zcmZ9MTaVjB6vxN8Y!c^w-}`!ZThOZ7L~Wr^sZ?TbEvQ>oEJ$cxEXN)axAu%RGYLtb z;EitpUxClU2SAEs35h4(fQpwsab~toLapSl-}%p(`>}s5mrVrE7ytY=`Z0&lA1X+m z)LVG{y@AkA$U_);hL;MAFojcw;xup?r!{AQGdQC;8)U;Zyry{#IEQnZb3r~V;DY8n zu!&901>hnsYBqsOxTLuVT*hV1CEyCKXf6X+aaD6AsD*W0*IWf|;D+WJa1%E**MVEO zrMUsz#%;|_;12F+ZUJ|3S92S99j|Nd1RLQd-qhR$-ojg&*MYb3w&o4s9lWD?6L=Tz zYTgR=LJM1(w}JQZzUCd^1AL%)7x)k#YTg6Bg>PxLfN$g5!29^U*}>7_tDisj=?lm5 zh2>b1gi+u~Vi7v@DY3rezLbPoKDDATC)U+Wju`D(pGhm?Y~p(adYP2b<8LmXSz<<| zGqvQ%k(L-o5#v%o*FcR#rV%GX_>4ji>cQV)k%Z6*OaaD#O^FB7PJGU2NT}?Ye?onr zBV%4ZnMvX@kDNO0h=9?(@B?x^6R_HMn>v>ybXA)7ZcFieIW~-u|LW~lfjbF*Dg@zb zQRkd9uBJ{}5~G$F&zZbnW9mUtEAhS@Q|X5!$*m{8SV?Xs=CwYoB)9T4^~kqyP+sDg zCypS`nBx((kkaXh`R+0{&wN)dT5HP#S$LI;F?H2m7EbAsdE;O?M)}HdUpm93QM%%= zhUub1<8a-k;}e+heY6&vOG;PtDU%X*{DO3oYEcE7Sf5bx4cUdr)^#xo?MEbo6Y_lKugMOr6 zYdD{Kec?-T9NiR#=)X{(hI@V6_NgyzyBE#g8O3EA?KBOt?5>L@d}Ho@22+SEMV97PA|FKNBhkp?`ENtt>C(JC_y5rc z^UvnqS@@3}{Pv??V%gvQ{;z)@e5$a2y8p_2mSCS{UTW;+_~rB}b``%$UZt)wpXb=; zN3V9+tJ7EQ>pZ(Yxjtpr)$7J}^V(w9&X?MkZT9c&uj=fp_G_EH_Fj)k&ok1Cq#r{J z(rb_g=_bUXvm&FjV=@jH8E0e|jH(H$UP1z@P8ikpsHQ;*RI5X>aL zsga>ZmKr-4sMIJ>qe2aX8WU5fXB7u3m9r$QZry0}<3LEV75hj;=UWIxF_2bk}&|sSe zdyEFpX^^MEA>1hqx-{@;*rB1%Xn08%xDOYf&}D}%QMkOI%Mo1$G|Dm>sT3SiP^6$o z!GMAb3MLdxY20BnNzx=ulMGE%3<@;CGoA!AO>@O&T$%7#p7B_b$I1|$$10F2k2N3; zk98nEkH;C0t31BP<415Mu9g^APx;9{<0sGgNf+Yt(mpR8@KTqTJYM!0KRw{5C9dx< zuB*I~;*~V7n7pbpUbT6(4H@xff$`=sH(xMrmbr;JGvMZwTbQ=SyrnSSO7a#~bCTRa z!;Z(#Q9O_H^D~IU-8$p0$Jtd!3IopXKEOj$Dw9z z!&t>oYs<^E`#@fectxNd`p@ZDq}R0A5X&kWDjPtA0Bs0pd6M`HHL!;9BH}$yC~r) zmC`9`c7P>~6PC8(Fk8v6)Wm}+HTyt@%@*i|B?~jwF$&fxIFrT=%ksS`D`}9G<`5uL zR?dI{ssInHtXN^$$iW!-uv|;R)VA+*yis?0#{I)j-&y!#ek1zDy@zX0)|Xdc)*ozc zMmJW?$esMQe*K%pM{7@_ix1aUK76+LbaP{QJ-T@R>X*s%afBo6lKls&?wWW_%qQBmF z18d7K`O}}^5H8Hk&0R;{2)`eB^GDgY_uk!lH=K`r?{7c8TbO@yK6Y;dpZCcB0AdUL A^#A|> literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2234a4b756ffb44d008f66c8f754ec15ea88f502 GIT binary patch literal 4959 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 UX}a%?zU(^b literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ada50846028bc2299d99dab4ad944938db255e1a GIT binary patch literal 19330 zcmeHveQ;FAwdcJvcfMydBaOZg7%oU4je!v#w!s4I00ILx!ZG;S)+QN^X0FhP(TsfW z3_@DrB7WXPypY9u@vg*+cab-#G8CzeQ?<3RcT<&^_o|*>ZPgaC@JhK>QoP#iR{4*u zH&{y9MgG~}>Av^Q2Lq0`cK_RJ(|xCJ_v!A_r%#`+)_(~EyaJvRpDzsluO|fIzta!% zaT+hn|4|f#X(1`}3P~|(ON+fC%Wb_jmfL&nESGvEmOFYKEO+)gS?=m}vE1G3X1S-= zi`<^}4f}ijBEgi>f#I6o8uso;2ZuwwAyH7gLmSMY6mxYQgHhKTPCApWbp3EcZ-Xe< zglB}L`wb!KQNlx8inYzR8+QKI+m!V7HYa^HL2(T2FuxXar8()pVdKBYkv*`UYv{3J zEAuTWuEJ|FFpl1o>NT8HW88&WW&QN7W;3Y441#9=y=z!m2xYZa*(0p14rO8G5o=a! zS!q2=8%j#ojoBiNaT$wuYEY50Be_&I6Hm+iV>u;}O)7FCoLfXljE7BoC7SXlfp+7 z%Gm)qo=&4Ut0`6^&8wxeqnez|j%EnHD#u4g(y0V*lFMf0;e28+>h+#10v{bzR6r;n zUK~Z)ft-?&2eRs!ROYlis`Qrv)6gQG^HRN3CY4LY)2VSKDPv$X(1DbyE!h5mK>8D&g&s!A@eW)cSBT40Fimn9_A!kBPf?71#PY?z{w z9#Co5YgAvB?>*Bwm>pI+6WMhCSf`d#QzJ@e^sJIO+nG-FcaDr<2{SvR+jn$g#g(li z@x+<T2Dy>5{+8Rc+?PHbh}n{94K8&l^sYf2zSDb zY8Y<}cEqc@W3fzpSc%1SZ!9*PP3F_|?vKS@&BxQm7dx<{J7@!GYAy97=5+T7V`J&| zR3@i35l9*-2TtQri7;5Q8ZX*GByR|d?yWOBZ@IV5K0fc>T5t-7#be@KyUo+I*wj*B zd20vHcRu#Zu3vP$pZLYo?Dw5O?TQ2SID7*A8BK^S=FpDM2+5x{BPkwOp2Q1Et8v zzyYwYi%cde%SUtVnw(G-@TsJi2!l9ODIe$`V|<{37gDW}xMp-kj3S+lCyBcZ%f}`9&yxuHd0LneFHwg=MxOe$08X9GU>ej7=7UcujX}e_ z;`v;57;G>Bra1=AG^8YQGB!q%reLsYd{9r5}3O=yY+Q>;NF9z}93C&}dDDN{5e+^yH`p zdve4=*>l6FXXfW^6Sm^lGeDYJJMmTPCg#l3P#9torU{+r6QTtj^f2Tv|4P3m?0;@g z9wA3Z0(&0b7bwqUgu&}r>;!Il6 zC88UZk-lpW?uc#QQ@4WKJ{N4BuvP!J{<;E=zwkYc7VpE(mIGelrnl|DcKgk3BGT%6;P(%KS8jvZ!1H!{8xazpEhYUUn zJ}E||@jc!7;gRxV4QEo8l{|?2jN>laGv1tt(@8O^LdcUL0DQb2M2^btm=E;js z-tw(ks#|?)%@gx=yKeb+ExJ9IT^C(%xo^8yExBth`!4$4?4CY8b$oXFZ2Y#nW62%7 z?7!%L^VIY!Q?Ja5pSU-04(TM}HgmcloyGje$f}Y+ZF5UP!@VlTyDyZ{3tsXaQ|hMoAR^wAYZlA>6e& z9qvL%ax}~yF9^uqx3law8p}S)EmPsL-{$BnxN9BZnOColUl}h5c)gZfrmV2Z>1dr5 z-<95xW?y{AR}k>?J!zS;LdfRWa_#Ygfb6|f%aj$|l4I@cp%p+~%P_zOl)zZ5$2_f< zbre;q3Q!ZEEI{mcKwx)}R%`rr;twZh5KwBJvL&TV z=Vc0mU2zXU@qpgzPx=6deoIMGAOguivgV<%x#rAUNdsQ4T9k}51Smmh(_uYuz>vTW zk|8Aid(i%=tehe<2kG|QK0$^GlL!r&*|Lj(w`zu@4RVL=gbCeV(ho?)&%$n^reJ94 z8dh?HU43PTX&)joS}IXF7c!E_8jL*UGHKCH0;z>th`PGC=0me%GEEldqT!LO zn!|WGOSIpw=KqL7=^(la^J{cEn^Lpb15yS zb(rv~bVcJEP0{L(C>g8b7P(#RZ;!~}lLPn9o7&LB#~&@9+Cb#~$(Pa7|MSULozCdP zr(;Z|{NV2}=dxcOCM`dnJR8p>p#EYbX{Jq)Nzj}miKOwhVtZmAj>JKg#`ZZzW-3Fq zb@FZv4c5{^!GkPyju=z5)A4l?XWIuSi;6X~jDiDLyPRzcL90|88WY6g7Tp-r zhaNvb2jv*s)|o8q2>sY_Xg!bu17TL$6t`G%#hy$Zs9ynRi=4{Aa0-hifk?ubkb%(- zk`A9XkVO#8nTMjL1z>V(HKw ztc&q*InlAgzeZJ+^gV_fT_RqsyG<^ez`<=jmf7RqqNsEuLv$^zXEaD!hKL)6Kz!al zVf*fe341l=F9}n~kA;6@s|Lvwf=xIOmhBHSZb4YKkMHEdGGE4gCIx>4Y<1e8j8ld@ z8$dV~(sH@byrcIV`P{(P-S@-^==L-v-Kk`VRp`$A2$>6Y&!BQHnSzbpGLXH9YU*E5 zU5UU~D*uqfV{C`S&~GJ`mVKN74DApSYZTZY40_tt!8%)&4OANN0y@DmsfTAj?O3+vc$!aepq;r`n99cL^d8QsFO!1~M z(^xvbzMPz^RQUlEN%xSn`xrd zIAKx!B)&XIi-jT9Zki0vJ076yNhbZCcjl}fV9<3;I8AfKc~^Cl*o4b$3)*)vWpLC` z27zPdY&1Btag52QQ*bj`G-42e2Uav@`4=GI3s3KY4o z2Mz$pyS%O}V`qE^m{8-Cv{6DDIE)zVwA)Ap)|OCdA&aJEm7RrTCp3X^+l7~wj*ox5 z`Tj-aU*1JC?HMF6k<|;q@Is9|S0m5X&z_sF*#>nq+_VthJQv=4?eKhf=cIe7wrR#U zd-7VxeC^IjCsS5Qi=TPowtK^3uwgR5&w|qPlxUIuEt3)Nfh%osHD(&Jjjw$k=NFxW z#sXM&A$~5x0IkwSyZ-?5!i4>RSr@O3L=`_gYEW-d%9lI2!LXY$!O8!(tk&E4b**Erjc*ADw!1=Hygo z!9yipp|-x@qc^|c4J`-gO}0U=ZzOoF*Sc3I;|zf2MzgmbVg~dqe-BBy!VX0|0OeV# zW)@diC;~ix&Lk9hsM}7c+b(zko$$wz8V^69;$gof<_Yxj->54=HJ5sQCBMlF=!as? zRCI(L1ofuF5S>o4*n+an68|Sq^Zue>%=rRWL&>$r4Mj}ywS4ty#SBt_V^5AJNcu7y zXQPl;On%YDymCeT&^b_fp_yY&#Yzkm;2X|QLx|uI;i6>F4ehBMdWmDx z#0D(F#9U1*FpXyz^GU%%f(by&g0#UoyGHsf`^i_04MQW9+L|?HdJ0oBabk9YvG(<~ z$70-s5!!nv>2m*>Zzw>7(t-NKY;u? z+BmbfV=)$k;(f9!SDOC5Uh-jv=pc!oirBq|C)| zej@eg9t#V)%a}M*Ld!%~V)J&|$lYusPly*nIA|?9Eeegtlw)AACAXthgLzu5!@~5P z+V#d5om~dv4M7hBQd5AZ4k3Yz!wyEPK%;Ts{9{KSGk=ah2&0xa^}nKtMyC>U5BVEl zv|nsqv(UVAu6gHt^W&387gue7Q?+KXX)T;iAMxIpj3I7W1U-3=Fs`1o)FB{+gm+6W$mDy5_RM&TYa)Oqx^_gsL%8vnDA9 z=j}y^)x4TRgyxE;Oe~Y&&9ua>YGD@>QqgN!&9-XJLKMm%k$t-2`ST%_jEGL-if5uk zWSnpg$rYdRv!uQE{;wwf$lt4-$dUHTo}mrqTQLXxw&E}I?S`=f)NLiLi4rTGhqrz> zUYR$#f-*|x_5blwvSTKslLEZ!mW>~N^avCV#}GMLDxREGHbjn>iicrcd|h}2(WmDf zuQ}cnFQxh0sO597=&9rXPEVKqsj{DlvnNqHJYrQutjjcmQWdpmQ-IOX)-!(WU_8SN za|&dP;S?g3wD42)Jk4x)S0SwtUcPen_BEMRVilX0nTZNVni?pU_l!!-rL z9;o5!yA5H8P8=}#RC2t=IL5cKgLx}dWgh^H`*KROC(CugNWJbR$%7;*os=s2f#K@5 ztj3fw-31c`pmUJmLKndA|_aE5A1S}vZ`T_!;)NVDp2{>Csw*6d{W(HC?V3h*5XEeo}6bG2>rwVNiLu(|kaF7LXy>&@g}J-rxSHFOULij zZ}{nscb|Oc$)D_*-FmBT+oWr$p=tW1sh6g|HTA98P1oAz8+J^3DdM7W36PFlJo0Am zPwU@Z^Uj*v{%FDNt5&?UR=zrTWpH+Ue(jFQ6L&)E7DAimLYscJ;pdU-ksF&o4n4lq zw0e4CYGU@pLff9Xwmr9-_AZ5+ruRi+d}A3XPQ_{cwoR=*X1 z&3N@AS39nB%y!MUL??rH{HquI8|M5Qe%k+T>Ydb2&V20OUIF8Fc=r;FM{wZIoLE@1 zb8gMf`QT%}l78*~!2fZu`ybitgR5@2SADs%T?jQ%*hu4IFm!qJ;^^BOuWq@r<>TO{ z#Zbc^?Lw&iPZUbo_@|ZThg4iCR=lTCtiy-<+Mbbxn;Q;nJJKNhz3e$sXaD=i+9Lt` zM*#=kKWgwCb=p5#yY{GP{|C{5cVr!;sI7)`{M!&a3GFV@xX3oh!_wD*?(p`3Q@!XB$*A0;XyfT zMOYx2UBn?aCYXU@t-^K~zejCUD&oH}D}by=x2gRRr}_hc)Ftu~>a~PccyA78^BL~9 z(QA)t`@2n7Dd&E{=jn7ojA=H*&jx1lGUBD51vF*=R#{LEjhC1e=Tua2eB*=GuFT!& zrd7+JK0+odj9CS@17Tb+3BNp(n-8^3?uRj>CU{p6J&5+ITky+setEX`w!ifYJBkWa z{^g2KsNHb8^|Akuy%jwCxnTE%?>dD*xZuLuy)V3Gy?YwT20!xe72c`a-)R3;{r<51 z!#a`DM#uhjuChHwjF{2H|HN3oFa0@GQKX3>Yb622c#>jqRjci@p=uOk1(JP5Te6E) zJQG%1ip~C+bi+^x{tDLxCZz!p!59AXc8_pTGAOo+QgP7|%I~LG>;cneBn**PrQ*3L zRZ}c5DnmiyG+$1?mp1bNNbChN1hNNWpNFpIVD}g$qVRgj4k!~4y_Gd-xBR)VA};Kj z(f)BMic|Y=#Gy;H2{3~&qbSGoO z3qm#4d{L-IC`Bg0n1aQqfryIjZ$>o})1~Vh!{kL~7U>C;z#7YTDGlKQw>}4WofvmW zj_-ZYW-W6m7A3l})@`(h$@}&tGn&Qo=*F}7d!3DtQ+w&KBa2-sMq!23`m}WIG0rs9z{beIaR(# zRovvUr=x-gfCUcV=ONRZs=EvWPYEU*MgKG}{V~9B?9i?t9`+5+#K?aAU?x_EmnK5M zZPX_OkQZwq*gh9*zvi3|c1}u5{`v)f`<%ahv6f-RHRYNPP6cNrM7b`78>V+n?OF)8 z&V^fNyXV6Z2w{ui<`tha;GGoz7;<_V3L%H5Zn3rwoG%br3^gu9bR3XL6tT+r9|WH)`{zKLpp1^iua*|EfzT7X7sp@LKmL$bux* z*gb2AN4EUS6HC>q-P4}H#6FDL4(t{_+*WsBi~Xj}jrW^A`Cve}xy5ndao5f5E-Kkw zchGD9+d$~xHv8YMt3_Jobhg;&T40L;+;Q_y7#7cqh*m9HC@dOBr^ZvVbF3rK{D!#h zs`23F&cRorvx+BaFBMrR9=%)m_D(?{CP=oL5;2Or0Ts^>-PEags*j@R9y7-y3YQ+2 z_z`b0N^>_~I$$2=5vfNd-iUqsH!Rb|MpS1F1BWK;4x_oDjHE ziI`Osy%-BH&TZD*fmXP2ME=`y&#g+nlJQ3##0;1vavu>psWcaaKe`3a+CPMvrfa5Z z-c~7+@LJo?qt~PJ>z;i7v0v}~VDCqp=Jq^4ANnSOxtkyPT#!5slSc|RZ2#Yepk+*t zPK`1#zx&;ucY5ACGT*fClh9Ll9jNx@ic_dx{W+)?RqG2Nb8rm8*oT2_2L#(q!E?ax zxakv-l15y6pShQFlbWjjAp{ZdP=r|@` z+l2j!{JoRQEH5|%+{J{9TujIcYug-kb?#!V#$x@=wmjq&MOm9k}2oHA>>2zVxI&%5p;W0Q$tlr?jPnbU<%vC&^BA+tz8Btsm zkI{tT9v&XUvSPTB;7)*XCN+#JRqQI)09+01iYUbFq~Tw9j&+{GFzKo*hECyHhBtzo zE_CV2h;iJC+4eD&2P2mE4(4(rT32W1X~h2J`=e;yIf6(VToCFsD?Qa0W3yr{`L)Zf z=3J6R2qR-7sc2R`-HGAT4HDyqX0d7~0pj?1kr0_fxKmDnC5gNh$)R}WG+hKkghI(Y zF?d3J$*lU7L>z00*eC|dS{uU;Vy$F9i-nfqoR5=Zin>wG<)SiKv&exom>pFh+#o7Q zD$fW+I8SmvXc;0(qX5Y-#z6EjoS05a1V}Kn z&^Du|&j8=YrfB>yomS*BXjS&okBEyInakrgjOPeB@gw42L0WtFi+%jowEK~=o zx%1jwFO%%8ZIb7uH>PY33p2=?IZe|JwHm~Fw{bSvYFkyxe?6)1!UFL%A zXE-uPLG#B=Tz(Rn99D+$ILiVm)odQK1TxIleXOz)GpojU)jo=Jgf4?kZ~A$iobB)% z-~Sp%IJ=&%H&zEw7Q#gWq@7Owz3k-w8h246R*4wiUVsJXA&F9@p+&d<97R;LAX;)NdfsJ(kYPm&I_uGb7z* zR48}9GxJ>A1D2x9I`;;x$IAdfioMelg^7-?Urs+g_4Mpx@9ueL&wGu(Z23hCVwdK_ zdndaQcN7S7UH6*wiGS;tD;^=ViW|+Bz{6_J*i-$*xPtGNw>Va7KUR6f9dDFqmxX@%IzSo&qLooPZMoe!%}WqrTffpT}T zh51(9JV*D?t3fe?9BKW(9=vk%Sk98nEy}5)n^vbBcL}|8V;YQ!aB6CzpFg97?dMYK zE+emce5%k9nPKEXP%PRjrX-+$*Y%6kw}M{n>1q-{xz>?-I4K zLSuZFzEbimp@fu8(ik6w#`qmkXo@VhwlB7CzU%Wk_T32~z7ILwh^{ZV=*=zEg{NDl zT4oMTtt)t_#4D`dxJwg)*)iQuh&=he)2M@%%eV z9;1Z$YIe{YZ5jN%lQE5(;G8)q2bt6Snj-m82T5I`?Wo&QS$6eOcc2ce3AD%bz^PZB zKNLH7dV(4V``z6Ple#8Lf!9#=HCg8zY|*S*ro43{rc0NN*n%%)UhHt98EJj zuI{6xDu3dC&xMLL_T&QoGt8bhA z=3IUIwHhJ4$5+Ck+_q@B`bI&>VoOAzeR#v6~*NM;K=f7EPH2ft!$XBiuc<8nm z4A%{Uq01l`1=E1B%YwgT2g|z3SU7K>e6XUcf`#)3DhI2&s#v%HVRx6C zg$oC&2Wz@&j0V4{|DfCy>aUo|+Muqh9_1|>Xc%nlYBU;51pTZEC5MD!ygwyBslP%A z-gm0ca;Vo-g5ZaxADH-?uGK=BP%cyml|q%^7OI6Bq4vABu4bXmzgnpGukN)74R2ez zT7*Ww7ti{6HTiShG7+QGZ!_>;0RB4fvy0S~k~Sm$30| zYu6TG6QFeZ2VZYSTWv-iw+dSTBdWQ`A=Ef1ht*$JhONtd!D~zrRv5kU`k~wn5mTjFDaJ-A=soDDQT&cf0Uzw|~zEW}a5pUiNkm-tP6+C~x<%xBKvR zzvk_J_VxhYw)zh!u&wNE8{Rf)VB5w_oSB>F~1 z*c)3%Q0yBzcjN?Otv%;`eM1Oj^aU>X$1V+v0v^)*fgaz8pF+od;)T(XpBa%pfwS@; zP}u1o92r2m`vNFXuy1&%O%#VIzx0l=!L!2y0R*$3+jpw_*ol3u-TRIm+1G(LxyqYo z_nq2zysfkC6yCa&x2M`VP8@r#EeY~;du!XlBkgUicx!LF=o>h|tBA*p6C=UC!M+f$ zR`;{MKwzJE4iRZ+h8|y#zGz4LJl7ZK3$oJL+lDUoiNiyK{-I#Pc+d+7>)GMaAt7Yi zwJT(*-u2kHJ7n68pPeDo&Rq#p-%u!RXgG)__t+99|EmepkUwEM7fe{r1?g!3p#g-% zacIIMhQ8CttKc&;WWkjoVjgA;2OanAI`fFCi=W1Ns##f>lTh zV&ULdf0`Upe}(jw<9jnF4ZTLe_O@ff7|f8r8#hiFS0>xOZI4jM7M z*)eX?t8BkgO_mzF1$ODD(Vwou$f0qge!6lsCoJQZapQ$827{Q3RP|D@jGJWW4y;B~ z)^P)++H3AJjGNyx{<^WlaNF4Ku_Q8v<-wP*`7tcJdxDn}wu{4<6_~mS>qQ!Lo;0x$ zg%dq=TSd2K+!D4S|D|qfSFsL{0qRmWT~{6-UUPnU(7&cqjz+uCsZYu6tf}_ z^zIxO?(q!-c6+H11mLAI(0cTXD~2VT!Qpym_tfr)y?)mJ(a`OoxVP=Dw{5Yg?E351 zUXK^8jux$+ZJn$C#QU*#p=jUa;Rnv5@W#8&DuM`I3(Yjmwk;H`kGR(V#Oa#OpALpk zN1ZJ*y|_heEf0~4!DAKe_(@pWE{})_V=!UfH#8SZ^o` zmY_0wF{=%|Ha0KQ-gbO|^yr!}j$?p%(%bp4VWm*Vj_!2J!)FiwJMhf%(@k%xiI=9# z%S3YKBjVz+T)KViU>OPy})JDn*hm_A3! zj+A8as7-n3E6bGre_W|8Xcu7b&($tZDg82Kx2o+jX7Hr7hupvu^6KWr93SXD+cz{k z(u8?WL_xFru?c_1rpHFyJ)ZQ0UGqUABj6hn&JJJp3yEA%7=E$GKN9o{JdHrYdPxMz z5!a(-vE=!Cg9)qHckX=fwj~wC?EpxC1`%O2K7Z30HXIg1<=un63x1xaiixDy-Spw_ z<3>|D&5)H7ca%pR<#9*DT}Q+0`nml0x_!}g`{L_5qxiqN^8rxRGgHq*O190{%oom! zk)r)E$ALxub~<={?Aq8&eaz9Myoou=l`unAo9;P0QYzDdt0&aRluyGs;q~FVuy1-S z=BQSo2;XgrAqkt~oy@7s=?&j-G8E#mFcihnT>AdLA;NSFo!mBw)I8!5s;U;l*)Up|#88VV*LF(3$F#1>7$aNm|sDfeftep(@SX z=Ez_)2^WYo+r&L|+lLz{mHiYxfLkI*JOAmkfY?TnH2FC#a~PrIInIW3sEiL|`sRu0 zeVV=*$L(p;yCb@;Bf7dnnciFHbLZ3M&qj*&#T@(9*~jMSJx7x=fy1Y+U5+{2DG)#a zE6&f1(?dRSOqrn~(G*EjGgGaTcoLB$h6qsWp&pOY*o@2Ma}z(9o87m&mkbF0(P{Sc zY48y}NplmSB@i9*+~lpvTD}M=g4!lB+tv#bl7-Sh1Nwb~iA=%Y>leHGhWdgk$56rf(i zI>|1+Rw6CNd-+9@HTm%u=*10VE#KfMoEE;@cC-CPd(6K2es)o$c>6;3j)-l?16Ntx zwKnQnyJ*Xs?hJ38d2Y6AzT~0Vl#_Pl2-Z?-_E%55d1AUXW+{1)o^|E*MQ3r`Srv6w z#hp!2XVZdnRm8UHft@d3U|y&$N$Z9(x;ingh_8Fog>i*)@oUr&uxZEHs6jN28H2y%Axb=AW4_YAzy|H7Am1)B~&Vh&RdX1Zm>dr z7EEuWUaiWQlV?DOLAM^2@^`4KTa${JQt7XjW7S`IEbHYkX7N}^}0e=q(KOZ$1S^u2DYy!KlVgY4F|EBS} z(P+4uV=;^we#d;tC=vsB+nC5Y?+bKOZrzld$CNO6*Cvb?87_2lM(lCMP8yw{W_E{A zJ`K2v?G=b$L$ZMa-2R#{<=xy3v&L`jn#qah)kbqS`~zD(-YO_E>Q{y4j#8B>gW+YM zunFUYNv}eejiTMCMR*FwAXT+GsjA{xs;^lT@RKlJ5ZM$X%!x_Jrl3gk?dkQK0#u*@ zH>rLdKj@r4d56_;A+Pps-qsJZ=6nlHTNm=SMsqu)3fDIp4|;ME+3mx@BM_naNfHH$ z+txNP&^Hq33nVN-V4Z~J?C|hF!i;qoqL+bTUoeqQcx=Fb8DzI_=$t=c#>yZP1(C1@ zM-c&{ye|M=I^f3&0f}MAKSV(@*nosZ=<7j3px*}rw~b;q6`Tf!RNWo~MY>H;#9O#s zF+50jT$u=4->ZxkubJEQ!^6=Ht&7gQpQhU<+kWM>Zw0^G@m~FhMc=RgVcrjWBZY0z z^fpcG=y!$p4t!V=DclfE-*DfVi|(F19n0OY;M@?gZIIItqUoh9vg6L_KY8g#Fa7H? zvD}UYXGg@=@xbn4lq<)`R$2)IJ<1w}^3jN=9(x$ZEorS&M)`y(gU#kMV2~%wkP8uf z$~CTG|E?BTAZZ6&S_%*zI}Ei3Rm4_j5VMVj7ng;-WVmd8(QwJ=F^0Z%;Jm-*g1fJm z&uXd%gt(BI3T~f>$=%cAXAh7-`mv^ne!=T@cLD)$@u8dH;Y?Z_`T}mB8y)H%?scO} zS$gVMZq`Jqpg7=vb<~d~ji99{l5%=kQV?DhoK`YyN1-GEDQE8N(o@@I&>ER)9$;!{ zX%}Ck8}Tn}rIU$3K9my9-o7EBTm4A90>EF#U*Kiju!cDd&bpblh3r*V4lS81)~v<+ zlFtmr4EJQ~q9gB}<5S1Ob@v=qKR4qQ$)fV&_KK*zB4Vld#Urc1Q3P0gV{yiq~_kKv2i#-hsb{A}8W{)*tJMQZdhfn!?IZaTH589K4F%4-pjCUe{Mb$WN zpt;E}fu0of&7PDgz@C%=J!ZIVYCnkn@!-pZQyNu)ZW00bMa>H?woSMch>Jdv1i9c! z6)~k2-6w3_jO6U@4&}&o@yf6M88QpdGIzzWm|r|;xtg(9RX1sg*~*n)cm1U0o~?rO z#2J(t4aV;7L}qvQ;IJ?{Kw(FB_p7760Ujf6r7BoY4`G#)Wg>1(ERX zZ39OT8xa=Yl5g)K5Lk`d+Ykv_tPSClH=n=p{LJb1U%K@YM3!qlUK6R`7p>U8WI*H{ z(B=5y=};0$qlGXlT@NR5(~g!dGux4K2xdR}T7Q%X2DVFO)sOY3v)DB38QO$&?2_4p zEC}ZF0Mu46KU8sqWuo*fd8U@fD7&A$v{=4FdK!>VYH==LJ;|yQ8;e8(x@SZ z%pWS~7EsD~6zCfz2LWifTOkD5lY(N0PH0loMZM#chcxcBc>q!COj>QefKbRvswTg* zWdVdjZp!h*E_EyAV>MBkBC3~?D~pqdiGe*S`LQR$mh1vUZf?iA`%OF@^f*|rh`)gc zF$=dudVp`4CGtg}?LN`pJv^;4oHubYvn!93Bqx zVCKN^@JKh`qp>qM=^-;P+#BR!;0HFzX-x3ksXWQ}o6W6IHrwS?T{w8uySSUGZSxA_~Bql(lu@K7S zgM{Gz9M6FRxLq;)G%N3&uS|U<+)6y^Le}a@)1oc&9s86$ZYz!2O2Zp(?z*unX7el- zlw5!L+RO2RhG;>1yVpGiNe`q2q+DFF+eZIh-3<;PldKLW(n z_bUVkUPzZb{3eVbJB%8V#DphGfn97sntcsOKyC;(As?w3-0ppvNB5v_3`}m&eb(;= zA<);`M-*{@k*7rMl0ZiA4Pg9YJVRLlaqhmLJ8&K=8RwAk%fvnb_ocqzc{b`=4%xHF>9mPg|u#wa%f|xN1`s77K$Bns>CG;k|nMxX+=RtYn|M1Yjn0u56 zcj#X9$($P~`xcZHd=;h}DD)u#^KeM$BPQK9pd>;JGYEaW3~&;h>UglzV`fuH{00gZd9G3TuL+_CHy~q|Av^b-7pGqQ`b(H*Mdg@7j>Tg7$x^41$JE}A zAy$tsLg_)jw*y=Jx50vDi(kVl@#}QEiW?yZVYsKeTO=6^C&O%{UqKZShv*&AUA(}9 z6#8H3_91SBLkJDvTheUM5N2$+(~U4jfD(Dz@MFtb;OfTJi`Df%&sb-5Kgg|Evf>vw zJ}38j=C#c5mZ+jF%`h->}|hoNoig2Um)Go)}g#uhQB}{K*;TFAl@Uq{V1{rf667J zv4?NtRdUIN490XoQ$(NOlo*pV5R&N(hAN+ONigY*45f4wA({#(!4Rox2ZNKDC~EbO z_`yjI^^6?^-{%)4)-mMW=a%;L&~iSK!GaU%!3=?58=Hu1q6GZ`M1ZOfc-io5*T+nI zk-wJ1m$4B@F}X7}q90AHf|Zieya_JK$A4qLvgshLZf+dl~1k8Os-K>kme}#k~CK3dZWNzXlZb>M}!N9r?vYrdo zE!QksC^K?pk}UCHHK#e41+O`9DKDiN8n9@d@32 zpKkiClgaDdiJ=s#S-EWpCY@TQ4$0}Y47QNp$)3vQJJzXB-(b_m;ecyh|z67aJuz*{)GUS@(xAoKdnQ{pnhL9_`d%zT?0N_!AA>``7 zZa{`e!r0KQR76TFAqWx(0hwTr$pvL8B2hwM9YIuKATZ)1Nvg;R84z3GCW$*x)Ji$w z#6|_}p)peHQr`flUx-$sRn1Lkd|)^*Dq^dRC|ik?;qpK>9`sS&e$+#Yz*Y42Wl=cK z@(rXb6VD`*)FLg;$5!et*a`wKpt(pr0R&!994`1~7f^WS{RYqX{6OJ+D~yTM^y}rt z=fs5cBZbsUFkWcFIQAh{i`FDCeWnDPQAZG?$R5-*b-7F3lvQ-EpOSvgtgM+qnzHPY z7tyzjW5f~=u1UG{xK#bRswILH!~`8vY-R}HNzG7~8S>TeE4K$)5it`-ohSvjP8 z6n9ic9hKqW&9NI}&?WkO7`rG1V?PC9GdvlpUa7JSpH`!`;*Y2yiAD5e=^|$)U$q?p z5#~D!;jl>HD#Erq(ZYZ=-- z;W!|vztYY{=!d6#eZ;OwdoPj}fCwGA9&Cl6{={*Da1V}hndznTctuQR|7d`-kOFpN zNr8Yg*0A-0?KC3wdq+ixSVZ@TI82*2j5A+w`I<&CNew3JQ#|Z)Y1g#V z*ymz0?5`0)4;l6{`yY}Fd!^X4Wxh4*307Hp>Hc)VhQAEK*qhB{+%|s(q~7VhCX#f^ zs0Zt$!*3O`{B}TQ!)C)t>muN+fO8?7CFJ-aEk`OAAs5e1Sjl{yy~~qQPZRPXL3asP zg#yIq2;UG2S!(n}5n^(MUuW>e%hVySA1FNaVs)Tg(}WVFQJ^VBDRL=9DSlljL&>Rh zUoK^vP>z&~gbI{vZEF5d2wA>da*L!1l_*PzP=#{v7INdc6lHsdz5C+js+L;LCe)y8 zWk~1Cr;#SqB8_s^Qk2Se-8#~aSjvT(?@oDzN4(wpnUoHx@G#;+)tEA%H_8L zx;5n`9{CQR()%`{9(Abw5`Dz`qXGR&Zq_11*rZ%aZfU|kl4g&57gZoxW z)_Byw9Rl1@21iOCDVGNBFyM|eIGvHNfja`Yb_S<27c_9s0PX~Xn@PzOj~ck6fIG?H z-dhpw7~nb>-0X^Q#{qYmSqZkoO7H}F^1~>s5R0FRoU?E+j6gZp$vxR(IuXK+M8 zr(Bx!UIyGb1{X;I!lMT64B+}0Tx>gIin?t{ZTJ4DSAlaIXMvn8E3+0h;pp z05`(m{$j=S&H_$kaQ|sVxE{bkRoOo(2r}E)b&);$mFG+BxmS6<%%0CF&tvTQyz(4k z&wa}CYwWpSc^+ra7nJ7-_B^0GzmDfOH08O%p4IZa$({!l__zGOLN%Q>>dhlf+YM=E z-mfa(I96<*Va+#Rm2v@PpL%I>89|FqDXHhDLMDy2S2d}BUHPVX#cxE-H{Xy-RKDUD z0hH(+|1@BiTbVvTjmK>KS#5(vGx^PE^%|Yrjf8iA8%8yy{S972J&ID(eit=gd{g>j zuTBms<$X!>#kZ7JT(#mimo?w~rvFz!b9|lJvY(J`%EihyCQ*nsA@sIY;h3&V?XQE4 zH8pw-?SDgp+?bL$9yO5Tfc%aGNm7H9O9MFp$af{k<;u)?rq=;^Q-a)^k{}*6X}$r- zTN0$+nx?k+6+nJZf;_xpnr{N~w~&Cx+C;T{VEYD1Rx4)2)8E72fJ_78RLhl2RqsL`+pybCQifzoX(oKdE?A*x zl+R$1qE$Yl@08s#*s5riyGYfGq$oU$jxV^7d+=9fUVR`5HEBh7nuv8O`$ ziRD0@#4h%v;CR7$j@paRCA*ke=|PcNnyImLk`_9%CH0hw)T+G8iOyE-ToMJ6&P6wq zg+VodeZdF88Um$KC$gbLF)RkVeFJ?yh{&Mk#&)d|*|1c_o-#}ehP!)xVj_pk3@!`} zUmEI`ViI;{jWf_UT7_ z$z=xw!bNIxnv<}Rz!t&lQ?Ji-MpX5xgn2MNRqtLr?YL7C2LisPdZl+_lVXp2I&&Qtm&Obc!gEI@+ zMxUbxkrck zUVn6?bhF zGdWRP4fNj^bMmHJK6fD9^0o0M-4OS{F`1s)lO zSrQcD-~&boctckAF851k+A)6q204mh+!7fKnbIVHt^gZWRMVs#T7nDZCpRq5`&X$c zJ%~nA7L~<|)<%og!llTh73yu!AAyEMxc+AIjplIW%xI*j<(|#U8WXlB!>|K|@d^bYgjk11RB;9_|N)Vw|Y}gyrti~s+H_=&MV}uV(~g1gtb|hQ$!b;Q(Q;b z<*KN^PfcB86^0>iRAt?i)#kt+ss zUs~ji1HP%69-BO#$5#J901(*{gcQXL^4mc#5GyCHquYPMEs@3v5kAGzq3Jl5uz;&!(H#htnyjPpB?=7V1NNjb`P)L7G<#KZjms)uJ<>7QeW&;jXh` z(UpHa`&xFSYH!T7j~?vT?BB|g-&Sv)8~tSbTS6Vc15P(~V+v(}Fs zw;eOD&z+1EZMkRLy27&LMMb~Jvcynm_7O%Xx}h&hn)i%kCcBTHPH?J)B1yysZ;Kzj1u9JnzM{>tpuNZH0Y;htj$AKgR~%a<}p_TtTQ4gDs0 zM$>I*S;k4tjA3IAt!sn6J2ebdgD3`BCxX=g`V|;XuV`xX3dYqwWG%N-8^Yq>;-(#3 zi3~KQ)G#SDxDxR@)GX!rP}3~6vfGcqH%>rD$5F?piZReb<4eAju{MA=G{N-@9>}qU zY}&yVZk^^(wb+(h+A%IsOuDGSps2aAgV_zhiUE9Y5A^hiz|u62d$ly+RzpceY636O zRitUm9k3XYqHM=yLYVuMW5bJT25OyijR{A9bz3)yXfn1M&OmGd18v~$u!BV9~MM_&GYZeetA5F`2(Eck1;yZP*I2d01J6@sKm0Q$g9%Q4wul4|>yYVMJ+ zkl{CVC#~h&cSsZ=xjTuxTedqhnQ(+DwuOq5J5!DMJ?cu5E>KrmGje1+u{q|bSuC!A z>2y}pw1t*Rva;AXQ*h7K2t(_vreFNjSw=?KIX`x|mSB0E^Eg0c*;}hx48N1H%{*`1 zW=}+T3#DEm5Yy`XV*I1d z#^o~Ka-LEt0iZHd(}%M2R=n3CPxai?=%;|UI%VqB-~}d{Q`iC~CPaJk3tuZGl;0V2 ziFgwJ^(#U{6*jqzK>lj1%RhhWT1*ErCoR}C^ zlIHz2qAugE>Zq%FrfxR>qpI6g(VDF>*EU4O zUGBRs_e|^iCvKgHx;ET%x!H%FXdYPhO%S79KXL6uJbzU*f7NVjym^1LdHM|XeqyT*8HK=Y(WaQK zT3K_xk;N$(?cz&Qg`OY&0d7fRGhIXjC&=jniJ^dF z3G<-uGM`K&s1yHBy3rJpiB2L2MAj#iDNR7uCGcAE1lcZSnV=3i24G0>N-M&`&EXrv zv#-u=x;?f~x{XP3?aqk34BF8!r-0`48@J!M>)yRs?;+O;G~jC%D{F3ExN!ky-Y1r< zhUz_l=A+rcMsqj!J&`o12|2Rf{5|x7wl@Xi+lHXhUd%6(ZcnM6l*Y}MjR8o}#^wEJLAXI_1Kyl9otmv|tx2;MX4qQeJ6aI61j6R~BPl+xw)W`wa` zd+Da9t=G6^+9;MFU!6sb@h2H6U4Tcyrsg}8vrO4CRG4M^=Qzf~GW|22*01cpsU?8> z+f1!E6?yB`I!(`{GO50HPBnJRiA<& zRwahx18Jp~T)=sfT)@EvR!(1_n-{KIYC~@HZt20!FtdvR`6-}WVjpf=2?ci#w}r2(+!Zo6yH|xWaa%>>qUp7emBOz* zHf?u@tP>Pwa-zq^iI9b!Ja!l;!$&-kW!!_lg`GdZ7>M=satybGO&A;MrU-uy&UmiK&TTq#kz_@IfzQQ7+g2bzPR8M$x9mY63->9?6s(T9iTObO)clZn2A@3V44dDYLU_kUVYisqT!_|cBrJ7Q&9=F9JHJNjwvLcy^| zR>VFun9DOG%%u(Zj&0YreP%Fa)K037tu=0}1L3xNj+!Ma07xqDUM#7&S#|^5yeZ2w zZB=;v7-A&8f749;Jy#RH$ns!c-BliOHZIn9<24(jH5(UdHbV}Ov*Fq^(+9!@#PvLL z?U|X}nFBMMW{tD;vqh1rb@%euLq?FZf%vOkU)v>1-9{yz2R3oAU!J%&G2@Rpn*YLH zCfU(NoJ>ehl82qh|AADREiqTEQf6~jwOVHX&AuCb;WM)}k+PPU%c~Us=8hXXX04hx z8^NqCrQ=(061vsdoLrsSnW9rQ9~b>u+3pW7c}l;RR)!tz#re(g#Ke z{}~2~mJpUnxCv~1fsDhZz~^;khy{%%U&;lKS2}N@I8E|59i|8HI&a~)%-m~gHB1}N zKoR0)lzhT6VVy|RoGqgGrbns&8{**@c-(T)D3TOkhd7e!3FWQyohUP)6m==J3Lx$= zo9JSsrJ^*&-_c!8hsEopK+r^*DsT!eLPKY2wA1n9@(rVobM_<$J+2|EwN(!)&Fk67`d8{1<2uX`Ti3+ zkKBYX|COnZK*;@HfV*3Pe3mFC(y|~QP$Y@aP!xn&DIO;x4Z}aC*hg9mFj?mxNoJk` z_j-x*QT$#v^T7$CN=bydB%v&Lrtm2Qf1BqZEM`Wbia#NZ19hUr1me_TC90A)JToHK zC^7EqfXPkB(*g708}P~kX6DfssgUq_h+YnhN_h^zWf1uvXP-2)#F*!rkVHH5){X_hn&z6(KIJygD*Wco(Z|QJ*@kv ze~kIr-X6-@%UsXHnNANVL0(b#Vl=OQv9>W@yE9t5bD?(k z^uh4PYvkK6r+_y4!xv*Nw&}0k=bveq&A-(=Q#t#_d}w~))9O!KKiwMX=!{gIj=7$r zbyK_J4@yE>O|?mc--x-^5GeAP$)D++?YuQG^Od>nk*eJ>*B*+{LN69>n(M!lcc*4< zII`*BVj<*K;TL9JM2i%xePlN0zeJUOmad1T8~VR;m-n1>YtA2us*bFP8{RTPoPi^s^z#>t{fe5hnl{7+5)DABw^r;j1{X&-1?RCDxJEtKB2+v& z#I%Ru+RX=V0PyuMjxzTAaV7u<`=HG`bPk?ueiM1XMJj*-jGGW?K^3W{T=~WY7ynS{ zgIxC z+PHV2asOwA%#4G^sH1lB;I$Le&xKDfItyYYtM58jV`?qt6vfI`-_4;gn|}>6#j|;{ zo$;3a(U$!SEv=E}wmT>9jNa+{^wmh!$$PF-_~N^}@8)=tKR7*mi0Eq9CYE5!-JF(1 zS0SOGaPK`={Z9)$kyWh=g>4a6+fo4)=jVmcT$cAL{mgqr;X>uwNX5Fj(n#6PdyZYS zouA8v$vLz-%Y1tPUg!M!ThPCYroc9dDR3H-*!=k?u|#BBAW@~ghLmeu8M^SF4}am~ zW;S@!Q^4?u!Ar;_oAtY^|;}fG#ZoQ26{mwjBgxo=22{6VodB# zirPZAt++8ia;|CHY8nEQCCw2U2qF$i!^CGglV)(Jsy;x8L9rDsDa>W`iZHbn) z(B^T&begs&fo8KBe&Q^Ud%vC>rOZCJP_r>oy=krsx?uNQ`^Z~L;Zlad#hqCt>^_K^ z;CYPBmq=u);iO(fH8>jHjKFf6%X%nS1iJ1(ugm(~CT5>N-bA6bk9_6*kv-H}d#SYu z+beD5=s7<;9Po44P>RxoHtrQ_Ew1y7ZI5`RH(Ke9S8lmmxn=UTi0#mP7j93kE|eEr zU7F=;QAJZO4fck!O~SpLitko(!a(Kr|G1pEhCp0Yo-37j(QVG zF|Wb74a)RUcbX^6f^ov4@{>v)R!rwK)l(5Bw$2W{yh30y2Q(WWHoa{O!Nk@u(|9_z zhx8%L@XS;;Ztd6Mb@acG^9Ki&rn@rgx0A9$%FPcxShqxS`tmQ3(Wu1`R8~v0O0k-T z9KuExh5=m@8K4X@P^+$S%bShR(=qm!@)+$M>pbnyvTNmb4q==SS8X&5t@=VW#XNv6(85CnhP_ zq(aIedDgP{E%ICSSEc0`#5OfX4y8cskl(AnT8J-z7k;S03%{h0`B&(j7|q2#@0?A??Hbq&gf~2C5(lYQ=hxj%Y6k z4QL~hwHdo`FpQhEK(+iv{bj}nHR`h*QgeLKFm1YeQPyKjNf%V%3jLU)zfOSn%Uw1m zPsh**C8Mc_EMx19z*A!hXl=y)Nqs?1ZONY>_uvm<37~_Anp6$Q@MtxT%&9^ zx(DH)jrJOc2T9?QDQe3*k0>9K_Kgk%y`5^N2NPD759bPL7YfD~+aH^u$NAVnLN6im^)PBCYR#mw+))k7hxbK)HE|e(=M*pY-C0k(D)~s z+*8k8WHZLnfdknG#zKC6>hoJD0(V9XWoK;H;-qcASV;{#AM3f|Fy zPy!BhmTDJBm~lX0B9jabE;CM3{26`uR|J|PdHv+3sZ?_DS1Iz>==N2*U8ft9b+u8Z z#8NPO1g^fmgK{n%84ZBZBI8y{fec*f@Ii86&W{Ny7{t-=8UXkRg-bmqH%pX^;4}*T zZ^;3!`1h3mZiK*hH&WO`H^v@ku%05@*@P2r(+B!``fv~i8(fLJz=gh%ZfRif^aHHf za8QUBWl)Em0C5X7nm<_79=s#j)uhv#82PM znzSz3vfjy>g0gfCEc|9R#%xXZ^UK4X-)x`Ecu-n7>AYWA{T+YAhRv^>Ny|@*p>IeY zCl`vFKQmY}HccI#JTRTN=*)fR^3>(<*1OKy#hUtQr}QFHwl?ZqyXdNoyBede##!@6 zw%fLtYn`M~7`EQbx{(zx_C$+4v$Y>J-ELYa-f+*camkL9A7vW~>t{OOfAQ9fk+mll z3Z9+Jd|=O;4n^(NOW82m!S>dY$(B<{TYJZ^9iLhA{R8usKg{?+#=mTj*6d%%KL9gg zNcd38aNEt}H;%{4cSOr~%pYDT$KKb$#ir)TBRJS&QA%>=d}Q;HXv2||l5L3=Z<)6( z6tmMhl~3}+nNfSq%vfaW(P-mQy-zY0irM+So)*fb0lSk8t0%2wsQg50OWNq+x|^OG zo|!`nrOlC&mf4d~OdGpBHlP2&8xijwb{_DZ)|l;xq-S|Gi_QUs!sT=ujEeD6)^(5B zs+i4YW7O7&two#neo~J)Gs>hM%PqRza;=5)PcsMJKYZ)(LT(G+m?eXZj+wj}>&(lM zvh^{?2C0Tuk1v@rvQ{saRuVHkYyPl@o5y}I6m8lWE!{Ppj*j6%)tTCvf|;K1YcUrS z!7x|&Gidi!ND5~lM;#3_ftX`8C46k^*f-jjs!*~eH&fbgh}s%33aNt5DQDPnGvh`E zjwZ%I8&u8OsI7LUZGL0KRvWYJ)zo~h4*Se8+ZJjes9;{ret(h@X6ti56|s{3+BDXip2`|%@=OG5I#0*Bq{Cc|H`DaW_5 z-@e84@9p*N8_oZIgOToAwwzdJ{SRx6xQj1hb|=XTNC=8KYIw*GFoNs_5UH1>MJSOn z+E~3UQ623;vzAfSlRl6yP1zrpmU#u?@;P&r32ed2m{RMwSx6%TXl5Q^*Or-w!2(&Z z$lI7WI76RFLp&W?qlkRfRHPV1n41)n`L0H<3;w9>p`8j*!0@BAhBHMc*-{u7S2=J4 zwm&K!^|I53lhl4J$d0&-hX-*})LFnrYSn)9n@(;fNx`KoS;57Wu+aIHd?_u)NYKhi zbai)lIZ=2W-JRd36@a*DuHRB|c=pxr3N!28-+XKH&4FmeVM$r1s@ljhY-dJ)kB!Zt z(&I!ZHEDLent6jXyGj40DP;B_RN0IzH0B>e&vumdtk~kr)<+@`66uf``+`tV>cA7z z#@4Lsw9G?n$d*)^CDM`#L31}dBa#&{RYEAOxTt=r5{uF7YSrrG>i+njms$lMMfi#@JIS4rIEiMl)yXY=g-*|GSV zBhfWSBHm+&J#I{jjx;|*3N6Qse`mI2@Us_^tW^j(Fa+@x1g_K0iSDir`4E5K#OW|Hss8#Ac$`*ik?)U3+QzcqFT4(nQ{{ zw@qz}*xifyh0`0SgE+A1$c-c6U6CBm>8FY4a6;64DAwhB^d%g>y&VLvuEfBNwB_VB5Q(;cz7xyTunQ7&bw z{tLWX&d?>vgizneP}wGAjI%ZeDXSD^B0UJrZV#rt9)w0&W-QH<9{NO40wx7s%ygXl z287zeHB3~SDZdRFWMi`9o?r*H%oT!{OjwJ|!vG=q^a z8(!}7{(%wbez1i6bO0n=lDmCw=>&0&ib?Q1R2$F12RW8)Y=fS~8Nxm1RfUaEowTzF z)>mGSio=2hN@%J4bd8>GbZm!T^B3UK2zBC;c5!BK*J-^JYc zvv9}-mORO{lFa8BqdJdn)A;B~WHDPJ%r9!@K&UKv*d|3T(1<;R@4>`nf?6gIB9S7T zLbsd9UiPp(X4|1WfSua}B3B078nbOv;ym|ktDfB1u^@38xDWerTXw^WAW|-@L-cLR zwGuXzX&-J=>^q53`7Ahf>UJobD?GQG?=IuOC2<&mTc@6w5Eim~?p_G9I*ZImBYHa;fGpBWvkt%2d$a0A6!ntp3 z;guY4Daoli@1sL!NiRrS2L-AfsP!+=Cw$kH;a83-S)Sce(>`IjE)x3@YDyl7%ZpJS z(6FpWHW-%KjESp=+A89T8oIZ4pZsQR?U0_uc0 zOk$Oqb6(h1v<(ia(bNzE*IU^9t7r8?PB1#t{FEw7d+WRpi)k5qShss3v8 zp&n6X3t44>z2mm}sI5M3YmVBQXP>)g+xR5qK~2gA*FRxCCD-Z_)hc!2Dj?bDlXXhz zKV6`|rz-I&qp6Z7YQw6;9f~D!*h+=msM&HI#b*WAF`yxb^_KNWYO$T9{-h~(s3Lj5 zr9?lbqSBTvs6=O8+}Ruj6L$)7&4_L73QfQHsU;<27irJlI0nTY@MIR|`3+nEm0ye@ ziA1_YyoBHzjH_&kZ%}0F5ED1zZK(3es>s9-?SK5gR2QP7Nw=yXp5u+?cxT0E&U&a> z*>k2}ylbyq%qw5aEuJn87e|~m5nIiZB!a>`k&!Ly4CI`8$(R|HTGo-x2hw-MjJ|6j zhO<4C;l#`uP3q8pz1bko9ylackOBBwec&d!Lf^U2yPID;rXWd#I5K{=L#z75Kj3lMyo=$^~+i1Ceul9TO_iRm14jRQg{4$#7i!_Sd z6ij=Unl|MM6oc;8v17SnTZWfQ>)<}bC2m9JZPQaVp-@Z38qq*os)Zj zfbpth+();! z#^fqc>m`R^3qyLsR1*^GR4uC@sXVdk$$o?8*%3v<1U5z@8KjfKV9F(EgzPA{jwt@A zJ*}HAYgY&BPp$6uQKoyLR}PICwSM~rM)mt7aDE)(cFjmvgeKBRFIlF~vd1lglbR4C zz@^oV88Zs@ens<4ZLnaK91gmbklF`IzOqJzGKa|JfnKjdYXXaCZgSq_+HB0&16L9~ zrU~;UgC{REtT0G826J#2$_E4fi~fP-&?pnejE)G{(`Rf|rp#bV)RWd|iQKKwDRS^P zt1=9H4cEoUGq2{|OM+WcLXl%|(GhVoQ+FE0UXYx6Z&=H|ZeJH5_P2y(&^5lqYWnm=o zyLcgfmu|mBH`>WaSjf*w!U931$km={51)&EPEe?sZfyikLQnF5G9vmAl8t(aK1*1r z8AP&aPB=zJ&q8^io0)iV;Vny%jA{}Y>@D1Ki+WbQc|?4tE^*Z;| z3ND45)lp}4+*u!W)-O2WF8hJ20N#i0x~doROXB%;ck}BIxZeI7?LW>ddH@yp+QvUC z+8XxFuA4nI>zmy)ci@Aazh#URZJl)BM*AqiuWt(*zqb2+UeR|g;m+@5F67ltwk{@Z zO1CcLdaxnwMDA60omH}KcG+y_?BTiA`Mi0nY)VtefZTVX?Jep1m(L2bFU)n$*UlHn z?luc)vzfNG&p=JMX|8TAFo#WD(#gk;LQ)p8%70-zr{-=>jg)4jYSTRzvqWOvK{v-- zTi|5;y^FKL_r@10HqwUinrj);=IPEK=P{)O*c*p~F|}{0ktoaEN>ar(+_~Qz$iSh7n`ky$Pyd47lg8>8;xqNbpz^T}zdwa2o41{>5F;~9E= zfEIA8-^d}TS+7D&t^BP1LdjP*9W012?nPXk3M+@?env}W=;x=OCK**Ya><(hv?#xh@((6qoCN!BkUQQa-?=JQpq#FQ}8|xSeV<;SlWO zcC_x=al4+PGt`(B#Z|WHmo<@%^z_E4V>}ClK-PFR?%CrG5W&jmglhe3%Y5Y=w=3`p z@d5a6G9pVa9~V;6nY-9LR@ehJ19ZN{m+PKvDIrJh8zN+w2dBJuErKaU-Bm}KTW({P z-=-&1R^x+UZ1|;GFHM+)g5Wmgy;1KBPoYpAtLUROP+_M|OS$@Wl!=7`xlR*K{gxkh zqP9gzZKj|4zLf0nsFgtq#Ta3x?rIqd;Tk1uyKEG*SnH5}O3LK`-tJar=eUiL_d2~M zl*n~qDIHBo29GN1z#xw6K=GIPmZhp(@(yW#~O1t@+%Tk?ZO(Y+nad1 z?#VQSnsJvle=W8ghcT3_wa3Q$)B5g~|0_2Vv3GYz;KghuVEx=c=b7+WKt8F!%_NgB;A{ShEE z$t7DB=PIk_vN%__Uy{<*!@0U&jpxX{$#Od>mtOrH$N2anI2SHee$4`3je4RX!Sgm5 zin!I(<&cgV6*=S4o8_y<^UzaR|Y`OD+?H6DP2i194u{H^-a~)iP`_`zSMgiIP8@SH zAxFXxDrwg0uwkN>d|$K9}$LpC=*zswB}$Jq1@rOS`$ zBwK)_23n|4@d=gCc^^T@HlY2`eV2UX zxE&x~U(Wzcv70>7xp3W3JfPk0gf%bq;0)LkzNF<%*y2jN<=c{K<&a}-I&sERm#cDQ1tB*?R#yNS$5cdfmplUIFz{kc0 z{o1Xd0%<@UbyXnI+@)w@se0#8rX-T-CAFGm_a{S|%TIKps+Uuef{PGs`QO*32kGlKaW zf=Lqtuulq#%!cX_y(R@Uk=A+f3f)LKiwiSPQ>dM8zeN$>q1%t?cAaiya3!vx8?%lg z!zgA)#r=>lY3U7u`*Ykp1sqo}rC=Jj{E#4}5$OCxNmk2*oQX8xHT+LF&XXSqAR#$o%G9%uCkNoK-Rcq$*KPmaRWFc?Ir0xHT zPqqJ)9v3QFCfmtchN=H;oC|(3_VL)A%7rb@MvI<}*-k=JwYdEH8^7_!wcJSap~*D< zJa%pDy@K~EZdEK4t(gl(igrxWF^7ev*Uwx#^WLWScih^sP_PE7ycx}tZFD|TXet!$ zy!q0Nm!i%l5+7z<%LpHw+4TPQTia*6bJ>y7J$DNJr2I$aF<1K{Y@J%kV?6A;GH+zw zb=1PAVMgE~(L0YkT_GwGpRU38H&K!uknr1gG<`sr(uWg6j8S~oFF;~4% zv+>$dxOqB2wqfnp+GkGBZidLWX@0|e{e19F+np_u+N1aKkC6cYML$2=G21qmKj)u& zK2p2uUjFW-929G*P|}+W7tQ3qUvjHtCM#0pjoH>H3YFv!a%^fWTnJ%oB)d9Ny?uW3 zeAAtph@9&g@ZT8Zj5o$ zD?MW@{>2lPSD&RB9L4<5fxCIkrHr(t@u~c`(T)QO`v~bQ$UA$&1 z4pE3yZjF{~i#fKV+aN%Pi_UmibF{2^q0IZxPzL+Cqm!-E^-}9eYUAM-W-T|m7xG#n zx!#EP(5Gp4E`KUUsK{_Blk?$B{m5o0bI;hmvu5(>V#BJ* zqcKPA{gS5Hf{#jXm%XTCtB!<7w(7_?wCKgPd4HEtIZBL|6Yjw&c*Nd^Lq&%5&>G_ojtc7s5GzAck zSIDoMULTU7qJ9}OVa^EuBk!V>RHk|8PnSuDv~`}6P7=$mR~D__gRcAiq!!Uh0cERr zvhMO%s7>~}a7v}t2JlboS4Gc3O;>QHh;EiU8gQWj*u&tAM8-_R)tPJ z>NWvsQ$v5kdw@(6eA4M#iw{H&L07PLPu(`RKF8_OgBp+Z2w3xdq1 zdO2PCQpk435GG^-9h{Px)UR?IRsQZh;eWFgBTa3$5{lN;QnK%wx(KSkJt) z_6%3G3>9$BI0c09zmIdMZVKm1jBmoq9v^2YEbrr7&h%<|-p6)&k{Do*i}MVOU0B4B z;7Sq1Z@_mcdB79Iw~1pQmCuAtlxoGP_P-~{VG13f5H^PuOHq}T_$I}Z0&R+o zsCWnOQoYAc5X9q1@-nA=1qC&hD@61~EWt5cO=w9r^~)izFM+nUmTR zLwCkpyEHUNK{)4H=CqZ(i|_c_j>W=KzIxBrFBGnwI`n{^S49g~Efh9S9wH#g1vxFR z6&vPSKRNR8k-1%WY>~1fpKgpfuq?AB&)iVTanyXJ*I?E69A{FzUiBd+I>GYr(= z7S%@j12C(<+RpShtD?@TxU=c5vuXD9M=#%gInu(`T$V!fZ0AQW-hOfR_Z6P+4k|axt96SJI~)a0y?4Wgj68JhuNWQsfA-_RYmja7V;V* zxs8#=tr2!Om8OI$EyT{1IyVEq>n##BaJ4-tz{*+{ZjG0>M9W(u-u-uuFO;8(lyyX0 zosXo#!p4bCUOIix#t-XBQdLk?mS?eold3{LMnUQoC>Le<*S#1W(!w8Z!uF~lU90N`D7|*j=u!gW%e16cVE?q% z(WM;3bR11%&>X2nr^D-w6+6*)IL%fWfABM&g@fU+-f)X1F7EJ)-cU0P!bl7X`%9RT zkr0HN#^I!RSW`l=uZ1i1F^tNU+uj923vF6y36YW);F4${*f&CEp74Vm!1A#=MN|qA zmPWqpC2I+J!E545cl*$jp>4EckldzOmbLQ534+s<1f|u^%Pf1F;23*r@)G2Qy(kQm z$Q4o(Pw=HP9{HeJDJ_<^r<1Lw?VfDD&ioAJ;5O)Nv0=*&6Q|LNBSz`QR+aS#C2Vpf zxN6=hiY4LJZF7p0DoJ{n$l_~98y7~U8gC{={xvNv2EMdFqVoFJUMD1XWa>zyu=S4c zCl`KnA?7#*?Ju%ss*KtzXL9b^Yw(<39MAJej5On0lTW5b8ib|GPQ@G@!2R+vb-%FY zn?n&-9r4hN?NvlX$Sh_%3MQW&h`RCmu4}ty>fv!keshZZT$!Gj*%!%!E0#uzV8W$S zFc$g&Ln_GHXD^&g*c3NS*haINIq#tox*S*{bzdknP@l~`41<7 zslRIYstGt+*RO$CJ+%yuR_S9v5WY{jR6Hg?8#c)SiVk)TX3C%Isg=o?U+jEZI(p7Z zRG-sII%dHy%12HHB{oDmWJBa!Q=4xJ`ie{?O*9rL3v14zHw%EtcCw z{ng|KCA|srGCc$rFyJ9lctgO_EvH0uU>Xy=79+Xyt#&GHA5#pH>E;aMCns=rsvhZ#x**U!&GV z4vF7erli?;UoS(czvvqvHoDNqN&X?1Nk`)~_i5$TPXTWmd5+q<+*c??l1E4r4lo0Fzm3&nO4p-{ zW&{{@Th2J89I%Q}VqAGHV`CrQtmjc8cqm~c1+k+1xD69O|C&Z9vsk=xh3^_=Fe?b= zsn4sorFw*)aHsC5D)23+BeSvp1?(3!+?I4KZxZ|Tjdo^&7Ha1lz1-?gZi_21I6GCg zqEv(s)R!PXo8a83Qyc{y$IKtZPpFbVpc|diEfTLBI+P?HXyS4JCGl=bNuuDo`JNni zOy1=2c)O`FX!{M`MYe}FYh)EGeczP)q4>X}p*@9(Y@DbA-;J`D4^_S(z5oF652?U* zgc8;RaJ3O+XQ{CR^27ke2U%3-D9GQ0;guo0q#6JN5lS#bdens|dFA5 zNjAHj22AF}ALKW~iH4@U(zrL4wQsT5GkHWN zE=$(VmCV`a*TE^td@yEfm1)Y)LuG1f!^9U-wIXGkVvfz)G0*HcWU+%5G`s~HC<^3% zwV1J^zzOQ|yY_M^J-GhM%g5edJb!gGfAwtJLjL+l-iEpL@Vk|>b0e&EMyL$)(R_#z5Q_- zN0*_JmD%c$$>UAf2YnZS-nd>vntZ&&3MhLYS}T#KgMmXC@>d>DI_G&A79(buBT9zx z{uC8uI8Ht(T}5hXz1$>?7GF}3kn|$DxrPar6Y^)2suz(QdyKHzAK-hY7Xc9-+~-XT zlBtw!p>SQK02AzJB=1#x85 z`X3-T#b4ee{(|U0(yOsAebp%@8XY|f&<*N~?WNi)II_v0f6Wem(FLCqC{@Nd%PZCoCvPyzLh`9_9i#VW-h+^I1}((j`uxnxlf6~H8-7`3p7TR4S* zEr&@Tkqh!|JV@poxj1uZHKs{f;TO(zyq3yT!-rO54 z>j{_k&KGFwE>I&}xkKUNz6Do5vr|+a0Z(Q-kNHF;?ows{{PrL3{o&sEr|;B+%l9q1_G8Uiy?JUgw{>6yeJ5(lK>x2%Z^p?H zVoRg?N(#Jb*dro`a9S970^}YEfAHoY0uCm0zY7A9lJ1M;qNH;+R1lV-`OlQB;01IX zUdNaNb;0^DohIVOh&bp;-X>H(W*U$)-nXE9ul);tK{8GO^qYVmukVA9E;{$rdS2wW z%$p7mp`bwNCro#MBch~VBK~&<5L6cF@qgD2rA6Ut`vu$Tg5Ep$7|cdMPLfc*8{ZS0^ZU}s$0rIXxHck1Gec$c}+c_D$BP_0-Rt zz3$WC9mpFX{gFqFfdvg=-$7lDY)=$?jy}}vYk)d3K;n3Z*CSHzoJu=k^%njXj57-a z;fd-I!Eez;C&s-v2^#J4mklk|zO1yA>??>$DuI0k)&po|jLBI)~mfa*`UV2 z|50F49VO=FMD)E<=24_9`AZkdn=AYtzL3x<1RU@&%GQeIkoQ5mn^Ud;JT0QpB)o-jQs(px&VM9YT z@}=q~UMbWLM?wDjX1IEV=>|G2;!*eP!QA0>I!0097gg?XR34*PP>|BK( zCF#rMW_0Zcs;m8IN$$ko^2@k<+p3A7*Xd&DfKe^G9uZN^`uYGERqfg~sDkVAX?z%x z-P!^S7K|4K@@;wxV#;F6`7T_@d!2~mvIB-2`5LS&tM7jtwU+QQcT;X z)#oogy=`W4=49Y_kjc-+YSu?;a6%rf=?Pc&E_nLx+mMM1xBm|+r}Z zKjdPxNfwo~L>Fdrn~9bG9^DS((wt>F>54m1HBRHla}@$;)XN|6j=n|j@{i%L&b=q+?>48yWVWK%$$CL#^Dg=FPLA%YM_(;L)`NLZ5hG^ z%?pke><@6xq|-F82R-FnDyx{vRouUmuh{id+ZhMs18E_*0UqzJX3f~Ij@~P&fV+0S z$%d^fIueT&)Ioe9csN?n8qRNnq3$&uOC6n|lXItF?musxKj(J)lo|aJe&pqoBz3999 zn=GzEGC$G#%{Os6nOnP5Tpi52dJ&Fxamq+isFk5fbdh(y`^QiH@Tpk;zDWPRJBOnE z&xiXChN})Ox)0wguX?}tdhfD@X41}QQLp-Z+*IVxIB-(Py+?#=;B;fof4d-DMZP*d z&MKpCJ{`>^gX>)UoX$aOp1z$Me)hS@GtY;gJ{&&$Lb&S1MfXbvs~2;*(S~QD6OtC8zW(BAu!3rMF7g?pGr)SgFiTR({f-3q{a1jwA}W` zq|@F8&~E;{ZuP-OCS~kvxylWI@GqYLk_{Qq+AI{huYz& z-c2Hs6(u@NB?`zx=!gFRB#MAI)JE3{ z^fCAO3(pRId{etvTyeF`FqRu4Pig^YbS)sF5=2!Yr zIFp=Biu#9KO_rI2v_<(Ii-Sx;>t76})8!`AQ-Ei@<&42W7I{RtP_xN_)>M91+jzsg zBNJ;1G8a53GN zsx`@$Jj8v!b!C}JJmud^O^g;l#QmD84asi`s57R3BkIvwb$(*J3&p(-43Xwt4Vz$} z4|j{!YXk2a-xACfZ=GHr4!PI!}JKZN$atAmZ!jSU!z%Ep9GUaXTC`*sc3D0 zN|Bf@X10xlb#hrutBHt8^rh&jd{*;3BNGTYAGe~4M#V7aQ}(%_W*0T;ovrqwK1nWF zu;vb{9VC;neJrpstiIC4)f6unz@kW>(@%bPKMLup+*TYnRX04Zum!Mv2*h6k^9;RQQX2#9Q zNLzdt#z*|FeRv0AQe^R^iAm@YN0C*?pJiwZ7ujoQ(>;KstS>qz+mH{pxw@HORN#$E ztR8FSFm;$j^=l$-G)0=Z(fbzeiTFF{rMMH-IWPO*EkM3Z_ipN}p^=kgXTYR{?=PQR zNdx!K=#oX<`mgB1SjLCx8CkJ_8XLxNNd6D>fNWv#gI(Pa2D50fjZ%ryXD&-PFP5ne zFas9>O88s4{ERL%Uv&E$2A#F5R0^|;!OUrVM*039x>zaU-y#Nw$7Vh-G~;M!eJi-L z%V5(Vcx2|TSdUbsm&v^lSM7zyEL1YBs#HPDlEGOXMOK}Wh#?&$TJrlmBvSUD$GN0 znJXBb$lh&*()%xRnO%&oNLAN-GmP>^tG3@Bi{?HH{;T^r>!%Qp+HHjq1$P1FDD>FA za`P)c>i%*65BsBQb}r=aistT0I4#a1I3)6vOgTQzDp@M7i4`|TikoA_{gGnQpD*4v zwd*3LRrN%wdZJZ*&}dJYUEwYVyzh@)9}742L|65OEBoe~!sXj;ANtE9KRL4CI-v21 z5mEHyk1n|2VUk-e?&6jRLSLTW5G`l^g}D^V%;dERlX&aq4xSfWZECK`YcLiPY*DoHs6^3wJqxZn z{S9M%Afgt?V_#C+1oyq9`~M7+%_H?ndJ$Z7)ttf$(So{geto!pPuRWpj-uknnAfV( zATuwL31L4ljcZzC)$1bF>!#2Fl@OS7l`6#rP6mz!{oIE!+4_K+=nt5Ykf>)3d9Tig z$!VDIAkWnsqfq9Yym4Xn!rYE%BeNs{3nxpSK{`6vdv)(GB^$WK65atkp|S)RwGFY_ z{zz?qwDzg6t4jH1mNe@tHz`f`u$4c+>UUWU9)b-|?t6!Uk^x_uk5>YpdyLN3da%HEa zPNtq@x<~8)h-{Kz5{Bw-wcl*N+p_nz=P%2CQa1lG*<&f?_E-QSd;}4&vzu^DSGc-+ z4tlLLXw(ZToT(72%)$e(X0e@FvjFUoUu;u46aB=Y5K7?v5OXy~T#X?mH`mJ5UppLx z;HcW`fx1{36X@9$E$a@KZh(36;!O*#r%XfexyDP)OrwQ5F(7~&PKr~*Ay-?&Y8%U{ zyqiVFJvgch$S~s(b9F^rU2{ic-8&=QJ7e90k?z4o*8!3>UA0o`2gsfunfwC?yvHAz zfHWmS$MhpjTb-qZJXEUb2O?1*`jxan71|}x8G(#oCVIg1Gi;WGatQcxj_DQLn!cR3 zGKZmDp_K=)?k<7+wWsJ4n~Ci!>J$5aw?47|x_xrxYm9M7w72Oe52omm;xz8{=KeePg%V91|!7dwv z0}HMe74MwC=D+F>f=bZn3NsZ!$d#K4f~(+l^d1*(&qk^Gs;d@m6!fROI%-aS+i7tX zJpx_*2|6{Ue6B&Vm5Bt}QcY6B6i*XzspKPKv?Vg2qKn@9$o-=Lynj7;UARaRqEHA| znMDT$-^S^+00|1k9)({~IS1hFq?>p<1%Oi1@1or}DZy#T807Lu?_k*2##7eik=D`t z$&_EFBqlP$L|)i#jETIk`S+jk1zl=L9;J5_H}k}s=5FR8We?A*%CtLzEaqvK#i!SP z$|g1@!jhh%$v2B)G5KohZ&b}z!OGnEXw6fwtu~c4b3~s&inuQKLLDn;j1)i!V}YAP z19cXzgq^M*JAde$yL5X?xO~Tgo6+#JhQpo7t=^lxp*67LSI+1K%u1TOqeibIx12Yf z(W3R?!p^zQaKXj}M-P3QP{4&?>mpnW(xH*qWX3-s<=3AfI#jde7ae2%C66^ApVU`O zzl&zBqSKTCw}9?U!P7KY0JbGr$IcezQsEQQ<8Vt3e}wQWdbe`bv$=EjxzT9#Cb*-W%ADD)j`$l2%IBlsvfx;Q6onKo3}SCmPdRg^bGaRWVE4Rd zDpz+gJ#&81QMnRc?D#N|bjz=zAD(~!w26$Vi3vV^Oj1Ba^0|iyCX#cA@S0Vm=x@Y6 z_;#)cVoW5ffB*zU<_q3TmT?e?VQWg&Y|e-zVGQlMpm=O`aSj<{a}kG&+hk=tDxL0N zY^NWgQt@=o3gSE{VrQ*X^l_=&BAG<{XrPHD#6|h?I1uh&{3H&gRYEaKJ;MQl({G{_ zz-e&>u`b@dMCSTDF-JwjQ4w>H8`w}CEN$v=S+U?~AgBZ-G6P+pnq&ywwBT5)=ha|1 z<|vIgNZYaXdTa3Ff`iOlag8vi^r5}Sa5%eal!I%Ytb=rj8MWsl_6WuFN{6a}0n75uP;`K3JP4iHb zuF&%!2gZqh40A&Kk#%*O>VVnj)WY|ZWQ<@&?1W^`)7oh~?FA>cQN;yhX;sd;iDWS7Om&~lmBvegY zlV4O+1?@Lnv#yZ$*6Ew4qZNJdL*}fT-Z!;lX1hW`b6Z-BT@>&e33A1pC#6gV4ljb2 z=ES?;$w3cK$Nr4_qRo}EMMvGrxk4y`%@q>-PE9N5BZRT1{H7o9B$Z_P8R167aW=zX zF|zG820vN7O0my8fH65Zd3MsQhse>EntFozzZxG#{{u&u#EWOTuF=M5RBOAjhH8zM zC-L-}Wz=%i>a`qAJ8T)XiFEMrR6w10t)uBDm|tK5?a>Tx8VTE^C?Q?RW1~D5?9I}{ z@?^Lg+Cf(6$NZza$4^YO$0bOd`zGTypFBc}Yj5K%nb5C%g)TjGxrIyIK?KY2aZo!l z-R2GrF*{T2P{21dB+pPzq7ymh&rbS`Tm-%kE#J(=@^8acwwu|Eu6e)ZdQ0$NXm#+V zNLhO%w<8L)o}Kf~(dnZB+w>6ZAoC*2@j6q-PdY3lAYp(-=i}EbMu&1LFu{$o)&HYI z(2-Cq3{*3NglK&=oo-ByK@kEQb5f!(=-0x%G7icz`9!TI)B7jJUO7)D6lqpNd1AD^ z`T!2z1aF>%j|8N*p~x{fZuaSgp!>Mu#pKChSc6o)-iYkyC(oVd_959=43AIxbSIfO z%cKsM{kV|Xb&I;RYBm$p7Wqv}>xvBHGyt?eyKH&j!pX=?_c#4vM=9&#xN}G?C#jDK zVX;0wjv;{UCHprd*v}BUu71lUetwYh<8AZrb?YVT+Ysuzl!kP5q8KuXxK{FC!#>mJ z$p5x9N#feAze^MuQX;85q|o@EE1ER)RoG})cswOvYswwT29#(qQJfu$guH9plVkzp*fEX^2y>j6Ab%}mCEpR?!26oY$)S{*wEgl#JF;KX?u?HR%0HuaLyo?)4c<3P&`N8U>3 zjS@}6I>69jR4KL7w3@;-jR7yVtJQ2`##0}3dm;}g& zTj8ljgskwS!G;e0(k^OZs_JYw$Tur&O@ZnbEAJ}+i?|Dw(eM;s(N)_yDqpKG}^c?TD3o1vY$1v*(I-{?^e=fD_&rqlZg$^Mj9Q@ zMwkzG+y>1>_!WU}+z>g>U_?SM<)wAHS)qlg!g2{NamP7`oD2=iugElrtc8paJ_d+; z<{3^eCUvZ^*#*%_(q3_Cif z95Wl2a`LBa%<_ZoFk^}N5H7EZmA6L9TVv&2k@BvoegEEF5_2=Pr{-T!v_9gl4>$I* zcwNL@7d)HDu$Sa~=CI`EPmi$2H4%4Bur2EDShl6*=0LI_yAV9-k_reAt4Lp~ z=YuUb24)AKu$9;I;qa}|o1>pm6enzDl>v#JM$6%%mKocW{VBs#2{6`hHH;|{{sh)~O@^!qMUoU-xlI!dE%_LxGZ0B> zOh-|sEu-QRd3VnvRSiXA{RWx{;sdpiQ%@9u{@ zK-f{su>-;Rh>&XwR;Fi-_#uZJ3USoL}CwD^Wg@h43A^^ zRH1>5fAw)>mM`#O*G5)>ATpQ^7*OG>O(WaAk6RdbpQ!GGfw;b7q_zu5H|$uBfex=` z=54)1myhz#;~8l_tDhkHL94}UW1t5>Wf&JqZE>vLGJc_Y0_DKw`RgN)w4+S~dt>+v zsEp&IS}~&68M!e!>>I=D%%jjN=m7&HJL8UF9|uwH@#vob8!{2GT&tJ3lX2G}#rEBH zPzij0Pz-Qd!9?b0oRZ9E6h+!(U;=TFJ!Bo>uS+o@l5*XmN%0~o0`%)4wao0R*@4mb z$FGk^-D{>`(;Na0)0-8iM4mF5F;fE&#&Q+Sc)v3ct7wl@v@c|J{Gy;}=KQ;mi>d^c zB(xP6jpo*cRUU$IPSJc~bE*hn#`wp0VE&0_6qCItlxO-Gc~axOm~EzXx)p9fNIODQ zo`D<7bT>qK3|uJ8DQ#n-fBG#lGA?*iocmAF7xV*9%T7Ce|4V#=k=g1QQye$xl!8k0#K5OzIGD#RFX-?kdS#ZBs2M=Ccho` zO@n|<^3Nu(qsstY7+@2DaMNz$o-wdBvyzhm_8jC{&HG&yc{5l=hM%G*eaG=BfT@cN z4>O>wh23Q3*g0IhXVJBHDLen2m#1IWZLDe1P&hbdoH2;Y-ODO?XVdhia27KlM^9hB zcJb=PMOPh(yeM2RA;eMzQgOYEP>3-`UzmSy5xgnmY)mu0c_9t%Cv5%~Q;z=d35aig z;lXDose@Qn*{IQg$?I`3jgP*%^6sC2)N`uURm-tJBSb7ZHbRPpFNhVa>}}t-m~4@N zy{K_0-b7)kP=nl#ZWMGc{PPg28E=|@#tudf!Es{}Yg}-wq^4_jhceCIuvox?2cPYd z%{c8ypj z0AhA*+URvA^3zGN^_1F8u>p$x5|?JDhyY710fQMhVV|f9P)5XbeqW=-y^3v z4UvL|Xh9QX^!lHgvg0%kJ~^3eU9q!%Y9Nu8mt6{mLSf~#!QUGM!Cg`ttpBhu*4!Uy z?q4Y0^zX~6Vr4CnvX*FBTiDYEyEd_s&PYk;+`xSI?It+Vo00CjvB~{TX0R)iHrw;z zp@ow5kP@DG{;K0z?$z9&wCHXiml5!z7&si*x#+G-bl}U0^+a89@`#MFbba$eU<({r zC}v;kZ?w&}1y_Y$4_Eapx_hYrvIe6*zQFx6Qmc7GJtd!73Y~STEgt(qZawpdv?fxt zCghD4brO%HCs);1uySVWiIL>f4M%;}dduVj-CAfxE%8eAXD)xf{zHc8$ zw4&aLcD*-}PFXRgAFK{~|F}8y)$g@m@0|0JsYMk4l$_jLZ^N%1z+_BeS|1n*lkho!}LvU++C8$!qbP0efg8hE!lf=(teiHvS*X@vwkbCNg`Vsopc$H zmx>_OF^0|!QlG(2uF&TBB$dp5qAiVzIkECxV{*)P(K*aT+pAD?x{?nnNF;bAd`B%A zccn`QD@YSUT~;`V#n7oOJh_{HF(tULr~kyg+B7-DOx1Xqw2cy zUtAhI`26SzuATQkQ_}C#wIx(+=q}AxXbZhGVSekO)gS2(B zm*yNMcCC16J`%}g=&tmhtMHxu)B9m87Dw<4u6oU-@ajnZ>fpeQJ+phF`5l^D;c#Wg zoGo;IZhu(QEmO5%Xst@5S@U)nt)6k=>`Ht)QB5KvD}^RVu}M+{w@4zjd%;mk;uREE zL@FS|!UVCZ;Tb4cxaeqP9M>eQM)VY8488h9SPhs$+1KDb?WfK;#aI_g;y+*`4Y#S! zz!svl-}E!h$ShMbZjB;Hpc6${E*UpytXRD);9r3cR+IRX0PC1)C))Fg1*?)NYXK%o z(wh;Q&3LO4trZw}L0hyPq@jfdvBz=R$%(#c6YrJTUM{&0MQ>|tYlh(jI1soDGnsxY zM-7h~ug0-txNL{N7c#(2`-kPz=g&P6k8I34IzBlzd7-)KVFnm#(5U5pHkWOOYfX?1Mm1OUrFq5=pd$wIMB`MXFrv2YY=O^#Kv5+6V1yOy8IRD%uMI{-AxeF7=={AsFyi1e9A916DslN z(eagH47i#x*xBB>Ia~f2z5EAs`3_xZN;5+NGNWLgr(2DTftMMm?nB>y*elc0BL5D3 zo~W0Vr$&tIp_-XajpV<^GqId1QEj7y4DKNdkO3xO&vehsYs~))yrsN77#NMMYQMXx zeXc&Xe%syk+t`k`=5B5cwuv!!ZNyz0T#pS{%-s@kw{W$U1$XySPQg28r_aW6sv`8}H*Aj#_QU!_8!Py*&b`ztQ#oA3Q=}iKLUc3p` zex?P~r)U%j+mgqE)q%pmFdyB(r4UeY`=X;`WiM;Q-cM03dijf-tlK836!yDl)3>fF z3la87g#@0?QrBm*v5!-{rIC5!x45;M47r_FY<4{M5^5$-(1oTZKiVCpVOudY{dmW; zfGb0@jpQ4|L&K7OhlYlPnlMju@@Zh8Svh!pFq+dkWh0+ZBj4#>$YOfnSSH`|1v=k- zebH5|ESv952DZIR#sXH34?!xM1;0S#ngxd%!m}%#wSW=SMgy-XKk;g(_O>}B2nTCZ zn+YQJ0@#_gjF>}Dnt#lJvl!DSZTOGiJ1V2|rftx_;fs-b9Cs@|b!cP_gHJ27yb+QR_6E?jkj`KpC&nTl+#ZPB=hJMswZOz(Td(^ao?h=|5v}r zg)eim>Hu3STIQwvU3WZxTl!a}ce2Ttvirq&e$UH&}kKeoL$ECoNW7 z#hbMMfQ+eFPsRf`=7d$-s684-g0TctrD@>W7&BZn&dFN?5mtrNjfw|wK+?w8FM^UF zL~Cc%MTXbF3cmoIRTVZF)`d3e(=?!Lou}!>*ZH)zW(ET|^=4BXhMO(&1xh9|{-#;o zRQ@uh_t9jhsRA@?Ld47=op`phq;J#cd+{nG(fJYv#qAt7=6WgoAKmDi?TePS(_q(4 z@1EK=|n=Brk~o!Pdx6)+qqw3+`R?}V)~zaRb@jKPUW64(_ z(wCz2WZDX59>^;P_ibKIu?k$k2NX$7DWHT>{ux0DF)tqhC6cq{ z(KGql>sMdLxrVDzo7)RyoQjLPOfp*x-HWbfoGv(9AUdN8W+-s<(AxUYx+ZRId1&qM zr*+`31=0Gr4I*^$vzN)AyUrb2@!_>1Q3!$9_Xrvof3o)D-*M}>O459?kxMJP#_cWbltfZk+6Jtz4 zX@$(ys}pCSdIh}zRpN?eZ6+6h#DijYaR(%?Sj?Y>qgRHfKE+@FICW91e*A2TToCd)*yv#4YCp(EHT@fr~NMkwzSHzGf#sgR>||zyOSlbO6sR~-z%w| zVk+sh;~Ja!QZOxCu$tJxkno0;l20vZ&PvXkCQ&ROj>BB4P}j`lqN@VVFr1axwkeQ{ z^{M0$OVj^`dOZmW#2_1i8gJ20Or9hGhtSvsz{>;hBJY!;QfcbLLx9eO-taRh5%YukHSU}^$8}76azF05WC8WFfN)oO_yD~z?iKg2 zk{G2P?nHq)hJWt83qj9~;@M)@Cxnhbs3u&{#?^g|$0eEusu7&Dp48TPlx+S9F)#7X z=xx)_NT;XBVE{?w_(Hv%qGURP&NNjBx8QjsJA@S~C<D!xUS z6^=~}>MeXh4;RBAWt%eHG-pUgz~Sd??8)=otjEly;FfSf1Nh$JGC7ikod5iZnE{y)335vxfYuH79?+Hpa zKtJOMi#XbDy+k#}_N}6t8g?Bi+G3zcf5W|Gm<1_I{$jmk*ej#tC+#Det)f0k;=*IL zIt(07nV@dPL?ux!g(lJ`s*{VE5v8Mef3_jA>3d-gyA%4SbzKxv8mIV|Mwhkcf9TuOzoLyr8T^ z!V@y40byLfl<9$au1*v~Xqt_WTdjm-*dxA(@iG6Bz9{6szeS?vkE@B8{30_f z2rA@10_>V4vg-{O!W=pYFym0Qm^ddtL{zY*DBNKN(PDlPOZpW-TL~9Jgt&bZM8(U)pxiFq0NDz*eLUE><#KKW=^G{T!$ey2= zGF7=?m+a$5#qfrw0wj%R=Dw9M$DT%G`EfgcQVVR8l z$DNZG&W$pkrg9S=`Und#7QD)YFHmq5ocltj7{(gTPK^6&OiGlBg)~E!G!*2c6L{uP z0_=1cS58H_|6P_x**?QqS=;qCep($VTNf@}KUWhj?pknlgD(;*SRE-?9V=*sNOG*8 zBT~>YXaC6geP^_wZ+g43>Z1TMxO3>nk=Y}WvW{@++Bs{ucs*IG)(dEk6g0;Q)1$GDegRk&6LSLD$ z2^Vde_x||w4^J<+_JF#{E>w(RkNv{siMeVbuA1=bZWgbOxT=F|pi}S3gid`{&h%>b zxH96Z40xli)zGQW$|P(3c?q}03f*}!o)GZzO!s+g*EBmiVhXoR_5mzs#I)!lsE91fURbno^|LlU$M=PEiX1@h(@Vs0DP(Qhv*@ z(P6TGqE@7*d_Tj;?ggJMmj52{JWs)tT+Y_`E!-C+$Qi@NfgiD z-ppigRos;)|YhLrp{T>eijMBYYdWD7tDcC~0P%rOkxOX&PphP?uWbr>i1HUKSY zL%{_3#GF-bRLEWBrE=*qt=hkU- zI{DcRjxM^}mhy_Ot-87@me+JQuSrQ>Dyk2T-Z(RRCipTePjqdwE^XWOmz#dF>2`bg z+2_H%D?DWVrHyZa@6lLswAuFLm!bB?`=!lR%QE_RnoSmjHKyER2Z9%R}lFe(=ipb zO*<0P&p7R#9EjxKLNTyZ!$z46Fk4Jk4(9)geBu+pLs&naqM;;KqIoF0quIUpEmo)M z4FGhwx?%eaywqlx1aUUA3=e%yy#HQhpY4B=w%C%pkDAN6?->9YY^xav=g9^;PYR|pzGIXFMh*d%n-*@qrVU3ZDM~hAg_I=|o;LlS zpk$5MvceV-1ay=VtYn=^)J6j{1T2P(!4cyp2{uXedO3&-*#ts^5i|eZsziqi3K!>| zPC{XLQ_!(qE1nZwV){*Ms`&p-+hvWIIZ z6`tG4zy<#MHy8|Jz&ghX=)u9r2Qx0EoI^p+f?30W6+A_jvAwpr*$zKSC~3XEQ)O=9 zF<}_F#pX&Qs?QLgYVjzZ#Z1Al8m{-ROD3t*BZ+Y@8EMpwIvHNsL6d18O8pf!vM`I| zpZ14y>s1uh^?u*=zTo)<_nIYlkwP6oiJ`zl+FWo26ReAR8p8!mK!43G2?znU{?ca8 z&S6{)M!CWl6$xji8zeI2zrfdUIPf6?ozKhLzK;2jS}DbKk*G?Vn8#pIOfiL&+&Hr- zq~z4C)XFn>{~>UOyO6N#yRIqeGrQB7lPFTpzZ6UT{DcPQXMyvIv^721u;3_Dck@Y# z7mOhcQ~nhnI|{C3t65ZO0@;SDCvDLQI0>|udyvA=Gj7a3;r8LljvCBG;a;?fPHFPP zuu*y<6CGca;cSy3jO?|KS+RvB&mBUF2YDn|4@90Z=>H>+h>Eg%)4l0R9@4}208iP4 zIv~;slyfot1MBZvp>yrNDEZPZrpvBLO&jE*AqR6*plw9;ZY4?<`t%BVVghp_gkxZ~ z{sy*)nzM4E$$*+59?clGWyX^gvV~4`6&W6BtM+HBgc*A-@5Blg&(xj8#j}QvpP3jr zJ@o3Z>|+!d-!*2Lca7W7b^~))m!kfF5?-f^c!x-^FXz!`vzW)U)3E#giZAZspXGNe zHjAazhBVoVr;g)nR3G7%uKybag4HjBSe48LLm~k2{_U zID+u^)q1-NMzuHe$2RP^yJ5%7#o(7CMeFZuoyuD3-5l%PbGLU-AUk*|Qrr!CZ_4#? zR`HUnYHDB1RTXhn1+yZqO`(fX*QSrNORn$xML9hw#}izp_R&Ylc04v=LD=G6r&fYc zkY4Y)yIHzFFgmY)%ux~zMQVaigj2lMWGe=MQ~@kwrzT?U8K@FKBp9w`7;5!6oeA+U zB9BS(tRV8@$`Qcc(F?Cl$SKZxmBe#2=1pwO)sE`A)^oKdFmiSCf}>V{#*ns9@kFEQ zE$@>YLe1k44fvJqI_iFQZpV*>VTklIvS*K}2G2sHJS+VJA65M!{o`cqJ&!DhW6Ou_(qc!GV@`Pj)%TE?P$K;9e zvrva?zp2<5Vtl-mT`{1)u|>7FD((tV&aYEf5WgE(R+A6f9Nd0m_v~)4yoBCPw0-AM zy!UxqP5Kz($@Pbp6?z)}VqU9GW@Wx_P&YLucT>2q4W2ZIZVrXpo}QO)*ZpPlPnvI+hYR*E;<$AK z@`|U}p+|HYaEbs>#N9=MW@IOG3}bg%qKAG8;m+DM?jHEHrP-afLd7 znCLp5>EiY`z<>SP?AIa%8y6itE1ONImHw9da7hI#XrQ3kD;g(X5#t24K_G`@7`=T& zgA6&|p$6qAH;63P3;nfdt!Q{eD~yW@UnYrZ52LmOrGjxN(zY%{#zEbF6i$mrM$I+{ z#kqcus!w7Q#(68QJgxI=2(}}VatMTbe5`lM8mERtm2yZ^kkfC8fvl2Od;6#iBdOkP zoK)4@*eaTKDKcN9rk0zUssi8nXbL1{S6fZwM5$wbgJqq=iFN9)U>NqEKxW2RvI^oE zB8MnuUngcww0M?p1d@>4Rh3DwRFyfP4C1jkNJ-zLu{eNg1KH}T<4cYwQ5avLB>qS> zZR%o%8~y>Xo@$n;oWRtwxg=DYVn?B25G?No-X(I=cTGR0$Y~Z95P^YE*uX@cXPFAe zt#Ob6wgNEl+CJ3yprlGI;zJ0{|7z?-24EVWL9c^unUCcV@*6})?|9D$y0q+@ex{NM zRhoY42om;&tr=$d#qVe*egJpYCWr7wbB@8OJHzX2TgQ%`-ymH0C&)Wu?IU&*;SCcV?>teOtk=kx}b*tSJu6Zh4j4kBT#w;hp#qeF;r0*(WLJMjjjz&C*IaWs; ztApE+evePVP}j`qXwh2m1b)4F$XSgsM{UGWD-==I$m=)xoD?$7Auaz~sioyH8*QTf ztC{tk3dxF2QjN2V+2<6TGKfxE#r!@M(Zet|sY|k-IH$NJM!wvY-?0O(q4cVWk%~lJ zp!Dj2NJxs)-63t!IAXc-XR2Z=IW^29dH@8P=GCE{O`k)}S@DbsX6@R?Z6cW%A(|3% zJj2K3mbv*pQfOsne^*SCc*beYBaxXhGtq5KxPtS+OO-tg%ybbrj2p#*zv$+54%*;q04IJ!FO}+e5G2dgJCBp|kUy;qs^9cV5+1c(mo@R@w=b98*z-9-SLo7DE+Qg7w0Fq6v}n~K6BkyafD!TuNf6^)5fdbewu^)k z1gp@+WCw7h?ILc4Hh1_8qN`~&5VQjuaB7LoxE^C&0IZi`HCO@ezTsC#o0|P4D-z^U z@@}9Q>T&S3gHG}xcZpZ{qzDnTKSwJAttIhv{?1CfV6KTXa1=WEIukB}l`s^*?&V%u zH3%iLsi2$*Rq?sN)(fuy(EV#fGa_a7pVGXzif<_MB38UMQoJ@=ydF$pPbt|?jCmR( zp2n!BdCIA-AZ>wF;YQeI*t+1@#uki*hy$iGLJ+p;T!PiHBUg`*wh!!3sx#<3yrPkT zY&^W@$R@UM%uxw{qk%DH6~dEn>AJbLxmELD4Hs`&bZlk21gO{VI3)jb)Q=yjS-CAy zVqg(779E7ppFZrnFg{W({{gMQKS=4hjM-3#rym0T*nL1gONCD30h=Z(&azVrIjvBEaNkZJ)p}k>5_#@+&%~wGt8YU_l#+$@%|f1X4C=O|NdvXW#*Z_ z#ab0PPhMxVz=q? zKho__aEWK^9v?Y#9&P>`x=ZJbl6dA0xPaktd6DvdOqai-EVdmJviy)@X}eFz|Bar* z*$?^$mw1-JA*h^1PweF9P|l~QgHCkGDIcA7f!Rge4KLGVXYOU@Sq7U{@^*UbZ|VKN zrpso!-A$LjqGs%+7#X6K576ZxUH&yC97Zf|Cmmh+MS8doFUOsH;%@PJ)#$$tT&JqF^MSR_{n@K_17Qe3mXW5oOxc#2vfA zi6U=HTmt4tcqWsm3%mwG$bbe^ev>lO0a!dkIs1@*o9-MczgnK6TaS8cWOU1Kvm_Ba zSN;|y28)udp^DQ3PCWcw0O*eJW5eJ(0*@j~tc)&$X7TErEkqI}%Rz zDASUc&t$aLz29@a2X2lMS?syXQdpYEX3-prrzF7&hahHV&T<}m`h1!tJqMx_QcIu< z_+M&Swy6&inQ78KYrvMUP#8SO!_Zfj*?q!cliGqK%N7KQOq|C&-FKu(wSjF^bZy8^CD-0}ND}rn2@8VI@U2rf zPt6zpxa@~zk@oHES@_vQ%aoSLu}Kwy^Yqb*kcU26fsbyt?y}yurAw=p@;nI^R@U;c zrS(?J&6c^tA07Sv(MZcP>>;ZQGAGb})?voBJ;Az{I@d6bXf4$4Q6 zC~`@aGroicL11#3g2XDzZtEU=Qj&_;Cn>C`e1FgNJ;C!g{ImW@#rgzG+&aKQ_DN*A zpCh5qwK|dmZ6iENm_njN1j(a(|@4Pbo3Vgqxx_XM6U!Idb%KUz2 zxTr6Z)1Q!#hhzl{6B!h9Sc*$n&b%9?v!$WVIqOH#_oYx@q-H~;Xk&s(gj6u#Ad6zM zwN0uDew8XbSN~DV_gf;3PbDmPcDrtwg2b1tInrht6$GKKWeV-72jQ6wuT4!2)`=K9T;MRf5T{!fQLP?u1RF zz1R1K3U5{2tO{53L_EC-8%y50lSl43Gv6tmE}kh2IA*FM&YES3k`pJ=GNsI5Pr`y= z4iJf89zBU5Q6fqCfy3_~y?&HBI6t(FIygUpai|HwMHhm()%2)lIVVeMO_XIwyRCCb zpl}}DK;d$JngshPlC&X&79p5Ja}gwRtWtLfQv|^rYhw2@TG&R-T*uqDE|G4RRtND3 z1PPZ_I&2N1f)s`@jVPoXouQEga=^YcW$avbrAf^RN3(Rm8bVJ~IEU`15MyF_#=0G_ z_qr9+j8lFIe$(1UP&_vpY2C!1FtDS1iAh_BR1suqY6%OX)Jq7cmk=b5TbraBfY+MY zH3*W@irEU9a)Z{nQ6Ap5)7*p0w4!b)KX^D+-yNy%PFQd=j~oc@ zAOnKLxOI1$^sE)GjK;2yB`oZQ#*am409hpQg1ta02OPX~{iTEj(GW^OFpp9YBw8H6 zVM^~HO1*=CdIv$m17rd7x(8+t5VWtFM=FBbNL8>%V{kOqurboGkt*MK8=psT2Omd} zD9V)T1LxoOU-uJW*3Z?mV17HnXMLh1O{x!e-`G66nb2YVJW>(dMk;~_K$MjM>-()8Fwv4@$VhR@NFilJ$c7tXqS`4{XeCmdGEztx5weU36Gi*2fHws! zC{AEOA%O*jiI>wVr6x58qLcvvr6Wje_DBu-nBa!S1Obf+g2dWlsYD$UL}^SA(3l`d ztWTHLs?dNaK?4GU1_TMWB-N^^h*By7N=1;!Ntbeh=VOh%kw$bUZf>J&1RO)=B-|NN zyZSbw^fm%|8$lvJU9T6SR4)WnF9ZpfK(;fk(^r#oSz)Xm#?`0ODT(!y2tcG=AKh_m!l2^r{v zyr9JMR#v?nX@d&Th*BRSpgu&PR1dL4HOq|kL4{vL2@(*@Z-7#QKGh;R6N=pe+qq=#H`= zWLb#v1TlI5OAv}_yX!%H*==_pk0`mYdS+rVWYhC5O;6m=^h7|@lh#SB+^dY~t9be< zp1vxPZUd1?Uun7Pfs8TTb@s4O`Nk?n7PBm5zLb(WminG%pay^jf31j-mx3JY|-XZ@P?HkjfcSp>T z9=gdK;rp~RW5@Y+)5*N2PfVQg$#%++HZ~y>lN7qc*oRKC1md8{H)!`n3_;?AqoA|Q zIFb)SX56D9@iH0zh_iJvHGhsi8M`VbX#-DsBd4h<#I=-j=t4Y5nON^Ksiw*#Qz3WI zg$}{u(s|fr@^NiLI`fiu)1`=#vJV}3c3^1Ru7PcPcMtB2=kZ2D!d;Ql@x{|n|E-k2 znDS>Fg7)DHaPU}4?O=?e5=wl9ZfP^m?St;27;ziqXX!$`0GY9KZc%KGGBdW<%XB+J zm%pLQzd%CVc5rl3zD&1Yrwg&Y;;!eD|qkog0|2bVQ(S>BYYrzcYas+&570SilvGRwNcQV3_&xW6WA>8;vq~gV8 z%8+PrTML#PSqU4$ds6y0j=pttrV5y=W42>%W7yq4e<6 zD!ZRsXhnr`-)Wx)jzaui-l~LzkgDu@r)9cj=HPTkB7>g5$*{h8chZwgOLh)(OZZhX z{Q%v`L>4`E!4GF5n_@Z8_DawvuuD(RV70QnHME>ZPuAvG^Uz_1*Fo+f8l-)gH7`-? zvaVXfr=jf6cZZQI7-^!1%AWV&%?@@?%{=_p;i=BIjxI|`|7?|HZMbj2zm6P55XN`GAZw%xj6{k$b-=AK8A3!5Si&5#g^)U4f#S>}~I_Ug^A zK1L-+^%w@D4O@ay{a*X1XGEq^+h}g~i|$98W`+H%!PdIC)&a+?t*H$WS|ZHnk|nr# zsQsIhqqNRa`0gZ%9@xM3O+aBf!Ldq(+3B84ULd7D z3`?%F)3ivP6^fd9f-KzvsOC}X*;gx?E^VagcC=nxgnCA4JT#*(RhS+rmAwi9l)9Qb z4p<^eskpK)wX-O~N}3|QL3r{KAZ6f~{n-+de3Ujkn@aSE*={qFAJrTkfmN3ZVO?bc z*mhEZwz<0JBQY7xNgkL`0lnPOR#wt17i5XD?oSv>fr&1cJn z#dZ^q_r@6@QL*!-ZmC|{c`Y(2j$(ldvS?|Vqk?hbf(m>~_O=j1G7_q*=p{9x0v`?)BWfgOUV8Cp3#8aKX zahxH?I)MwN8$cJ%8hzU7D7MuvYIJg!I+-JLrzv$F2#XT1zW`IE!>Mx>F@IFilUgHpNC-Ri57c$Jgw-UFij;k2?HE0ujD^&V}KTRByNT|F%|;iXc% zwZzdEj^jGwGCF1Z?&bK2XyKUb+-l_MZZ+TfXH3i7Jh`{)<^J8{FS$TQ gl&|WCWVXw^U18q5zuj)%Jo@P4PyX0EsgD@>7lz3)S^xk5 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15c871fb0880f1fffca36fb580f23c2c2a16ab70 GIT binary patch literal 6566 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cf9b9dbbaff4d16efabde4054691607dbd4366f GIT binary patch literal 76667 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..860d91d4205c39f4ff2b46b42b11947c75dc044a GIT binary patch literal 7705 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 D?dqHQ literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28f477e49c97c5e092de9a7196022e844dd80e0f GIT binary patch literal 41898 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

-X6kPnAb+2-K)#dAgB`*5EJL+R{)n4;jmay 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c98a0ac545c977cdc3f8905297fe6ea48dae7757 GIT binary patch literal 72315 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6dfe069516f66e21918a1a843f1850d0e63b3d03 GIT binary patch literal 19180 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 TCn4VMV1`qFSz|xmYxw^G^ue?1 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cc28ae67d538f58cdffa36607af4953c9cdd787 GIT binary patch literal 32340 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c86b73b58b89bc775d648f17f34cb44befa1168 GIT binary patch literal 5475 zcmcgwZ%iD=6`#G^JB|Yk4&Xl!+mpi>4x7Uvb{sna*9Po3#yE|!s$S}xm)kjR&wIPq z***RlR1#T=kz55=Y9VT*fE0;DZdF@}?ku1m_ zRfu|IuPmzGv=|iy1a+V4OZ%gKUiU-2Bw8XM;z?DxqVgs6!}t=lG#!iv1>`{|ksP>! z;^`084Ej^@KN# z#ZF|kxT)xxfz703VltA^4T2Rdq0_X)I=~a{vWbsOQRFr+hCqs-vMEGH!ez}B{ z*lj*00Am7I(TET&J%_?UtG1s?@k^lo29?Gl-y^W|EZD+K5*!D0@t~`3k&Rk@O3W

6xB#b0aHC&9CY!^b8%{ZnV$Rt>XcUD# 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 literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..400da050922acd5d2bace067a5bc4c7155504cba GIT binary patch literal 6996 zcmb_gU2qfE6~3$8mGv)KvJ3&fT?* zT{%Njreiv7flgaHGju{{IujV$fjosirSQ^+zSuFX-7R!zo6a z+R4w==Bu^A ze1hjt#se=T1jY+lG3QJ;87~6gkZ54MGwaH^6K>!e6j#=h^CrBEcV~S$f5Ojr5AcCR zfbm}7gNY#Hec4d1G116)Kk(s182Et7WgfRDT781FqxxoZ8-P)QP`AyNRG*J-F(fFV zvqGZTK@Jn8@hnlos{a~qwM?vI(g;YK)W(W*J(EU3+N_2v(hcecb$#+Nd(25Lw(fm= z8HjPFFPk=0Drb}GxSWM|aa5+dicD%mPHVt8(|R_YLXrQls)4SNr^hEp)%Rgj2r6oM zMb)wTOTbiAu;vhzbFATrtS5DONKI08ltPWSUmH);yp~fn172On)!b-SHdNCIvlvr# z(@9lhjA|(y!!9mh@bgOsGY6zrG0KZVNC8abn!}P_E7wnR1y1KC9foaAq`=vA3jZ=} z7hPB26ahDB+F>-5J0%5&fg`eF_o*K$I0i|L4l$VdqLQsceTLs^1@qww75Ow##7xkx zsXhzjAUV&c9K$5#_!hLB<_))9Tj1@PUUd90D1gRvMKbMh6Qj}AG$J-va461SH`ueW z+Ydrpj;>338f$iA-=Ym#o2}9%EZ0$&w}; z>2X#1>ZCD}*CYdMLK>p^oMeosQZ}s{QhrEE<#VIytg1-NO5)OyA&&$FRj8_uWeq8< zLsxoQ8_udsX@`_Hbcxvk)>($2Dsky~XhbK{y1E0Kvu;?Yl1x*wjAF)j7D${Kjp%sti^ zFsPifK1_dFI)ZL@3ceW@DL-b6j=@J8`P%P@vu5w3IS)`YMT)FROrh+nLJk}*<~Idg zZ0f{HKC5b`Ck@M~8?u&CO&)3}+B8M;H-$_-tx@zBD&V{4MfA6RO7qn84o+%@e7gMd z6*ZTqlk6oXP_$c97*S=#uv4uwnbs-QSjG2^S~Rv3k^FNee-oE5H>^%4z=2zt1RYfAmrELriY8+vg<`tc|Y zsy9=K4b?6bm+DvCY9Or?R#xfCC?Z~PSP{m?!<>5T=<$N-C9 ztFqRV+zT$KsM4^V>ZFO0bZP{`kfx|quMKv(bZQbJmLbWC0&cVg03ETDCm|^1 z$26tv+U4lSR7{Zt5=1*>Rer;Kg`QbLPo9NbHb|~=16Lu((ybuTv0kEEfSQd-MIDkM zdM1a`nw(8fsZ(3)d`K zDqIHTYf6EGBnIiClEiA$t>YR_9ZDsMRU~#zB|SMNNX#)nF`LDBQ$V~x5xGz_OO)tp zc8G3Ai3CK)xj+!ImL;6DA}K}>-C$s2>hZek@)5nyV`qQ`U}5eCBNzH+4_`cd<;0&_ zp1i_c8ob>2ix=N*d2+F7&tkB9-qrmfys-H9v+!=8DPR^d#UTVcrpw-t6vjupAkS8F z9vIkKE>m6+TLGU1N2YcM%2oCXO$#*uMzE!NQx%M4>>yIpsT~Af;|#AYE^r1~7%TO{ ziVYp8qaX~D0$&%jRAw+p=o8RY%w@U&~nw zCZ^8@eFtSj2Dph^787Y4TkJy8g=9C9eL!@~U$E2mUN=|vdL*4yl1APddurSN-0xMo z&tSJN069a7PSO~i^7!!FTD50k_Ieu- zwtT*(^ZU>3pZB&c`$FfBo;!Ns^laf`;g7!dB2RqQg4AD+FG3HGT#s=5^#GJ#b|CB9 zA!Iz{VicX2vRy@otJ+F6E?A$K*Ny)Z7b<#a9y(^Y`X8zP==tjR#UiFFnbaT*B$K8m znFM$?mPOu|OujNEXUjDW$)u7`p%^flkxu1Qz|V@w87AMWP0|<)X1Z*6$l@OD1exVV zLjP%qi0I1{L$v8n9x7*mBic}&K7|!uK+=Z<0~)hMw$-#9Uy-0!>3;`umi*h{5M4zV zafXWyPK;h|d^7sXXc2%+^h($D?yKF1X`&_Gt}i+{aqkuGy639rM%UZjZ*?zpJcZhO zZ>CE4C_263*5#%Rvqvu;E%L}evBP@q>tEV8xUg@Kz1??v&PUHhOCo3#9}{YtAdgM( zS#1Ju_uc-I2+yKV5L+rEAaAL+tWs|Q^%YQWu|6L^ItBkqL0805!kSsK8gL~<2T`4B zgKcC9*Q5h-PoouDYR;}x2YNLLkgk1}g`sztjS%%1K_ILmlkbE8fdKAc6@@L`j{f+T?Vf~-| z8|HQ{`a8aR$XXWETeU29Vkq5!n(DHsd_qvT`grkUqf;lMQ$VGkU4J6<=bCiJ8q9#T zMRsa21(^=RZNkeF`1~m3LL`Joo6=v|=R&Zllb36*7q~QJ>0fa_u7say-VH!4BS7;t zC4+shDWF+7+E=TphkV=K2JwiF?#&7u#y3B7D0^x?Co;FNDNv906u_g+XUG=N5duE8{^N2+8^pM0`2GiYtI;D;p>AYroYZ{rM z5m{3pU8r_79J?798ial*q6U)(NVO(=!$lc(Jr!MT_;E{o3R>x-Kp=YsNHDS#*t8JX zbji4Ue17wuD=#i=-m@6!#)Gct?pcnkTZ+UMBC(~&u7$|1*ds9Xj_SQ zGzE&p;SW4magxvm$O`2aZ3~gMrO2Lz$ezW>-gkX_;pFS?d8jwSpqFC3PIAlH*1Lnh zwVeaH>bQew^*sDbC&4VAB^-hPQV$f>L&dtciiWFT;5E2ztLJw$7iy34;EK1wjLIcb zxyG|4c)?iDV;4^K)^Q|Gp@aX`vv%`N!8oe%P>=Xkz&~PME+; zxf(PLo*%Nut9ZUGsCj1ah_t5E_x#`RaCPSxnA&$7F5PM@PMUywGCaSgsLHO*m?z2l zq?VHKW(johf=Y?UJoFndlIcq8Nmgz8j*V$XI%i!R(HEhTehmrc9Ex^NUqX^V@=YK% zuCJIf{T4_~PFsuWePvH!!%S_gYt+^pD0HB|3FKeo!5IQqKuf{R3&G7x!H#!>9e2Z< zmP1FuXd{-<0>1fp#^3t*QftpbYtK!7v337a=)j%Ofw>oc(l{SF@L(Zy;6r%*m>%&T z9oOcy{e5xnosK?{+JTl3`~z8`8E>F_iKUSF_a-m!e7T&bCxWxkIf6w zq7V>!=6c`gf4#p*fW7j<^%GZ5F!shPZ;!n-Rzhh}@-v57t?m_MEzE(##5S5vxblNr6N7tEBwVG9_uLnm4+MGvL{BuA0pBABk{S@4y!3`SX)m@O7g%naCBu^hx#qpOFm z{T8TyhQ18i2p04iAQ1F8?k^;KkF?w)(R*YgV>bVjMDCF`_6oH99@$cKZssC$Ti)3A z`nJn2ym{i6Cl(&tUL+v9!M*Ky%X72qo$lXuFYM|qp={+K*T%KX?OY-7Sb2^UxY(R` gg}`GaAaOkxzP>`>Q9Q(v_TBTO@sDsjv<)WnUu#)A5C8xG literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41a161bb72c947f45ecf75e396f06362f9e23749 GIT binary patch literal 58258 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 J9|V)S?ti#Zfe`=z literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/parser.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6645a33b62dee0d8986cfc27a6a38e13e5506ed GIT binary patch literal 61188 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 U{M>&;EEPLu2mYggAGVVH{~i>{DF6Tf literal 0 HcmV?d00001 diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf9718d268201c072f4038ee70223d68981dfb21 GIT binary patch literal 18092 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 Neeu-42|Tz{{{ bool: + return t.cast(bool, args[0].is_async) + + else: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].environment.is_async) + + # Take the doc and annotations from the sync function, but the + # name from the async function. Pallets-Sphinx-Themes + # build_function_directive expects __wrapped__ to point to the + # sync function. + async_func_attrs = ("__module__", "__name__", "__qualname__") + normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) + + @wraps(normal_func, assigned=normal_func_attrs) + @wraps(async_func, assigned=async_func_attrs, updated=()) + def wrapper(*args, **kwargs): # type: ignore + b = is_async(args) + + if need_eval_context: + args = args[1:] + + if b: + return async_func(*args, **kwargs) + + return normal_func(*args, **kwargs) + + if need_eval_context: + wrapper = pass_eval_context(wrapper) + + wrapper.jinja_async_variant = True # type: ignore[attr-defined] + return wrapper + + return decorator + + +_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} + + +async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": + # Avoid a costly call to isawaitable + if type(value) in _common_primitives: + return t.cast("V", value) + + if inspect.isawaitable(value): + return await t.cast("t.Awaitable[V]", value) + + return value + + +class _IteratorToAsyncIterator(t.Generic[V]): + def __init__(self, iterator: "t.Iterator[V]"): + self._iterator = iterator + + def __aiter__(self) -> "te.Self": + return self + + async def __anext__(self) -> V: + try: + return next(self._iterator) + except StopIteration as e: + raise StopAsyncIteration(e.value) from e + + +def auto_aiter( + iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> "t.AsyncIterator[V]": + if hasattr(iterable, "__aiter__"): + return iterable.__aiter__() + else: + return _IteratorToAsyncIterator(iter(iterable)) + + +async def auto_to_list( + value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> t.List["V"]: + return [x async for x in auto_aiter(value)] diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/bccache.py b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/bccache.py new file mode 100644 index 0000000..ada8b09 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/bccache.py @@ -0,0 +1,408 @@ +"""The optional bytecode cache system. This is useful if you have very +complex template situations and the compilation of all those templates +slows down your application too much. + +Situations where this is useful are often forking web applications that +are initialized on the first request. +""" + +import errno +import fnmatch +import marshal +import os +import pickle +import stat +import sys +import tempfile +import typing as t +from hashlib import sha1 +from io import BytesIO +from types import CodeType + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .environment import Environment + + class _MemcachedClient(te.Protocol): + def get(self, key: str) -> bytes: ... + + def set( + self, key: str, value: bytes, timeout: t.Optional[int] = None + ) -> None: ... + + +bc_version = 5 +# Magic bytes to identify Jinja bytecode cache files. Contains the +# Python major and minor version to avoid loading incompatible bytecode +# if a project upgrades its Python version. +bc_magic = ( + b"j2" + + pickle.dumps(bc_version, 2) + + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) +) + + +class Bucket: + """Buckets are used to store the bytecode for one template. It's created + and initialized by the bytecode cache and passed to the loading functions. + + The buckets get an internal checksum from the cache assigned and use this + to automatically reject outdated cache material. Individual bytecode + cache subclasses don't have to care about cache invalidation. + """ + + def __init__(self, environment: "Environment", key: str, checksum: str) -> None: + self.environment = environment + self.key = key + self.checksum = checksum + self.reset() + + def reset(self) -> None: + """Resets the bucket (unloads the bytecode).""" + self.code: t.Optional[CodeType] = None + + def load_bytecode(self, f: t.BinaryIO) -> None: + """Loads bytecode from a file or file like object.""" + # make sure the magic header is correct + magic = f.read(len(bc_magic)) + if magic != bc_magic: + self.reset() + return + # the source code of the file changed, we need to reload + checksum = pickle.load(f) + if self.checksum != checksum: + self.reset() + return + # if marshal_load fails then we need to reload + try: + self.code = marshal.load(f) + except (EOFError, ValueError, TypeError): + self.reset() + return + + def write_bytecode(self, f: t.IO[bytes]) -> None: + """Dump the bytecode into the file or file like object passed.""" + if self.code is None: + raise TypeError("can't write empty bucket") + f.write(bc_magic) + pickle.dump(self.checksum, f, 2) + marshal.dump(self.code, f) + + def bytecode_from_string(self, string: bytes) -> None: + """Load bytecode from bytes.""" + self.load_bytecode(BytesIO(string)) + + def bytecode_to_string(self) -> bytes: + """Return the bytecode as bytes.""" + out = BytesIO() + self.write_bytecode(out) + return out.getvalue() + + +class BytecodeCache: + """To implement your own bytecode cache you have to subclass this class + and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of + these methods are passed a :class:`~jinja2.bccache.Bucket`. + + A very basic bytecode cache that saves the bytecode on the file system:: + + from os import path + + class MyCache(BytecodeCache): + + def __init__(self, directory): + self.directory = directory + + def load_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + if path.exists(filename): + with open(filename, 'rb') as f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + with open(filename, 'wb') as f: + bucket.write_bytecode(f) + + A more advanced version of a filesystem based bytecode cache is part of + Jinja. + """ + + def load_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to load bytecode into a + bucket. If they are not able to find code in the cache for the + bucket, it must not do anything. + """ + raise NotImplementedError() + + def dump_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to write the bytecode + from a bucket back to the cache. If it unable to do so it must not + fail silently but raise an exception. + """ + raise NotImplementedError() + + def clear(self) -> None: + """Clears the cache. This method is not used by Jinja but should be + implemented to allow applications to clear the bytecode cache used + by a particular environment. + """ + + def get_cache_key( + self, name: str, filename: t.Optional[t.Union[str]] = None + ) -> str: + """Returns the unique hash key for this template name.""" + hash = sha1(name.encode("utf-8")) + + if filename is not None: + hash.update(f"|{filename}".encode()) + + return hash.hexdigest() + + def get_source_checksum(self, source: str) -> str: + """Returns a checksum for the source.""" + return sha1(source.encode("utf-8")).hexdigest() + + def get_bucket( + self, + environment: "Environment", + name: str, + filename: t.Optional[str], + source: str, + ) -> Bucket: + """Return a cache bucket for the given template. All arguments are + mandatory but filename may be `None`. + """ + key = self.get_cache_key(name, filename) + checksum = self.get_source_checksum(source) + bucket = Bucket(environment, key, checksum) + self.load_bytecode(bucket) + return bucket + + def set_bucket(self, bucket: Bucket) -> None: + """Put the bucket into the cache.""" + self.dump_bytecode(bucket) + + +class FileSystemBytecodeCache(BytecodeCache): + """A bytecode cache that stores bytecode on the filesystem. It accepts + two arguments: The directory where the cache items are stored and a + pattern string that is used to build the filename. + + If no directory is specified a default cache directory is selected. On + Windows the user's temp directory is used, on UNIX systems a directory + is created for the user in the system temp directory. + + The pattern can be used to have multiple separate caches operate on the + same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` + is replaced with the cache key. + + >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') + + This bytecode cache supports clearing of the cache using the clear method. + """ + + def __init__( + self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" + ) -> None: + if directory is None: + directory = self._get_default_cache_dir() + self.directory = directory + self.pattern = pattern + + def _get_default_cache_dir(self) -> str: + def _unsafe_dir() -> "te.NoReturn": + raise RuntimeError( + "Cannot determine safe temp directory. You " + "need to explicitly provide one." + ) + + tmpdir = tempfile.gettempdir() + + # On windows the temporary directory is used specific unless + # explicitly forced otherwise. We can just use that. + if os.name == "nt": + return tmpdir + if not hasattr(os, "getuid"): + _unsafe_dir() + + dirname = f"_jinja2-cache-{os.getuid()}" + actual_dir = os.path.join(tmpdir, dirname) + + try: + os.mkdir(actual_dir, stat.S_IRWXU) + except OSError as e: + if e.errno != errno.EEXIST: + raise + try: + os.chmod(actual_dir, stat.S_IRWXU) + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + except OSError as e: + if e.errno != errno.EEXIST: + raise + + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + + return actual_dir + + def _get_cache_filename(self, bucket: Bucket) -> str: + return os.path.join(self.directory, self.pattern % (bucket.key,)) + + def load_bytecode(self, bucket: Bucket) -> None: + filename = self._get_cache_filename(bucket) + + # Don't test for existence before opening the file, since the + # file could disappear after the test before the open. + try: + f = open(filename, "rb") + except (FileNotFoundError, IsADirectoryError, PermissionError): + # PermissionError can occur on Windows when an operation is + # in progress, such as calling clear(). + return + + with f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket: Bucket) -> None: + # Write to a temporary file, then rename to the real name after + # writing. This avoids another process reading the file before + # it is fully written. + name = self._get_cache_filename(bucket) + f = tempfile.NamedTemporaryFile( + mode="wb", + dir=os.path.dirname(name), + prefix=os.path.basename(name), + suffix=".tmp", + delete=False, + ) + + def remove_silent() -> None: + try: + os.remove(f.name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + pass + + try: + with f: + bucket.write_bytecode(f) + except BaseException: + remove_silent() + raise + + try: + os.replace(f.name, name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + remove_silent() + except BaseException: + remove_silent() + raise + + def clear(self) -> None: + # imported lazily here because google app-engine doesn't support + # write access on the file system and the function does not exist + # normally. + from os import remove + + files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) + for filename in files: + try: + remove(os.path.join(self.directory, filename)) + except OSError: + pass + + +class MemcachedBytecodeCache(BytecodeCache): + """This class implements a bytecode cache that uses a memcache cache for + storing the information. It does not enforce a specific memcache library + (tummy's memcache or cmemcache) but will accept any class that provides + the minimal interface required. + + Libraries compatible with this class: + + - `cachelib `_ + - `python-memcached `_ + + (Unfortunately the django cache interface is not compatible because it + does not support storing binary data, only text. You can however pass + the underlying cache client to the bytecode cache which is available + as `django.core.cache.cache._client`.) + + The minimal interface for the client passed to the constructor is this: + + .. class:: MinimalClientInterface + + .. method:: set(key, value[, timeout]) + + Stores the bytecode in the cache. `value` is a string and + `timeout` the timeout of the key. If timeout is not provided + a default timeout or no timeout should be assumed, if it's + provided it's an integer with the number of seconds the cache + item should exist. + + .. method:: get(key) + + Returns the value for the cache key. If the item does not + exist in the cache the return value must be `None`. + + The other arguments to the constructor are the prefix for all keys that + is added before the actual cache key and the timeout for the bytecode in + the cache system. We recommend a high (or no) timeout. + + This bytecode cache does not support clearing of used items in the cache. + The clear method is a no-operation function. + + .. versionadded:: 2.7 + Added support for ignoring memcache errors through the + `ignore_memcache_errors` parameter. + """ + + def __init__( + self, + client: "_MemcachedClient", + prefix: str = "jinja2/bytecode/", + timeout: t.Optional[int] = None, + ignore_memcache_errors: bool = True, + ): + self.client = client + self.prefix = prefix + self.timeout = timeout + self.ignore_memcache_errors = ignore_memcache_errors + + def load_bytecode(self, bucket: Bucket) -> None: + try: + code = self.client.get(self.prefix + bucket.key) + except Exception: + if not self.ignore_memcache_errors: + raise + else: + bucket.bytecode_from_string(code) + + def dump_bytecode(self, bucket: Bucket) -> None: + key = self.prefix + bucket.key + value = bucket.bytecode_to_string() + + try: + if self.timeout is not None: + self.client.set(key, value, self.timeout) + else: + self.client.set(key, value) + except Exception: + if not self.ignore_memcache_errors: + raise diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/compiler.py b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/compiler.py new file mode 100644 index 0000000..a4ff6a1 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/compiler.py @@ -0,0 +1,1998 @@ +"""Compiles nodes from the parser into Python code.""" + +import typing as t +from contextlib import contextmanager +from functools import update_wrapper +from io import StringIO +from itertools import chain +from keyword import iskeyword as is_python_keyword + +from markupsafe import escape +from markupsafe import Markup + +from . import nodes +from .exceptions import TemplateAssertionError +from .idtracking import Symbols +from .idtracking import VAR_LOAD_ALIAS +from .idtracking import VAR_LOAD_PARAMETER +from .idtracking import VAR_LOAD_RESOLVE +from .idtracking import VAR_LOAD_UNDEFINED +from .nodes import EvalContext +from .optimizer import Optimizer +from .utils import _PassArg +from .utils import concat +from .visitor import NodeVisitor + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .environment import Environment + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + +operators = { + "eq": "==", + "ne": "!=", + "gt": ">", + "gteq": ">=", + "lt": "<", + "lteq": "<=", + "in": "in", + "notin": "not in", +} + + +def optimizeconst(f: F) -> F: + def new_func( + self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any + ) -> t.Any: + # Only optimize if the frame is not volatile + if self.optimizer is not None and not frame.eval_ctx.volatile: + new_node = self.optimizer.visit(node, frame.eval_ctx) + + if new_node != node: + return self.visit(new_node, frame) + + return f(self, node, frame, **kwargs) + + return update_wrapper(new_func, f) # type: ignore[return-value] + + +def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed and op in self.environment.intercepted_binops # type: ignore + ): + self.write(f"environment.call_binop(context, {op!r}, ") + self.visit(node.left, frame) + self.write(", ") + self.visit(node.right, frame) + else: + self.write("(") + self.visit(node.left, frame) + self.write(f" {op} ") + self.visit(node.right, frame) + + self.write(")") + + return visitor + + +def _make_unop( + op: str, +) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed and op in self.environment.intercepted_unops # type: ignore + ): + self.write(f"environment.call_unop(context, {op!r}, ") + self.visit(node.node, frame) + else: + self.write("(" + op) + self.visit(node.node, frame) + + self.write(")") + + return visitor + + +def generate( + node: nodes.Template, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, +) -> t.Optional[str]: + """Generate the python source for a node tree.""" + if not isinstance(node, nodes.Template): + raise TypeError("Can't compile non template nodes") + + generator = environment.code_generator_class( + environment, name, filename, stream, defer_init, optimized + ) + generator.visit(node) + + if stream is None: + return generator.stream.getvalue() # type: ignore + + return None + + +def has_safe_repr(value: t.Any) -> bool: + """Does the node have a safe representation?""" + if value is None or value is NotImplemented or value is Ellipsis: + return True + + if type(value) in {bool, int, float, complex, range, str, Markup}: + return True + + if type(value) in {tuple, list, set, frozenset}: + return all(has_safe_repr(v) for v in value) + + if type(value) is dict: # noqa E721 + return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) + + return False + + +def find_undeclared( + nodes: t.Iterable[nodes.Node], names: t.Iterable[str] +) -> t.Set[str]: + """Check if the names passed are accessed undeclared. The return value + is a set of all the undeclared names from the sequence of names found. + """ + visitor = UndeclaredNameVisitor(names) + try: + for node in nodes: + visitor.visit(node) + except VisitorExit: + pass + return visitor.undeclared + + +class MacroRef: + def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: + self.node = node + self.accesses_caller = False + self.accesses_kwargs = False + self.accesses_varargs = False + + +class Frame: + """Holds compile time information for us.""" + + def __init__( + self, + eval_ctx: EvalContext, + parent: t.Optional["Frame"] = None, + level: t.Optional[int] = None, + ) -> None: + self.eval_ctx = eval_ctx + + # the parent of this frame + self.parent = parent + + if parent is None: + self.symbols = Symbols(level=level) + + # in some dynamic inheritance situations the compiler needs to add + # write tests around output statements. + self.require_output_check = False + + # inside some tags we are using a buffer rather than yield statements. + # this for example affects {% filter %} or {% macro %}. If a frame + # is buffered this variable points to the name of the list used as + # buffer. + self.buffer: t.Optional[str] = None + + # the name of the block we're in, otherwise None. + self.block: t.Optional[str] = None + + else: + self.symbols = Symbols(parent.symbols, level=level) + self.require_output_check = parent.require_output_check + self.buffer = parent.buffer + self.block = parent.block + + # a toplevel frame is the root + soft frames such as if conditions. + self.toplevel = False + + # the root frame is basically just the outermost frame, so no if + # conditions. This information is used to optimize inheritance + # situations. + self.rootlevel = False + + # variables set inside of loops and blocks should not affect outer frames, + # but they still needs to be kept track of as part of the active context. + self.loop_frame = False + self.block_frame = False + + # track whether the frame is being used in an if-statement or conditional + # expression as it determines which errors should be raised during runtime + # or compile time. + self.soft_frame = False + + def copy(self) -> "te.Self": + """Create a copy of the current one.""" + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.symbols = self.symbols.copy() + return rv + + def inner(self, isolated: bool = False) -> "Frame": + """Return an inner frame.""" + if isolated: + return Frame(self.eval_ctx, level=self.symbols.level + 1) + return Frame(self.eval_ctx, self) + + def soft(self) -> "te.Self": + """Return a soft frame. A soft frame may not be modified as + standalone thing as it shares the resources with the frame it + was created of, but it's not a rootlevel frame any longer. + + This is only used to implement if-statements and conditional + expressions. + """ + rv = self.copy() + rv.rootlevel = False + rv.soft_frame = True + return rv + + __copy__ = copy + + +class VisitorExit(RuntimeError): + """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" + + +class DependencyFinderVisitor(NodeVisitor): + """A visitor that collects filter and test calls.""" + + def __init__(self) -> None: + self.filters: t.Set[str] = set() + self.tests: t.Set[str] = set() + + def visit_Filter(self, node: nodes.Filter) -> None: + self.generic_visit(node) + self.filters.add(node.name) + + def visit_Test(self, node: nodes.Test) -> None: + self.generic_visit(node) + self.tests.add(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting at blocks.""" + + +class UndeclaredNameVisitor(NodeVisitor): + """A visitor that checks if a name is accessed without being + declared. This is different from the frame visitor as it will + not stop at closure frames. + """ + + def __init__(self, names: t.Iterable[str]) -> None: + self.names = set(names) + self.undeclared: t.Set[str] = set() + + def visit_Name(self, node: nodes.Name) -> None: + if node.ctx == "load" and node.name in self.names: + self.undeclared.add(node.name) + if self.undeclared == self.names: + raise VisitorExit() + else: + self.names.discard(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting a blocks.""" + + +class CompilerExit(Exception): + """Raised if the compiler encountered a situation where it just + doesn't make sense to further process the code. Any block that + raises such an exception is not further processed. + """ + + +class CodeGenerator(NodeVisitor): + def __init__( + self, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, + ) -> None: + if stream is None: + stream = StringIO() + self.environment = environment + self.name = name + self.filename = filename + self.stream = stream + self.created_block_context = False + self.defer_init = defer_init + self.optimizer: t.Optional[Optimizer] = None + + if optimized: + self.optimizer = Optimizer(environment) + + # aliases for imports + self.import_aliases: t.Dict[str, str] = {} + + # a registry for all blocks. Because blocks are moved out + # into the global python scope they are registered here + self.blocks: t.Dict[str, nodes.Block] = {} + + # the number of extends statements so far + self.extends_so_far = 0 + + # some templates have a rootlevel extends. In this case we + # can safely assume that we're a child template and do some + # more optimizations. + self.has_known_extends = False + + # the current line number + self.code_lineno = 1 + + # registry of all filters and tests (global, not block local) + self.tests: t.Dict[str, str] = {} + self.filters: t.Dict[str, str] = {} + + # the debug information + self.debug_info: t.List[t.Tuple[int, int]] = [] + self._write_debug_info: t.Optional[int] = None + + # the number of new lines before the next write() + self._new_lines = 0 + + # the line number of the last written statement + self._last_line = 0 + + # true if nothing was written so far. + self._first_write = True + + # used by the `temporary_identifier` method to get new + # unique, temporary identifier + self._last_identifier = 0 + + # the current indentation + self._indentation = 0 + + # Tracks toplevel assignments + self._assign_stack: t.List[t.Set[str]] = [] + + # Tracks parameter definition blocks + self._param_def_block: t.List[t.Set[str]] = [] + + # Tracks the current context. + self._context_reference_stack = ["context"] + + @property + def optimized(self) -> bool: + return self.optimizer is not None + + # -- Various compilation helpers + + def fail(self, msg: str, lineno: int) -> "te.NoReturn": + """Fail with a :exc:`TemplateAssertionError`.""" + raise TemplateAssertionError(msg, lineno, self.name, self.filename) + + def temporary_identifier(self) -> str: + """Get a new unique identifier.""" + self._last_identifier += 1 + return f"t_{self._last_identifier}" + + def buffer(self, frame: Frame) -> None: + """Enable buffering for the frame from that point onwards.""" + frame.buffer = self.temporary_identifier() + self.writeline(f"{frame.buffer} = []") + + def return_buffer_contents( + self, frame: Frame, force_unescaped: bool = False + ) -> None: + """Return the buffer contents of the frame.""" + if not force_unescaped: + if frame.eval_ctx.volatile: + self.writeline("if context.eval_ctx.autoescape:") + self.indent() + self.writeline(f"return Markup(concat({frame.buffer}))") + self.outdent() + self.writeline("else:") + self.indent() + self.writeline(f"return concat({frame.buffer})") + self.outdent() + return + elif frame.eval_ctx.autoescape: + self.writeline(f"return Markup(concat({frame.buffer}))") + return + self.writeline(f"return concat({frame.buffer})") + + def indent(self) -> None: + """Indent by one.""" + self._indentation += 1 + + def outdent(self, step: int = 1) -> None: + """Outdent by step.""" + self._indentation -= step + + def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: + """Yield or write into the frame buffer.""" + if frame.buffer is None: + self.writeline("yield ", node) + else: + self.writeline(f"{frame.buffer}.append(", node) + + def end_write(self, frame: Frame) -> None: + """End the writing process started by `start_write`.""" + if frame.buffer is not None: + self.write(")") + + def simple_write( + self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None + ) -> None: + """Simple shortcut for start_write + write + end_write.""" + self.start_write(frame, node) + self.write(s) + self.end_write(frame) + + def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: + """Visit a list of nodes as block in a frame. If the current frame + is no buffer a dummy ``if 0: yield None`` is written automatically. + """ + try: + self.writeline("pass") + for node in nodes: + self.visit(node, frame) + except CompilerExit: + pass + + def write(self, x: str) -> None: + """Write a string into the output stream.""" + if self._new_lines: + if not self._first_write: + self.stream.write("\n" * self._new_lines) + self.code_lineno += self._new_lines + if self._write_debug_info is not None: + self.debug_info.append((self._write_debug_info, self.code_lineno)) + self._write_debug_info = None + self._first_write = False + self.stream.write(" " * self._indentation) + self._new_lines = 0 + self.stream.write(x) + + def writeline( + self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 + ) -> None: + """Combination of newline and write.""" + self.newline(node, extra) + self.write(x) + + def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: + """Add one or more newlines before the next write.""" + self._new_lines = max(self._new_lines, 1 + extra) + if node is not None and node.lineno != self._last_line: + self._write_debug_info = node.lineno + self._last_line = node.lineno + + def signature( + self, + node: t.Union[nodes.Call, nodes.Filter, nodes.Test], + frame: Frame, + extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + ) -> None: + """Writes a function call to the stream for the current node. + A leading comma is added automatically. The extra keyword + arguments may not include python keywords otherwise a syntax + error could occur. The extra keyword arguments should be given + as python dict. + """ + # if any of the given keyword arguments is a python keyword + # we have to make sure that no invalid call is created. + kwarg_workaround = any( + is_python_keyword(t.cast(str, k)) + for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) + ) + + for arg in node.args: + self.write(", ") + self.visit(arg, frame) + + if not kwarg_workaround: + for kwarg in node.kwargs: + self.write(", ") + self.visit(kwarg, frame) + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f", {key}={value}") + if node.dyn_args: + self.write(", *") + self.visit(node.dyn_args, frame) + + if kwarg_workaround: + if node.dyn_kwargs is not None: + self.write(", **dict({") + else: + self.write(", **{") + for kwarg in node.kwargs: + self.write(f"{kwarg.key!r}: ") + self.visit(kwarg.value, frame) + self.write(", ") + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f"{key!r}: {value}, ") + if node.dyn_kwargs is not None: + self.write("}, **") + self.visit(node.dyn_kwargs, frame) + self.write(")") + else: + self.write("}") + + elif node.dyn_kwargs is not None: + self.write(", **") + self.visit(node.dyn_kwargs, frame) + + def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: + """Find all filter and test names used in the template and + assign them to variables in the compiled namespace. Checking + that the names are registered with the environment is done when + compiling the Filter and Test nodes. If the node is in an If or + CondExpr node, the check is done at runtime instead. + + .. versionchanged:: 3.0 + Filters and tests in If and CondExpr nodes are checked at + runtime instead of compile time. + """ + visitor = DependencyFinderVisitor() + + for node in nodes: + visitor.visit(node) + + for id_map, names, dependency in ( + (self.filters, visitor.filters, "filters"), + ( + self.tests, + visitor.tests, + "tests", + ), + ): + for name in sorted(names): + if name not in id_map: + id_map[name] = self.temporary_identifier() + + # add check during runtime that dependencies used inside of executed + # blocks are defined, as this step may be skipped during compile time + self.writeline("try:") + self.indent() + self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") + self.outdent() + self.writeline("except KeyError:") + self.indent() + self.writeline("@internalcode") + self.writeline(f"def {id_map[name]}(*unused):") + self.indent() + self.writeline( + f'raise TemplateRuntimeError("No {dependency[:-1]}' + f' named {name!r} found.")' + ) + self.outdent() + self.outdent() + + def enter_frame(self, frame: Frame) -> None: + undefs = [] + for target, (action, param) in frame.symbols.loads.items(): + if action == VAR_LOAD_PARAMETER: + pass + elif action == VAR_LOAD_RESOLVE: + self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") + elif action == VAR_LOAD_ALIAS: + self.writeline(f"{target} = {param}") + elif action == VAR_LOAD_UNDEFINED: + undefs.append(target) + else: + raise NotImplementedError("unknown load instruction") + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: + if not with_python_scope: + undefs = [] + for target in frame.symbols.loads: + undefs.append(target) + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: + return async_value if self.environment.is_async else sync_value + + def func(self, name: str) -> str: + return f"{self.choose_async()}def {name}" + + def macro_body( + self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame + ) -> t.Tuple[Frame, MacroRef]: + """Dump the function def of a macro or call block.""" + frame = frame.inner() + frame.symbols.analyze_node(node) + macro_ref = MacroRef(node) + + explicit_caller = None + skip_special_params = set() + args = [] + + for idx, arg in enumerate(node.args): + if arg.name == "caller": + explicit_caller = idx + if arg.name in ("kwargs", "varargs"): + skip_special_params.add(arg.name) + args.append(frame.symbols.ref(arg.name)) + + undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) + + if "caller" in undeclared: + # In older Jinja versions there was a bug that allowed caller + # to retain the special behavior even if it was mentioned in + # the argument list. However thankfully this was only really + # working if it was the last argument. So we are explicitly + # checking this now and error out if it is anywhere else in + # the argument list. + if explicit_caller is not None: + try: + node.defaults[explicit_caller - len(node.args)] + except IndexError: + self.fail( + "When defining macros or call blocks the " + 'special "caller" argument must be omitted ' + "or be given a default.", + node.lineno, + ) + else: + args.append(frame.symbols.declare_parameter("caller")) + macro_ref.accesses_caller = True + if "kwargs" in undeclared and "kwargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("kwargs")) + macro_ref.accesses_kwargs = True + if "varargs" in undeclared and "varargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("varargs")) + macro_ref.accesses_varargs = True + + # macros are delayed, they never require output checks + frame.require_output_check = False + frame.symbols.analyze_node(node) + self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) + self.indent() + + self.buffer(frame) + self.enter_frame(frame) + + self.push_parameter_definitions(frame) + for idx, arg in enumerate(node.args): + ref = frame.symbols.ref(arg.name) + self.writeline(f"if {ref} is missing:") + self.indent() + try: + default = node.defaults[idx - len(node.args)] + except IndexError: + self.writeline( + f'{ref} = undefined("parameter {arg.name!r} was not provided",' + f" name={arg.name!r})" + ) + else: + self.writeline(f"{ref} = ") + self.visit(default, frame) + self.mark_parameter_stored(ref) + self.outdent() + self.pop_parameter_definitions() + + self.blockvisit(node.body, frame) + self.return_buffer_contents(frame, force_unescaped=True) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + return frame, macro_ref + + def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: + """Dump the macro definition for the def created by macro_body.""" + arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) + name = getattr(macro_ref.node, "name", None) + if len(macro_ref.node.args) == 1: + arg_tuple += "," + self.write( + f"Macro(environment, macro, {name!r}, ({arg_tuple})," + f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," + f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" + ) + + def position(self, node: nodes.Node) -> str: + """Return a human readable position for the node.""" + rv = f"line {node.lineno}" + if self.name is not None: + rv = f"{rv} in {self.name!r}" + return rv + + def dump_local_context(self, frame: Frame) -> str: + items_kv = ", ".join( + f"{name!r}: {target}" + for name, target in frame.symbols.dump_stores().items() + ) + return f"{{{items_kv}}}" + + def write_commons(self) -> None: + """Writes a common preamble that is used by root and block functions. + Primarily this sets up common local helpers and enforces a generator + through a dead branch. + """ + self.writeline("resolve = context.resolve_or_missing") + self.writeline("undefined = environment.undefined") + self.writeline("concat = environment.concat") + # always use the standard Undefined class for the implicit else of + # conditional expressions + self.writeline("cond_expr_undefined = Undefined") + self.writeline("if 0: yield None") + + def push_parameter_definitions(self, frame: Frame) -> None: + """Pushes all parameter targets from the given frame into a local + stack that permits tracking of yet to be assigned parameters. In + particular this enables the optimization from `visit_Name` to skip + undefined expressions for parameters in macros as macros can reference + otherwise unbound parameters. + """ + self._param_def_block.append(frame.symbols.dump_param_targets()) + + def pop_parameter_definitions(self) -> None: + """Pops the current parameter definitions set.""" + self._param_def_block.pop() + + def mark_parameter_stored(self, target: str) -> None: + """Marks a parameter in the current parameter definitions as stored. + This will skip the enforced undefined checks. + """ + if self._param_def_block: + self._param_def_block[-1].discard(target) + + def push_context_reference(self, target: str) -> None: + self._context_reference_stack.append(target) + + def pop_context_reference(self) -> None: + self._context_reference_stack.pop() + + def get_context_ref(self) -> str: + return self._context_reference_stack[-1] + + def get_resolve_func(self) -> str: + target = self._context_reference_stack[-1] + if target == "context": + return "resolve" + return f"{target}.resolve" + + def derive_context(self, frame: Frame) -> str: + return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" + + def parameter_is_undeclared(self, target: str) -> bool: + """Checks if a given target is an undeclared parameter.""" + if not self._param_def_block: + return False + return target in self._param_def_block[-1] + + def push_assign_tracking(self) -> None: + """Pushes a new layer for assignment tracking.""" + self._assign_stack.append(set()) + + def pop_assign_tracking(self, frame: Frame) -> None: + """Pops the topmost level for assignment tracking and updates the + context variables if necessary. + """ + vars = self._assign_stack.pop() + if ( + not frame.block_frame + and not frame.loop_frame + and not frame.toplevel + or not vars + ): + return + public_names = [x for x in vars if x[:1] != "_"] + if len(vars) == 1: + name = next(iter(vars)) + ref = frame.symbols.ref(name) + if frame.loop_frame: + self.writeline(f"_loop_vars[{name!r}] = {ref}") + return + if frame.block_frame: + self.writeline(f"_block_vars[{name!r}] = {ref}") + return + self.writeline(f"context.vars[{name!r}] = {ref}") + else: + if frame.loop_frame: + self.writeline("_loop_vars.update({") + elif frame.block_frame: + self.writeline("_block_vars.update({") + else: + self.writeline("context.vars.update({") + for idx, name in enumerate(sorted(vars)): + if idx: + self.write(", ") + ref = frame.symbols.ref(name) + self.write(f"{name!r}: {ref}") + self.write("})") + if not frame.block_frame and not frame.loop_frame and public_names: + if len(public_names) == 1: + self.writeline(f"context.exported_vars.add({public_names[0]!r})") + else: + names_str = ", ".join(map(repr, sorted(public_names))) + self.writeline(f"context.exported_vars.update(({names_str}))") + + # -- Statement Visitors + + def visit_Template( + self, node: nodes.Template, frame: t.Optional[Frame] = None + ) -> None: + assert frame is None, "no root frame allowed" + eval_ctx = EvalContext(self.environment, self.name) + + from .runtime import async_exported + from .runtime import exported + + if self.environment.is_async: + exported_names = sorted(exported + async_exported) + else: + exported_names = sorted(exported) + + self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) + + # if we want a deferred initialization we cannot move the + # environment into a local name + envenv = "" if self.defer_init else ", environment=environment" + + # do we have an extends tag at all? If not, we can save some + # overhead by just not processing any inheritance code. + have_extends = node.find(nodes.Extends) is not None + + # find all blocks + for block in node.find_all(nodes.Block): + if block.name in self.blocks: + self.fail(f"block {block.name!r} defined twice", block.lineno) + self.blocks[block.name] = block + + # find all imports and import them + for import_ in node.find_all(nodes.ImportedName): + if import_.importname not in self.import_aliases: + imp = import_.importname + self.import_aliases[imp] = alias = self.temporary_identifier() + if "." in imp: + module, obj = imp.rsplit(".", 1) + self.writeline(f"from {module} import {obj} as {alias}") + else: + self.writeline(f"import {imp} as {alias}") + + # add the load name + self.writeline(f"name = {self.name!r}") + + # generate the root render function. + self.writeline( + f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 + ) + self.indent() + self.write_commons() + + # process the root + frame = Frame(eval_ctx) + if "self" in find_undeclared(node.body, ("self",)): + ref = frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + frame.symbols.analyze_node(node) + frame.toplevel = frame.rootlevel = True + frame.require_output_check = have_extends and not self.has_known_extends + if have_extends: + self.writeline("parent_template = None") + self.enter_frame(frame) + self.pull_dependencies(node.body) + self.blockvisit(node.body, frame) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + # make sure that the parent root is called. + if have_extends: + if not self.has_known_extends: + self.indent() + self.writeline("if parent_template is not None:") + self.indent() + if not self.environment.is_async: + self.writeline("yield from parent_template.root_render_func(context)") + else: + self.writeline("agen = parent_template.root_render_func(context)") + self.writeline("try:") + self.indent() + self.writeline("async for event in agen:") + self.indent() + self.writeline("yield event") + self.outdent() + self.outdent() + self.writeline("finally: await agen.aclose()") + self.outdent(1 + (not self.has_known_extends)) + + # at this point we now have the blocks collected and can visit them too. + for name, block in self.blocks.items(): + self.writeline( + f"{self.func('block_' + name)}(context, missing=missing{envenv}):", + block, + 1, + ) + self.indent() + self.write_commons() + # It's important that we do not make this frame a child of the + # toplevel template. This would cause a variety of + # interesting issues with identifier tracking. + block_frame = Frame(eval_ctx) + block_frame.block_frame = True + undeclared = find_undeclared(block.body, ("self", "super")) + if "self" in undeclared: + ref = block_frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + if "super" in undeclared: + ref = block_frame.symbols.declare_parameter("super") + self.writeline(f"{ref} = context.super({name!r}, block_{name})") + block_frame.symbols.analyze_node(block) + block_frame.block = name + self.writeline("_block_vars = {}") + self.enter_frame(block_frame) + self.pull_dependencies(block.body) + self.blockvisit(block.body, block_frame) + self.leave_frame(block_frame, with_python_scope=True) + self.outdent() + + blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) + self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) + debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) + self.writeline(f"debug_info = {debug_kv_str!r}") + + def visit_Block(self, node: nodes.Block, frame: Frame) -> None: + """Call a block and register it for the template.""" + level = 0 + if frame.toplevel: + # if we know that we are a child template, there is no need to + # check if we are one + if self.has_known_extends: + return + if self.extends_so_far > 0: + self.writeline("if parent_template is None:") + self.indent() + level += 1 + + if node.scoped: + context = self.derive_context(frame) + else: + context = self.get_context_ref() + + if node.required: + self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) + self.indent() + self.writeline( + f'raise TemplateRuntimeError("Required block {node.name!r} not found")', + node, + ) + self.outdent() + + if not self.environment.is_async and frame.buffer is None: + self.writeline( + f"yield from context.blocks[{node.name!r}][0]({context})", node + ) + else: + self.writeline(f"gen = context.blocks[{node.name!r}][0]({context})") + self.writeline("try:") + self.indent() + self.writeline( + f"{self.choose_async()}for event in gen:", + node, + ) + self.indent() + self.simple_write("event", frame) + self.outdent() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) + + self.outdent(level) + + def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: + """Calls the extender.""" + if not frame.toplevel: + self.fail("cannot use extend from a non top-level scope", node.lineno) + + # if the number of extends statements in general is zero so + # far, we don't have to add a check if something extended + # the template before this one. + if self.extends_so_far > 0: + # if we have a known extends we just add a template runtime + # error into the generated code. We could catch that at compile + # time too, but i welcome it not to confuse users by throwing the + # same error at different times just "because we can". + if not self.has_known_extends: + self.writeline("if parent_template is not None:") + self.indent() + self.writeline('raise TemplateRuntimeError("extended multiple times")') + + # if we have a known extends already we don't need that code here + # as we know that the template execution will end here. + if self.has_known_extends: + raise CompilerExit() + else: + self.outdent() + + self.writeline("parent_template = environment.get_template(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + self.writeline("for name, parent_block in parent_template.blocks.items():") + self.indent() + self.writeline("context.blocks.setdefault(name, []).append(parent_block)") + self.outdent() + + # if this extends statement was in the root level we can take + # advantage of that information and simplify the generated code + # in the top level from this point onwards + if frame.rootlevel: + self.has_known_extends = True + + # and now we have one more + self.extends_so_far += 1 + + def visit_Include(self, node: nodes.Include, frame: Frame) -> None: + """Handles includes.""" + if node.ignore_missing: + self.writeline("try:") + self.indent() + + func_name = "get_or_select_template" + if isinstance(node.template, nodes.Const): + if isinstance(node.template.value, str): + func_name = "get_template" + elif isinstance(node.template.value, (tuple, list)): + func_name = "select_template" + elif isinstance(node.template, (nodes.Tuple, nodes.List)): + func_name = "select_template" + + self.writeline(f"template = environment.{func_name}(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + if node.ignore_missing: + self.outdent() + self.writeline("except TemplateNotFound:") + self.indent() + self.writeline("pass") + self.outdent() + self.writeline("else:") + self.indent() + + def loop_body() -> None: + self.indent() + self.simple_write("event", frame) + self.outdent() + + if node.with_context: + self.writeline( + f"gen = template.root_render_func(" + "template.new_context(context.get_all(), True," + f" {self.dump_local_context(frame)}))" + ) + self.writeline("try:") + self.indent() + self.writeline(f"{self.choose_async()}for event in gen:") + loop_body() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) + elif self.environment.is_async: + self.writeline( + "for event in (await template._get_default_module_async())" + "._body_stream:" + ) + loop_body() + else: + self.writeline("yield from template._get_default_module()._body_stream") + + if node.ignore_missing: + self.outdent() + + def _import_common( + self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame + ) -> None: + self.write(f"{self.choose_async('await ')}environment.get_template(") + self.visit(node.template, frame) + self.write(f", {self.name!r}).") + + if node.with_context: + f_name = f"make_module{self.choose_async('_async')}" + self.write( + f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" + ) + else: + self.write(f"_get_default_module{self.choose_async('_async')}(context)") + + def visit_Import(self, node: nodes.Import, frame: Frame) -> None: + """Visit regular imports.""" + self.writeline(f"{frame.symbols.ref(node.target)} = ", node) + if frame.toplevel: + self.write(f"context.vars[{node.target!r}] = ") + + self._import_common(node, frame) + + if frame.toplevel and not node.target.startswith("_"): + self.writeline(f"context.exported_vars.discard({node.target!r})") + + def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: + """Visit named imports.""" + self.newline(node) + self.write("included_template = ") + self._import_common(node, frame) + var_names = [] + discarded_names = [] + for name in node.names: + if isinstance(name, tuple): + name, alias = name + else: + alias = name + self.writeline( + f"{frame.symbols.ref(alias)} =" + f" getattr(included_template, {name!r}, missing)" + ) + self.writeline(f"if {frame.symbols.ref(alias)} is missing:") + self.indent() + # The position will contain the template name, and will be formatted + # into a string that will be compiled into an f-string. Curly braces + # in the name must be replaced with escapes so that they will not be + # executed as part of the f-string. + position = self.position(node).replace("{", "{{").replace("}", "}}") + message = ( + "the template {included_template.__name__!r}" + f" (imported on {position})" + f" does not export the requested name {name!r}" + ) + self.writeline( + f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" + ) + self.outdent() + if frame.toplevel: + var_names.append(alias) + if not alias.startswith("_"): + discarded_names.append(alias) + + if var_names: + if len(var_names) == 1: + name = var_names[0] + self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") + else: + names_kv = ", ".join( + f"{name!r}: {frame.symbols.ref(name)}" for name in var_names + ) + self.writeline(f"context.vars.update({{{names_kv}}})") + if discarded_names: + if len(discarded_names) == 1: + self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") + else: + names_str = ", ".join(map(repr, discarded_names)) + self.writeline( + f"context.exported_vars.difference_update(({names_str}))" + ) + + def visit_For(self, node: nodes.For, frame: Frame) -> None: + loop_frame = frame.inner() + loop_frame.loop_frame = True + test_frame = frame.inner() + else_frame = frame.inner() + + # try to figure out if we have an extended loop. An extended loop + # is necessary if the loop is in recursive mode if the special loop + # variable is accessed in the body if the body is a scoped block. + extended_loop = ( + node.recursive + or "loop" + in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) + or any(block.scoped for block in node.find_all(nodes.Block)) + ) + + loop_ref = None + if extended_loop: + loop_ref = loop_frame.symbols.declare_parameter("loop") + + loop_frame.symbols.analyze_node(node, for_branch="body") + if node.else_: + else_frame.symbols.analyze_node(node, for_branch="else") + + if node.test: + loop_filter_func = self.temporary_identifier() + test_frame.symbols.analyze_node(node, for_branch="test") + self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) + self.indent() + self.enter_frame(test_frame) + self.writeline(self.choose_async("async for ", "for ")) + self.visit(node.target, loop_frame) + self.write(" in ") + self.write(self.choose_async("auto_aiter(fiter)", "fiter")) + self.write(":") + self.indent() + self.writeline("if ", node.test) + self.visit(node.test, test_frame) + self.write(":") + self.indent() + self.writeline("yield ") + self.visit(node.target, loop_frame) + self.outdent(3) + self.leave_frame(test_frame, with_python_scope=True) + + # if we don't have an recursive loop we have to find the shadowed + # variables at that point. Because loops can be nested but the loop + # variable is a special one we have to enforce aliasing for it. + if node.recursive: + self.writeline( + f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node + ) + self.indent() + self.buffer(loop_frame) + + # Use the same buffer for the else frame + else_frame.buffer = loop_frame.buffer + + # make sure the loop variable is a special one and raise a template + # assertion error if a loop tries to write to loop + if extended_loop: + self.writeline(f"{loop_ref} = missing") + + for name in node.find_all(nodes.Name): + if name.ctx == "store" and name.name == "loop": + self.fail( + "Can't assign to special loop variable in for-loop target", + name.lineno, + ) + + if node.else_: + iteration_indicator = self.temporary_identifier() + self.writeline(f"{iteration_indicator} = 1") + + self.writeline(self.choose_async("async for ", "for "), node) + self.visit(node.target, loop_frame) + if extended_loop: + self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") + else: + self.write(" in ") + + if node.test: + self.write(f"{loop_filter_func}(") + if node.recursive: + self.write("reciter") + else: + if self.environment.is_async and not extended_loop: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async and not extended_loop: + self.write(")") + if node.test: + self.write(")") + + if node.recursive: + self.write(", undefined, loop_render_func, depth):") + else: + self.write(", undefined):" if extended_loop else ":") + + self.indent() + self.enter_frame(loop_frame) + + self.writeline("_loop_vars = {}") + self.blockvisit(node.body, loop_frame) + if node.else_: + self.writeline(f"{iteration_indicator} = 0") + self.outdent() + self.leave_frame( + loop_frame, with_python_scope=node.recursive and not node.else_ + ) + + if node.else_: + self.writeline(f"if {iteration_indicator}:") + self.indent() + self.enter_frame(else_frame) + self.blockvisit(node.else_, else_frame) + self.leave_frame(else_frame) + self.outdent() + + # if the node was recursive we have to return the buffer contents + # and start the iteration code + if node.recursive: + self.return_buffer_contents(loop_frame) + self.outdent() + self.start_write(frame, node) + self.write(f"{self.choose_async('await ')}loop(") + if self.environment.is_async: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async: + self.write(")") + self.write(", loop)") + self.end_write(frame) + + # at the end of the iteration, clear any assignments made in the + # loop from the top level + if self._assign_stack: + self._assign_stack[-1].difference_update(loop_frame.symbols.stores) + + def visit_If(self, node: nodes.If, frame: Frame) -> None: + if_frame = frame.soft() + self.writeline("if ", node) + self.visit(node.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(node.body, if_frame) + self.outdent() + for elif_ in node.elif_: + self.writeline("elif ", elif_) + self.visit(elif_.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(elif_.body, if_frame) + self.outdent() + if node.else_: + self.writeline("else:") + self.indent() + self.blockvisit(node.else_, if_frame) + self.outdent() + + def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: + macro_frame, macro_ref = self.macro_body(node, frame) + self.newline() + if frame.toplevel: + if not node.name.startswith("_"): + self.write(f"context.exported_vars.add({node.name!r})") + self.writeline(f"context.vars[{node.name!r}] = ") + self.write(f"{frame.symbols.ref(node.name)} = ") + self.macro_def(macro_ref, macro_frame) + + def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: + call_frame, macro_ref = self.macro_body(node, frame) + self.writeline("caller = ") + self.macro_def(macro_ref, call_frame) + self.start_write(frame, node) + self.visit_Call(node.call, frame, forward_caller=True) + self.end_write(frame) + + def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: + filter_frame = frame.inner() + filter_frame.symbols.analyze_node(node) + self.enter_frame(filter_frame) + self.buffer(filter_frame) + self.blockvisit(node.body, filter_frame) + self.start_write(frame, node) + self.visit_Filter(node.filter, filter_frame) + self.end_write(frame) + self.leave_frame(filter_frame) + + def visit_With(self, node: nodes.With, frame: Frame) -> None: + with_frame = frame.inner() + with_frame.symbols.analyze_node(node) + self.enter_frame(with_frame) + for target, expr in zip(node.targets, node.values): + self.newline() + self.visit(target, with_frame) + self.write(" = ") + self.visit(expr, frame) + self.blockvisit(node.body, with_frame) + self.leave_frame(with_frame) + + def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: + self.newline(node) + self.visit(node.node, frame) + + class _FinalizeInfo(t.NamedTuple): + const: t.Optional[t.Callable[..., str]] + src: t.Optional[str] + + @staticmethod + def _default_finalize(value: t.Any) -> t.Any: + """The default finalize function if the environment isn't + configured with one. Or, if the environment has one, this is + called on that function's output for constants. + """ + return str(value) + + _finalize: t.Optional[_FinalizeInfo] = None + + def _make_finalize(self) -> _FinalizeInfo: + """Build the finalize function to be used on constants and at + runtime. Cached so it's only created once for all output nodes. + + Returns a ``namedtuple`` with the following attributes: + + ``const`` + A function to finalize constant data at compile time. + + ``src`` + Source code to output around nodes to be evaluated at + runtime. + """ + if self._finalize is not None: + return self._finalize + + finalize: t.Optional[t.Callable[..., t.Any]] + finalize = default = self._default_finalize + src = None + + if self.environment.finalize: + src = "environment.finalize(" + env_finalize = self.environment.finalize + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(env_finalize) # type: ignore + ) + finalize = None + + if pass_arg is None: + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(value)) + + else: + src = f"{src}{pass_arg}, " + + if pass_arg == "environment": + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(self.environment, value)) + + self._finalize = self._FinalizeInfo(finalize, src) + return self._finalize + + def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: + """Given a group of constant values converted from ``Output`` + child nodes, produce a string to write to the template module + source. + """ + return repr(concat(group)) + + def _output_child_to_const( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> str: + """Try to optimize a child of an ``Output`` node by trying to + convert it to constant, finalized data at compile time. + + If :exc:`Impossible` is raised, the node is not constant and + will be evaluated at runtime. Any other exception will also be + evaluated at runtime for easier debugging. + """ + const = node.as_const(frame.eval_ctx) + + if frame.eval_ctx.autoescape: + const = escape(const) + + # Template data doesn't go through finalize. + if isinstance(node, nodes.TemplateData): + return str(const) + + return finalize.const(const) # type: ignore + + def _output_child_pre( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code before visiting a child of an + ``Output`` node. + """ + if frame.eval_ctx.volatile: + self.write("(escape if context.eval_ctx.autoescape else str)(") + elif frame.eval_ctx.autoescape: + self.write("escape(") + else: + self.write("str(") + + if finalize.src is not None: + self.write(finalize.src) + + def _output_child_post( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code after visiting a child of an + ``Output`` node. + """ + self.write(")") + + if finalize.src is not None: + self.write(")") + + def visit_Output(self, node: nodes.Output, frame: Frame) -> None: + # If an extends is active, don't render outside a block. + if frame.require_output_check: + # A top-level extends is known to exist at compile time. + if self.has_known_extends: + return + + self.writeline("if parent_template is None:") + self.indent() + + finalize = self._make_finalize() + body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] + + # Evaluate constants at compile time if possible. Each item in + # body will be either a list of static data or a node to be + # evaluated at runtime. + for child in node.nodes: + try: + if not ( + # If the finalize function requires runtime context, + # constants can't be evaluated at compile time. + finalize.const + # Unless it's basic template data that won't be + # finalized anyway. + or isinstance(child, nodes.TemplateData) + ): + raise nodes.Impossible() + + const = self._output_child_to_const(child, frame, finalize) + except (nodes.Impossible, Exception): + # The node was not constant and needs to be evaluated at + # runtime. Or another error was raised, which is easier + # to debug at runtime. + body.append(child) + continue + + if body and isinstance(body[-1], list): + body[-1].append(const) + else: + body.append([const]) + + if frame.buffer is not None: + if len(body) == 1: + self.writeline(f"{frame.buffer}.append(") + else: + self.writeline(f"{frame.buffer}.extend((") + + self.indent() + + for item in body: + if isinstance(item, list): + # A group of constant data to join and output. + val = self._output_const_repr(item) + + if frame.buffer is None: + self.writeline("yield " + val) + else: + self.writeline(val + ",") + else: + if frame.buffer is None: + self.writeline("yield ", item) + else: + self.newline(item) + + # A node to be evaluated at runtime. + self._output_child_pre(item, frame, finalize) + self.visit(item, frame) + self._output_child_post(item, frame, finalize) + + if frame.buffer is not None: + self.write(",") + + if frame.buffer is not None: + self.outdent() + self.writeline(")" if len(body) == 1 else "))") + + if frame.require_output_check: + self.outdent() + + def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: + self.push_assign_tracking() + + # ``a.b`` is allowed for assignment, and is parsed as an NSRef. However, + # it is only valid if it references a Namespace object. Emit a check for + # that for each ref here, before assignment code is emitted. This can't + # be done in visit_NSRef as the ref could be in the middle of a tuple. + seen_refs: t.Set[str] = set() + + for nsref in node.find_all(nodes.NSRef): + if nsref.name in seen_refs: + # Only emit the check for each reference once, in case the same + # ref is used multiple times in a tuple, `ns.a, ns.b = c, d`. + continue + + seen_refs.add(nsref.name) + ref = frame.symbols.ref(nsref.name) + self.writeline(f"if not isinstance({ref}, Namespace):") + self.indent() + self.writeline( + "raise TemplateRuntimeError" + '("cannot assign attribute on non-namespace object")' + ) + self.outdent() + + self.newline(node) + self.visit(node.target, frame) + self.write(" = ") + self.visit(node.node, frame) + self.pop_assign_tracking(frame) + + def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: + self.push_assign_tracking() + block_frame = frame.inner() + # This is a special case. Since a set block always captures we + # will disable output checks. This way one can use set blocks + # toplevel even in extended templates. + block_frame.require_output_check = False + block_frame.symbols.analyze_node(node) + self.enter_frame(block_frame) + self.buffer(block_frame) + self.blockvisit(node.body, block_frame) + self.newline(node) + self.visit(node.target, frame) + self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") + if node.filter is not None: + self.visit_Filter(node.filter, block_frame) + else: + self.write(f"concat({block_frame.buffer})") + self.write(")") + self.pop_assign_tracking(frame) + self.leave_frame(block_frame) + + # -- Expression Visitors + + def visit_Name(self, node: nodes.Name, frame: Frame) -> None: + if node.ctx == "store" and ( + frame.toplevel or frame.loop_frame or frame.block_frame + ): + if self._assign_stack: + self._assign_stack[-1].add(node.name) + ref = frame.symbols.ref(node.name) + + # If we are looking up a variable we might have to deal with the + # case where it's undefined. We can skip that case if the load + # instruction indicates a parameter which are always defined. + if node.ctx == "load": + load = frame.symbols.find_load(ref) + if not ( + load is not None + and load[0] == VAR_LOAD_PARAMETER + and not self.parameter_is_undeclared(ref) + ): + self.write( + f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" + ) + return + + self.write(ref) + + def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: + # NSRef is a dotted assignment target a.b=c, but uses a[b]=c internally. + # visit_Assign emits code to validate that each ref is to a Namespace + # object only. That can't be emitted here as the ref could be in the + # middle of a tuple assignment. + ref = frame.symbols.ref(node.name) + self.writeline(f"{ref}[{node.attr!r}]") + + def visit_Const(self, node: nodes.Const, frame: Frame) -> None: + val = node.as_const(frame.eval_ctx) + if isinstance(val, float): + self.write(str(val)) + else: + self.write(repr(val)) + + def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: + try: + self.write(repr(node.as_const(frame.eval_ctx))) + except nodes.Impossible: + self.write( + f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" + ) + + def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: + self.write("(") + idx = -1 + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write(",)" if idx == 0 else ")") + + def visit_List(self, node: nodes.List, frame: Frame) -> None: + self.write("[") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write("]") + + def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: + self.write("{") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item.key, frame) + self.write(": ") + self.visit(item.value, frame) + self.write("}") + + visit_Add = _make_binop("+") + visit_Sub = _make_binop("-") + visit_Mul = _make_binop("*") + visit_Div = _make_binop("/") + visit_FloorDiv = _make_binop("//") + visit_Pow = _make_binop("**") + visit_Mod = _make_binop("%") + visit_And = _make_binop("and") + visit_Or = _make_binop("or") + visit_Pos = _make_unop("+") + visit_Neg = _make_unop("-") + visit_Not = _make_unop("not ") + + @optimizeconst + def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: + if frame.eval_ctx.volatile: + func_name = "(markup_join if context.eval_ctx.volatile else str_join)" + elif frame.eval_ctx.autoescape: + func_name = "markup_join" + else: + func_name = "str_join" + self.write(f"{func_name}((") + for arg in node.nodes: + self.visit(arg, frame) + self.write(", ") + self.write("))") + + @optimizeconst + def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: + self.write("(") + self.visit(node.expr, frame) + for op in node.ops: + self.visit(op, frame) + self.write(")") + + def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: + self.write(f" {operators[node.op]} ") + self.visit(node.expr, frame) + + @optimizeconst + def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getattr(") + self.visit(node.node, frame) + self.write(f", {node.attr!r})") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: + # slices bypass the environment getitem method. + if isinstance(node.arg, nodes.Slice): + self.visit(node.node, frame) + self.write("[") + self.visit(node.arg, frame) + self.write("]") + else: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getitem(") + self.visit(node.node, frame) + self.write(", ") + self.visit(node.arg, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: + if node.start is not None: + self.visit(node.start, frame) + self.write(":") + if node.stop is not None: + self.visit(node.stop, frame) + if node.step is not None: + self.write(":") + self.visit(node.step, frame) + + @contextmanager + def _filter_test_common( + self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool + ) -> t.Iterator[None]: + if self.environment.is_async: + self.write("(await auto_await(") + + if is_filter: + self.write(f"{self.filters[node.name]}(") + func = self.environment.filters.get(node.name) + else: + self.write(f"{self.tests[node.name]}(") + func = self.environment.tests.get(node.name) + + # When inside an If or CondExpr frame, allow the filter to be + # undefined at compile time and only raise an error if it's + # actually called at runtime. See pull_dependencies. + if func is None and not frame.soft_frame: + type_name = "filter" if is_filter else "test" + self.fail(f"No {type_name} named {node.name!r}.", node.lineno) + + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(func) # type: ignore + ) + + if pass_arg is not None: + self.write(f"{pass_arg}, ") + + # Back to the visitor function to handle visiting the target of + # the filter or test. + yield + + self.signature(node, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: + with self._filter_test_common(node, frame, True): + # if the filter node is None we are inside a filter block + # and want to write to the current buffer + if node.node is not None: + self.visit(node.node, frame) + elif frame.eval_ctx.volatile: + self.write( + f"(Markup(concat({frame.buffer}))" + f" if context.eval_ctx.autoescape else concat({frame.buffer}))" + ) + elif frame.eval_ctx.autoescape: + self.write(f"Markup(concat({frame.buffer}))") + else: + self.write(f"concat({frame.buffer})") + + @optimizeconst + def visit_Test(self, node: nodes.Test, frame: Frame) -> None: + with self._filter_test_common(node, frame, False): + self.visit(node.node, frame) + + @optimizeconst + def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: + frame = frame.soft() + + def write_expr2() -> None: + if node.expr2 is not None: + self.visit(node.expr2, frame) + return + + self.write( + f'cond_expr_undefined("the inline if-expression on' + f" {self.position(node)} evaluated to false and no else" + f' section was defined.")' + ) + + self.write("(") + self.visit(node.expr1, frame) + self.write(" if ") + self.visit(node.test, frame) + self.write(" else ") + write_expr2() + self.write(")") + + @optimizeconst + def visit_Call( + self, node: nodes.Call, frame: Frame, forward_caller: bool = False + ) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + if self.environment.sandboxed: + self.write("environment.call(context, ") + else: + self.write("context.call(") + self.visit(node.node, frame) + extra_kwargs = {"caller": "caller"} if forward_caller else None + loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} + block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} + if extra_kwargs: + extra_kwargs.update(loop_kwargs, **block_kwargs) + elif loop_kwargs or block_kwargs: + extra_kwargs = dict(loop_kwargs, **block_kwargs) + self.signature(node, frame, extra_kwargs) + self.write(")") + if self.environment.is_async: + self.write("))") + + def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: + self.write(node.key + "=") + self.visit(node.value, frame) + + # -- Unused nodes for extensions + + def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: + self.write("Markup(") + self.visit(node.expr, frame) + self.write(")") + + def visit_MarkSafeIfAutoescape( + self, node: nodes.MarkSafeIfAutoescape, frame: Frame + ) -> None: + self.write("(Markup if context.eval_ctx.autoescape else identity)(") + self.visit(node.expr, frame) + self.write(")") + + def visit_EnvironmentAttribute( + self, node: nodes.EnvironmentAttribute, frame: Frame + ) -> None: + self.write("environment." + node.name) + + def visit_ExtensionAttribute( + self, node: nodes.ExtensionAttribute, frame: Frame + ) -> None: + self.write(f"environment.extensions[{node.identifier!r}].{node.name}") + + def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: + self.write(self.import_aliases[node.importname]) + + def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: + self.write(node.name) + + def visit_ContextReference( + self, node: nodes.ContextReference, frame: Frame + ) -> None: + self.write("context") + + def visit_DerivedContextReference( + self, node: nodes.DerivedContextReference, frame: Frame + ) -> None: + self.write(self.derive_context(frame)) + + def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: + self.writeline("continue", node) + + def visit_Break(self, node: nodes.Break, frame: Frame) -> None: + self.writeline("break", node) + + def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: + scope_frame = frame.inner() + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + + def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: + ctx = self.temporary_identifier() + self.writeline(f"{ctx} = {self.derive_context(frame)}") + self.writeline(f"{ctx}.vars = ") + self.visit(node.context, frame) + self.push_context_reference(ctx) + + scope_frame = frame.inner(isolated=True) + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + self.pop_context_reference() + + def visit_EvalContextModifier( + self, node: nodes.EvalContextModifier, frame: Frame + ) -> None: + for keyword in node.options: + self.writeline(f"context.eval_ctx.{keyword.key} = ") + self.visit(keyword.value, frame) + try: + val = keyword.value.as_const(frame.eval_ctx) + except nodes.Impossible: + frame.eval_ctx.volatile = True + else: + setattr(frame.eval_ctx, keyword.key, val) + + def visit_ScopedEvalContextModifier( + self, node: nodes.ScopedEvalContextModifier, frame: Frame + ) -> None: + old_ctx_name = self.temporary_identifier() + saved_ctx = frame.eval_ctx.save() + self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") + self.visit_EvalContextModifier(node, frame) + for child in node.body: + self.visit(child, frame) + frame.eval_ctx.revert(saved_ctx) + self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/constants.py b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/constants.py new file mode 100644 index 0000000..41a1c23 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/constants.py @@ -0,0 +1,20 @@ +#: list of lorem ipsum words used by the lipsum() helper function +LOREM_IPSUM_WORDS = """\ +a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at +auctor augue bibendum blandit class commodo condimentum congue consectetuer +consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus +diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend +elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames +faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac +hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum +justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem +luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie +mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non +nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque +penatibus per pharetra phasellus placerat platea porta porttitor posuere +potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus +ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit +sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor +tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices +ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus +viverra volutpat vulputate""" diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/debug.py b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/debug.py new file mode 100644 index 0000000..eeeeee7 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/debug.py @@ -0,0 +1,191 @@ +import sys +import typing as t +from types import CodeType +from types import TracebackType + +from .exceptions import TemplateSyntaxError +from .utils import internal_code +from .utils import missing + +if t.TYPE_CHECKING: + from .runtime import Context + + +def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: + """Rewrite the current exception to replace any tracebacks from + within compiled template code with tracebacks that look like they + came from the template source. + + This must be called within an ``except`` block. + + :param source: For ``TemplateSyntaxError``, the original source if + known. + :return: The original exception with the rewritten traceback. + """ + _, exc_value, tb = sys.exc_info() + exc_value = t.cast(BaseException, exc_value) + tb = t.cast(TracebackType, tb) + + if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: + exc_value.translated = True + exc_value.source = source + # Remove the old traceback, otherwise the frames from the + # compiler still show up. + exc_value.with_traceback(None) + # Outside of runtime, so the frame isn't executing template + # code, but it still needs to point at the template. + tb = fake_traceback( + exc_value, None, exc_value.filename or "", exc_value.lineno + ) + else: + # Skip the frame for the render function. + tb = tb.tb_next + + stack = [] + + # Build the stack of traceback object, replacing any in template + # code with the source file and line information. + while tb is not None: + # Skip frames decorated with @internalcode. These are internal + # calls that aren't useful in template debugging output. + if tb.tb_frame.f_code in internal_code: + tb = tb.tb_next + continue + + template = tb.tb_frame.f_globals.get("__jinja_template__") + + if template is not None: + lineno = template.get_corresponding_lineno(tb.tb_lineno) + fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) + stack.append(fake_tb) + else: + stack.append(tb) + + tb = tb.tb_next + + tb_next = None + + # Assign tb_next in reverse to avoid circular references. + for tb in reversed(stack): + tb.tb_next = tb_next + tb_next = tb + + return exc_value.with_traceback(tb_next) + + +def fake_traceback( # type: ignore + exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int +) -> TracebackType: + """Produce a new traceback object that looks like it came from the + template source instead of the compiled code. The filename, line + number, and location name will point to the template, and the local + variables will be the current template context. + + :param exc_value: The original exception to be re-raised to create + the new traceback. + :param tb: The original traceback to get the local variables and + code info from. + :param filename: The template filename. + :param lineno: The line number in the template source. + """ + if tb is not None: + # Replace the real locals with the context that would be + # available at that point in the template. + locals = get_template_locals(tb.tb_frame.f_locals) + locals.pop("__jinja_exception__", None) + else: + locals = {} + + globals = { + "__name__": filename, + "__file__": filename, + "__jinja_exception__": exc_value, + } + # Raise an exception at the correct line number. + code: CodeType = compile( + "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" + ) + + # Build a new code object that points to the template file and + # replaces the location with a block name. + location = "template" + + if tb is not None: + function = tb.tb_frame.f_code.co_name + + if function == "root": + location = "top-level template code" + elif function.startswith("block_"): + location = f"block {function[6:]!r}" + + if sys.version_info >= (3, 8): + code = code.replace(co_name=location) + else: + code = CodeType( + code.co_argcount, + code.co_kwonlyargcount, + code.co_nlocals, + code.co_stacksize, + code.co_flags, + code.co_code, + code.co_consts, + code.co_names, + code.co_varnames, + code.co_filename, + location, + code.co_firstlineno, + code.co_lnotab, + code.co_freevars, + code.co_cellvars, + ) + + # Execute the new code, which is guaranteed to raise, and return + # the new traceback without this frame. + try: + exec(code, globals, locals) + except BaseException: + return sys.exc_info()[2].tb_next # type: ignore + + +def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: + """Based on the runtime locals, get the context that would be + available at that point in the template. + """ + # Start with the current template context. + ctx: t.Optional[Context] = real_locals.get("context") + + if ctx is not None: + data: t.Dict[str, t.Any] = ctx.get_all().copy() + else: + data = {} + + # Might be in a derived context that only sets local variables + # rather than pushing a context. Local variables follow the scheme + # l_depth_name. Find the highest-depth local that has a value for + # each name. + local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} + + for name, value in real_locals.items(): + if not name.startswith("l_") or value is missing: + # Not a template variable, or no longer relevant. + continue + + try: + _, depth_str, name = name.split("_", 2) + depth = int(depth_str) + except ValueError: + continue + + cur_depth = local_overrides.get(name, (-1,))[0] + + if cur_depth < depth: + local_overrides[name] = (depth, value) + + # Modify the context with any derived context. + for name, (_, value) in local_overrides.items(): + if value is missing: + data.pop(name, None) + else: + data[name] = value + + return data diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/defaults.py b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/defaults.py new file mode 100644 index 0000000..638cad3 --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/defaults.py @@ -0,0 +1,48 @@ +import typing as t + +from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 +from .tests import TESTS as DEFAULT_TESTS # noqa: F401 +from .utils import Cycler +from .utils import generate_lorem_ipsum +from .utils import Joiner +from .utils import Namespace + +if t.TYPE_CHECKING: + import typing_extensions as te + +# defaults for the parser / lexer +BLOCK_START_STRING = "{%" +BLOCK_END_STRING = "%}" +VARIABLE_START_STRING = "{{" +VARIABLE_END_STRING = "}}" +COMMENT_START_STRING = "{#" +COMMENT_END_STRING = "#}" +LINE_STATEMENT_PREFIX: t.Optional[str] = None +LINE_COMMENT_PREFIX: t.Optional[str] = None +TRIM_BLOCKS = False +LSTRIP_BLOCKS = False +NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" +KEEP_TRAILING_NEWLINE = False + +# default filters, tests and namespace + +DEFAULT_NAMESPACE = { + "range": range, + "dict": dict, + "lipsum": generate_lorem_ipsum, + "cycler": Cycler, + "joiner": Joiner, + "namespace": Namespace, +} + +# default policies +DEFAULT_POLICIES: t.Dict[str, t.Any] = { + "compiler.ascii_str": True, + "urlize.rel": "noopener", + "urlize.target": None, + "urlize.extra_schemes": None, + "truncate.leeway": 5, + "json.dumps_function": None, + "json.dumps_kwargs": {"sort_keys": True}, + "ext.i18n.trimmed": False, +} diff --git a/stripe_config/.venv/lib/python3.12/site-packages/jinja2/environment.py b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/environment.py new file mode 100644 index 0000000..0fc6e5b --- /dev/null +++ b/stripe_config/.venv/lib/python3.12/site-packages/jinja2/environment.py @@ -0,0 +1,1672 @@ +"""Classes for managing templates and their runtime and compile time +options. +""" + +import os +import typing +import typing as t +import weakref +from collections import ChainMap +from functools import lru_cache +from functools import partial +from functools import reduce +from types import CodeType + +from markupsafe import Markup + +from . import nodes +from .compiler import CodeGenerator +from .compiler import generate +from .defaults import BLOCK_END_STRING +from .defaults import BLOCK_START_STRING +from .defaults import COMMENT_END_STRING +from .defaults import COMMENT_START_STRING +from .defaults import DEFAULT_FILTERS # type: ignore[attr-defined] +from .defaults import DEFAULT_NAMESPACE +from .defaults import DEFAULT_POLICIES +from .defaults import DEFAULT_TESTS # type: ignore[attr-defined] +from .defaults import KEEP_TRAILING_NEWLINE +from .defaults import LINE_COMMENT_PREFIX +from .defaults import LINE_STATEMENT_PREFIX +from .defaults import LSTRIP_BLOCKS +from .defaults import NEWLINE_SEQUENCE +from .defaults import TRIM_BLOCKS +from .defaults import VARIABLE_END_STRING +from .defaults import VARIABLE_START_STRING +from .exceptions import TemplateNotFound +from .exceptions import TemplateRuntimeError +from .exceptions import TemplatesNotFound +from .exceptions import TemplateSyntaxError +from .exceptions import UndefinedError +from .lexer import get_lexer +from .lexer import Lexer +from .lexer import TokenStream +from .nodes import EvalContext +from .parser import Parser +from .runtime import Context +from .runtime import new_context +from .runtime import Undefined +from .utils import _PassArg +from .utils import concat +from .utils import consume +from .utils import import_string +from .utils import internalcode +from .utils import LRUCache +from .utils import missing + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .bccache import BytecodeCache + from .ext import Extension + from .loaders import BaseLoader + +_env_bound = t.TypeVar("_env_bound", bound="Environment") + + +# for direct template usage we have up to ten living environments +@lru_cache(maxsize=10) +def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: + """Return a new spontaneous environment. A spontaneous environment + is used for templates created directly rather than through an + existing environment. + + :param cls: Environment class to create. + :param args: Positional arguments passed to environment. + """ + env = cls(*args) + env.shared = True + return env + + +def create_cache( + size: int, +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: + """Return the cache class for the given size.""" + if size == 0: + return None + + if size < 0: + return {} + + return LRUCache(size) # type: ignore + + +def copy_cache( + cache: t.Optional[t.MutableMapping[t.Any, t.Any]], +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: + """Create an empty copy of the given cache.""" + if cache is None: + return None + + if type(cache) is dict: # noqa E721 + return {} + + return LRUCache(cache.capacity) # type: ignore + + +def load_extensions( + environment: "Environment", + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], +) -> t.Dict[str, "Extension"]: + """Load the extensions from the list and bind it to the environment. + Returns a dict of instantiated extensions. + """ + result = {} + + for extension in extensions: + if isinstance(extension, str): + extension = t.cast(t.Type["Extension"], import_string(extension)) + + result[extension.identifier] = extension(environment) + + return result + + +def _environment_config_check(environment: _env_bound) -> _env_bound: + """Perform a sanity check on the environment.""" + assert issubclass( + environment.undefined, Undefined + ), "'undefined' must be a subclass of 'jinja2.Undefined'." + assert ( + environment.block_start_string + != environment.variable_start_string + != environment.comment_start_string + ), "block, variable and comment start strings must be different." + assert environment.newline_sequence in { + "\r", + "\r\n", + "\n", + }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." + return environment + + +class Environment: + r"""The core component of Jinja is the `Environment`. It contains + important shared variables like configuration, filters, tests, + globals and others. Instances of this class may be modified if + they are not shared and if no template was loaded so far. + Modifications on environments after the first template was loaded + will lead to surprising effects and undefined behavior. + + Here are the possible initialization parameters: + + `block_start_string` + The string marking the beginning of a block. Defaults to ``'{%'``. + + `block_end_string` + The string marking the end of a block. Defaults to ``'%}'``. + + `variable_start_string` + The string marking the beginning of a print statement. + Defaults to ``'{{'``. + + `variable_end_string` + The string marking the end of a print statement. Defaults to + ``'}}'``. + + `comment_start_string` + The string marking the beginning of a comment. Defaults to ``'{#'``. + + `comment_end_string` + The string marking the end of a comment. Defaults to ``'#}'``. + + `line_statement_prefix` + If given and a string, this will be used as prefix for line based + statements. See also :ref:`line-statements`. + + `line_comment_prefix` + If given and a string, this will be used as prefix for line based + comments. See also :ref:`line-statements`. + + .. versionadded:: 2.2 + + `trim_blocks` + If this is set to ``True`` the first newline after a block is + removed (block, not variable tag!). Defaults to `False`. + + `lstrip_blocks` + If this is set to ``True`` leading spaces and tabs are stripped + from the start of a line to a block. Defaults to `False`. + + `newline_sequence` + The sequence that starts a newline. Must be one of ``'\r'``, + ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a + useful default for Linux and OS X systems as well as web + applications. + + `keep_trailing_newline` + Preserve the trailing newline when rendering templates. + The default is ``False``, which causes a single newline, + if present, to be stripped from the end of the template. + + .. versionadded:: 2.7 + + `extensions` + List of Jinja extensions to use. This can either be import paths + as strings or extension classes. For more information have a + look at :ref:`the extensions documentation `. + + `optimized` + should the optimizer be enabled? Default is ``True``. + + `undefined` + :class:`Undefined` or a subclass of it that is used to represent + undefined values in the template. + + `finalize` + A callable that can be used to process the result of a variable + expression before it is output. For example one can convert + ``None`` implicitly into an empty string here. + + `autoescape` + If set to ``True`` the XML/HTML autoescaping feature is enabled by + default. For more details about autoescaping see + :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also + be a callable that is passed the template name and has to + return ``True`` or ``False`` depending on autoescape should be + enabled by default. + + .. versionchanged:: 2.4 + `autoescape` can now be a function + + `loader` + The template loader for this environment. + + `cache_size` + The size of the cache. Per default this is ``400`` which means + that if more than 400 templates are loaded the loader will clean + out the least recently used template. If the cache size is set to + ``0`` templates are recompiled all the time, if the cache size is + ``-1`` the cache will not be cleaned. + + .. versionchanged:: 2.8 + The cache size was increased to 400 from a low 50. + + `auto_reload` + Some loaders load templates from locations where the template + sources may change (ie: file system or database). If + ``auto_reload`` is set to ``True`` (default) every time a template is + requested the loader checks if the source changed and if yes, it + will reload the template. For higher performance it's possible to + disable that. + + `bytecode_cache` + If set to a bytecode cache object, this object will provide a + cache for the internal Jinja bytecode so that templates don't + have to be parsed if they were not changed. + + See :ref:`bytecode-cache` for more information. + + `enable_async` + If set to true this enables async template execution which + allows using async functions and generators. + """ + + #: if this environment is sandboxed. Modifying this variable won't make + #: the environment sandboxed though. For a real sandboxed environment + #: have a look at jinja2.sandbox. This flag alone controls the code + #: generation by the compiler. + sandboxed = False + + #: True if the environment is just an overlay + overlayed = False + + #: the environment this environment is linked to if it is an overlay + linked_to: t.Optional["Environment"] = None + + #: shared environments have this set to `True`. A shared environment + #: must not be modified + shared = False + + #: the class that is used for code generation. See + #: :class:`~jinja2.compiler.CodeGenerator` for more information. + code_generator_class: t.Type["CodeGenerator"] = CodeGenerator + + concat = "".join + + #: the context class that is used for templates. See + #: :class:`~jinja2.runtime.Context` for more information. + context_class: t.Type[Context] = Context + + template_class: t.Type["Template"] + + def __init__( + self, + block_start_string: str = BLOCK_START_STRING, + block_end_string: str = BLOCK_END_STRING, + variable_start_string: str = VARIABLE_START_STRING, + variable_end_string: str = VARIABLE_END_STRING, + comment_start_string: str = COMMENT_START_STRING, + comment_end_string: str = COMMENT_END_STRING, + line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, + line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, + trim_blocks: bool = TRIM_BLOCKS, + lstrip_blocks: bool = LSTRIP_BLOCKS, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, + keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), + optimized: bool = True, + undefined: t.Type[Undefined] = Undefined, + finalize: t.Optional[t.Callable[..., t.Any]] = None, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, + loader: t.Optional["BaseLoader"] = None, + cache_size: int = 400, + auto_reload: bool = True, + bytecode_cache: t.Optional["BytecodeCache"] = None, + enable_async: bool = False, + ): + # !!Important notice!! + # The constructor accepts quite a few arguments that should be + # passed by keyword rather than position. However it's important to + # not change the order of arguments because it's used at least + # internally in those cases: + # - spontaneous environments (i18n extension and Template) + # - unittests + # If parameter changes are required only add parameters at the end + # and don't change the arguments (or the defaults!) of the arguments + # existing already. + + # lexer / parser information + self.block_start_string = block_start_string + self.block_end_string = block_end_string + self.variable_start_string = variable_start_string + self.variable_end_string = variable_end_string + self.comment_start_string = comment_start_string + self.comment_end_string = comment_end_string + self.line_statement_prefix = line_statement_prefix + self.line_comment_prefix = line_comment_prefix + self.trim_blocks = trim_blocks + self.lstrip_blocks = lstrip_blocks + self.newline_sequence = newline_sequence + self.keep_trailing_newline = keep_trailing_newline + + # runtime information + self.undefined: t.Type[Undefined] = undefined + self.optimized = optimized + self.finalize = finalize + self.autoescape = autoescape + + # defaults + self.filters = DEFAULT_FILTERS.copy() + self.tests = DEFAULT_TESTS.copy() + self.globals = DEFAULT_NAMESPACE.copy() + + # set the loader provided + self.loader = loader + self.cache = create_cache(cache_size) + self.bytecode_cache = bytecode_cache + self.auto_reload = auto_reload + + # configurable policies + self.policies = DEFAULT_POLICIES.copy() + + # load extensions + self.extensions = load_extensions(self, extensions) + + self.is_async = enable_async + _environment_config_check(self) + + def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: + """Adds an extension after the environment was created. + + .. versionadded:: 2.5 + """ + self.extensions.update(load_extensions(self, [extension])) + + def extend(self, **attributes: t.Any) -> None: + """Add the items to the instance of the environment if they do not exist + yet. This is used by :ref:`extensions ` to register + callbacks and configuration values without breaking inheritance. + """ + for key, value in attributes.items(): + if not hasattr(self, key): + setattr(self, key, value) + + def overlay( + self, + block_start_string: str = missing, + block_end_string: str = missing, + variable_start_string: str = missing, + variable_end_string: str = missing, + comment_start_string: str = missing, + comment_end_string: str = missing, + line_statement_prefix: t.Optional[str] = missing, + line_comment_prefix: t.Optional[str] = missing, + trim_blocks: bool = missing, + lstrip_blocks: bool = missing, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, + keep_trailing_newline: bool = missing, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, + optimized: bool = missing, + undefined: t.Type[Undefined] = missing, + finalize: t.Optional[t.Callable[..., t.Any]] = missing, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, + loader: t.Optional["BaseLoader"] = missing, + cache_size: int = missing, + auto_reload: bool = missing, + bytecode_cache: t.Optional["BytecodeCache"] = missing, + enable_async: bool = missing, + ) -> "te.Self": + """Create a new overlay environment that shares all the data with the + current environment except for cache and the overridden attributes. + Extensions cannot be removed for an overlayed environment. An overlayed + environment automatically gets all the extensions of the environment it + is linked to plus optional extra extensions. + + Creating overlays should happen after the initial environment was set + up completely. Not all attributes are truly linked, some are just + copied over so modifications on the original environment may not shine + through. + + .. versionchanged:: 3.1.5 + ``enable_async`` is applied correctly. + + .. versionchanged:: 3.1.2 + Added the ``newline_sequence``, ``keep_trailing_newline``, + and ``enable_async`` parameters to match ``__init__``. + """ + args = dict(locals()) + del args["self"], args["cache_size"], args["extensions"], args["enable_async"] + + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.overlayed = True + rv.linked_to = self + + for key, value in args.items(): + if value is not missing: + setattr(rv, key, value) + + if cache_size is not missing: + rv.cache = create_cache(cache_size) + else: + rv.cache = copy_cache(self.cache) + + rv.extensions = {} + for key, value in self.extensions.items(): + rv.extensions[key] = value.bind(rv) + if extensions is not missing: + rv.extensions.update(load_extensions(rv, extensions)) + + if enable_async is not missing: + rv.is_async = enable_async + + return _environment_config_check(rv) + + @property + def lexer(self) -> Lexer: + """The lexer for this environment.""" + return get_lexer(self) + + def iter_extensions(self) -> t.Iterator["Extension"]: + """Iterates over the extensions by priority.""" + return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) + + def getitem( + self, obj: t.Any, argument: t.Union[str, t.Any] + ) -> t.Union[t.Any, Undefined]: + """Get an item or attribute of an object but prefer the item.""" + try: + return obj[argument] + except (AttributeError, TypeError, LookupError): + if isinstance(argument, str): + try: + attr = str(argument) + except Exception: + pass + else: + try: + return getattr(obj, attr) + except AttributeError: + pass + return self.undefined(obj=obj, name=argument) + + def getattr(self, obj: t.Any, attribute: str) -> t.Any: + """Get an item or attribute of an object but prefer the attribute. + Unlike :meth:`getitem` the attribute *must* be a string. + """ + try: + return getattr(obj, attribute) + except AttributeError: + pass + try: + return obj[attribute] + except (TypeError, LookupError, AttributeError): + return self.undefined(obj=obj, name=attribute) + + def _filter_test_common( + self, + name: t.Union[str, Undefined], + value: t.Any, + args: t.Optional[t.Sequence[t.Any]], + kwargs: t.Optional[t.Mapping[str, t.Any]], + context: t.Optional[Context], + eval_ctx: t.Optional[EvalContext], + is_filter: bool, + ) -> t.Any: + if is_filter: + env_map = self.filters + type_name = "filter" + else: + env_map = self.tests + type_name = "test" + + func = env_map.get(name) # type: ignore + + if func is None: + msg = f"No {type_name} named {name!r}." + + if isinstance(name, Undefined): + try: + name._fail_with_undefined_error() + except Exception as e: + msg = f"{msg} ({e}; did you forget to quote the callable name?)" + + raise TemplateRuntimeError(msg) + + args = [value, *(args if args is not None else ())] + kwargs = kwargs if kwargs is not None else {} + pass_arg = _PassArg.from_obj(func) + + if pass_arg is _PassArg.context: + if context is None: + raise TemplateRuntimeError( + f"Attempted to invoke a context {type_name} without context." + ) + + args.insert(0, context) + elif pass_arg is _PassArg.eval_context: + if eval_ctx is None: + if context is not None: + eval_ctx = context.eval_ctx + else: + eval_ctx = EvalContext(self) + + args.insert(0, eval_ctx) + elif pass_arg is _PassArg.environment: + args.insert(0, self) + + return func(*args, **kwargs) + + def call_filter( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a filter on a value the same way the compiler does. + + This might return a coroutine if the filter is running from an + environment in async mode and the filter supports async + execution. It's your responsibility to await this if needed. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, True + ) + + def call_test( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a test on a value the same way the compiler does. + + This might return a coroutine if the test is running from an + environment in async mode and the test supports async execution. + It's your responsibility to await this if needed. + + .. versionchanged:: 3.0 + Tests support ``@pass_context``, etc. decorators. Added + the ``context`` and ``eval_ctx`` parameters. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, False + ) + + @internalcode + def parse( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> nodes.Template: + """Parse the sourcecode and return the abstract syntax tree. This + tree of nodes is used by the compiler to convert the template into + executable source- or bytecode. This is useful for debugging or to + extract information from templates. + + If you are :ref:`developing Jinja extensions ` + this gives you a good overview of the node tree generated. + """ + try: + return self._parse(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def _parse( + self, source: str, name: t.Optional[str], filename: t.Optional[str] + ) -> nodes.Template: + """Internal parsing function used by `parse` and `compile`.""" + return Parser(self, source, name, filename).parse() + + def lex( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> t.Iterator[t.Tuple[int, str, str]]: + """Lex the given sourcecode and return a generator that yields + tokens as tuples in the form ``(lineno, token_type, value)``. + This can be useful for :ref:`extension development ` + and debugging templates. + + This does not perform preprocessing. If you want the preprocessing + of the extensions to be applied you have to filter source through + the :meth:`preprocess` method. + """ + source = str(source) + try: + return self.lexer.tokeniter(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def preprocess( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> str: + """Preprocesses the source with all extensions. This is automatically + called for all parsing and compiling methods but *not* for :meth:`lex` + because there you usually only want the actual source tokenized. + """ + return reduce( + lambda s, e: e.preprocess(s, name, filename), + self.iter_extensions(), + str(source), + ) + + def _tokenize( + self, + source: str, + name: t.Optional[str], + filename: t.Optional[str] = None, + state: t.Optional[str] = None, + ) -> TokenStream: + """Called by the parser to do the preprocessing and filtering + for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. + """ + source = self.preprocess(source, name, filename) + stream = self.lexer.tokenize(source, name, filename, state) + + for ext in self.iter_extensions(): + stream = ext.filter_stream(stream) # type: ignore + + if not isinstance(stream, TokenStream): + stream = TokenStream(stream, name, filename) + + return stream + + def _generate( + self, + source: nodes.Template, + name: t.Optional[str], + filename: t.Optional[str], + defer_init: bool = False, + ) -> str: + """Internal hook that can be overridden to hook a different generate + method in. + + .. versionadded:: 2.5 + """ + return generate( # type: ignore + source, + self, + name, + filename, + defer_init=defer_init, + optimized=self.optimized, + ) + + def _compile(self, source: str, filename: str) -> CodeType: + """Internal hook that can be overridden to hook a different compile + method in. + + .. versionadded:: 2.5 + """ + return compile(source, filename, "exec") + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[False]" = False, + defer_init: bool = False, + ) -> CodeType: ... + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[True]" = ..., + defer_init: bool = False, + ) -> str: ... + + @internalcode + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: bool = False, + defer_init: bool = False, + ) -> t.Union[str, CodeType]: + """Compile a node or template source code. The `name` parameter is + the load name of the template after it was joined using + :meth:`join_path` if necessary, not the filename on the file system. + the `filename` parameter is the estimated filename of the template on + the file system. If the template came from a database or memory this + can be omitted. + + The return value of this method is a python code object. If the `raw` + parameter is `True` the return value will be a string with python + code equivalent to the bytecode returned otherwise. This method is + mainly used internally. + + `defer_init` is use internally to aid the module code generator. This + causes the generated code to be able to import without the global + environment variable to be set. + + .. versionadded:: 2.4 + `defer_init` parameter added. + """ + source_hint = None + try: + if isinstance(source, str): + source_hint = source + source = self._parse(source, name, filename) + source = self._generate(source, name, filename, defer_init=defer_init) + if raw: + return source + if filename is None: + filename = "